diff --git a/CMakeLists.txt b/CMakeLists.txt index 782aecd67d..da1bf352e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1192,26 +1192,29 @@ if(APHRODITE_GPU_LANG STREQUAL "CUDA" OR APHRODITE_GPU_LANG STREQUAL "HIP") endif() if(APHRODITE_GPU_LANG STREQUAL "CUDA") + file(GLOB APHRODITE_EXL3_GEMM_UNITS CONFIGURE_DEPENDS + "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_*_cb*.cu") + file(GLOB APHRODITE_EXL3_GEMV_INT8_UNITS CONFIGURE_DEPENDS + "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_*.cu") + file(GLOB APHRODITE_EXL3_MOE_UNITS CONFIGURE_DEPENDS + "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_*.cu") set(APHRODITE_EXL3_SRC "csrc/libtorch_stable/exl3_torch_bindings.cpp" "csrc/quantization/exl3/exllamav3_ext/graph.cu" "csrc/quantization/exl3/exllamav3_ext/hgemm.cu" + "csrc/quantization/exl3/exllamav3_ext/quant/coop_autotune.cu" "csrc/quantization/exl3/exllamav3_ext/quant/exl3_devctx.cu" "csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm.cu" "csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv.cu" + "csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_int8.cu" "csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map.cu" "csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe.cu" "csrc/quantization/exl3/exllamav3_ext/quant/hadamard.cu" "csrc/quantization/exl3/exllamav3_ext/quant/reconstruct.cu" "csrc/quantization/exl3/exllamav3_ext/quant/util.cu" - "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1.cu" - "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2.cu" - "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3.cu" - "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4.cu" - "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5.cu" - "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6.cu" - "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7.cu" - "csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8.cu") + ${APHRODITE_EXL3_GEMM_UNITS} + ${APHRODITE_EXL3_GEMV_INT8_UNITS} + ${APHRODITE_EXL3_MOE_UNITS}) # EXL3 requires Ampere+ instructions. Preserve all configured SM80+ # architectures, including native Thor SM110 cubins. diff --git a/aphrodite/_custom_ops.py b/aphrodite/_custom_ops.py index d59355ff7e..5527c2908b 100644 --- a/aphrodite/_custom_ops.py +++ b/aphrodite/_custom_ops.py @@ -187,6 +187,17 @@ def exl3_reconstruct( torch.ops._C.exl3_reconstruct(unpacked, packed, k, mcg, mul1) +def exl3_reconstruct_slice( + unpacked: torch.Tensor, + packed: torch.Tensor, + k: int, + mcg: bool, + mul1: bool, + n_offset: int, +) -> None: + torch.ops._C.exl3_reconstruct_slice(unpacked, packed, k, mcg, mul1, n_offset) + + def exl3_had_r_128( input: torch.Tensor, output: torch.Tensor, @@ -197,6 +208,30 @@ def exl3_had_r_128( torch.ops._C.exl3_had_r_128(input, output, pre_scale, post_scale, scale) +def exl3_had_r_128_dual( + input1: torch.Tensor, + output1: torch.Tensor, + pre_scale1: torch.Tensor | None, + post_scale1: torch.Tensor | None, + input2: torch.Tensor, + output2: torch.Tensor, + pre_scale2: torch.Tensor | None, + post_scale2: torch.Tensor | None, + scale: float = 1.0, +) -> None: + torch.ops._C.exl3_had_r_128_dual( + input1, + output1, + pre_scale1, + post_scale1, + input2, + output2, + pre_scale2, + post_scale2, + scale, + ) + + def exl3_hgemm(a: torch.Tensor, b: torch.Tensor, c: torch.Tensor) -> None: torch.ops._C.exl3_hgemm(a, b, c) @@ -231,8 +266,10 @@ def exl3_moe( down_mcg: bool, down_mul1: bool, act_limit: float = 0.0, + num_active: int = -1, ) -> None: - torch.ops._C.exl3_moe( + op = torch.ops._C.exl3_moe if num_active < 0 else torch.ops._C.exl3_moe_active + args = ( hidden_state, output_state, expert_count, @@ -263,6 +300,10 @@ def exl3_moe( down_mul1, act_limit, ) + if num_active < 0: + op(*args) + else: + op(*args, num_active) if hasattr(torch.ops, "_C") and hasattr(torch.ops._C, "exl3_gemm"): @@ -312,6 +353,17 @@ def _exl3_reconstruct_fake( ) -> None: return None + @register_fake("_C::exl3_reconstruct_slice") + def _exl3_reconstruct_slice_fake( + unpacked: torch.Tensor, + packed: torch.Tensor, + k: int, + mcg: bool, + mul1: bool, + n_offset: int, + ) -> None: + return None + @register_fake("_C::exl3_had_r_128") def _exl3_had_r_128_fake( input: torch.Tensor, diff --git a/aphrodite/model_executor/layers/fused_moe/routed_experts.py b/aphrodite/model_executor/layers/fused_moe/routed_experts.py index c0966929d1..10444196f5 100644 --- a/aphrodite/model_executor/layers/fused_moe/routed_experts.py +++ b/aphrodite/model_executor/layers/fused_moe/routed_experts.py @@ -5,6 +5,7 @@ from enum import Enum from typing import TYPE_CHECKING, Any, Literal, cast, overload +import regex as re import torch from aphrodite.distributed.eplb.eplb_state import EplbState @@ -853,8 +854,12 @@ def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> Iterable[ unpadded_hidden = self.moe_config.hidden_dim_unpadded for expert_name, loaded_weight in weights: qual_name = f"{self.layer_name}.{expert_name}" - # Fused expert weights can be identified by their 3D tensors - is_fused = loaded_weight.dim() == 3 + # Most fused expert weights are 3D, but some quantization formats + # use 3D tensors for a single expert (for example EXL3 trellises). + # An explicit expert index in the checkpoint name takes priority + # over the tensor rank. + is_per_expert = re.search(r"(?:^|\.)experts\.\d+\.", qual_name) is not None + is_fused = loaded_weight.dim() == 3 and not is_per_expert matched = False for param_name, weight_name, expert_id, shard_id in expert_mapping: if weight_name not in qual_name: diff --git a/aphrodite/model_executor/layers/quantization/exl3.py b/aphrodite/model_executor/layers/quantization/exl3.py index 6971559ee1..3de3034c56 100644 --- a/aphrodite/model_executor/layers/quantization/exl3.py +++ b/aphrodite/model_executor/layers/quantization/exl3.py @@ -39,9 +39,14 @@ from aphrodite.platforms import current_platform logger = init_logger(__name__) -_EXL3_MOE_MAX_TOKENS_PER_EXPERT = 128 +_EXL3_MOE_DEFAULT_MAX_TOKENS_PER_EXPERT = 128 +_EXL3_MOE_SM110_MAX_TOKENS_PER_EXPERT = 32 +_EXL3_MOE_SM110_SHORT_MAX_TOKENS_PER_EXPERT = 1 +_EXL3_MOE_SM110_SHORT_TOKEN_THRESHOLD = 512 _EXL3_MOE_MAX_EXPERTS_PER_TOKEN = 32 _EXL3_MOE_ACT_SILU = 0 +_EXL3_AUTO_RECONSTRUCT_THRESHOLD = 144 +_EXL3_MAX_RECONSTRUCT_SLICE_N = 32768 def _get_exl3_moe_down_tuning( @@ -86,7 +91,7 @@ def _exl3_linear_one( ) x_had = torch.empty_like(x) - if x.shape[0] <= 32: + if x.shape[0] <= _EXL3_AUTO_RECONSTRUCT_THRESHOLD: ops.exl3_gemm( x, trellis, @@ -101,19 +106,6 @@ def _exl3_linear_one( ) return output - weight = torch.empty( - (trellis.shape[0] * 16, out_features), - device=trellis.device, - dtype=torch.float16, - ) - ops.exl3_reconstruct( - weight, - trellis, - # EXL3 reconstruct expects K where packed.shape[2] == 16 * K. - trellis.shape[2] // 16, - mcg, - mul1, - ) ops.exl3_had_r_128( x, x_had, @@ -121,11 +113,27 @@ def _exl3_linear_one( None, 1.0, ) - ops.exl3_hgemm( - x_had, - weight, - output, - ) + in_features = trellis.shape[0] * 16 + k = trellis.shape[2] // 16 + if out_features <= _EXL3_MAX_RECONSTRUCT_SLICE_N: + weight = torch.empty( + (in_features, out_features), + device=trellis.device, + dtype=torch.float16, + ) + ops.exl3_reconstruct(weight, trellis, k, mcg, mul1) + ops.exl3_hgemm(x_had, weight, output) + else: + weight_buffer = torch.empty( + (in_features * _EXL3_MAX_RECONSTRUCT_SLICE_N,), + device=trellis.device, + dtype=torch.float16, + ) + for n_start in range(0, out_features, _EXL3_MAX_RECONSTRUCT_SLICE_N): + n_end = min(n_start + _EXL3_MAX_RECONSTRUCT_SLICE_N, out_features) + weight = weight_buffer[: in_features * (n_end - n_start)].view(in_features, n_end - n_start) + ops.exl3_reconstruct_slice(weight, trellis, k, mcg, mul1, n_start) + ops.exl3_hgemm(x_had, weight, output[:, n_start:n_end]) ops.exl3_had_r_128( output, output, @@ -173,7 +181,7 @@ def _exl3_gate_up( mcg: bool, mul1: bool, ) -> torch.Tensor: - if x.shape[0] > 32: + if x.shape[0] > _EXL3_AUTO_RECONSTRUCT_THRESHOLD: return torch.cat( [ _exl3_linear_one(x, gate_trellis, gate_suh, gate_svh, mcg, mul1), @@ -267,7 +275,7 @@ def _exl3_qkv( kv_mul1: bool, ) -> torch.Tensor: q = _exl3_linear_one(x, q_trellis, q_suh, q_svh, q_mcg, q_mul1) - if x.shape[0] > 32: + if x.shape[0] > _EXL3_AUTO_RECONSTRUCT_THRESHOLD: return torch.cat( [ q, @@ -479,6 +487,10 @@ def _linear_prefix_is_exl3(self, prefix: str) -> bool: base = prefix.removesuffix(".gate_up_proj") return all(self._is_exl3_prefix(f"{base}.{proj}") for proj in ("gate_proj", "up_proj")) + if prefix.endswith(".w13"): + base = prefix.removesuffix(".w13") + return all(self._is_exl3_prefix(f"{base}.{proj}") for proj in ("w1", "w3")) + if prefix.endswith(".in_proj_qkvz"): base = prefix.removesuffix(".in_proj_qkvz") return all(self._is_exl3_prefix(f"{base}.{proj}") for proj in ("in_proj_qkv", "in_proj_z")) @@ -488,8 +500,9 @@ def _linear_prefix_is_exl3(self, prefix: str) -> bool: def _moe_prefix_is_exl3(self, prefix: str) -> bool: expert_prefixes = (f"{prefix}.0", f"{prefix}.experts.0") return any( - all(self._is_exl3_prefix(f"{expert_prefix}.{proj}") for proj in ("gate_proj", "up_proj", "down_proj")) + all(self._is_exl3_prefix(f"{expert_prefix}.{proj}") for proj in projections) for expert_prefix in expert_prefixes + for projections in (("gate_proj", "up_proj", "down_proj"), ("w1", "w3", "w2")) ) def has_moe_tensors(self) -> bool: @@ -888,7 +901,7 @@ def _setup_mgemm_if_supported(layer: torch.nn.Module) -> None: layer.exl3_can_mgemm = False prefix = getattr(layer, "prefix", "") - if prefix.endswith("gate_up_proj") and len(layer.exl3_shard_ids) == 2: + if prefix.endswith(("gate_up_proj", "w13")) and len(layer.exl3_shard_ids) == 2: mgemm_shard_ids = layer.exl3_shard_ids layer.exl3_mgemm_mode = "gate_up" elif prefix.endswith("qkv_proj") and layer.exl3_shard_ids == ["q", "k", "v"]: @@ -940,8 +953,8 @@ def _setup_mgemm_if_supported(layer: torch.nn.Module) -> None: layer.exl3_mgemm_mul1 = mul1 layer.exl3_can_mgemm = True - @staticmethod def _shard_ids_for_layer( + self, layer: torch.nn.Module, output_partition_sizes: list[int], ) -> list[str | int | tuple[int, ...] | None]: @@ -949,6 +962,10 @@ def _shard_ids_for_layer( return [None] prefix = getattr(layer, "prefix", "") + # Some checkpoints store a merged projection as one EXL3 tensor even + # when the runtime layer exposes several logical output partitions. + if self.quant_config._is_exl3_prefix(prefix): + return [None] if prefix.endswith("qkv_proj"): return ["q", "k", "v"] if prefix.endswith("gate_up_proj"): @@ -1142,6 +1159,16 @@ def apply( expert_sorted, torch.ones_like(expert_sorted, dtype=torch.long), ) + capturing = torch.cuda.is_current_stream_capturing() + fused_max_tokens = layer.exl3_moe_max_tokens_per_expert + if x_2d.shape[0] <= layer.exl3_moe_short_token_threshold: + fused_max_tokens = layer.exl3_moe_short_max_tokens_per_expert + if capturing: + expert_count_list = None + num_active = -1 + else: + expert_count_list = expert_count.tolist() + num_active = sum(0 < count <= fused_max_tokens for count in expert_count_list[: layer.local_num_experts]) if not hasattr(torch.ops._C, "exl3_moe"): raise RuntimeError("EXL3 MoE kernel is not available. Rebuild Aphrodite.") @@ -1152,10 +1179,10 @@ def apply( expert_count, token_sorted, weight_sorted, - layer.exl3_temp_state_g, - layer.exl3_temp_state_u, - layer.exl3_temp_intermediate_g, - layer.exl3_temp_intermediate_u, + layer.exl3_temp_state_g[:, :fused_max_tokens], + layer.exl3_temp_state_u[:, :fused_max_tokens], + layer.exl3_temp_intermediate_g[:, :fused_max_tokens], + layer.exl3_temp_intermediate_u[:, :fused_max_tokens], _EXL3_MOE_ACT_SILU, layer.exl3_moe_k_gate, layer.exl3_moe_k_up, @@ -1176,50 +1203,144 @@ def apply( layer.exl3_down_mcg, layer.exl3_down_mul1, 0.0, + num_active, ) - if torch.cuda.is_current_stream_capturing(): + if capturing: if output.dtype != original_dtype: output = output.to(original_dtype) return output.reshape(*x.shape[:-1], output.shape[-1]) - if total_assignments <= _EXL3_MOE_MAX_TOKENS_PER_EXPERT: + if total_assignments <= fused_max_tokens: if output.dtype != original_dtype: output = output.to(original_dtype) return output.reshape(*x.shape[:-1], output.shape[-1]) - needs_fallback = bool((expert_count[:-1] > _EXL3_MOE_MAX_TOKENS_PER_EXPERT).any().item()) - if not needs_fallback: + assert expert_count_list is not None + max_fallback_count = max(expert_count_list[: layer.local_num_experts]) + if max_fallback_count <= fused_max_tokens: if output.dtype != original_dtype: output = output.to(original_dtype) return output.reshape(*x.shape[:-1], output.shape[-1]) - expert_offsets = torch.empty( - layer.local_num_experts + 2, + expert_offsets_list = [0] + for count in expert_count_list: + expert_offsets_list.append(expert_offsets_list[-1] + count) + + hidden_size = layer.hidden_size + intermediate_size = layer.exl3_intermediate_size_per_partition + input_had = torch.empty( + (2, max_fallback_count, hidden_size), + dtype=torch.float16, + device=x_2d.device, + ) + gate_up = torch.empty( + (2, max_fallback_count, intermediate_size), + dtype=torch.float16, + device=x_2d.device, + ) + intermediate = torch.empty( + (max_fallback_count, intermediate_size), + dtype=torch.float16, + device=x_2d.device, + ) + expert_output = torch.empty( + (max_fallback_count, hidden_size), + dtype=torch.float32, + device=x_2d.device, + ) + weight = torch.empty( + (hidden_size, intermediate_size), + dtype=torch.float16, device=x_2d.device, - dtype=torch.long, ) - expert_offsets[0] = 0 - expert_offsets[1:] = expert_count.cumsum(0) - expert_offsets_list = expert_offsets.cpu().tolist() for expert_id in range(layer.local_num_experts): start = expert_offsets_list[expert_id] end = expert_offsets_list[expert_id + 1] count = end - start - if count <= _EXL3_MOE_MAX_TOKENS_PER_EXPERT: + if count <= fused_max_tokens: continue token_pos = token_sorted[start:end] route_weight = weight_sorted[start:end].unsqueeze(-1) expert_input = x_2d.index_select(0, token_pos) - gate = self._apply_exl3(layer, "w13", expert_input, expert_id, "w1") - up = self._apply_exl3(layer, "w13", expert_input, expert_id, "w3") - intermediate = torch.nn.functional.silu(gate) * up - expert_output = self._apply_exl3(layer, "w2", intermediate, expert_id, "w2") - expert_output = expert_output * route_weight - output.index_add_(0, token_pos, expert_output.to(torch.float32)) + gate_key = (expert_id, "w1") + up_key = (expert_id, "w3") + down_key = (expert_id, "w2") + gate = gate_up[0, :count] + up = gate_up[1, :count] + gate_had = input_had[0, :count] + up_had = input_had[1, :count] + ops.exl3_had_r_128_dual( + expert_input, + gate_had, + layer.w13_suh.exl3_tensors[gate_key], + None, + expert_input, + up_had, + layer.w13_suh.exl3_tensors[up_key], + None, + 1.0, + ) + ops.exl3_reconstruct( + weight, + layer.w13_trellis.exl3_tensors[gate_key], + layer.exl3_moe_k_gate, + layer.exl3_gate_mcg, + layer.exl3_gate_mul1, + ) + ops.exl3_hgemm(gate_had, weight, gate) + ops.exl3_reconstruct( + weight, + layer.w13_trellis.exl3_tensors[up_key], + layer.exl3_moe_k_up, + layer.exl3_up_mcg, + layer.exl3_up_mul1, + ) + ops.exl3_hgemm(up_had, weight, up) + ops.exl3_had_r_128_dual( + gate, + gate, + None, + layer.w13_svh.exl3_tensors[gate_key], + up, + up, + None, + layer.w13_svh.exl3_tensors[up_key], + 1.0, + ) + activated = intermediate[:count] + ops.silu_mul(activated, gate, up) + + down_had = gate_up[0, :count] + ops.exl3_had_r_128( + activated, + down_had, + layer.w2_suh.exl3_tensors[down_key], + None, + 1.0, + ) + down_weight = weight.view(intermediate_size, hidden_size) + ops.exl3_reconstruct( + down_weight, + layer.w2_trellis.exl3_tensors[down_key], + layer.exl3_moe_k_down, + layer.exl3_down_mcg, + layer.exl3_down_mul1, + ) + current_output = expert_output[:count] + ops.exl3_hgemm(down_had, down_weight, current_output) + ops.exl3_had_r_128( + current_output, + current_output, + None, + layer.w2_svh.exl3_tensors[down_key], + 1.0, + ) + current_output.mul_(route_weight) + output.index_add_(0, token_pos, current_output) if output.dtype != original_dtype: output = output.to(original_dtype) @@ -1509,14 +1630,23 @@ def ptr_tensor(prefix: str, attr: str, shard_id: str): 1, torch.cuda.get_device_properties(device).multi_processor_count // 12, ) + capability = current_platform.get_device_capability(device.index) + is_sm110 = capability is not None and capability.major == 11 + layer.exl3_moe_max_tokens_per_expert = ( + _EXL3_MOE_SM110_MAX_TOKENS_PER_EXPERT if is_sm110 else _EXL3_MOE_DEFAULT_MAX_TOKENS_PER_EXPERT + ) + layer.exl3_moe_short_max_tokens_per_expert = ( + _EXL3_MOE_SM110_SHORT_MAX_TOKENS_PER_EXPERT if is_sm110 else layer.exl3_moe_max_tokens_per_expert + ) + layer.exl3_moe_short_token_threshold = _EXL3_MOE_SM110_SHORT_TOKEN_THRESHOLD if is_sm110 else 0 temp_shape_hidden = ( concurrency, - _EXL3_MOE_MAX_TOKENS_PER_EXPERT, + layer.exl3_moe_max_tokens_per_expert, layer.hidden_size, ) temp_shape_intermediate = ( concurrency, - _EXL3_MOE_MAX_TOKENS_PER_EXPERT, + layer.exl3_moe_max_tokens_per_expert, intermediate_size, ) layer.exl3_temp_state_g = torch.empty(temp_shape_hidden, dtype=torch.float16, device=device) @@ -1531,6 +1661,7 @@ def _apply_exl3( x: torch.Tensor, expert_id: int, shard_id: str, + output_dtype: torch.dtype = torch.float16, ) -> torch.Tensor: key = (expert_id, shard_id) suh = getattr(layer, f"{prefix}_suh").exl3_tensors[key] @@ -1542,11 +1673,13 @@ def _apply_exl3( output = torch.empty( (x.shape[0], trellis.shape[1] * 16), device=x.device, - dtype=torch.float16, + dtype=output_dtype, ) x_had = torch.empty_like(x) if x.shape[0] <= 32: + if output_dtype != torch.float16: + raise ValueError("The EXL3 GEMM path only supports float16 output") ops.exl3_gemm( x, trellis, diff --git a/aphrodite/model_executor/models/lfm2_moe.py b/aphrodite/model_executor/models/lfm2_moe.py index 48a7f1cdcc..d494f71ecc 100644 --- a/aphrodite/model_executor/models/lfm2_moe.py +++ b/aphrodite/model_executor/models/lfm2_moe.py @@ -56,6 +56,7 @@ make_empty_intermediate_tensors_factory, make_layers, maybe_prefix, + model_should_use_tied_lm_head, ) @@ -573,6 +574,7 @@ def __init__(self, *, aphrodite_config: AphroditeConfig, prefix: str = "") -> No super().__init__() self.config = config + self.use_tied_lm_head = model_should_use_tied_lm_head(config, quant_config) self.model = Lfm2MoeModel(aphrodite_config=aphrodite_config, prefix=maybe_prefix(prefix, "model")) if get_pp_group().is_last_rank: @@ -582,7 +584,8 @@ def __init__(self, *, aphrodite_config: AphroditeConfig, prefix: str = "") -> No quant_config=quant_config, prefix=maybe_prefix(prefix, "lm_head"), ) - self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens) + if self.use_tied_lm_head: + self.lm_head.weight = self.model.embed_tokens.weight else: self.lm_head = PPMissingLayer() @@ -653,6 +656,6 @@ def compute_logits(self, hidden_states: torch.Tensor) -> torch.Tensor: def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]: loader = AutoWeightsLoader( self, - skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None), + skip_prefixes=(["lm_head."] if self.use_tied_lm_head else None), ) return loader.load_weights(weights) diff --git a/csrc/libtorch_stable/exl3_torch_bindings.cpp b/csrc/libtorch_stable/exl3_torch_bindings.cpp index e0423178ad..2840ce7369 100644 --- a/csrc/libtorch_stable/exl3_torch_bindings.cpp +++ b/csrc/libtorch_stable/exl3_torch_bindings.cpp @@ -17,6 +17,7 @@ #include "quantization/exl3/exllamav3_ext/quant/exl3_moe.cuh" #include "quantization/exl3/exllamav3_ext/quant/hadamard.cuh" #include "quantization/exl3/exllamav3_ext/quant/reconstruct.cuh" +#include "quantization/exl3/exllamav3_ext/quant/util.cuh" // Thin adapters between the torch schema (int64/double/bool) and the native // kernel entry points (int/float). Defined here rather than in a shared header @@ -51,6 +52,13 @@ static void aphrodite_exl3_reconstruct(torch::stable::Tensor unpacked, reconstruct(unpacked, packed, static_cast(k), mcg, mul1); } +static void aphrodite_exl3_reconstruct_slice(torch::stable::Tensor unpacked, + torch::stable::Tensor packed, + int64_t k, bool mcg, bool mul1, + int64_t n_offset) { + reconstruct_slice(unpacked, packed, static_cast(k), mcg, mul1, n_offset); +} + static void aphrodite_exl3_had_r_128( const torch::stable::Tensor& input, const torch::stable::Tensor& output, const std::optional& pre_scale, @@ -58,6 +66,17 @@ static void aphrodite_exl3_had_r_128( had_r_128(input, output, pre_scale, post_scale, static_cast(scale)); } +static void aphrodite_exl3_had_r_128_dual( + const torch::stable::Tensor& input1, const torch::stable::Tensor& output1, + const std::optional& pre_scale1, + const std::optional& post_scale1, + const torch::stable::Tensor& input2, const torch::stable::Tensor& output2, + const std::optional& pre_scale2, + const std::optional& post_scale2, double scale) { + had_r_128_dual(input1, output1, pre_scale1, post_scale1, input2, output2, + pre_scale2, post_scale2, static_cast(scale)); +} + static void aphrodite_exl3_hgemm(torch::stable::Tensor a, torch::stable::Tensor b, torch::stable::Tensor c) { @@ -87,6 +106,38 @@ static void aphrodite_exl3_moe(const torch::stable::Tensor& hidden_state, bool gate_mcg, bool gate_mul1, bool up_mcg, bool up_mul1, bool down_mcg, bool down_mul1, double act_limit) { + exl3_moe( + hidden_state, output_state, expert_count, token_sorted, weight_sorted, + temp_state_g, temp_state_u, temp_intermediate_g, temp_intermediate_u, + static_cast(act_function), static_cast(K_gate), + static_cast(K_up), static_cast(K_down), gate_ptrs_trellis, + gate_ptrs_suh, gate_ptrs_svh, up_ptrs_trellis, up_ptrs_suh, up_ptrs_svh, + down_ptrs_trellis, down_ptrs_suh, down_ptrs_svh, gate_mcg, gate_mul1, + up_mcg, up_mul1, down_mcg, down_mul1, static_cast(act_limit), -1); +} + +static void aphrodite_exl3_moe_active( + const torch::stable::Tensor& hidden_state, + const torch::stable::Tensor& output_state, + const torch::stable::Tensor& expert_count, + const torch::stable::Tensor& token_sorted, + const torch::stable::Tensor& weight_sorted, + const torch::stable::Tensor& temp_state_g, + const torch::stable::Tensor& temp_state_u, + const torch::stable::Tensor& temp_intermediate_g, + const torch::stable::Tensor& temp_intermediate_u, int64_t act_function, + int64_t K_gate, int64_t K_up, int64_t K_down, + const torch::stable::Tensor& gate_ptrs_trellis, + const torch::stable::Tensor& gate_ptrs_suh, + const torch::stable::Tensor& gate_ptrs_svh, + const torch::stable::Tensor& up_ptrs_trellis, + const torch::stable::Tensor& up_ptrs_suh, + const torch::stable::Tensor& up_ptrs_svh, + const torch::stable::Tensor& down_ptrs_trellis, + const torch::stable::Tensor& down_ptrs_suh, + const torch::stable::Tensor& down_ptrs_svh, bool gate_mcg, bool gate_mul1, + bool up_mcg, bool up_mul1, bool down_mcg, bool down_mul1, double act_limit, + int64_t num_active) { exl3_moe(hidden_state, output_state, expert_count, token_sorted, weight_sorted, temp_state_g, temp_state_u, temp_intermediate_g, temp_intermediate_u, static_cast(act_function), @@ -94,7 +145,8 @@ static void aphrodite_exl3_moe(const torch::stable::Tensor& hidden_state, static_cast(K_down), gate_ptrs_trellis, gate_ptrs_suh, gate_ptrs_svh, up_ptrs_trellis, up_ptrs_suh, up_ptrs_svh, down_ptrs_trellis, down_ptrs_suh, down_ptrs_svh, gate_mcg, gate_mul1, - up_mcg, up_mul1, down_mcg, down_mul1, static_cast(act_limit)); + up_mcg, up_mul1, down_mcg, down_mul1, static_cast(act_limit), + static_cast(num_active)); } // --------------------------------------------------------------------------- @@ -113,9 +165,16 @@ STABLE_TORCH_LIBRARY_FRAGMENT(_C, ops) { ops.def( "exl3_reconstruct(Tensor! unpacked, Tensor packed, int k, bool mcg, " "bool mul1) -> ()"); + ops.def( + "exl3_reconstruct_slice(Tensor! unpacked, Tensor packed, int k, bool " + "mcg, bool mul1, int n_offset) -> ()"); ops.def( "exl3_had_r_128(Tensor input, Tensor! output, Tensor? pre_scale, " "Tensor? post_scale, float scale) -> ()"); + ops.def( + "exl3_had_r_128_dual(Tensor input1, Tensor! output1, Tensor? " + "pre_scale1, Tensor? post_scale1, Tensor input2, Tensor! output2, " + "Tensor? pre_scale2, Tensor? post_scale2, float scale) -> ()"); ops.def("exl3_hgemm(Tensor a, Tensor b, Tensor! c) -> ()"); ops.def( "exl3_moe(Tensor hidden_state, Tensor! output_state, Tensor " @@ -127,13 +186,33 @@ STABLE_TORCH_LIBRARY_FRAGMENT(_C, ops) { "up_ptrs_svh, Tensor down_ptrs_trellis, Tensor down_ptrs_suh, Tensor " "down_ptrs_svh, bool gate_mcg, bool gate_mul1, bool up_mcg, bool " "up_mul1, bool down_mcg, bool down_mul1, float act_limit) -> ()"); + ops.def( + "exl3_moe_active(Tensor hidden_state, Tensor! output_state, Tensor " + "expert_count, Tensor token_sorted, Tensor weight_sorted, Tensor " + "temp_state_g, Tensor temp_state_u, Tensor temp_intermediate_g, Tensor " + "temp_intermediate_u, int act_function, int K_gate, int K_up, int " + "K_down, Tensor gate_ptrs_trellis, Tensor gate_ptrs_suh, Tensor " + "gate_ptrs_svh, Tensor up_ptrs_trellis, Tensor up_ptrs_suh, Tensor " + "up_ptrs_svh, Tensor down_ptrs_trellis, Tensor down_ptrs_suh, Tensor " + "down_ptrs_svh, bool gate_mcg, bool gate_mul1, bool up_mcg, bool " + "up_mul1, bool down_mcg, bool down_mul1, float act_limit, int " + "num_active) -> ()"); + ops.def( + "make_gate_up_indices(Tensor! out, Tensor indices, int offset) -> ()"); + ops.def("silu_mul(Tensor! out, Tensor gate, Tensor up) -> ()"); } STABLE_TORCH_LIBRARY_IMPL(_C, CUDA, ops) { ops.impl("exl3_gemm", TORCH_BOX(&aphrodite_exl3_gemm)); ops.impl("exl3_mgemm", TORCH_BOX(&aphrodite_exl3_mgemm)); ops.impl("exl3_reconstruct", TORCH_BOX(&aphrodite_exl3_reconstruct)); + ops.impl("exl3_reconstruct_slice", + TORCH_BOX(&aphrodite_exl3_reconstruct_slice)); ops.impl("exl3_had_r_128", TORCH_BOX(&aphrodite_exl3_had_r_128)); + ops.impl("exl3_had_r_128_dual", TORCH_BOX(&aphrodite_exl3_had_r_128_dual)); ops.impl("exl3_hgemm", TORCH_BOX(&aphrodite_exl3_hgemm)); ops.impl("exl3_moe", TORCH_BOX(&aphrodite_exl3_moe)); + ops.impl("exl3_moe_active", TORCH_BOX(&aphrodite_exl3_moe_active)); + ops.impl("make_gate_up_indices", TORCH_BOX(&exl3_make_gate_up_indices)); + ops.impl("silu_mul", TORCH_BOX(&exl3_silu_mul)); } diff --git a/csrc/quantization/exl3/UPSTREAM.md b/csrc/quantization/exl3/UPSTREAM.md new file mode 100644 index 0000000000..937e89d720 --- /dev/null +++ b/csrc/quantization/exl3/UPSTREAM.md @@ -0,0 +1,12 @@ +# EXL3 upstream source + +The inference kernels in `exllamav3_ext` are vendored from +[`turboderp-org/exllamav3`](https://github.com/turboderp-org/exllamav3). + +- Branch: `dev` +- Commit: `cf055324f0725c30a94a9e96927f4597ec56fbc2` +- Upstream version: `1.3.0` + +Sonar supplies its own stable Torch ABI registrations and integrates the +kernels with its own model loader, tensor-parallel implementation, and engine. +Conversion kernels and the standalone ExLlama runtime are not vendored. diff --git a/csrc/quantization/exl3/exllamav3_ext/hgemm.cu b/csrc/quantization/exl3/exllamav3_ext/hgemm.cu index b83215a907..70e810e80d 100644 --- a/csrc/quantization/exl3/exllamav3_ext/hgemm.cu +++ b/csrc/quantization/exl3/exllamav3_ext/hgemm.cu @@ -3,6 +3,7 @@ #include "util.h" #include "util.cuh" #include "quant/exl3_devctx.cuh" +#include /* @@ -15,11 +16,10 @@ accumulate) using bfloat16 = __nv_bfloat16; -void hgemm_gr(at::Tensor a, at::Tensor b, at::Tensor c, Graph* graph) { +static void hgemm_gemmex_impl(at::Tensor a, at::Tensor b, at::Tensor c, + cudaStream_t stream) { const torch::stable::accelerator::DeviceGuard device_guard( a.get_device_index()); - cudaStream_t stream = graph ? graph->capture_stream - : get_current_cuda_stream(a.get_device_index()); bool output_fp32 = c.scalar_type() == at::kFloat; bool output_fp16 = c.scalar_type() == at::kHalf; @@ -30,8 +30,10 @@ void hgemm_gr(at::Tensor a, at::Tensor b, at::Tensor c, Graph* graph) { TORCH_CHECK_DTYPE(a, kHalf); TORCH_CHECK_DTYPE(b, kHalf); TORCH_CHECK_DIM(b, 2); + TORCH_CHECK(c.dim() >= 2, "c must have at least 2 dimensions"); TORCH_CHECK_SHAPES(a, -1, b, 0, 1); TORCH_CHECK_SHAPES(b, 1, c, -1, 1); + TORCH_CHECK(c.stride(-1) == 1, "c must have contiguous columns"); const half* a_ptr = (const half*)a.data_ptr(); const half* b_ptr = (const half*)b.data_ptr(); @@ -39,6 +41,10 @@ void hgemm_gr(at::Tensor a, at::Tensor b, at::Tensor c, Graph* graph) { int size_k = a.size(-1); int size_m = a.numel() / size_k; int size_n = b.size(-1); + int64_t c_stride_m = c.stride(-2); + TORCH_CHECK(c_stride_m >= size_n, "c row stride is too small"); + TORCH_CHECK(c_stride_m <= std::numeric_limits::max(), + "c row stride is too large"); // Set cuBLAS modes and workspace cublasHandle_t cublas_handle = get_current_cuda_blas_handle(); @@ -49,30 +55,22 @@ void hgemm_gr(at::Tensor a, at::Tensor b, at::Tensor c, Graph* graph) { void* ws = DevCtx::instance().get_ws(device); cublasSetWorkspace(cublas_handle, ws, WORKSPACE_SIZE); - if (output_fp16) { - half alpha_ = __float2half(1.0f); - half beta_ = __float2half(0.0f); - - half* c_ptr = (half*)c.data_ptr(); - auto r = cublasHgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, size_n, - size_m, size_k, &alpha_, b_ptr, size_n, a_ptr, size_k, - &beta_, c_ptr, size_n); - cublas_check(r); - cuda_check(cudaPeekAtLastError()); - } - if (output_fp32) { - float alpha_ = 1.0f; - float beta_ = 0.0f; + float alpha_ = 1.0f; + float beta_ = 0.0f; + cudaDataType_t c_type = output_fp32 ? CUDA_R_32F : CUDA_R_16F; + auto r = cublasGemmEx(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, size_n, size_m, + size_k, &alpha_, b_ptr, CUDA_R_16F, size_n, a_ptr, + CUDA_R_16F, size_k, &beta_, c.data_ptr(), c_type, + (int)c_stride_m, CUBLAS_COMPUTE_32F, + CUBLAS_GEMM_DEFAULT_TENSOR_OP); + cublas_check(r); + cuda_check(cudaPeekAtLastError()); +} - float* c_ptr = (float*)c.data_ptr(); - auto r = - cublasGemmEx(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, size_n, size_m, - size_k, &alpha_, b_ptr, CUDA_R_16F, size_n, a_ptr, - CUDA_R_16F, size_k, &beta_, c_ptr, CUDA_R_32F, size_n, - CUBLAS_COMPUTE_32F, CUBLAS_GEMM_DEFAULT_TENSOR_OP); - cublas_check(r); - cuda_check(cudaPeekAtLastError()); - } +void hgemm_gr(at::Tensor a, at::Tensor b, at::Tensor c, Graph* graph) { + cudaStream_t stream = graph ? graph->capture_stream + : get_current_cuda_stream(a.get_device_index()); + hgemm_gemmex_impl(a, b, c, stream); if (graph) graph->need_cublas = true; } diff --git a/csrc/quantization/exl3/exllamav3_ext/ptx.cuh b/csrc/quantization/exl3/exllamav3_ext/ptx.cuh index fb6624b229..ee69d39d46 100644 --- a/csrc/quantization/exl3/exllamav3_ext/ptx.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/ptx.cuh @@ -206,7 +206,10 @@ __device__ __forceinline__ uint4 ldg_cv_u128(const uint4* p) { __device__ __forceinline__ uint32_t ldg_acquire_sys_u32(const uint32_t* p) { uint32_t v; - asm volatile("ld.global.acquire.sys.u32 %0, [%1];" : "=r"(v) : "l"(p)); + asm volatile("ld.global.acquire.sys.u32 %0, [%1];" + : "=r"(v) + : "l"(p) + : "memory"); return v; } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/codebook.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/codebook.cuh index d031dc8a47..c892312520 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/codebook.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/codebook.cuh @@ -1,9 +1,9 @@ #pragma once -// Force integer MAD on sm<=86. For some reason this performs better than -// letting the compiler emit IMUL -// TODO: Keep an eye on new behavior in future versions of nvcc. While this is -// faster on RTX 3090, it really shouldn't be. +// This used to force integer MAD on sm_86 via inline asm, which outperformed +// the IMUL emitted by older nvcc versions on the RTX 3090. As of CUDA 13.2 the +// workaround has inverted: the plain multiply is ~4% faster end-to-end at m=1. +// Kept as a hook in case it regresses again. template __device__ __forceinline__ uint32_t mul_const_u32(uint32_t x) { #if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ == 860) @@ -22,6 +22,37 @@ __device__ __forceinline__ uint32_t mul_const_u32(uint32_t x) { #endif } +// Decode two mul1 (cb 2) codebook entries from precomputed products x0 = idx0 * +// 0x83DCD12D, x1 = idx1 * 0x83DCD12D +__device__ inline half2 decode_mul1_product_2(uint32_t x0, uint32_t x1) { + const uint32_t acc = 0x6400u; // 0x6400 -> 1024.0 .. 0x67FF -> 2047.0 + // uint32_t sum0; + // uint32_t sum1; + // asm ("vabsdiff4.u32.u32.u32.add %0, %1, %2, %3;" : "=r"(sum0) : "r"(x0), + // "r"(0), "r"(acc) : ); asm ("vabsdiff4.u32.u32.u32.add %0, %1, %2, %3;" : + // "=r"(sum1) : "r"(x1), "r"(0), "r"(acc) : ); + uint32_t sum0 = __dp4a(x0, 0x01010101u, acc); + uint32_t sum1 = __dp4a(x1, 0x01010101u, acc); + half2 k_inv_h2 = + __half2half2(__ushort_as_half(0x1eee)); // 0.00677 = 1/147.7 + half2 k_bias_h2 = __half2half2( + __ushort_as_half(0xc931)); // -10.39 = (-1024.0 - 510.0) * k_inv_h + half_uint16 h0((uint16_t)sum0); + half_uint16 h1((uint16_t)sum1); + return __hfma2(__halves2half2(h0.as_half, h1.as_half), k_inv_h2, k_bias_h2); +} + +// Ditto mcg (cb 1) +__device__ inline half2 decode_mcg_product_2(uint32_t x0, uint32_t x1) { + asm("lop3.b32 %0, %0, 0x8fff8fff, 0x3b603b60, 0x6a;" : "+r"(x0)); + asm("lop3.b32 %0, %0, 0x8fff8fff, 0x3b603b60, 0x6a;" : "+r"(x1)); + half2_uint32 xu0(x0); + half2_uint32 xu1(x1); + half2 d0 = __lows2half2(xu0.as_half2, xu1.as_half2); + half2 d1 = __highs2half2(xu0.as_half2, xu1.as_half2); + return __hadd2(d0, d1); +} + template __device__ inline half decode_3inst(uint32_t x) { if constexpr (cb == 0) { @@ -32,8 +63,8 @@ __device__ inline half decode_3inst(uint32_t x) { return __hadd(__low2half(xu.as_half2), __high2half(xu.as_half2)); } if constexpr (cb == 1) { - // x *= 0xCBAC1FEDu; - x = mul_const_u32<0xCBAC1FEDu>(x); + x *= 0xCBAC1FEDu; + // x = mul_const_u32<0xCBAC1FEDu>(x); asm("lop3.b32 %0, %0, 0x8fff8fff, 0x3b603b60, 0x6a;" : "+r"(x)); half2_uint32 xu(x); @@ -41,12 +72,13 @@ __device__ inline half decode_3inst(uint32_t x) { } if constexpr (cb == 2) { x *= 0x83DCD12Du; - uint32_t sum; const uint32_t acc = 0x6400u; // 0x6400 -> 1024.0 .. 0x67FF -> 2047.0 - asm("vabsdiff4.u32.u32.u32.add %0, %1, %2, %3;" - : "=r"(sum) - : "r"(x), "r"(0), "r"(acc) - :); + // Byte sum via dp4a, bit-identical to the previous vabsdiff4(x, 0, acc) but + // native on Blackwell where vabsdiff4 is emulated. dp4a also wins om Ampere + // now, possibly after compiler changes, and ties on Ada uint32_t sum; asm + // ("vabsdiff4.u32.u32.u32.add %0, %1, %2, %3;" : "=r"(sum) : "r"(x), + // "r"(0), "r"(acc) : ); + uint32_t sum = __dp4a(x, 0x01010101u, acc); const __half k_inv_h = __ushort_as_half(0x1eee); // 0.00677 = 1/147.7 const __half k_bias_h = __ushort_as_half(0xc931); // -10.39 = (-1024.0 - 510.0) * k_inv_h @@ -71,39 +103,16 @@ __device__ inline half2 decode_3inst_2(uint32_t x0, uint32_t x1) { return __hadd2(d0, d1); } if constexpr (cb == 1) { - // x0 *= 0xCBAC1FEDu; - // x1 *= 0xCBAC1FEDu; - x0 = mul_const_u32<0xCBAC1FEDu>(x0); - x1 = mul_const_u32<0xCBAC1FEDu>(x1); - asm("lop3.b32 %0, %0, 0x8fff8fff, 0x3b603b60, 0x6a;" : "+r"(x0)); - asm("lop3.b32 %0, %0, 0x8fff8fff, 0x3b603b60, 0x6a;" : "+r"(x1)); - half2_uint32 xu0(x0); - half2_uint32 xu1(x1); - half2 d0 = __lows2half2(xu0.as_half2, xu1.as_half2); - half2 d1 = __highs2half2(xu0.as_half2, xu1.as_half2); - return __hadd2(d0, d1); + // x0 = mul_const_u32<0xCBAC1FEDu>(x0); + // x1 = mul_const_u32<0xCBAC1FEDu>(x1); + x0 *= 0xCBAC1FEDu; + x1 *= 0xCBAC1FEDu; + return decode_mcg_product_2(x0, x1); } if constexpr (cb == 2) { x0 *= 0x83DCD12Du; x1 *= 0x83DCD12Du; - uint32_t sum0; - uint32_t sum1; - const uint32_t acc = 0x6400u; // 0x6400 -> 1024.0 .. 0x67FF -> 2047.0 - asm("vabsdiff4.u32.u32.u32.add %0, %1, %2, %3;" - : "=r"(sum0) - : "r"(x0), "r"(0), "r"(acc) - :); - asm("vabsdiff4.u32.u32.u32.add %0, %1, %2, %3;" - : "=r"(sum1) - : "r"(x1), "r"(0), "r"(acc) - :); - half2 k_inv_h2 = - __half2half2(__ushort_as_half(0x1eee)); // 0.00677 = 1/147.7 - half2 k_bias_h2 = __half2half2( - __ushort_as_half(0xc931)); // -10.39 = (-1024.0 - 510.0) * k_inv_h - half_uint16 h0((uint16_t)sum0); - half_uint16 h1((uint16_t)sum1); - return __hfma2(__halves2half2(h0.as_half, h1.as_half), k_inv_h2, k_bias_h2); + return decode_mul1_product_2(x0, x1); } } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1_cb0.cu similarity index 81% rename from csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1.cu rename to csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1_cb0.cu index cfcb2074c4..919191d6d1 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1_cb0.cu @@ -1,4 +1,5 @@ #include +#include #include namespace cg = cooperative_groups; #include "../../util.h" @@ -7,4 +8,4 @@ namespace cg = cooperative_groups; #include "../exl3_gemm_kernel.cuh" #include "exl3_comp_unit_1.cuh" -ALL_EXL3_KERNEL_INSTANCES(1) \ No newline at end of file +EXL3_KERNEL_INSTANCES_CB(1, 0) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1_cb1.cu new file mode 100644 index 0000000000..167588c147 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1_cb1.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_1.cuh" + +EXL3_KERNEL_INSTANCES_CB(1, 1) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1_cb2.cu new file mode 100644 index 0000000000..a8eee71fb4 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_1_cb2.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_1.cuh" + +EXL3_KERNEL_INSTANCES_CB(1, 2) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2_cb0.cu similarity index 81% rename from csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2.cu rename to csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2_cb0.cu index 64375a4a86..8eac8aad80 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2_cb0.cu @@ -1,4 +1,5 @@ #include +#include #include namespace cg = cooperative_groups; #include "../../util.h" @@ -7,4 +8,4 @@ namespace cg = cooperative_groups; #include "../exl3_gemm_kernel.cuh" #include "exl3_comp_unit_2.cuh" -ALL_EXL3_KERNEL_INSTANCES(2) +EXL3_KERNEL_INSTANCES_CB(2, 0) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2_cb1.cu new file mode 100644 index 0000000000..cc2891655c --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2_cb1.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_2.cuh" + +EXL3_KERNEL_INSTANCES_CB(2, 1) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2_cb2.cu new file mode 100644 index 0000000000..dcae1de85c --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_2_cb2.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_2.cuh" + +EXL3_KERNEL_INSTANCES_CB(2, 2) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3_cb0.cu similarity index 81% rename from csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3.cu rename to csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3_cb0.cu index c756851ba5..2a20d50410 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3_cb0.cu @@ -1,4 +1,5 @@ #include +#include #include namespace cg = cooperative_groups; #include "../../util.h" @@ -7,4 +8,4 @@ namespace cg = cooperative_groups; #include "../exl3_gemm_kernel.cuh" #include "exl3_comp_unit_3.cuh" -ALL_EXL3_KERNEL_INSTANCES(3) +EXL3_KERNEL_INSTANCES_CB(3, 0) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3_cb1.cu new file mode 100644 index 0000000000..b0932c92e1 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3_cb1.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_3.cuh" + +EXL3_KERNEL_INSTANCES_CB(3, 1) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3_cb2.cu new file mode 100644 index 0000000000..36b77d78ac --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_3_cb2.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_3.cuh" + +EXL3_KERNEL_INSTANCES_CB(3, 2) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4_cb0.cu similarity index 81% rename from csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4.cu rename to csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4_cb0.cu index 744e7b40f7..d333fa628d 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4_cb0.cu @@ -1,4 +1,5 @@ #include +#include #include namespace cg = cooperative_groups; #include "../../util.h" @@ -7,4 +8,4 @@ namespace cg = cooperative_groups; #include "../exl3_gemm_kernel.cuh" #include "exl3_comp_unit_4.cuh" -ALL_EXL3_KERNEL_INSTANCES(4) +EXL3_KERNEL_INSTANCES_CB(4, 0) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4_cb1.cu new file mode 100644 index 0000000000..3fd0394834 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4_cb1.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_4.cuh" + +EXL3_KERNEL_INSTANCES_CB(4, 1) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4_cb2.cu new file mode 100644 index 0000000000..d7b9f5c503 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_4_cb2.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_4.cuh" + +EXL3_KERNEL_INSTANCES_CB(4, 2) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5_cb0.cu similarity index 81% rename from csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5.cu rename to csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5_cb0.cu index adc99dac25..3430104125 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5_cb0.cu @@ -1,4 +1,5 @@ #include +#include #include namespace cg = cooperative_groups; #include "../../util.h" @@ -7,4 +8,4 @@ namespace cg = cooperative_groups; #include "../exl3_gemm_kernel.cuh" #include "exl3_comp_unit_5.cuh" -ALL_EXL3_KERNEL_INSTANCES(5) +EXL3_KERNEL_INSTANCES_CB(5, 0) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5_cb1.cu new file mode 100644 index 0000000000..4d69ce6b7a --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5_cb1.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_5.cuh" + +EXL3_KERNEL_INSTANCES_CB(5, 1) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5_cb2.cu new file mode 100644 index 0000000000..757278deeb --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_5_cb2.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_5.cuh" + +EXL3_KERNEL_INSTANCES_CB(5, 2) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6_cb0.cu similarity index 81% rename from csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6.cu rename to csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6_cb0.cu index 9593457ae9..e60afdc0bb 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6_cb0.cu @@ -1,4 +1,5 @@ #include +#include #include namespace cg = cooperative_groups; #include "../../util.h" @@ -7,4 +8,4 @@ namespace cg = cooperative_groups; #include "../exl3_gemm_kernel.cuh" #include "exl3_comp_unit_6.cuh" -ALL_EXL3_KERNEL_INSTANCES(6) +EXL3_KERNEL_INSTANCES_CB(6, 0) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6_cb1.cu new file mode 100644 index 0000000000..8f1352cb38 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6_cb1.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_6.cuh" + +EXL3_KERNEL_INSTANCES_CB(6, 1) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6_cb2.cu new file mode 100644 index 0000000000..660dc12ea5 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_6_cb2.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_6.cuh" + +EXL3_KERNEL_INSTANCES_CB(6, 2) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7_cb0.cu similarity index 81% rename from csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7.cu rename to csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7_cb0.cu index cb7af49662..11e41df823 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7_cb0.cu @@ -1,4 +1,5 @@ #include +#include #include namespace cg = cooperative_groups; #include "../../util.h" @@ -7,4 +8,4 @@ namespace cg = cooperative_groups; #include "../exl3_gemm_kernel.cuh" #include "exl3_comp_unit_7.cuh" -ALL_EXL3_KERNEL_INSTANCES(7) +EXL3_KERNEL_INSTANCES_CB(7, 0) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7_cb1.cu new file mode 100644 index 0000000000..5327a6ec59 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7_cb1.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_7.cuh" + +EXL3_KERNEL_INSTANCES_CB(7, 1) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7_cb2.cu new file mode 100644 index 0000000000..b94e974f68 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_7_cb2.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_7.cuh" + +EXL3_KERNEL_INSTANCES_CB(7, 2) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8_cb0.cu similarity index 81% rename from csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8.cu rename to csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8_cb0.cu index 63ce549809..bae4416b32 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8_cb0.cu @@ -1,4 +1,5 @@ #include +#include #include namespace cg = cooperative_groups; #include "../../util.h" @@ -7,4 +8,4 @@ namespace cg = cooperative_groups; #include "../exl3_gemm_kernel.cuh" #include "exl3_comp_unit_8.cuh" -ALL_EXL3_KERNEL_INSTANCES(8) +EXL3_KERNEL_INSTANCES_CB(8, 0) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8_cb1.cu new file mode 100644 index 0000000000..698c2fcc9e --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8_cb1.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_8.cuh" + +EXL3_KERNEL_INSTANCES_CB(8, 1) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8_cb2.cu new file mode 100644 index 0000000000..7b7bc5d1bb --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_comp_unit_8_cb2.cu @@ -0,0 +1,11 @@ +#include +#include +#include +namespace cg = cooperative_groups; +#include "../../util.h" +#include "../../util.cuh" +#include "../../ptx.cuh" +#include "../exl3_gemm_kernel.cuh" +#include "exl3_comp_unit_8.cuh" + +EXL3_KERNEL_INSTANCES_CB(8, 2) diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k1.cu new file mode 100644 index 0000000000..36b1e8f5da --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k1.cu @@ -0,0 +1,11 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_coop_sel_k1(bool c_fp32, bool residual) { + if (c_fp32) + return residual ? (void*)exl3_gemv_int8_coop_kernel<1, true, true> + : (void*)exl3_gemv_int8_coop_kernel<1, true, false>; + else + return residual ? (void*)exl3_gemv_int8_coop_kernel<1, false, true> + : (void*)exl3_gemv_int8_coop_kernel<1, false, false>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k2.cu new file mode 100644 index 0000000000..d98b934e65 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k2.cu @@ -0,0 +1,11 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_coop_sel_k2(bool c_fp32, bool residual) { + if (c_fp32) + return residual ? (void*)exl3_gemv_int8_coop_kernel<2, true, true> + : (void*)exl3_gemv_int8_coop_kernel<2, true, false>; + else + return residual ? (void*)exl3_gemv_int8_coop_kernel<2, false, true> + : (void*)exl3_gemv_int8_coop_kernel<2, false, false>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k3.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k3.cu new file mode 100644 index 0000000000..b8663cad0a --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k3.cu @@ -0,0 +1,11 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_coop_sel_k3(bool c_fp32, bool residual) { + if (c_fp32) + return residual ? (void*)exl3_gemv_int8_coop_kernel<3, true, true> + : (void*)exl3_gemv_int8_coop_kernel<3, true, false>; + else + return residual ? (void*)exl3_gemv_int8_coop_kernel<3, false, true> + : (void*)exl3_gemv_int8_coop_kernel<3, false, false>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k4.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k4.cu new file mode 100644 index 0000000000..065095bd26 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k4.cu @@ -0,0 +1,11 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_coop_sel_k4(bool c_fp32, bool residual) { + if (c_fp32) + return residual ? (void*)exl3_gemv_int8_coop_kernel<4, true, true> + : (void*)exl3_gemv_int8_coop_kernel<4, true, false>; + else + return residual ? (void*)exl3_gemv_int8_coop_kernel<4, false, true> + : (void*)exl3_gemv_int8_coop_kernel<4, false, false>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k5.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k5.cu new file mode 100644 index 0000000000..2a15204f53 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k5.cu @@ -0,0 +1,11 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_coop_sel_k5(bool c_fp32, bool residual) { + if (c_fp32) + return residual ? (void*)exl3_gemv_int8_coop_kernel<5, true, true> + : (void*)exl3_gemv_int8_coop_kernel<5, true, false>; + else + return residual ? (void*)exl3_gemv_int8_coop_kernel<5, false, true> + : (void*)exl3_gemv_int8_coop_kernel<5, false, false>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k6.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k6.cu new file mode 100644 index 0000000000..06949a8997 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k6.cu @@ -0,0 +1,11 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_coop_sel_k6(bool c_fp32, bool residual) { + if (c_fp32) + return residual ? (void*)exl3_gemv_int8_coop_kernel<6, true, true> + : (void*)exl3_gemv_int8_coop_kernel<6, true, false>; + else + return residual ? (void*)exl3_gemv_int8_coop_kernel<6, false, true> + : (void*)exl3_gemv_int8_coop_kernel<6, false, false>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k7.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k7.cu new file mode 100644 index 0000000000..2eb041ced1 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k7.cu @@ -0,0 +1,11 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_coop_sel_k7(bool c_fp32, bool residual) { + if (c_fp32) + return residual ? (void*)exl3_gemv_int8_coop_kernel<7, true, true> + : (void*)exl3_gemv_int8_coop_kernel<7, true, false>; + else + return residual ? (void*)exl3_gemv_int8_coop_kernel<7, false, true> + : (void*)exl3_gemv_int8_coop_kernel<7, false, false>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k8.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k8.cu new file mode 100644 index 0000000000..24db623cca --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_coop_k8.cu @@ -0,0 +1,11 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_coop_sel_k8(bool c_fp32, bool residual) { + if (c_fp32) + return residual ? (void*)exl3_gemv_int8_coop_kernel<8, true, true> + : (void*)exl3_gemv_int8_coop_kernel<8, true, false>; + else + return residual ? (void*)exl3_gemv_int8_coop_kernel<8, false, true> + : (void*)exl3_gemv_int8_coop_kernel<8, false, false>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k1.cu new file mode 100644 index 0000000000..c596b3cb61 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k1.cu @@ -0,0 +1,22 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_sq_sel_k1(int M, bool c_fp32, bool residual) { +#define SELM_(M_) \ + if (c_fp32) \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<1, M_, true, true> \ + : (void*)exl3_gemv_int8_sq_kernel<1, M_, true, false>; \ + else \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<1, M_, false, true> \ + : (void*)exl3_gemv_int8_sq_kernel<1, M_, false, false>; + switch (M) { + case 1: { + SELM_(1) + } + case 2: { + SELM_(2) + } + } +#undef SELM_ + return nullptr; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k2.cu new file mode 100644 index 0000000000..f1a99572b2 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k2.cu @@ -0,0 +1,22 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_sq_sel_k2(int M, bool c_fp32, bool residual) { +#define SELM_(M_) \ + if (c_fp32) \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<2, M_, true, true> \ + : (void*)exl3_gemv_int8_sq_kernel<2, M_, true, false>; \ + else \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<2, M_, false, true> \ + : (void*)exl3_gemv_int8_sq_kernel<2, M_, false, false>; + switch (M) { + case 1: { + SELM_(1) + } + case 2: { + SELM_(2) + } + } +#undef SELM_ + return nullptr; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k3.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k3.cu new file mode 100644 index 0000000000..3dea86a1b9 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k3.cu @@ -0,0 +1,22 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_sq_sel_k3(int M, bool c_fp32, bool residual) { +#define SELM_(M_) \ + if (c_fp32) \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<3, M_, true, true> \ + : (void*)exl3_gemv_int8_sq_kernel<3, M_, true, false>; \ + else \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<3, M_, false, true> \ + : (void*)exl3_gemv_int8_sq_kernel<3, M_, false, false>; + switch (M) { + case 1: { + SELM_(1) + } + case 2: { + SELM_(2) + } + } +#undef SELM_ + return nullptr; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k4.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k4.cu new file mode 100644 index 0000000000..9f9fd57bdb --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k4.cu @@ -0,0 +1,22 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_sq_sel_k4(int M, bool c_fp32, bool residual) { +#define SELM_(M_) \ + if (c_fp32) \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<4, M_, true, true> \ + : (void*)exl3_gemv_int8_sq_kernel<4, M_, true, false>; \ + else \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<4, M_, false, true> \ + : (void*)exl3_gemv_int8_sq_kernel<4, M_, false, false>; + switch (M) { + case 1: { + SELM_(1) + } + case 2: { + SELM_(2) + } + } +#undef SELM_ + return nullptr; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k5.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k5.cu new file mode 100644 index 0000000000..6c5826cb23 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k5.cu @@ -0,0 +1,22 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_sq_sel_k5(int M, bool c_fp32, bool residual) { +#define SELM_(M_) \ + if (c_fp32) \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<5, M_, true, true> \ + : (void*)exl3_gemv_int8_sq_kernel<5, M_, true, false>; \ + else \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<5, M_, false, true> \ + : (void*)exl3_gemv_int8_sq_kernel<5, M_, false, false>; + switch (M) { + case 1: { + SELM_(1) + } + case 2: { + SELM_(2) + } + } +#undef SELM_ + return nullptr; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k6.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k6.cu new file mode 100644 index 0000000000..afb38d5d90 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_inst_sq_k6.cu @@ -0,0 +1,22 @@ +#include "exl3_gemv_int8_instances.cuh" +#include "../exl3_gemv_int8_kernel.cuh" + +void* exl3_gemv_int8_sq_sel_k6(int M, bool c_fp32, bool residual) { +#define SELM_(M_) \ + if (c_fp32) \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<6, M_, true, true> \ + : (void*)exl3_gemv_int8_sq_kernel<6, M_, true, false>; \ + else \ + return residual ? (void*)exl3_gemv_int8_sq_kernel<6, M_, false, true> \ + : (void*)exl3_gemv_int8_sq_kernel<6, M_, false, false>; + switch (M) { + case 1: { + SELM_(1) + } + case 2: { + SELM_(2) + } + } +#undef SELM_ + return nullptr; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_instances.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_instances.cuh new file mode 100644 index 0000000000..4650046788 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_gemv_int8_instances.cuh @@ -0,0 +1,20 @@ +#pragma once + +// Per-K selectors for the int8 GEMV kernel instances, each defined in its own +// compilation unit + +void* exl3_gemv_int8_sq_sel_k1(int M, bool c_fp32, bool residual); +void* exl3_gemv_int8_sq_sel_k2(int M, bool c_fp32, bool residual); +void* exl3_gemv_int8_sq_sel_k3(int M, bool c_fp32, bool residual); +void* exl3_gemv_int8_sq_sel_k4(int M, bool c_fp32, bool residual); +void* exl3_gemv_int8_sq_sel_k5(int M, bool c_fp32, bool residual); +void* exl3_gemv_int8_sq_sel_k6(int M, bool c_fp32, bool residual); + +void* exl3_gemv_int8_coop_sel_k1(bool c_fp32, bool residual); +void* exl3_gemv_int8_coop_sel_k2(bool c_fp32, bool residual); +void* exl3_gemv_int8_coop_sel_k3(bool c_fp32, bool residual); +void* exl3_gemv_int8_coop_sel_k4(bool c_fp32, bool residual); +void* exl3_gemv_int8_coop_sel_k5(bool c_fp32, bool residual); +void* exl3_gemv_int8_coop_sel_k6(bool c_fp32, bool residual); +void* exl3_gemv_int8_coop_sel_k7(bool c_fp32, bool residual); +void* exl3_gemv_int8_coop_sel_k8(bool c_fp32, bool residual); diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n128_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n128_cb1.cu new file mode 100644 index 0000000000..d805f96b47 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n128_cb1.cu @@ -0,0 +1,6 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k0_n128_cb1() { + return exl3_moe_kernel<0, 128, 1>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n128_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n128_cb2.cu new file mode 100644 index 0000000000..80c443133a --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n128_cb2.cu @@ -0,0 +1,6 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k0_n128_cb2() { + return exl3_moe_kernel<0, 128, 2>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n256_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n256_cb1.cu new file mode 100644 index 0000000000..204b476349 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n256_cb1.cu @@ -0,0 +1,6 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k0_n256_cb1() { + return exl3_moe_kernel<0, 256, 1>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n256_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n256_cb2.cu new file mode 100644 index 0000000000..c1763bf028 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k0_n256_cb2.cu @@ -0,0 +1,6 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k0_n256_cb2() { + return exl3_moe_kernel<0, 256, 2>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k1_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k1_cb1.cu new file mode 100644 index 0000000000..22fff213b1 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k1_cb1.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k1_n128_cb1() { + return exl3_moe_kernel<1, 128, 1>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k1_n256_cb1() { + return exl3_moe_kernel<1, 256, 1>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k1_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k1_cb2.cu new file mode 100644 index 0000000000..d48ca311cd --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k1_cb2.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k1_n128_cb2() { + return exl3_moe_kernel<1, 128, 2>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k1_n256_cb2() { + return exl3_moe_kernel<1, 256, 2>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k2_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k2_cb1.cu new file mode 100644 index 0000000000..c8518e0391 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k2_cb1.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k2_n128_cb1() { + return exl3_moe_kernel<2, 128, 1>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k2_n256_cb1() { + return exl3_moe_kernel<2, 256, 1>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k2_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k2_cb2.cu new file mode 100644 index 0000000000..1adb538f74 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k2_cb2.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k2_n128_cb2() { + return exl3_moe_kernel<2, 128, 2>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k2_n256_cb2() { + return exl3_moe_kernel<2, 256, 2>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k3_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k3_cb1.cu new file mode 100644 index 0000000000..6af9e92a2a --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k3_cb1.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k3_n128_cb1() { + return exl3_moe_kernel<3, 128, 1>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k3_n256_cb1() { + return exl3_moe_kernel<3, 256, 1>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k3_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k3_cb2.cu new file mode 100644 index 0000000000..fee9d60a9e --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k3_cb2.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k3_n128_cb2() { + return exl3_moe_kernel<3, 128, 2>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k3_n256_cb2() { + return exl3_moe_kernel<3, 256, 2>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k4_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k4_cb1.cu new file mode 100644 index 0000000000..972107bbc6 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k4_cb1.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k4_n128_cb1() { + return exl3_moe_kernel<4, 128, 1>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k4_n256_cb1() { + return exl3_moe_kernel<4, 256, 1>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k4_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k4_cb2.cu new file mode 100644 index 0000000000..fd34b3c4b2 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k4_cb2.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k4_n128_cb2() { + return exl3_moe_kernel<4, 128, 2>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k4_n256_cb2() { + return exl3_moe_kernel<4, 256, 2>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k5_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k5_cb1.cu new file mode 100644 index 0000000000..0206f8c0cf --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k5_cb1.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k5_n128_cb1() { + return exl3_moe_kernel<5, 128, 1>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k5_n256_cb1() { + return exl3_moe_kernel<5, 256, 1>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k5_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k5_cb2.cu new file mode 100644 index 0000000000..c07af97a5d --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k5_cb2.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k5_n128_cb2() { + return exl3_moe_kernel<5, 128, 2>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k5_n256_cb2() { + return exl3_moe_kernel<5, 256, 2>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k6_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k6_cb1.cu new file mode 100644 index 0000000000..0f59915d5e --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k6_cb1.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k6_n128_cb1() { + return exl3_moe_kernel<6, 128, 1>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k6_n256_cb1() { + return exl3_moe_kernel<6, 256, 1>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k6_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k6_cb2.cu new file mode 100644 index 0000000000..08f7f3c05d --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k6_cb2.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k6_n128_cb2() { + return exl3_moe_kernel<6, 128, 2>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k6_n256_cb2() { + return exl3_moe_kernel<6, 256, 2>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k7_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k7_cb1.cu new file mode 100644 index 0000000000..3db6847608 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k7_cb1.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k7_n128_cb1() { + return exl3_moe_kernel<7, 128, 1>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k7_n256_cb1() { + return exl3_moe_kernel<7, 256, 1>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k7_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k7_cb2.cu new file mode 100644 index 0000000000..332cbeb2d6 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k7_cb2.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k7_n128_cb2() { + return exl3_moe_kernel<7, 128, 2>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k7_n256_cb2() { + return exl3_moe_kernel<7, 256, 2>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k8_cb1.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k8_cb1.cu new file mode 100644 index 0000000000..838acd549e --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k8_cb1.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k8_n128_cb1() { + return exl3_moe_kernel<8, 128, 1>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k8_n256_cb1() { + return exl3_moe_kernel<8, 256, 1>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k8_cb2.cu b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k8_cb2.cu new file mode 100644 index 0000000000..c80e866ec2 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_inst_k8_cb2.cu @@ -0,0 +1,9 @@ +#include "exl3_moe_instances.cuh" +#include "../exl3_moe_kernel.cuh" + +fp_exl3_moe_kernel exl3_moe_kernel_k8_n128_cb2() { + return exl3_moe_kernel<8, 128, 2>; +} +fp_exl3_moe_kernel exl3_moe_kernel_k8_n256_cb2() { + return exl3_moe_kernel<8, 256, 2>; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_instances.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_instances.cuh new file mode 100644 index 0000000000..6cdbfcf0ab --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/comp_units/exl3_moe_instances.cuh @@ -0,0 +1,25 @@ +#pragma once + +#include "../exl3_moe_common.cuh" + +typedef void (*fp_exl3_moe_kernel)(EXL3_MOE_KERNEL_ARGS); + +#define EXL3_MOE_DECLARE_GETTERS(K) \ + fp_exl3_moe_kernel exl3_moe_kernel_k##K##_n128_cb1(); \ + fp_exl3_moe_kernel exl3_moe_kernel_k##K##_n256_cb1(); \ + fp_exl3_moe_kernel exl3_moe_kernel_k##K##_n128_cb2(); \ + fp_exl3_moe_kernel exl3_moe_kernel_k##K##_n256_cb2(); + +EXL3_MOE_DECLARE_GETTERS(0); +EXL3_MOE_DECLARE_GETTERS(1); +EXL3_MOE_DECLARE_GETTERS(2); +EXL3_MOE_DECLARE_GETTERS(3); +EXL3_MOE_DECLARE_GETTERS(4); +EXL3_MOE_DECLARE_GETTERS(5); +EXL3_MOE_DECLARE_GETTERS(6); +EXL3_MOE_DECLARE_GETTERS(7); +EXL3_MOE_DECLARE_GETTERS(8); + +#undef EXL3_MOE_DECLARE_GETTERS + +extern fp_exl3_moe_kernel exl3_moe_kernel_instances[]; diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/coop_autotune.cu b/csrc/quantization/exl3/exllamav3_ext/quant/coop_autotune.cu new file mode 100644 index 0000000000..4054509bbc --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/coop_autotune.cu @@ -0,0 +1,526 @@ +#include +#include "coop_autotune.cuh" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../util.cuh" +#include "../util.h" + +// #define CACHEDEBUG 1 + +namespace { + +constexpr uint64_t COOP_AUTOTUNE_VERSION = 3; +constexpr char DISK_CACHE_MAGIC[8] = {'E', 'X', '3', 'A', 'T', 'U', 'N', 'E'}; +constexpr uint32_t DISK_CACHE_FORMAT = 1; + +struct ExpandedCandidate { + void* kernel; + int block_dim; + int num_sms; + int concurrency; + int tag; + float latency; + std::vector samples; +}; + +struct DiskCacheHeader { + char magic[8]; + uint32_t format; + uint32_t record_size; +}; + +struct DiskCacheRecordV1 { + uint64_t hash; + int32_t tag; + int32_t block_dim; + int32_t num_sms; + int32_t concurrency; + uint32_t reserved0; + uint32_t reserved1; +}; + +std::map launch_cache; + +std::set> attr_set; + +std::mutex disk_mutex; +bool disk_cache_loaded = false; +std::map disk_cache; + +uint64_t salt_hash(uint64_t hash) { + hash ^= COOP_AUTOTUNE_VERSION; + hash *= 1099511628211ull; + return hash; +} + +std::filesystem::path disk_cache_path() { + const char* override_path = std::getenv("EXLLAMAV3_TUNE_CACHE"); + if (override_path && override_path[0]) { + std::filesystem::path path = std::filesystem::path(override_path); + std::error_code ec; + if (std::filesystem::is_directory(path, ec)) + return path / "coop_autotune_v1.bin"; + return path; + } + + std::filesystem::path base; +#ifdef _WIN32 + const char* local_app_data = std::getenv("LOCALAPPDATA"); + if (local_app_data && local_app_data[0]) + base = std::filesystem::path(local_app_data); + else { + const char* user_profile = std::getenv("USERPROFILE"); + if (!user_profile || !user_profile[0]) return {}; + std::filesystem::path user_path = std::filesystem::path(user_profile); + std::filesystem::path local_path = user_path / "AppData" / "Local"; + std::error_code ec; + if (std::filesystem::exists(local_path, ec)) + base = local_path; + else + base = user_path; + } + + return base / "exllamav3" / "autotune" / "coop_autotune_v1.bin"; +#else + const char* xdg = std::getenv("XDG_CACHE_HOME"); + if (xdg && xdg[0]) + base = std::filesystem::path(xdg); + else { + const char* home = std::getenv("HOME"); + if (!home || !home[0]) return {}; + base = std::filesystem::path(home) / ".cache"; + } + + return base / "exllamav3" / "autotune" / "coop_autotune_v1.bin"; +#endif +} + +bool read_disk_header(std::ifstream& in) { + DiskCacheHeader header; + in.read((char*)&header, sizeof(header)); + if (!in) return false; + if (std::memcmp(header.magic, DISK_CACHE_MAGIC, sizeof(header.magic)) != 0) + return false; + if (header.format != DISK_CACHE_FORMAT) return false; + if (header.record_size < sizeof(DiskCacheRecordV1)) return false; + return true; +} + +void load_disk_cache_locked() { + if (disk_cache_loaded) return; + disk_cache_loaded = true; + + std::filesystem::path path = disk_cache_path(); + if (path.empty() || !std::filesystem::exists(path)) return; + + std::ifstream in(path, std::ios::binary); + if (!in || !read_disk_header(in)) return; + + DiskCacheHeader header; + in.seekg(0, std::ios::beg); + in.read((char*)&header, sizeof(header)); + if (!in) return; + + std::vector record_bytes(header.record_size); + while (in.read(record_bytes.data(), header.record_size)) { + DiskCacheRecordV1 record; + std::memcpy(&record, record_bytes.data(), sizeof(record)); + disk_cache[record.hash] = record; + } + +#ifdef CACHEDEBUG + printf("coop_autotune cache loaded: path=%s records=%zu\n", + path.string().c_str(), disk_cache.size()); +#endif +} + +void append_disk_cache_locked(const DiskCacheRecordV1& record) { + std::filesystem::path path = disk_cache_path(); + if (path.empty()) return; + + std::error_code ec; + std::filesystem::create_directories(path.parent_path(), ec); + if (ec) return; + + bool write_header = !std::filesystem::exists(path) || + std::filesystem::file_size(path, ec) == 0; + std::ofstream out(path, std::ios::binary | std::ios::app); + if (!out) return; + + if (write_header) { + DiskCacheHeader header; + std::memcpy(header.magic, DISK_CACHE_MAGIC, sizeof(header.magic)); + header.format = DISK_CACHE_FORMAT; + header.record_size = sizeof(DiskCacheRecordV1); + out.write((const char*)&header, sizeof(header)); + } + + out.write((const char*)&record, sizeof(record)); +} + +bool launch_from_disk_cache( + uint64_t hash, const std::vector& candidates, + CoopAutotuneLaunch* launch_config) { + std::lock_guard lock(disk_mutex); + load_disk_cache_locked(); + + auto lookup = disk_cache.find(hash); + if (lookup == disk_cache.end()) return false; + + const DiskCacheRecordV1& record = lookup->second; +#ifdef CACHEDEBUG + printf( + "coop_autotune cache lookup: hash=%016llx tag=%d block_dim=%d num_sms=%d " + "concurrency=%d\n", + (unsigned long long)record.hash, record.tag, record.block_dim, + record.num_sms, record.concurrency); +#endif + + for (const CoopAutotuneCandidate& candidate : candidates) { + if (candidate.tag != record.tag) continue; + if (candidate.block_dim != record.block_dim) continue; + if (record.num_sms < 1 || record.num_sms > candidate.max_num_sms) continue; + + int max_concurrency = MAX(candidate.max_concurrency, 1); + int total_sms = + candidate.total_sms > 0 ? candidate.total_sms : candidate.max_num_sms; + int expected_concurrency = + MAX(MIN(total_sms / record.num_sms, max_concurrency), 1); + if (record.concurrency != expected_concurrency) continue; + + *launch_config = {candidate.kernel, record.block_dim, record.num_sms, + record.concurrency, record.tag}; +#ifdef CACHEDEBUG + printf( + "coop_autotune cache hit: hash=%016llx tag=%d block_dim=%d num_sms=%d " + "concurrency=%d\n", + (unsigned long long)record.hash, launch_config->tag, + launch_config->block_dim, launch_config->num_sms, + launch_config->concurrency); +#endif + return true; + } + +#ifdef CACHEDEBUG + printf( + "coop_autotune cache rejected: hash=%016llx tag=%d block_dim=%d " + "num_sms=%d concurrency=%d\n", + (unsigned long long)record.hash, record.tag, record.block_dim, + record.num_sms, record.concurrency); +#endif + return false; +} + +void store_disk_cache(uint64_t hash, const CoopAutotuneLaunch& launch_config) { + DiskCacheRecordV1 record = {hash, + launch_config.tag, + launch_config.block_dim, + launch_config.num_sms, + launch_config.concurrency, + 0, + 0}; + + std::lock_guard lock(disk_mutex); + load_disk_cache_locked(); + disk_cache[hash] = record; + append_disk_cache_locked(record); + +#ifdef CACHEDEBUG + printf( + "coop_autotune cache store: hash=%016llx tag=%d block_dim=%d num_sms=%d " + "concurrency=%d\n", + (unsigned long long)record.hash, record.tag, record.block_dim, + record.num_sms, record.concurrency); +#endif +} + +void set_kernel_attr_once(void* kernel, size_t smem) { + int device; + cuda_check(cudaGetDevice(&device)); + + auto key = std::make_tuple(device, kernel, smem); + if (attr_set.find(key) != attr_set.end()) return; + + cuda_check(cudaFuncSetAttribute( + kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, (int)smem)); + attr_set.insert(key); +} + +std::mutex thrash_mutex; +std::map> thrash_buffers; + +// Candidates in one autotune session share the same input tensors, so +// back-to-back timed launches keep each other's operands mutually warm in L2 +// regardless of production's actual scattered, per-token-random expert access +// pattern. +void thrash_l2(cudaStream_t stream) { + int device; + cuda_check(cudaGetDevice(&device)); + + void* buf; + size_t size; + { + std::lock_guard lock(thrash_mutex); + auto it = thrash_buffers.find(device); + if (it == thrash_buffers.end()) { + int l2_bytes = 0; + cuda_check( + cudaDeviceGetAttribute(&l2_bytes, cudaDevAttrL2CacheSize, device)); + // 2x the reported L2 capacity to reliably evict prior residents + // regardless of associativity/replacement-policy quirks; generous + // fallback if the query fails + size_t alloc_size = + (size_t)(l2_bytes > 0 ? l2_bytes : 64 * 1024 * 1024) * 2; + void* ptr; + cuda_check(cudaMalloc(&ptr, alloc_size)); + thrash_buffers[device] = {ptr, alloc_size}; + buf = ptr; + size = alloc_size; + } else { + buf = it->second.first; + size = it->second.second; + } + } + cuda_check(cudaMemsetAsync(buf, 0, size, stream)); +} + +float trimmed_mean(std::vector& samples) { + TORCH_CHECK(!samples.empty(), "CoopKernelAutotuner: no timing samples"); + std::sort(samples.begin(), samples.end()); + + size_t trim = samples.size() / 4; + size_t begin = trim; + size_t end = samples.size() - trim; + if (begin >= end) { + begin = 0; + end = samples.size(); + } + + double sum = 0.0; + for (size_t i = begin; i < end; ++i) sum += samples[i]; + return (float)(sum / (double)(end - begin)); +} + +void measure_candidate_sample(ExpandedCandidate& candidate, void** kernel_args, + size_t smem, cudaStream_t stream, int repeats, + cudaEvent_t start, cudaEvent_t end) { + thrash_l2(stream); + cuda_check(cudaEventRecord(start, stream)); + for (int i = 0; i < repeats; ++i) { + cuda_check(cudaLaunchCooperativeKernel( + candidate.kernel, dim3(candidate.num_sms, 1, candidate.concurrency), + candidate.block_dim, kernel_args, smem, stream)); + } + cuda_check(cudaEventRecord(end, stream)); + cuda_check(cudaEventSynchronize(end)); + + float ms = 0.0f; + cuda_check(cudaEventElapsedTime(&ms, start, end)); + candidate.samples.push_back(ms / (float)repeats); +} + +void keep_best(std::vector& candidates, size_t limit) { + for (ExpandedCandidate& candidate : candidates) + candidate.latency = trimmed_mean(candidate.samples); + + std::sort(candidates.begin(), candidates.end(), + [](const ExpandedCandidate& a, const ExpandedCandidate& b) { + return a.latency < b.latency; + }); + if (candidates.size() > limit) candidates.resize(limit); +} + +void measure_stage(std::vector& candidates, + void** kernel_args, size_t smem, cudaStream_t stream, + int rounds, int repeats, size_t keep, cudaEvent_t start, + cudaEvent_t end) { + TORCH_CHECK(!candidates.empty(), + "CoopKernelAutotuner: no candidates in stage"); + + for (ExpandedCandidate& candidate : candidates) { + candidate.samples.clear(); + candidate.samples.reserve(rounds); + set_kernel_attr_once(candidate.kernel, smem); + + // One untimed launch avoids first-use effects from contaminating the first + // measured round. + cuda_check(cudaLaunchCooperativeKernel( + candidate.kernel, dim3(candidate.num_sms, 1, candidate.concurrency), + candidate.block_dim, kernel_args, smem, stream)); + } + cuda_check(cudaStreamSynchronize(stream)); + + std::vector order(candidates.size()); + std::iota(order.begin(), order.end(), 0); + + for (int round = 0; round < rounds; ++round) { + size_t n = order.size(); + size_t step = 2 * (size_t)round + 1; + while (std::gcd(step, n) != 1) step += 2; + size_t pos = ((uint64_t)round * 1103515245ull + 12345ull) % n; + + for (size_t i = 0; i < n; ++i) { + measure_candidate_sample(candidates[order[pos]], kernel_args, smem, + stream, repeats, start, end); + pos = (pos + step) % n; + } + } + + keep_best(candidates, keep); +} + +CoopAutotuneLaunch tune( + const std::vector& base_candidates, + void** kernel_args, size_t smem, cudaStream_t stream, size_t numel_B) { + std::vector candidates; + for (const CoopAutotuneCandidate& base : base_candidates) { + int total_tiles = numel_B / base.block_dim / 16; + int min_num_sms = MAX(2, MIN(total_tiles / 32, base.max_num_sms) / + base.max_concurrency / 2 * 2); + + TORCH_CHECK(base.kernel, "CoopKernelAutotuner: null kernel candidate"); + TORCH_CHECK(base.block_dim > 0, "CoopKernelAutotuner: invalid block_dim"); + TORCH_CHECK(base.max_num_sms > 0, + "CoopKernelAutotuner: invalid max_num_sms"); + int max_concurrency = MAX(base.max_concurrency, 1); + int total_sms = base.total_sms > 0 ? base.total_sms : base.max_num_sms; + + if (max_concurrency > 1 || base.max_num_sms == 1) { + int concurrency = MAX(MIN(total_sms, max_concurrency), 1); + candidates.push_back( + {base.kernel, base.block_dim, 1, concurrency, base.tag, 0.0f, {}}); + } + + for (int num_sms = min_num_sms; num_sms <= base.max_num_sms * 85 / 100; + num_sms += 2) { + int concurrency = MAX(MIN(total_sms / num_sms, max_concurrency), 1); + candidates.push_back({base.kernel, + base.block_dim, + num_sms, + concurrency, + base.tag, + 0.0f, + {}}); + } + + if (base.max_num_sms > 1) { + int concurrency = + MAX(MIN(total_sms / base.max_num_sms, max_concurrency), 1); + candidates.push_back({base.kernel, + base.block_dim, + base.max_num_sms, + concurrency, + base.tag, + 0.0f, + {}}); + } + } + TORCH_CHECK(!candidates.empty(), "CoopKernelAutotuner: no candidates"); + + cudaEvent_t start; + cudaEvent_t end; + cuda_check(cudaEventCreate(&start)); + cuda_check(cudaEventCreate(&end)); + + int repeats = 8; + if (numel_B > 1e6) repeats = 5; + if (numel_B > 1e7) repeats = 4; + if (numel_B > 1e8) repeats = 3; + if (numel_B > 2e8) repeats = 2; + int max_rounds = 32; + if (numel_B > 1e6) max_rounds = 12; + if (numel_B > 1e7) max_rounds = 8; + if (numel_B > 1e8) max_rounds = 5; + if (numel_B > 2e8) max_rounds = 2; + int max_cands = 7; + if (numel_B > 1e6) max_cands = 5; + if (numel_B > 1e7) max_cands = 4; + if (numel_B > 1e8) max_cands = 3; + if (numel_B > 2e8) max_cands = 2; + + if (candidates.size() > 1 && max_cands > 4) + measure_stage(candidates, kernel_args, smem, stream, MIN(2, max_rounds), + repeats, MIN(6, max_cands), start, end); + if (candidates.size() > 1 && max_cands > 1) + measure_stage(candidates, kernel_args, smem, stream, MIN(8, max_rounds), + repeats, MIN(3, max_cands), start, end); + if (candidates.size() > 1) + measure_stage(candidates, kernel_args, smem, stream, MIN(14, max_rounds), + repeats, 1, start, end); + + cuda_check(cudaEventDestroy(start)); + cuda_check(cudaEventDestroy(end)); + + const ExpandedCandidate& best = candidates[0]; + return {best.kernel, best.block_dim, best.num_sms, best.concurrency, + best.tag}; +} + +} // namespace + +bool CoopKernelAutotuner::launch_locked(uint64_t hash, void** kernel_args, + size_t smem, cudaStream_t stream, + CoopAutotuneLaunch* out_launch_config) { + CoopAutotuneLaunch launch_config; + hash = salt_hash(hash); + + { + auto lookup = launch_cache.find(hash); + if (lookup == launch_cache.end()) return false; + launch_config = lookup->second; + } + + set_kernel_attr_once(launch_config.kernel, smem); + cuda_check(cudaLaunchCooperativeKernel( + launch_config.kernel, + dim3(launch_config.num_sms, 1, launch_config.concurrency), + launch_config.block_dim, kernel_args, smem, stream)); + + if (out_launch_config) *out_launch_config = launch_config; + return true; +} + +CoopAutotuneLaunch CoopKernelAutotuner::launch( + uint64_t hash, const std::vector& candidates, + void** kernel_args, size_t smem, cudaStream_t stream, size_t numel_B) { + CoopAutotuneLaunch launch_config; + uint64_t salted_hash = salt_hash(hash); + + if (launch_locked(hash, kernel_args, smem, stream, &launch_config)) + return launch_config; + + if (launch_from_disk_cache(salted_hash, candidates, &launch_config)) { + launch_cache[salted_hash] = launch_config; + set_kernel_attr_once(launch_config.kernel, smem); + cuda_check(cudaLaunchCooperativeKernel( + launch_config.kernel, + dim3(launch_config.num_sms, 1, launch_config.concurrency), + launch_config.block_dim, kernel_args, smem, stream)); + return launch_config; + } + + { + launch_config = tune(candidates, kernel_args, smem, stream, numel_B); + auto inserted = launch_cache.emplace(salted_hash, launch_config); + launch_config = inserted.first->second; + } + store_disk_cache(salted_hash, launch_config); + + set_kernel_attr_once(launch_config.kernel, smem); + cuda_check(cudaLaunchCooperativeKernel( + launch_config.kernel, + dim3(launch_config.num_sms, 1, launch_config.concurrency), + launch_config.block_dim, kernel_args, smem, stream)); + + return launch_config; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/coop_autotune.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/coop_autotune.cuh new file mode 100644 index 0000000000..1d7cc50b79 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/coop_autotune.cuh @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include + +struct CoopAutotuneCandidate { + void* kernel; + int block_dim; + int max_num_sms; + int max_concurrency; + int total_sms; + int tag; +}; + +struct CoopAutotuneLaunch { + void* kernel; + int block_dim; + int num_sms; + int concurrency; + int tag; +}; + +class CoopKernelAutotuner { + public: + static bool launch_locked(uint64_t hash, void** kernel_args, size_t smem, + cudaStream_t stream, + CoopAutotuneLaunch* launch_config = nullptr); + + static CoopAutotuneLaunch launch( + uint64_t hash, const std::vector& candidates, + void** kernel_args, size_t smem, cudaStream_t stream, + size_t numel_B = 1e9); +}; diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_devctx.cu b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_devctx.cu index 4583c36a0c..70303343c0 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_devctx.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_devctx.cu @@ -58,7 +58,8 @@ int* DevCtx::get_locks(int device) { std::lock_guard lock(mtx); if (!locks[device]) { cudaSetDevice(device); - size_t size = (MAX_TILES_C + MAX_BARRIERS * 2) * sizeof(int); + size_t size = + (MAX_TILES_C + MAX_BARRIERS * 2 + MOE_SCHED_INTS) * sizeof(int); cudaMalloc(&locks[device], size); cudaMemset(locks[device], 0, size); } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_devctx.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_devctx.cuh index f76c0e670a..497ace5a1e 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_devctx.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_devctx.cuh @@ -9,16 +9,22 @@ #define MAX_BARRIERS 1024 #define BARRIER_LOCKS_OFFSET MAX_TILES_C +// MoE expert scheduler state, after the barrier counters: [0] next ticket, [1] +// retired groups, [2 + group] ticket published to group. Self-resetting, +// zero-initialized with the rest of the buffer +#define MOE_MAX_GROUPS 64 +#define MOE_SCHED_OFFSET (MAX_TILES_C + 2 * MAX_BARRIERS) +#define MOE_SCHED_INTS (2 + MOE_MAX_GROUPS) + // Workspace size #define WORKSPACE_SIZE (16 * 1024 * 1024) -// Treat hopper and blackwell as same arch for now #define MAX_DEVICES 16 #define CC_OLD 1 #define CC_AMPERE 2 #define CC_ADA 3 #define CC_HOPPER 4 -#define CC_BLACKWELL 4 +#define CC_BLACKWELL 5 // Singleton to manage context for each device. Stores device attributes and a // large-enough lock buffer per device diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm.cu b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm.cu index bf89230ca7..1911d615e1 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm.cu @@ -9,13 +9,14 @@ namespace cg = cooperative_groups; #include "exl3_kernel_map.cuh" #include "exl3_devctx.cuh" #include "exl3_gemv.cuh" +#include "exl3_gemv_int8.cuh" +#include "coop_autotune.cuh" #include - -#define NEW_TUNE_GEMM -#define NEW_TUNE_MGEMM +#include int exl3_gemm_tilesize_k_g[] = {EXL3_GEMM_TILESIZE_K}; int exl3_gemm_tilesize_n_g[] = {EXL3_GEMM_TILESIZE_N}; +int exl3_gemm_blockdim_g[] = {EXL3_GEMM_BLOCKDIM}; /* EXL3 matmul, A @ B -> C @@ -36,6 +37,52 @@ limitations: std::set kernel_attr_set[MAX_DEVICES] = {}; +uint64_t roundup_pow2(uint64_t x) { + if (x == 0) return 1; + x--; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + x |= x >> 32; + return x + 1; +} + +uint64_t gemm_autotune_hash(int size_m, int size_k, int size_n, int K, + bool c_fp32, int device, int cc, int max_num_sms, + int cb) { + uint64_t h = 1469598103934665603ull; + auto mix = [&](uint64_t v) { + h ^= v; + h *= 1099511628211ull; + }; + mix((uint64_t)MIN(roundup_pow2(size_m), 16)); + mix((uint64_t)size_k); + mix((uint64_t)size_n); + mix((uint64_t)K); + mix(c_fp32 ? 1ull : 0ull); + mix((uint64_t)device); + mix((uint64_t)cc); + mix((uint64_t)max_num_sms); + mix((uint64_t)cb); + return h; +} + +uint64_t mgemm_autotune_hash(int size_m, int size_k, int size_n, int K, + bool c_fp32, int device, int cc, int max_num_sms, + int cb, int bszm_in, int bszm_out) { + uint64_t h = gemm_autotune_hash(size_m, size_k, size_n, K, c_fp32, device, cc, + max_num_sms, cb); + auto mix = [&](uint64_t v) { + h ^= v; + h *= 1099511628211ull; + }; + mix((uint64_t)bszm_in); + mix((uint64_t)bszm_out); + return h; +} + int exl3_gemm_gr(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, const c10::optional& suh, const c10::optional& A_had, @@ -96,25 +143,96 @@ int exl3_gemm_gr(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, if (mcg) cb = 1; if (mul1) cb = 2; + // Experimental fused int8-activation GEMV path (EXL3_INT8_GEMV=1) for mul1 + // tensors. Rows are processed as successive GEMV launches, so this is only + // sensible for small m (the reconstruct threshold keeps m <= 144 in + // practice). Not graph-capturable yet; graphed callers fall through to the + // regular kernel. + if (mul1 && exl3_gemv_int8_enabled()) { + if (exl3_gemv_int8(A, B, C, suh, A_had, svh, stream, graph)) return 0; + } + int block_dim; int shape_idx; fp_exl3_gemm_kernel kernel; -#ifndef NEW_TUNE_GEMM + void* kernelArgs[] = {(void*)&A_ptr, (void*)&B_ptr, (void*)&C_ptr, + (void*)&size_m, (void*)&size_k, (void*)&size_n, + (void*)&locks, (void*)&suh_ptr, (void*)&A_had_ptr, + (void*)&svh_ptr}; + + auto add_graph_args = [&](void* kernel_ptr) { + if (graph) { + graph->record_param(kernel_ptr, GP_gemm_A, 0); + graph->record_param(kernel_ptr, GP_gemm_B_trellis, 1); + graph->record_param(kernel_ptr, GP_gemm_C, 2); + graph->record_param(kernel_ptr, GP_gemm_B_suh, 7); + graph->record_param(kernel_ptr, GP_gemm_A_had, 8); + graph->record_param(kernel_ptr, GP_gemm_B_svh, 9); + graph->record_param(kernel_ptr, GP_end, 0); + } + }; + + // QTIP-style GEMV path for small m (exl3_gemv_kernel.cuh). Same kernel + // arguments, so graph recording is identical; falls through to the regular + // kernel when the heuristic declines + if (force_shape_idx <= 0 && force_num_sms <= 0) { + void* gemv_kernel = nullptr; + if (exl3_gemv_try_launch(kernelArgs, size_m, size_k, size_n, K, cb, c_fp32, + suh_ptr && A_had_ptr && svh_ptr, device, stream, + &gemv_kernel, false)) { + add_graph_args(gemv_kernel); + cuda_check(cudaPeekAtLastError()); + return 90; + } + } + + bool autotune = force_shape_idx <= 0 && force_num_sms <= 0; + if (autotune) { + uint64_t autotune_key = gemm_autotune_hash( + MAX(size_m, 2), size_k, size_n, K, c_fp32, device, cc, num_sms, cb); + CoopAutotuneLaunch tuned; + if (CoopKernelAutotuner::launch_locked(autotune_key, kernelArgs, SMEM_MAX, + stream, &tuned)) { + add_graph_args((void*)tuned.kernel); + cuda_check(cudaPeekAtLastError()); + return tuned.tag; + } + std::vector candidates; + for (int candidate_shape_idx = 1; + candidate_shape_idx <= EXL3_GEMM_NUM_SHAPES; ++candidate_shape_idx) { + if (!exl3_gemm_shape_compat(candidate_shape_idx, size_m, size_k, size_n, + K)) + continue; + + fp_exl3_gemm_kernel candidate_kernel = + get_gemm_kernel_ptr(K, candidate_shape_idx, c_fp32, cb); + if (!candidate_kernel) continue; + + int tilesize_k = exl3_gemm_tilesize_k_g[candidate_shape_idx]; + int tilesize_n = exl3_gemm_tilesize_n_g[candidate_shape_idx]; + int max_slices = MAX(size_k / tilesize_k * size_n / tilesize_n, 1); + int max_candidate_sms = MAX(MIN(max_slices, num_sms), 1); + + candidates.push_back( + {(void*)candidate_kernel, exl3_gemm_blockdim_g[candidate_shape_idx], + max_candidate_sms, 1, max_candidate_sms, candidate_shape_idx}); + } + TORCH_CHECK(!candidates.empty(), + "exl3_gemm autotune: no compatible kernel shapes"); + + tuned = + CoopKernelAutotuner::launch(autotune_key, candidates, kernelArgs, + SMEM_MAX, stream, (size_t)size_k * size_n); + if (graph) add_graph_args((void*)tuned.kernel); + cuda_check(cudaPeekAtLastError()); + return tuned.tag; + } + kernel = select_exl3_gemm_kernel(cc, size_m, size_k, size_n, K, c_fp32, force_shape_idx, &block_dim, &shape_idx, &num_sms, cb); if (!kernel) return 0; -#else - TResult* tr = - select_exl3_gemm_mgemm_kernel_new(cc, size_m, size_k, size_n, K, c_fp32, - force_shape_idx, force_num_sms, cb); - if (!tr) return 0; - num_sms = MIN(num_sms, tr->num_sms); - kernel = tr->kernel; - block_dim = tr->block_dim; - shape_idx = tr->shape_idx; -#endif // Launch if (kernel_attr_set[device].find((void*)kernel) == @@ -124,20 +242,9 @@ int exl3_gemm_gr(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, kernel_attr_set[device].insert((void*)kernel); cuda_check(cudaPeekAtLastError()); } - void* kernelArgs[] = {(void*)&A_ptr, (void*)&B_ptr, (void*)&C_ptr, - (void*)&size_m, (void*)&size_k, (void*)&size_n, - (void*)&locks, (void*)&suh_ptr, (void*)&A_had_ptr, - (void*)&svh_ptr}; cudaLaunchCooperativeKernel((void*)kernel, num_sms, block_dim, kernelArgs, SMEM_MAX, stream); - - if (graph) graph->record_param((void*)kernel, GP_gemm_A, 0); - if (graph) graph->record_param((void*)kernel, GP_gemm_B_trellis, 1); - if (graph) graph->record_param((void*)kernel, GP_gemm_C, 2); - if (graph) graph->record_param((void*)kernel, GP_gemm_B_suh, 7); - if (graph) graph->record_param((void*)kernel, GP_gemm_A_had, 8); - if (graph) graph->record_param((void*)kernel, GP_gemm_B_svh, 9); - if (graph) graph->record_param((void*)kernel, GP_end, 0); + add_graph_args((void*)kernel); cuda_check(cudaPeekAtLastError()); return shape_idx; @@ -153,20 +260,45 @@ int exl3_gemm(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, } /* -EXL3 multi matmul, A @ B -> C - -- A: row-major A tensor, shape (m, k), dtype float16, contiguous -- B: EXL3-quantized B tensor, shape (k//16, n//16, 16*K), dtype uint16 -- C: empty row-major C tensor, shape (m, n), dtype float16 or float23, -contiguous. Does not need to be zero-initialized -- suh: optional, packed input scales/flips, shape (k//16), dtype float16 -- A_had: required if suh given, may be reference to A, temporary storage for -input transform, size and dtype as A -- svh: optional, packed output scales/flips, shape (n//16), dtype float16 - -limitations: -- k % 16 == 0 -- n % 128 == 0 +EXL3 batched/multi-matrix matmul. + +This is not a conventional batched A @ B. B, suh and svh are CUDA int64 +tensors containing device addresses (one address per quantized matrix), rather +than the matrix data themselves. Entry q of each table describes one linear: + + B[q] -> EXL3 trellis, logically (k / 16, n / 16, 16 * K) uint16 + suh[q] -> packed input scales/flips, logically (k / 16) float16 + svh[q] -> packed output scales/flips, logically (n / 16) float16 + +A is contiguous float16 [a_batches, m, k], C is contiguous float16 or +float32 [c_batches, m, n], and A_had is float16 scratch with room for every +active matrix. The kernel applies the input Hadamard transform into A_had, +performs the selected EXL3 matmul, then applies the output transform. + +The active matrix/output slot j selects q = indices[j] when indices is given, +or q = j otherwise. This supports the following modes: + +- Multiple inputs and outputs: A[j] @ B[q] -> C[j]. +- One input, multiple outputs: when a_batches == 1, A[0] is broadcast and + transformed separately for each selected B[q], producing C[j]. This is used + for e.g. fused gate/up projections and MoE expert fan-out. +- Indexed matrices: indices is a contiguous int64 [*, num_indices] tensor; + the kernel reads its first num_indices entries as q values. Negative indices + skip that slot. +- Weighted MoE reduction: weights is a float16 tensor parallel to indices. + Each transformed result is multiplied by weights[j], then all active C[j] + are summed into C[0]. C therefore also serves as per-expert scratch; only + C[0] is the reduced result. +- Expert-range filtering: with min_index >= 0, selections outside + [min_index, max_index) are removed and retained indices are rebased by + min_index. This allows B/suh/svh to be local pointer tables for an expert + shard. Weights are compacted in the same order. + +Without weights, every active C[j] is a separate output. The active slot count +is max(a_batches, c_batches), capped to num_indices when indices is present. + +Limitations: k must be divisible by 16 and n by 128. Range filtering supports +at most 128 slots (the kernel's index-compaction capacity). */ int exl3_mgemm_gr(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, @@ -175,12 +307,19 @@ int exl3_mgemm_gr(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, const c10::optional& indices, const c10::optional& weights, int K, int force_shape_idx, bool mcg, bool mul1, int min_index, - int max_index, int force_num_sms, Graph* graph) { + int max_index, int force_num_sms, Graph* graph, + int num_tokens) { const torch::stable::accelerator::DeviceGuard device_guard( A.get_device_index()); cudaStream_t stream = graph ? graph->capture_stream : get_current_cuda_stream(A.get_device_index()); + TORCH_CHECK(num_tokens == 1 || min_index < 0, + "exl3_mgemm: multi-token reduction (num_tokens > 1) is not " + "compatible with expert-range " + "filtering (min_index >= 0); TP-sharded experts must use " + "num_tokens == 1"); + TORCH_CHECK_DTYPE(A, kHalf); TORCH_CHECK_DTYPE(B, kLong); TORCH_CHECK_DTYPE(suh, kLong); @@ -202,7 +341,7 @@ int exl3_mgemm_gr(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, int bszm_out = C.size(0); int bszm = MAX(bszm_in, bszm_out); - const long* indices_ptr = (const long*)OPTPTR(indices); + const int64_t* indices_ptr = (const int64_t*)OPTPTR(indices); const half* weights_ptr = (const half*)OPTPTR(weights); if (indices) { @@ -249,13 +388,74 @@ int exl3_mgemm_gr(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, fp_exl3_mgemm_kernel kernel; int concurrency; -#ifndef NEW_TUNE_MGEMM - kernel = select_exl3_mgemm_kernel(cc, size_m, size_k, size_n, K, c_fp32, - force_shape_idx, &block_dim, &shape_idx, - &num_sms, cb, bszm_in, bszm_out); - if (!kernel) return 0; - concurrency = MIN(total_sms / num_sms, bszm_out); -#else + void* kernelArgs[] = { + (void*)&A_ptr, (void*)&B_ptr_ptr, (void*)&C_ptr, + (void*)&size_m, (void*)&size_k, (void*)&size_n, + (void*)&locks, (void*)&suh_ptr_ptr, (void*)&A_had_ptr, + (void*)&svh_ptr_ptr, (void*)&indices_ptr, (void*)&weights_ptr, + (void*)&bszm_in, (void*)&bszm_out, (void*)&min_index, + (void*)&max_index, (void*)&num_tokens}; + + auto add_graph_args = [&](void* kernel_ptr) { + if (graph) { + graph->record_param(kernel_ptr, GP_mgemm_A, 0); + graph->record_param(kernel_ptr, GP_mgemm_C, 2); + graph->record_param(kernel_ptr, GP_mgemm_indices, 10); + graph->record_param(kernel_ptr, GP_mgemm_weights, 11); + graph->record_param(kernel_ptr, GP_end, 0); + } + }; + + bool autotune = force_shape_idx <= 0 && force_num_sms <= 0; + if (autotune) { + uint64_t autotune_key = + mgemm_autotune_hash(size_m, size_k, size_n, K, c_fp32, device, cc, + total_sms, cb, bszm_in, bszm_out); + + CoopAutotuneLaunch tuned; + if (CoopKernelAutotuner::launch_locked(autotune_key, kernelArgs, SMEM_MAX, + stream, &tuned)) { + add_graph_args((void*)tuned.kernel); + cuda_check(cudaPeekAtLastError()); + return tuned.tag; + } + if (!graph) { + std::vector candidates; + for (int candidate_shape_idx = 1; + candidate_shape_idx <= EXL3_GEMM_NUM_SHAPES; ++candidate_shape_idx) { + if (!exl3_gemm_shape_compat(candidate_shape_idx, size_m, size_k, size_n, + K)) + continue; + + fp_exl3_mgemm_kernel candidate_kernel = + get_mgemm_kernel_ptr(K, candidate_shape_idx, c_fp32, cb); + if (!candidate_kernel) continue; + + int tilesize_k = exl3_gemm_tilesize_k_g[candidate_shape_idx]; + int tilesize_n = exl3_gemm_tilesize_n_g[candidate_shape_idx]; + int max_slices = MAX(size_k / tilesize_k * size_n / tilesize_n, 1); + int max_candidate_sms = MAX(MIN(max_slices, total_sms), 1); + + candidates.push_back( + {(void*)candidate_kernel, exl3_gemm_blockdim_g[candidate_shape_idx], + max_candidate_sms, bszm, total_sms, candidate_shape_idx}); + } + TORCH_CHECK(!candidates.empty(), + "exl3_mgemm autotune: no compatible kernel shapes"); + + tuned = CoopKernelAutotuner::launch(autotune_key, candidates, kernelArgs, + SMEM_MAX, stream, + (size_t)size_k * size_n * bszm); + add_graph_args((void*)tuned.kernel); + + // DBGI10(size_m, size_k, size_n, K, bszm_in, bszm_out, tuned.tag, + // tuned.block_dim, tuned.num_sms, tuned.concurrency); + + cuda_check(cudaPeekAtLastError()); + return tuned.tag; + } + } + kernel = select_exl3_mgemm_kernel(cc, size_m, size_k, size_n, K, c_fp32, force_shape_idx, &block_dim, &shape_idx, &num_sms, cb, bszm_in, bszm_out); @@ -267,7 +467,9 @@ int exl3_mgemm_gr(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, if (num_sms <= total_sms && tiles / num_sms > 48) num_sms = MIN(total_sms, num_sms * 2); concurrency = MIN(total_sms / num_sms, bszm); -#endif + + // DBGI10(size_m, size_k, size_n, K, bszm_in, bszm_out, shape_idx, block_dim, + // num_sms, concurrency); // Launch bigger grid if possible dim3 block_grid(num_sms, 1, concurrency); @@ -279,22 +481,10 @@ int exl3_mgemm_gr(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, SMEM_MAX); kernel_attr_set[device].insert((void*)kernel); } - void* kernelArgs[] = { - (void*)&A_ptr, (void*)&B_ptr_ptr, (void*)&C_ptr, - (void*)&size_m, (void*)&size_k, (void*)&size_n, - (void*)&locks, (void*)&suh_ptr_ptr, (void*)&A_had_ptr, - (void*)&svh_ptr_ptr, (void*)&indices_ptr, (void*)&weights_ptr, - (void*)&bszm_in, (void*)&bszm_out, (void*)&min_index, - (void*)&max_index}; cudaLaunchCooperativeKernel((void*)kernel, block_grid, block_dim, kernelArgs, SMEM_MAX, stream); - - if (graph) graph->record_param((void*)kernel, GP_mgemm_A, 0); - if (graph) graph->record_param((void*)kernel, GP_mgemm_C, 2); - if (graph) graph->record_param((void*)kernel, GP_mgemm_indices, 10); - if (graph) graph->record_param((void*)kernel, GP_mgemm_weights, 11); - if (graph) graph->record_param((void*)kernel, GP_end, 0); + add_graph_args((void*)kernel); cuda_check(cudaPeekAtLastError()); return shape_idx; @@ -305,8 +495,9 @@ int exl3_mgemm(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, const at::Tensor& svh, const c10::optional& indices, const c10::optional& weights, int K, int force_shape_idx, uint32_t mcg_mult, uint32_t mul1_mult, - int min_index, int max_index, int force_num_sms) { + int min_index, int max_index, int force_num_sms, + int num_tokens) { return exl3_mgemm_gr(A, B, C, suh, A_had, svh, indices, weights, K, force_shape_idx, mcg_mult, mul1_mult, min_index, - max_index, force_num_sms, nullptr); + max_index, force_num_sms, nullptr, num_tokens); } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm.cuh index f702f0a567..4b5909b057 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm.cuh @@ -21,11 +21,13 @@ int exl3_mgemm_gr(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, const c10::optional& indices, const c10::optional& weights, int K, int force_shape_idx, bool mcg, bool mul1, int min_index, - int max_index, int force_num_sms, Graph* graph); + int max_index, int force_num_sms, Graph* graph, + int num_tokens = 1); int exl3_mgemm(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, const at::Tensor& suh, const at::Tensor& A_had, const at::Tensor& svh, const c10::optional& indices, const c10::optional& weights, int K, int force_shape_idx, uint32_t mcg_mult, uint32_t mul1_mult, - int min_index, int max_index, int force_num_sms); + int min_index, int max_index, int force_num_sms, + int num_tokens = 1); diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm_inner.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm_inner.cuh index 535d2d525a..225a82e66d 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm_inner.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm_inner.cuh @@ -8,21 +8,36 @@ #include "exl3_dq.cuh" -template +// On GA10x, HMMA with fp32 accumulation runs at half rate and dominates the m=1 +// (decode-bound) case. Accumulate MMA results in fp16 instead and fold into the +// fp32 accumulators once per k-slice: ~14% faster at bsz 1 on RTX 3090 together +// with the codebook.cuh IMUL change (see benchmarks/exl3_m1_bench). Max +// observed error vs fp32 accumulation is ~1% of output RMS at k=4096, well +// below quantization noise. Only enabled for sm_86 for now; unvalidated on +// other archs where fp32-acc HMMA is also half rate. +#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ == 860) + #define EXL3_GEMM_H_ACC 1 +#else + #define EXL3_GEMM_H_ACC 0 +#endif + +template inline __device__ void exl3_gemm_kernel_inner( const half* __restrict__ A, const uint16_t* __restrict__ B, void* __restrict__ C, const int size_m, const int size_k, const int size_n, - int* __restrict__ locks) { + int* __restrict__ locks, const half* post_scale) { const int TILEBLOCKS_M = TILESIZE_M / 16; const int TILEBLOCKS_K = TILESIZE_K / 16; const int TILEBLOCKS_N = TILESIZE_N / 16; - const int FRAGS_M = TILEBLOCKS_M; + // const int FRAGS_M = TILEBLOCKS_M; const int FRAGS_N_PER_WARP = 2 * TILEBLOCKS_N / (EXL3_GEMM_BASE_THREADS / 32); const int sh_a_stage_size = TILESIZE_M * TILESIZE_K; // in halfs const int sh_b_stage_size = TILEBLOCKS_K * TILEBLOCKS_N * 256 / 16 * bits; // in uint16s - const int sh_c_size = 4 * EXL3_GEMM_BASE_THREADS; // in floats + const int sh_c_size = MAX // in floats + (4 * EXL3_GEMM_BASE_THREADS * FRAGS_N_PER_WARP, + shmem_out_had ? TILESIZE_N * TILESIZE_M : 0); // XOR-swizzle constants for bank-conflict-free A fragment loads // col_swizzled = col ^ ((row >> SHIFT) & MASK) @@ -32,7 +47,8 @@ inline __device__ void exl3_gemm_kernel_inner( // Sanity checks static_assert(EXL3_GEMM_BASE_THREADS == 256); - static_assert(TILESIZE_M % 16 == 0, "Invalid kernel params"); + static_assert(TILESIZE_M == 16, + "Invalid kernel params"); // strictly assume size_m <= 16 static_assert(TILESIZE_K % 16 == 0, "Invalid kernel params"); static_assert(TILESIZE_N % 128 == 0, "Invalid kernel params"); static_assert( @@ -72,8 +88,9 @@ inline __device__ void exl3_gemm_kernel_inner( auto index_n = [&](int slice_i) { return (slice_i / tiles_k); }; // Batch dimension - int slice_m = index_m(slice_beg); - int max_m = MIN(size_m - slice_m * TILESIZE_M, TILESIZE_M); + // int slice_m = index_m(slice_beg); + // int max_m = MIN(size_m - slice_m * TILESIZE_M, TILESIZE_M); + const int slice_m = 0; // Pipe 0, global A, B tile and shared A, B tile int slice0_k = index_k(slice_beg); @@ -96,7 +113,7 @@ inline __device__ void exl3_gemm_kernel_inner( int m = (i * EXL3_GEMM_BASE_THREADS + t) / (gl_a_stride_k / 8); load_a_gl[i] = m * size_k / 8 + k; load_a_sh[i] = m * A_COLS + (k ^ ((m >> A_SWIZZLE_SHIFT) & A_SWIZZLE_MASK)); - pred_a_gl[i] = m < max_m; + pred_a_gl[i] = m < size_m; } int gl_b_stride_k = blocks_n * TILEBLOCKS_K * 256 / 16 * bits; @@ -172,9 +189,12 @@ inline __device__ void exl3_gemm_kernel_inner( float* gl_c_ptr_32 = ((float*)C) + slice_m * gl_c_stride_m + slice2_n * gl_c_stride_n; - register FragA frag_a[FRAG_STAGES][FRAGS_M]; + register FragA frag_a[FRAG_STAGES]; register FragB frag_b[FRAG_STAGES][FRAGS_N_PER_WARP]; - register FragC frag_c[FRAGS_M][FRAGS_N_PER_WARP]; + register FragC frag_c[FRAGS_N_PER_WARP]; +#if EXL3_GEMM_H_ACC + register FragC_h frag_c_h[FRAGS_N_PER_WARP]; +#endif auto advance2 = [&]() { slice2_k++; @@ -244,7 +264,7 @@ inline __device__ void exl3_gemm_kernel_inner( for (int m = 0; m < TILEBLOCKS_M; ++m) { int R = r + m * 16; int c_swizzled = base_c ^ ((R >> A_SWIZZLE_SHIFT) & A_SWIZZLE_MASK); - ldsm4(frag_a[buf][m], (int4*)sh1_a_ptr + R * A_COLS + c_swizzled); + ldsm4(frag_a[buf], (int4*)sh1_a_ptr + R * A_COLS + c_swizzled); } } @@ -267,64 +287,213 @@ inline __device__ void exl3_gemm_kernel_inner( // Clear C fragments auto clear_frag_c = [&]() { #pragma unroll - for (int m = 0; m < FRAGS_M; ++m) -#pragma unroll - for (int n = 0; n < FRAGS_N_PER_WARP; ++n) frag_c[m][n] = {}; + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) frag_c[n] = {}; +#if EXL3_GEMM_H_ACC + #pragma unroll + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) frag_c_h[n] = {}; +#endif }; // Threadblock reduction auto threadblock_reduce = [&]() { - auto store = [&](int i, int m, int n) { - // TODO: Shuffle to avoid bank conflicts here? Doesn't seem to be a - // bottleneck + auto store = [&](int i) { if (sub_k == i) { float* sh_red = sh_c + (FRAGS_N_PER_WARP * 4) * t; - if (size_m <= 8) { #pragma unroll - for (int i = 0; i < 2; ++i) *sh_red++ = frag_c[m][n][i]; - } else { + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { #pragma unroll - for (int i = 0; i < 4; ++i) *sh_red++ = frag_c[m][n][i]; + for (int j = 0; j < 4; ++j) *sh_red++ = frag_c[n][j]; } } __syncthreads(); }; - auto add = [&](int i, int m, int n) { + auto add = [&](int i) { if (sub_k == i) { float* sh_red = sh_c + (FRAGS_N_PER_WARP * 4) * t; - if (size_m <= 8) { #pragma unroll - for (int i = 0; i < 2; ++i) frag_c[m][n][i] += *sh_red++; - } else { + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { #pragma unroll - for (int i = 0; i < 4; ++i) frag_c[m][n][i] += *sh_red++; + for (int j = 0; j < 4; ++j) frag_c[n][j] += *sh_red++; + } + } + }; + + auto store_small = [&](int i) { + if (sub_k == i && lane_id / 4 < size_m) { + float* sh_red = sh_c + (FRAGS_N_PER_WARP * 4) * t; +#pragma unroll + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { + *sh_red++ = frag_c[n][0]; + *sh_red++ = frag_c[n][1]; } } __syncthreads(); }; + auto add_small = [&](int i) { + if (sub_k == i && lane_id / 4 < size_m) { + float* sh_red = sh_c + (FRAGS_N_PER_WARP * 4) * t; #pragma unroll - for (int m = 0; m < FRAGS_M; ++m) { + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { + frag_c[n][0] += *sh_red++; + frag_c[n][1] += *sh_red++; + } + } + }; + + if (size_m <= 8) { + if constexpr (TILEBLOCKS_K == 2) { + store_small(1); + add_small(0); + } + if constexpr (TILEBLOCKS_K == 3) { + store_small(1); + add_small(0); + store_small(2); + add_small(0); + } + if constexpr (TILEBLOCKS_K == 4) { + store_small(3); + add_small(2); + store_small(1); + add_small(0); + store_small(2); + add_small(0); + } + } else { + if constexpr (TILEBLOCKS_K == 2) { + store(1); + add(0); + } + if constexpr (TILEBLOCKS_K == 3) { + store(1); + add(0); + store(2); + add(0); + } + if constexpr (TILEBLOCKS_K == 4) { + store(3); + add(2); + store(1); + add(0); + store(2); + add(0); + } + } + }; + + // Pre-hadamard: Write final output tile to shmem + auto write_sum_tile_sh = [&]() { + const int n0 = warp_id * FRAGS_N_PER_WARP; + const int r0 = lane_id / 4; + const int r1 = r0 + 8; + if (r0 < size_m) { + const int c = (lane_id % 4) * 2; +#pragma unroll + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { + float* c_ptr = ((float*)sh_c) + r0 * TILESIZE_N + (n0 + n) * 8 + c; + *c_ptr++ = frag_c[n][0]; + *c_ptr++ = frag_c[n][1]; + } + } + if (r1 < size_m) { + const int c = (lane_id % 4) * 2; #pragma unroll for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { - if constexpr (TILEBLOCKS_K == 2) { - store(1, m, n); - add(0, m, n); + float* c_ptr = ((float*)sh_c) + r1 * TILESIZE_N + (n0 + n) * 8 + c; + *c_ptr++ = frag_c[n][2]; + *c_ptr++ = frag_c[n][3]; + } + } + }; + + // Copy output tile to global with hadamard transform and out scale + auto output_had_sh_gl = [&]() { + int sh_warp = warp_id; + constexpr int active_warps = EXL3_GEMM_BASE_THREADS / 32; + for (;; sh_warp += active_warps) { + int col = sh_warp % (TILESIZE_N / 128); + int row = sh_warp / (TILESIZE_N / 128); + if (row >= size_m) break; + + const float* had_in = sh_c + row * TILESIZE_N + col * 128; + const half* post_scale_c = + post_scale + slice2_n * gl_c_stride_n + col * 128; + + if constexpr (c_fp32) { + float* had_out = gl_c_ptr_32 + row * size_n + col * 128; + had_ff_r_128_inner(had_in, had_out, post_scale_c, + 0.088388347648f); + } else { + half* had_out = gl_c_ptr_16 + row * size_n + col * 128; + had_fh_r_128_inner(had_in, had_out, post_scale_c, + 0.088388347648f); + } + } + }; + + auto read_sum_gl = [&]() { + int n0 = warp_id * FRAGS_N_PER_WARP; +#pragma unroll + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { + int r0 = lane_id / 4; + int r1 = r0 + 8; + int c = (lane_id % 4) * 2; + if (r0 < size_m) { + if constexpr (c_fp32) { + float* c_ptr = gl_c_ptr_32 + r0 * size_n + (n0 + n) * 8 + c; + frag_c[n][0] += *c_ptr++; + frag_c[n][1] += *c_ptr++; + } else { + half2* c_ptr = (half2*)(gl_c_ptr_16 + r0 * size_n + (n0 + n) * 8 + c); + float2 interm = __half22float2(*c_ptr); + frag_c[n][0] += interm.x; + frag_c[n][1] += interm.y; } - if constexpr (TILEBLOCKS_K == 3) { - store(1, m, n); - add(0, m, n); - store(2, m, n); - add(0, m, n); + } + if (r1 < size_m) { + if constexpr (c_fp32) { + float* c_ptr = gl_c_ptr_32 + r1 * size_n + (n0 + n) * 8 + c; + frag_c[n][2] += *c_ptr++; + frag_c[n][3] += *c_ptr++; + } else { + half2* c_ptr = (half2*)(gl_c_ptr_16 + r1 * size_n + (n0 + n) * 8 + c); + float2 interm = __half22float2(*c_ptr); + frag_c[n][2] += interm.x; + frag_c[n][3] += interm.y; + } + } + } + }; + + auto write_sum_gl = [&]() { + int n0 = warp_id * FRAGS_N_PER_WARP; +#pragma unroll + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { + int r0 = lane_id / 4; + int r1 = r0 + 8; + int c = (lane_id % 4) * 2; + if (r0 < size_m) { + if constexpr (c_fp32) { + float* c_ptr = gl_c_ptr_32 + r0 * size_n + (n0 + n) * 8 + c; + *c_ptr++ = frag_c[n][0]; + *c_ptr++ = frag_c[n][1]; + } else { + half2* c_ptr = (half2*)(gl_c_ptr_16 + r0 * size_n + (n0 + n) * 8 + c); + half2 sum = __floats2half2_rn(frag_c[n][0], frag_c[n][1]); + *c_ptr = sum; } - if constexpr (TILEBLOCKS_K == 4) { - store(3, m, n); - add(2, m, n); - store(1, m, n); - add(0, m, n); - store(2, m, n); - add(0, m, n); + } + if (r1 < size_m) { + if constexpr (c_fp32) { + float* c_ptr = gl_c_ptr_32 + r1 * size_n + (n0 + n) * 8 + c; + *c_ptr++ = frag_c[n][2]; + *c_ptr++ = frag_c[n][3]; + } else { + half2* c_ptr = (half2*)(gl_c_ptr_16 + r1 * size_n + (n0 + n) * 8 + c); + half2 sum = __floats2half2_rn(frag_c[n][2], frag_c[n][3]); + *c_ptr = sum; } } } @@ -332,6 +501,19 @@ inline __device__ void exl3_gemm_kernel_inner( // Output reduction auto reduce = [&]() { +#if EXL3_GEMM_H_ACC + // Fold the fp16 MMA accumulators into the fp32 accumulators once per k-slice + #pragma unroll + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { + float2 f0 = __half22float2(frag_c_h[n][0]); + float2 f1 = __half22float2(frag_c_h[n][1]); + frag_c[n][0] += f0.x; + frag_c[n][1] += f0.y; + frag_c[n][2] += f1.x; + frag_c[n][3] += f1.y; + } +#endif + // First reduce all partial sums along k for the current slice threadblock_reduce(); @@ -347,121 +529,29 @@ inline __device__ void exl3_gemm_kernel_inner( bool first = lock_i == 0; bool last = lock_i + lock_d == tiles_k; - int n0 = warp_id * FRAGS_N_PER_WARP; - // Second and subsequent threadblocks in column read back the intermediate // sum from global memory if (!sub_k && !first) { -#pragma unroll - for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { -#pragma unroll - for (int m = 0; m < FRAGS_M; ++m) { - int r0 = lane_id / 4 + 16 * m; - int r1 = r0 + 8; - int c = (lane_id % 4) * 2; - if (r0 < max_m) { - if constexpr (c_fp32) { - float* c_ptr = gl_c_ptr_32 + r0 * size_n + (n0 + n) * 8 + c; - frag_c[m][n][0] += *c_ptr++; - frag_c[m][n][1] += *c_ptr++; - } else { - half2* c_ptr = - (half2*)(gl_c_ptr_16 + r0 * size_n + (n0 + n) * 8 + c); - float2 interm = __half22float2(*c_ptr); - frag_c[m][n][0] += interm.x; - frag_c[m][n][1] += interm.y; - } - } - if (r1 < max_m) { - if constexpr (c_fp32) { - float* c_ptr = gl_c_ptr_32 + r1 * size_n + (n0 + n) * 8 + c; - frag_c[m][n][2] += *c_ptr++; - frag_c[m][n][3] += *c_ptr++; - } else { - half2* c_ptr = - (half2*)(gl_c_ptr_16 + r1 * size_n + (n0 + n) * 8 + c); - float2 interm = __half22float2(*c_ptr); - frag_c[m][n][2] += interm.x; - frag_c[m][n][3] += interm.y; - } - } - } - } + read_sum_gl(); } // All but last threadblock in column write the intermediate result to // global memory if (!sub_k && !last) { -#pragma unroll - for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { -#pragma unroll - for (int m = 0; m < FRAGS_M; ++m) { - int r0 = lane_id / 4 + 16 * m; - int r1 = r0 + 8; - int c = (lane_id % 4) * 2; - if (r0 < max_m) { - if constexpr (c_fp32) { - float* c_ptr = gl_c_ptr_32 + r0 * size_n + (n0 + n) * 8 + c; - *c_ptr++ = frag_c[m][n][0]; - *c_ptr++ = frag_c[m][n][1]; - } else { - half2* c_ptr = - (half2*)(gl_c_ptr_16 + r0 * size_n + (n0 + n) * 8 + c); - half2 sum = __floats2half2_rn(frag_c[m][n][0], frag_c[m][n][1]); - *c_ptr = sum; - } - } - if (r1 < max_m) { - if constexpr (c_fp32) { - float* c_ptr = gl_c_ptr_32 + r1 * size_n + (n0 + n) * 8 + c; - *c_ptr++ = frag_c[m][n][2]; - *c_ptr++ = frag_c[m][n][3]; - } else { - half2* c_ptr = - (half2*)(gl_c_ptr_16 + r1 * size_n + (n0 + n) * 8 + c); - half2 sum = __floats2half2_rn(frag_c[m][n][2], frag_c[m][n][3]); - *c_ptr = sum; - } - } - } - } + write_sum_gl(); } // Last block writes in row-major format if (!sub_k && last) { -#pragma unroll - for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { -#pragma unroll - for (int m = 0; m < FRAGS_M; ++m) { - int r0 = lane_id / 4 + 16 * m; - int r1 = r0 + 8; - int c = (lane_id % 4) * 2; - if (r0 < max_m) { - if constexpr (c_fp32) { - float* c_ptr = gl_c_ptr_32 + r0 * size_n + (n0 + n) * 8 + c; - *c_ptr++ = frag_c[m][n][0]; - *c_ptr++ = frag_c[m][n][1]; - } else { - half2* c_ptr = - (half2*)(gl_c_ptr_16 + r0 * size_n + (n0 + n) * 8 + c); - half2 sum = __floats2half2_rn(frag_c[m][n][0], frag_c[m][n][1]); - *c_ptr = sum; - } - } - if (r1 < max_m) { - if constexpr (c_fp32) { - float* c_ptr = gl_c_ptr_32 + r1 * size_n + (n0 + n) * 8 + c; - *c_ptr++ = frag_c[m][n][2]; - *c_ptr++ = frag_c[m][n][3]; - } else { - half2* c_ptr = - (half2*)(gl_c_ptr_16 + r1 * size_n + (n0 + n) * 8 + c); - half2 sum = __floats2half2_rn(frag_c[m][n][2], frag_c[m][n][3]); - *c_ptr = sum; - } - } - } - } + if constexpr (shmem_out_had) + write_sum_tile_sh(); + else + write_sum_gl(); + } + + if constexpr (shmem_out_had) { + if (last) __syncthreads(); + if (!sub_k && last) output_had_sh_gl(); } barrier_release(lock, lock_d, last); @@ -479,10 +569,13 @@ inline __device__ void exl3_gemm_kernel_inner( // Perform tensor core matmul on current tile auto matmul = [&](int buf) { #pragma unroll - for (int m = 0; m < FRAGS_M; ++m) -#pragma unroll - for (int n = 0; n < FRAGS_N_PER_WARP; ++n) - ptx_mma_m16n8k16(frag_a[buf][m], frag_b[buf][n], frag_c[m][n]); + for (int n = 0; n < FRAGS_N_PER_WARP; ++n) { +#if EXL3_GEMM_H_ACC + ptx_mma_m16n8k16(frag_a[buf], frag_b[buf][n], frag_c_h[n]); +#else + ptx_mma_m16n8k16(frag_a[buf], frag_b[buf][n], frag_c[n]); +#endif + } }; // Start global to shared pipeline @@ -499,7 +592,7 @@ inline __device__ void exl3_gemm_kernel_inner( // two different iterations of the main loop to avoid confusing the compiler // and making it (sometimes) place the fragment arrays in local memory -#define FSTAGE(_load, _mul) \ +#define FSTAGE_OLD(_load, _mul) \ async_load_gl(); \ wait_stage(); \ load_frags(_load); \ @@ -511,9 +604,21 @@ inline __device__ void exl3_gemm_kernel_inner( advance2(); \ if (!slice2_iters) break; +#define FSTAGE(_load, _mul) \ + async_load_gl(); \ + wait_stage(); \ + matmul(_mul); \ + if (slice2_k == tiles_k - 1 || slice2_iters == 1) { \ + reduce(); \ + slice2_k0 = slice2_k + 1; \ + } \ + advance2(); \ + if (!slice2_iters) break; \ + load_frags(_load); + if constexpr (FRAG_STAGES == 1) { while (true) { - FSTAGE(0, 0); + FSTAGE_OLD(0, 0); } } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm_kernel.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm_kernel.cuh index 5de366d592..7437e9d55b 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm_kernel.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemm_kernel.cuh @@ -3,21 +3,24 @@ #include "exl3_kernel_map.cuh" #include "hadamard_inner.cuh" #include "exl3_gemm_inner.cuh" +#include "exl3_devctx.cuh" template __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* TILESIZE_K / 16) void exl3_gemm_kernel(EXL3_GEMM_ARGS) { auto grid = cg::this_grid(); - if (suh) { + // if (suh) + { int total_warps = size_m * size_k / 128; int warps_grid = gridDim.x * blockDim.x / 32; int this_warp = threadIdx.x / 32 + blockDim.x / 32 * blockIdx.x; for (; this_warp < total_warps; this_warp += warps_grid) - had_hf_r_128_inner(A + this_warp * 128, A_had + this_warp * 128, - suh + (this_warp * 128) % size_k, nullptr, - 0.088388347648f // 1/sqrt(128) + had_hf_r_128_inner(A + this_warp * 128, + A_had + this_warp * 128, + suh + (this_warp * 128) % size_k, + 0.088388347648f // 1/sqrt(128) ); grid.sync(); @@ -30,8 +33,8 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* TILESIZE_K / while (size_m_ > 0) { exl3_gemm_kernel_inner(A_, B, C_, size_m_, size_k, - size_n, locks); + SH_STAGES, FRAG_STAGES, true>( + A_, B, C_, MIN(size_m_, 16), size_k, size_n, locks, svh); A_ += 16 * size_k; if constexpr (c_fp32) @@ -43,26 +46,34 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* TILESIZE_K / if (size_m_ > 0 || svh) grid.sync(); } - if (svh) { - int total_warps = size_m * size_n / 128; - int warps_grid = gridDim.x * blockDim.x / 32; - int this_warp = threadIdx.x / 32 + blockDim.x / 32 * blockIdx.x; + // if (svh) + /* + { + int total_warps = size_m * size_n / 128; + int warps_grid = gridDim.x * blockDim.x / 32; + int this_warp = threadIdx.x / 32 + blockDim.x / 32 * blockIdx.x; - for (; this_warp < total_warps; this_warp += warps_grid) { - if constexpr (c_fp32) - had_ff_r_128_inner(((const float*)C) + this_warp * 128, - ((float*)C) + this_warp * 128, nullptr, - svh + (this_warp * 128) % size_n, - 0.088388347648f // 1/sqrt(128) - ); - else - had_hf_r_128_inner(((const half*)C) + this_warp * 128, - ((half*)C) + this_warp * 128, nullptr, - svh + (this_warp * 128) % size_n, - 0.088388347648f // 1/sqrt(128) - ); - } + for(; this_warp < total_warps; this_warp += warps_grid) + { + if constexpr (c_fp32) + had_ff_r_128_inner + ( + ((const float*) C) + this_warp * 128, + ((float*) C) + this_warp * 128, + svh + (this_warp * 128) % size_n, + 0.088388347648f // 1/sqrt(128) + ); + else + had_hf_r_128_inner + ( + ((const half*) C) + this_warp * 128, + ((half*) C) + this_warp * 128, + svh + (this_warp * 128) % size_n, + 0.088388347648f // 1/sqrt(128) + ); + } } + */ } #define MAX_INDICES 128 @@ -77,6 +88,10 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* TILESIZE_K / int bszm = MAX(bszm_in, bszm_out); auto grid = cg::this_grid(); +#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ > 890) + int* barrier_counters_sense = locks + BARRIER_LOCKS_OFFSET; +#endif + // Pack indices within min_index <= idx < max_index if (min_index >= 0) { @@ -128,12 +143,18 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* TILESIZE_K / half* A_had_ = A_had + j * size_m * size_k; for (; this_warp < total_warps; this_warp += warps_grid) - had_hf_r_128_inner(A_ + this_warp * 128, A_had_ + this_warp * 128, - suh + (this_warp * 128) % size_k, nullptr, - 0.088388347648f // 1/sqrt(128) + had_hf_r_128_inner(A_ + this_warp * 128, + A_had_ + this_warp * 128, + suh + (this_warp * 128) % size_k, + 0.088388347648f // 1/sqrt(128) ); } + +#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ > 890) + group_barrier(blockIdx.z, gridDim.x, barrier_counters_sense); +#else grid.sync(); +#endif // Matmul @@ -150,8 +171,9 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* TILESIZE_K / int lock_offs = blockIdx.z * size_n / 128; exl3_gemm_kernel_inner( - A_, B, C_, size_m_, size_k, size_n, locks + lock_offs); + TILESIZE_N, SH_STAGES, FRAG_STAGES, false>( + A_, B, C_, MIN(size_m_, 16), size_k, size_n, locks + lock_offs, + nullptr); } A_ += 16 * size_k; @@ -160,7 +182,12 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* TILESIZE_K / else C_ = (void*)(((half*)C_) + 16 * size_n); size_m_ -= 16; + +#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ > 890) + group_barrier(blockIdx.z, gridDim.x, barrier_counters_sense); +#else grid.sync(); +#endif } // Had and output scales @@ -181,45 +208,56 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* TILESIZE_K / for (; this_warp < total_warps; this_warp += warps_grid) { if constexpr (c_fp32) - had_ff_r_128_inner(((const float*)C_) + this_warp * 128, - ((float*)C_) + this_warp * 128, nullptr, - svh + (this_warp * 128) % size_n, scale); + had_ff_r_128_inner(((const float*)C_) + this_warp * 128, + ((float*)C_) + this_warp * 128, + svh + (this_warp * 128) % size_n, + scale); else - had_hf_r_128_inner(((const half*)C_) + this_warp * 128, - ((half*)C_) + this_warp * 128, nullptr, - svh + (this_warp * 128) % size_n, scale); + had_hf_r_128_inner(((const half*)C_) + this_warp * 128, + ((half*)C_) + this_warp * 128, + svh + (this_warp * 128) % size_n, + scale); } } } if (B_weights) grid.sync(); - // Final reduction + // Final reduction: each of the num_tokens groups of (bszm / num_tokens) + // contiguous slots is summed into its own output row (row t for group t), + // instead of always collapsing into row 0. num_tokens == 1 (the legacy + // single-token case) reduces to exactly the original single-row behavior. + // Groups MUST be processed in increasing t order per column: row t is only + // ever read by group floor(t / stride), which is <= t, so it has already been + // fully read (and, if that group's index equals t, is only then correctly + // overwritten) by the time group t's own write happens. if (B_weights && blockIdx.z == 0) { int total_warps = size_m * size_n / 32; int warps_grid = gridDim.x * blockDim.x / 32; int this_warp = threadIdx.x / 32 + blockDim.x / 32 * blockIdx.x; int this_lane = threadIdx.x % 32; + int stride = bszm / num_tokens; for (; this_warp < total_warps; this_warp += warps_grid) { - if constexpr (c_fp32) { - float* C__ = ((float*)C) + this_warp * 32 + this_lane; - float* C___ = C__; - float sum = 0.0f; - for (int j = 0; j < bszm; ++j) { - sum += *C___; - C___ += size_m * size_n; - } - *C__ = sum; - } else { - half* C__ = ((half*)C) + this_warp * 32 + this_lane; - half* C___ = C__; - half sum = {}; - for (int j = 0; j < bszm; ++j) { - sum = __hadd(sum, *C___); - C___ += size_m * size_n; + for (int t = 0; t < num_tokens; ++t) { + int col = this_warp * 32 + this_lane; + if constexpr (c_fp32) { + float* C___ = ((float*)C) + t * stride * size_m * size_n + col; + float sum = 0.0f; + for (int j = 0; j < stride; ++j) { + sum += *C___; + C___ += size_m * size_n; + } + ((float*)C)[t * size_m * size_n + col] = sum; + } else { + half* C___ = ((half*)C) + t * stride * size_m * size_n + col; + half sum = {}; + for (int j = 0; j < stride; ++j) { + sum = __hadd(sum, *C___); + C___ += size_m * size_n; + } + ((half*)C)[t * size_m * size_n + col] = sum; } - *C__ = sum; } } } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv.cu b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv.cu index c10696dcc5..d04bf3747b 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv.cu @@ -6,91 +6,219 @@ namespace cg = cooperative_groups; #include "../util.h" #include "../util.cuh" #include "exl3_gemv_kernel.cuh" -#include "exl3_kernel_map.cuh" #include "exl3_devctx.cuh" -#include "hadamard.cuh" -// #include - -#define K_SPLIT 1 +#include /* -EXL3 matmul, A @ B -> C - -- A: row-major A tensor, shape (m, k), dtype float16, contiguous -- B: EXL3-quantized B tensor, shape (k//16, n//16, 16*bits), dtype uint16 -- C: empty row-major C tensor, shape (m, n), dtype float16 or float32, -contiguous. Does not need to be zero-initialized -- suh: optional, packed input scales/flips, shape (k//16), dtype float16 -- A_had: required if suh given, may be reference to A, temporary storage for -input transform, size and dtype as A -- svh: optional, packed output scales/flips, shape (n//16), dtype float16 - -limitations: -- k % 16 == 0 -- n % 128 == 0 +QTIP-style small-m GEMV path, kernel in exl3_gemv_kernel.cuh. Dispatched from +exl3_gemm via exl3_gemv_try_launch when the shape heuristic applies, or forced +through the exl3_gemv entry point. Kernel arguments and graph parameter offsets +are identical to exl3_gemm_kernel. + +Env: EXL3_GEMV = 0 disables the path, 1/unset = heuristic (default), 2 = use +wherever the hard constraints allow (testing). + +Heuristic envelope (measured, RTX 3090, 4 bpw, m <= 8, vs the tuned regular +kernel): the narrow config wins 15-60% at attention-projection sizes (n <= +4096), the wide config wins ~8% at large-n/small-k FFN sizes. Big-k x big-n +shapes lose slightly and fall through to the regular kernel, as do other +architectures (Ada/Blackwell are memory-bound here and keep the regular kernel), +bpw != 4, and m > 8. */ -// std::set kernel_attr_set[MAX_DEVICES] = {}; +static int exl3_gemv_env_mode() { + const char* env = std::getenv("EXL3_GEMV"); + if (!env) return 1; + return atoi(env); +} + +// -1 = default per bits, 0 = force shuffle extraction, 1 = force smem staging +// (testing) +static int exl3_gemv_env_smem() { + const char* env = std::getenv("EXL3_GEMV_SMEM"); + if (!env) return -1; + return atoi(env); +} + +// -1: not eligible, 0: narrow config, 1: wide config. narrow_coresident = +// number of narrow-config blocks that fit on the device at once (its grid is +// one block per 32 output columns) +static int exl3_gemv_cfg(int cc, int size_m, int size_k, int size_n, int K, + int cb, int mode, int narrow_coresident) { + if (mode == 0) return -1; + if (K < 2 || K > 4) return -1; + if (K != 4 && cb == 0) return -1; + if (size_m > EXL3_GEMV_MAX_M) return -1; + if (size_k % 128 || size_n % 128) return -1; + // if (cc != CC_AMPERE) return -1; // measured win on Ampere; Ada/Blackwell + // are memory-bound here + if (mode == 2) return size_n <= 8192 ? 0 : 1; + if (mode == 3) return 0; // testing: force narrow config + if (mode == 4) return 1; // testing: force wide config + + // The narrow config wins (up to ~30%) whenever its grid fits in a single + // co-resident wave; in the 1..2-wave zone the trailing partial wave costs + // more than the kernel gains unless per-group work is small (small k). The + // wide config covers a band of large-n shapes with small-to-mid k. Everything + // else runs the regular block-pipelined kernel. Per-bits envelopes: 2 bpw is + // decode-bound and won at every measured shape on both archs; 3 bpw wins + // everywhere on Ada but only in the narrow envelope on Ampere + if (K == 2) return size_n <= 8192 ? 0 : 1; + if (K == 3 && cc == CC_ADA) return size_n <= 8192 ? 0 : 1; + if (size_n / 32 <= narrow_coresident) return 0; + if (size_k <= 2048 && size_n <= 8192) return 0; + if (K == 3) return -1; + if (size_n >= 8192 && size_k <= 4096) return 1; + if (size_n >= 8192 && size_n <= 10240 && size_k <= 5120 && cc == CC_AMPERE) + return 1; + return -1; +} + +static void* exl3_gemv_select_kernel(int bits, int cb, bool c_fp32, int mmode, + int cfg, bool smem) { +#define SEL(bits_, cb_, fp32_, mm_, cfg_, sm_) \ + if (bits == bits_ && cb == cb_ && c_fp32 == fp32_ && mmode == mm_ && \ + cfg == cfg_ && smem == sm_) \ + return (void*)exl3_gemv_kernel; +#define SEL_GRID(bits_, cb_, sm_) \ + SEL(bits_, cb_, false, 0, 0, sm_) \ + SEL(bits_, cb_, false, 0, 1, sm_) \ + SEL(bits_, cb_, false, 1, 0, sm_) \ + SEL(bits_, cb_, false, 1, 1, sm_) \ + SEL(bits_, cb_, true, 0, 0, sm_) \ + SEL(bits_, cb_, true, 0, 1, sm_) \ + SEL(bits_, cb_, true, 1, 0, sm_) SEL(bits_, cb_, true, 1, 1, sm_) + SEL_GRID(4, 0, false) + SEL_GRID(4, 1, false) + SEL_GRID(4, 2, false) + SEL_GRID(2, 1, false) + SEL_GRID(2, 2, false) + SEL_GRID(2, 1, true) + SEL_GRID(2, 2, true) + SEL_GRID(3, 1, false) + SEL_GRID(3, 2, false) + SEL_GRID(3, 1, true) + SEL_GRID(3, 2, true) +#undef SEL_GRID +#undef SEL + return nullptr; +} + +bool exl3_gemv_try_launch(void** kernel_args, int size_m, int size_k, + int size_n, int K, int cb, bool c_fp32, + bool has_su_sv, int device, cudaStream_t stream, + void** launched_kernel, bool force) { + // Free integer checks first; the env read (~64 ns) and device queries only + // run for calls that could actually take this path + if (!has_su_sv) return false; + if (K < 2 || K > 4) return false; + if (K != 4 && cb == 0) return false; + if (size_m > EXL3_GEMV_MAX_M) return false; + if (size_k % 128 || size_n % 128) return false; + + int mode = force ? 2 : exl3_gemv_env_mode(); + if (mode == 0) return false; + int cc = DevCtx::instance().get_cc(device); + // if (cc != CC_AMPERE) return false; + int mmode = size_m == 1 ? 0 : 1; + int num_sms = DevCtx::instance().get_num_sms(device); + + // Cooperative launch: grids are capped at full co-residency (cached per + // kernel), and the narrow config's co-residency also feeds the shape + // heuristic + static std::map occ_cache[MAX_DEVICES]; + auto& cache = occ_cache[device]; + auto occupancy = [&](void* kernel, int block_dim) -> int { + auto it = cache.find(kernel); + if (it != cache.end()) return it->second; + int blocks_per_sm; + cuda_check(cudaOccupancyMaxActiveBlocksPerMultiprocessor( + &blocks_per_sm, kernel, block_dim, 0)); + cache[kernel] = blocks_per_sm; + return blocks_per_sm; + }; + + // Extraction style: shuffle by default, smem staging selectable per call for + // evaluation + bool smem = exl3_gemv_env_smem() == 1; + + void* narrow_kernel = exl3_gemv_select_kernel(K, cb, c_fp32, mmode, 0, smem); + if (!narrow_kernel) return false; + int narrow_coresident = occupancy(narrow_kernel, 512) * num_sms; + + int cfg = + exl3_gemv_cfg(cc, size_m, size_k, size_n, K, cb, mode, narrow_coresident); + if (cfg < 0) return false; + + void* kernel = cfg == 0 + ? narrow_kernel + : exl3_gemv_select_kernel(K, cb, c_fp32, mmode, cfg, smem); + if (!kernel) return false; + + int block_dim = cfg == 0 ? 512 : 256; + int cols = cfg == 0 ? 32 : 64; + + int max_blocks = occupancy(kernel, block_dim) * num_sms; + int grid = MIN(size_n / cols, max_blocks); + if (grid < 1) return false; + + cuda_check(cudaLaunchCooperativeKernel(kernel, dim3(grid), dim3(block_dim), + kernel_args, 0, stream)); + + if (launched_kernel) *launched_kernel = kernel; + return true; +} void exl3_gemv(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, const c10::optional& suh, const c10::optional& A_had, const c10::optional& svh, bool mcg, bool mul1) { - // had_r_128(A, A_had.value(), suh, c10::nullopt, 1.0); - const torch::stable::accelerator::DeviceGuard device_guard( A.get_device_index()); cudaStream_t stream = get_current_cuda_stream(A.get_device_index()); TORCH_CHECK_DIM(B, 3); - TORCH_CHECK_SHAPES(A, 1, B, 0, 16); + TORCH_CHECK_SHAPES(A, -1, B, 0, 16); TORCH_CHECK_SHAPES(C, -1, B, 1, 16); TORCH_CHECK_DTYPE(A, kHalf); TORCH_CHECK_DTYPE(B, kShort); bool c_fp32 = C.scalar_type() == at::kFloat; if (!c_fp32) TORCH_CHECK_DTYPE(C, kHalf); - - int size_m = A.size(0); - int size_k = A.size(1); + TORCH_CHECK(!(mcg && mul1), "Specified both mcg and mul1") + + const half* suh_ptr = (const half*)OPTPTR(suh); + half* A_had_ptr = (half*)OPTPTR(A_had); + const half* svh_ptr = (const half*)OPTPTR(svh); + TORCH_CHECK(suh_ptr && A_had_ptr && svh_ptr, + "exl3_gemv requires suh, A_had and svh"); + + int size_m = 1; + int dim = A.dim(); + for (int d = 0; d < dim - 1; ++d) size_m *= A.size(d); + int size_k = A.size(-1); int size_n = B.size(1) * 16; + int K = B.size(2) / 16; - TORCH_CHECK(size_m <= 8, "size_m must be <= 8"); + int cb = 0; + if (mcg) cb = 1; + if (mul1) cb = 2; - // dim3 blocks(size_k / TILESIZE_K, size_n / TILESIZE_N); - - // dim3 blocks(1, size_n / TILESIZE_N, K_SPLIT); - dim3 blocks(1, size_n / TILESIZE_N, 1); - dim3 threads(32, 1, TILESIZE_K / 16); - - // int cb = 0; - // if (mcg) cb = 1; - // if (mul1) cb = 2; + int device; + cudaGetDevice(&device); + int* locks = DevCtx::instance().get_locks(device); const half* A_ptr = (const half*)A.data_ptr(); - // const half* A_ptr = (const half*) OPTPTR(A_had); const uint16_t* B_ptr = (const uint16_t*)B.data_ptr(); void* C_ptr = (void*)C.data_ptr(); - // DBGI3(blocks.x, blocks.y, blocks.z); - // DBGI3(threads.x, threads.y, threads.z); - - if (!c_fp32) { - // DBGI3(size_m, size_k, size_n); - exl3_gemv_kernel<4, false, 0, K_SPLIT><<>>( - A_ptr, B_ptr, C_ptr, size_m, size_k, size_n - // (void*)& suh_ptr, - // (void*)& A_had_ptr, - // (void*)& svh_ptr, - ); - } else { - // DBGI3(size_m, size_k, size_n); - exl3_gemv_kernel<4, true, 0, K_SPLIT><<>>( - A_ptr, B_ptr, C_ptr, size_m, size_k, size_n - // (void*)& suh_ptr, - // (void*)& A_had_ptr, - // (void*)& svh_ptr, - ); - } + void* kernel_args[] = {(void*)&A_ptr, (void*)&B_ptr, (void*)&C_ptr, + (void*)&size_m, (void*)&size_k, (void*)&size_n, + (void*)&locks, (void*)&suh_ptr, (void*)&A_had_ptr, + (void*)&svh_ptr}; + + bool ok = exl3_gemv_try_launch(kernel_args, size_m, size_k, size_n, K, cb, + c_fp32, true, device, stream, nullptr, true); + TORCH_CHECK(ok, "exl3_gemv: call is not eligible for the GEMV kernel"); cuda_check(cudaPeekAtLastError()); } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv.cuh index bb132e0c08..305166ece5 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv.cuh @@ -1,7 +1,23 @@ #pragma once #include "../util.h" +#include +// QTIP-style small-m GEMV path (see exl3_gemv_kernel.cuh). Launched from +// exl3_gemm when the heuristic applies; also exposed directly for testing. Same +// kernel arguments as exl3_gemm_kernel, so graph recording/patching is +// identical. + +// Try to dispatch a GEMM call to the GEMV kernel. Returns false (launching +// nothing) if the call is not eligible. On success *launched_kernel receives +// the kernel pointer for graph recording. `force` bypasses the shape heuristic +// but not the hard constraints. +bool exl3_gemv_try_launch(void** kernel_args, int size_m, int size_k, + int size_n, int K, int cb, bool c_fp32, + bool has_su_sv, int device, cudaStream_t stream, + void** launched_kernel, bool force); + +// Direct entry point (testing): errors if the call is not hard-eligible void exl3_gemv(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, const c10::optional& suh, const c10::optional& A_had, diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_int8.cu b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_int8.cu new file mode 100644 index 0000000000..5811951e51 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_int8.cu @@ -0,0 +1,349 @@ +#include +#include "exl3_gemv_int8.cuh" +#include "exl3_gemv_int8_kernel.cuh" +#include "comp_units/exl3_gemv_int8_instances.cuh" +#include "../util.h" +#include "../util.cuh" +#include "../ptx.cuh" +#include "exl3_dq.cuh" +#include "exl3_devctx.cuh" +#include "hadamard_inner.cuh" +#include +#include +#include +#include + +// Mode 0: disabled; 1: int8 + error-feedback residual pass (~15-16 bit +// effective activation precision, KL at parity with fp16 or better); 2: plain +// int8 (cheaper, ~0.9% output RMS deviation). +static int _exl3_gemv_int8_mode = 0; +bool _exl3_gemv_int8_mode_chk = false; + +static int exl3_gemv_int8_mode() { + if (_exl3_gemv_int8_mode_chk) return _exl3_gemv_int8_mode; + const char* e = getenv("EXL3_INT8_GEMV"); + _exl3_gemv_int8_mode = e ? atoi(e) : 2; + return _exl3_gemv_int8_mode; +} + +bool exl3_gemv_int8_enabled() { return exl3_gemv_int8_mode() != 0; } + +// Highest K the int8 path accepts; above it the regular kernel wins. The fp16 +// pipeline must be compute/latency-limited for the reduced per-weight work to +// matter, and where that ends is per-arch. Ampere is DRAM-bound from K = 6 up +// (3090: int8 -29/-22/-9/-6% at K=2/3/4/5, then -11..-26% on wide shapes at +// K=6); Ada is marginal at K=6 (4090: -0..+7%, residual mode loses) and keeps +// the conservative gate. Hopper's fp16 kernel is per-SM INT-throughput-bound at +// K = 6 (H200, issue #242: +26/+57% per call, +16% e2e), and Blackwell measures +// the same way (5090: +7..+19% at K=6 across shapes, fp16 kernel at only +// ~65-78% of DRAM peak; K=7/8 are flat). EXL3_INT8_GEMV_MAX_K overrides the +// per-arch default for testing on unmeasured parts (kernel instances exist up +// to K = 8; at m == 1, K = 7..8 fall through to the cooperative kernel) +int exl3_gemv_int8_max_k(int device) { + static const int env_max_k = [] { + const char* e = getenv("EXL3_INT8_GEMV_MAX_K"); + return e ? atoi(e) : 0; + }(); + if (env_max_k) return MIN(env_max_k, 8); + int cc = DevCtx::instance().get_cc(device); + return (cc == CC_HOPPER || cc == CC_BLACKWELL) ? 6 : 5; +} + +struct GemvInt8Workspace { + int* ws = nullptr; + size_t ws_ints = 0; +}; + +static GemvInt8Workspace gemv_ws[MAX_DEVICES]; +static std::set gemv_attr_set[MAX_DEVICES]; +static std::map, int> gemv_occ_cache[MAX_DEVICES]; + +typedef void (*gemv_int8_coop_fn)(const half*, const uint16_t*, void*, int, int, + int, int*, const half*, half*, const half*); + +static void* select_gemv_int8_kernel(int K, bool c_fp32, bool residual) { + switch (K) { + case 1: + return exl3_gemv_int8_coop_sel_k1(c_fp32, residual); + case 2: + return exl3_gemv_int8_coop_sel_k2(c_fp32, residual); + case 3: + return exl3_gemv_int8_coop_sel_k3(c_fp32, residual); + case 4: + return exl3_gemv_int8_coop_sel_k4(c_fp32, residual); + case 5: + return exl3_gemv_int8_coop_sel_k5(c_fp32, residual); + case 6: + return exl3_gemv_int8_coop_sel_k6(c_fp32, residual); + case 7: + return exl3_gemv_int8_coop_sel_k7(c_fp32, residual); + case 8: + return exl3_gemv_int8_coop_sel_k8(c_fp32, residual); + } + return nullptr; +} + +static void* select_gemv_int8_sq_kernel(int K, int M, bool c_fp32, + bool residual) { + switch (K) { + case 1: + return exl3_gemv_int8_sq_sel_k1(M, c_fp32, residual); + case 2: + return exl3_gemv_int8_sq_sel_k2(M, c_fp32, residual); + case 3: + return exl3_gemv_int8_sq_sel_k3(M, c_fp32, residual); + case 4: + return exl3_gemv_int8_sq_sel_k4(M, c_fp32, residual); + case 5: + return exl3_gemv_int8_sq_sel_k5(M, c_fp32, residual); + case 6: + return exl3_gemv_int8_sq_sel_k6(M, c_fp32, residual); + } + return nullptr; +} + +// Fixed-size per-device workspace shared by the sq and coop paths, allocated +// once and never reallocated: the pointer is baked as a kernel argument into +// captured CUDA graphs, so growing the buffer would leave every previously +// captured graph with a dangling workspace pointer (and let a reallocation +// clobber the self-resetting completion counters at the start of the buffer). +// Zeroed at allocation so the counters begin at zero. Callers must reject work +// that exceeds the fixed size (returns nullptr) and fall through to a +// non-workspace path. +#define GEMV_INT8_WS_INTS (WORKSPACE_SIZE / sizeof(int)) // 16 MB +static int* gemv_int8_get_ws(int device, size_t ws_ints) { + if (ws_ints > GEMV_INT8_WS_INTS) return nullptr; + GemvInt8Workspace& ws = gemv_ws[device]; + if (!ws.ws) { + cuda_check(cudaMalloc(&ws.ws, GEMV_INT8_WS_INTS * sizeof(int))); + cuda_check(cudaMemset(ws.ws, 0, GEMV_INT8_WS_INTS * sizeof(int))); + ws.ws_ints = GEMV_INT8_WS_INTS; + } + return ws.ws; +} + +// m == 1 fast path: per-slice-scale kernel, regular launch. Returns false to +// fall through to the cooperative kernel (and from there to the regular fp16 +// kernel). +static bool exl3_gemv_int8_sq(const half* A_ptr, const uint16_t* B_ptr, + void* C_ptr, int size_m, int size_k, int size_n, + int K, bool c_fp32, bool residual, + const half* suh_ptr, half* A_had_ptr, + const half* svh_ptr, int device, int num_sms, + cudaStream_t stream, Graph* graph) { + if (size_m > 2) return false; + int M = size_m; + void* fn = select_gemv_int8_sq_kernel(K, M, c_fp32, residual); + if (!fn) return false; + + int rows_max = gemv_int8_sq_rows_max(M, residual); + + // Mirror of the kernel's work decomposition (single-wave rule with a + // half-wave floor) + auto decomp = [&](int grid_, int& ksplit, int& rows_per) { + int rows_total = size_k / 16; + int nb256 = size_n / 256; + int r = CEIL_DIVIDE(rows_total * nb256, grid_); + rows_per = (MAX(r, MIN(2 * r, 32)) + 7) & ~7; + rows_per = MAX(rows_per, SQ_MINROWS); + rows_per = MIN(rows_per, rows_max); + rows_per = MIN(rows_per, (rows_total + 7) & ~7); + ksplit = CEIL_DIVIDE(rows_total, rows_per); + }; + auto smem_for = [&](int rows_per) -> size_t { + size_t stage = + gemv_int8_stage_smem(K) ? (size_t)8 * GEMV_STAGE_D * 16 * K * 4 : 0; + return (size_t)rows_per * 16 * 2 + + (size_t)rows_per * 16 * 4 * M * (residual ? 2 : 1) + stage + + (size_t)2 * M * 128 * 4; + }; + + if (gemv_attr_set[device].find(fn) == gemv_attr_set[device].end()) { + cudaFuncSetAttribute(fn, cudaFuncAttributeMaxDynamicSharedMemorySize, + (int)smem_for(rows_max)); + // Match the tensor-core kernels' shared-memory carveout: these kernels + // interleave with them (hundreds of launches per decoded token), and a + // smaller carveout would make the GPU drain and reconfigure the SMs on + // every transition - measured at ~4 us per launch in graph replay + cudaFuncSetAttribute(fn, cudaFuncAttributePreferredSharedMemoryCarveout, + cudaSharedmemCarveoutMaxShared); + gemv_attr_set[device].insert(fn); + cuda_check(cudaPeekAtLastError()); + } + + int ksplit, rows_per; + decomp(6 * num_sms, ksplit, rows_per); + size_t smem_guess = smem_for(rows_per); + int maxb; + auto occ_key = std::make_pair(fn, smem_guess); + auto occ_it = gemv_occ_cache[device].find(occ_key); + if (occ_it != gemv_occ_cache[device].end()) + maxb = occ_it->second; + else { + maxb = 1; + cudaOccupancyMaxActiveBlocksPerMultiprocessor(&maxb, fn, NUM_THREADS, + smem_guess); + gemv_occ_cache[device][occ_key] = maxb; + } + int grid = MIN(MAX(maxb, 1) * num_sms, 1024); + decomp(grid, ksplit, rows_per); + size_t smem = smem_for(rows_per); + if (ksplit > SQ_KSPLIT_CAP) return false; + if (size_n / 256 > SQ_COUNTERS_CAP) return false; + + int pstride = size_n * (residual ? 2 : 1); + int* ws_ptr = + gemv_int8_get_ws(device, SQ_WS_RESERVED + (size_t)ksplit * M * pstride); + if (!ws_ptr) return false; + + void* kernelArgs[] = {(void*)&A_ptr, (void*)&B_ptr, (void*)&C_ptr, + (void*)&size_m, (void*)&size_k, (void*)&size_n, + (void*)&ws_ptr, (void*)&suh_ptr, (void*)&A_had_ptr, + (void*)&svh_ptr}; + + cudaError_t err = cudaLaunchKernel(fn, dim3(grid), dim3(NUM_THREADS), + kernelArgs, smem, stream); + if (graph) { + graph->record_param(fn, GP_gemm_A, 0); + graph->record_param(fn, GP_gemm_B_trellis, 1); + graph->record_param(fn, GP_gemm_C, 2); + graph->record_param(fn, GP_gemm_B_suh, 7); + graph->record_param(fn, GP_gemm_A_had, 8); + graph->record_param(fn, GP_gemm_B_svh, 9); + graph->record_param(fn, GP_end, 0); + } + if (err != cudaSuccess) { + cudaGetLastError(); + return false; + } + return true; +} + +bool exl3_gemv_int8(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, + const c10::optional& suh, + const c10::optional& A_had, + const c10::optional& svh, cudaStream_t stream, + Graph* graph) { + if (!suh.has_value() || !A_had.has_value() || !svh.has_value()) return false; + + int K = B.size(2) / 16; + int size_k = A.size(-1); + int size_n = B.size(1) * 16; + int size_m = A.numel() / size_k; + if (size_n % 256) return false; + if (size_k % 128) return false; + + int device; + cudaGetDevice(&device); + if (K < 1 || K > exl3_gemv_int8_max_k(device)) return false; + int num_sms = DevCtx::instance().get_num_sms(device); + bool c_fp32 = C.scalar_type() == at::kFloat; + bool residual = exl3_gemv_int8_mode() == 1; + + // Per-slice-scale kernel: m == 1, plus m == 2 in plain int8 mode (rows share + // the decoded weights and the B stream; measured on 3090, larger m and + // batched residual lose to the fp16 tensor-core kernel). Falls through to the + // cooperative kernel on a constraint miss at m == 1; batched rows beyond the + // gate go straight to the regular kernel. + if (size_m <= (residual ? 1 : 2) && + exl3_gemv_int8_sq( + (const half*)A.data_ptr(), (const uint16_t*)B.data_ptr(), + C.data_ptr(), size_m, size_k, size_n, K, c_fp32, residual, + (const half*)suh->data_ptr(), (half*)A_had->data_ptr(), + (const half*)svh->data_ptr(), device, num_sms, stream, graph)) + return true; + if (size_m > 1) return false; + + void* fn = select_gemv_int8_kernel(K, c_fp32, residual); + if (!fn) return false; + + // Mirror the kernel's work decomposition for the shared memory size; grid = + // max co-resident blocks (natural register allocation measures faster than + // forcing higher occupancy) + auto smem_for_grid = [&](int grid_) -> size_t { + int rows_total = size_k / 16; + int nb256 = size_n / 256; + int smem_rows_max = residual ? 384 : 768; + int ksplit = CEIL_DIVIDE(4 * grid_, nb256); + ksplit = MAX(ksplit, CEIL_DIVIDE(rows_total, smem_rows_max)); + ksplit = MIN(ksplit, rows_total); + int rows_per = CEIL_DIVIDE(rows_total, ksplit); + size_t stage = + gemv_int8_stage_smem(K) ? (size_t)8 * GEMV_STAGE_D * 16 * K * 4 : 0; + return MAX((size_t)rows_per * 16 * 4 * (residual ? 2 : 1) + stage, + (size_t)8 * 128 * 4); + }; + + if (gemv_attr_set[device].find(fn) == gemv_attr_set[device].end()) { + // Upper bound over all shapes: smem_rows_max * 64 B + cudaFuncSetAttribute(fn, cudaFuncAttributeMaxDynamicSharedMemorySize, + 768 * 16 * 4 + GEMV_STAGE_MAX_BYTES); + // Match the tensor-core kernels' shared-memory carveout: these kernels + // interleave with them (hundreds of launches per decoded token), and a + // smaller carveout would make the GPU drain and reconfigure the SMs on + // every transition - measured at ~4 us per launch in graph replay + cudaFuncSetAttribute(fn, cudaFuncAttributePreferredSharedMemoryCarveout, + cudaSharedmemCarveoutMaxShared); + gemv_attr_set[device].insert(fn); + cuda_check(cudaPeekAtLastError()); + } + + size_t smem_guess = smem_for_grid(6 * num_sms); + int maxb; + auto occ_key = std::make_pair(fn, smem_guess); + auto occ_it = gemv_occ_cache[device].find(occ_key); + if (occ_it != gemv_occ_cache[device].end()) + maxb = occ_it->second; + else { + maxb = 1; + cudaOccupancyMaxActiveBlocksPerMultiprocessor(&maxb, fn, NUM_THREADS, + smem_guess); + gemv_occ_cache[device][occ_key] = maxb; + } + int grid = MIN(MAX(maxb, 1) * num_sms, 1024); + size_t smem = smem_for_grid(grid); + + // Coop region beyond the sq-reserved prefix: [2n accs][4m qsums][grid partial + // maxes] + size_t ws_ints = SQ_WS_RESERVED + (size_t)2 * size_n + 4 * size_m + 1024; + int* ws_base = gemv_int8_get_ws(device, ws_ints); + if (!ws_base) return false; + int* ws_ptr = ws_base + SQ_WS_RESERVED; + + const half* A_ptr = (const half*)A.data_ptr(); + const uint16_t* B_ptr = (const uint16_t*)B.data_ptr(); + void* C_ptr = C.data_ptr(); + const half* suh_ptr = (const half*)suh->data_ptr(); + half* A_had_ptr = (half*)A_had->data_ptr(); // scratch; used through a raw + // half* like the regular kernel + const half* svh_ptr = (const half*)svh->data_ptr(); + + void* kernelArgs[] = {(void*)&A_ptr, (void*)&B_ptr, (void*)&C_ptr, + (void*)&size_m, (void*)&size_k, (void*)&size_n, + (void*)&ws_ptr, (void*)&suh_ptr, (void*)&A_had_ptr, + (void*)&svh_ptr}; + + auto add_graph_args = [&](void* kernel_ptr) { + if (graph) { + graph->record_param(kernel_ptr, GP_gemm_A, 0); + graph->record_param(kernel_ptr, GP_gemm_B_trellis, 1); + graph->record_param(kernel_ptr, GP_gemm_C, 2); + graph->record_param(kernel_ptr, GP_gemm_B_suh, 7); + graph->record_param(kernel_ptr, GP_gemm_A_had, 8); + graph->record_param(kernel_ptr, GP_gemm_B_svh, 9); + graph->record_param(kernel_ptr, GP_end, 0); + } + }; + + cudaError_t err = cudaLaunchCooperativeKernel(fn, grid, NUM_THREADS, + kernelArgs, smem, stream); + add_graph_args((void*)fn); + + if (err != cudaSuccess) { + // e.g. cooperative launch unsupported or co-residency violated: fall back + // to the regular kernel + cudaGetLastError(); + return false; + } + return true; +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_int8.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_int8.cuh new file mode 100644 index 0000000000..ddb01e8227 --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_int8.cuh @@ -0,0 +1,30 @@ +#pragma once + +#include "../util.h" +#include + +#include "../graph.cuh" + +// Fused int8-activation GEMV for mul1 (cb 2) tensors: single cooperative launch +// covering input Hadamard, activation quantization, dp4a GEMV and output +// Hadamard. EXL3_INT8_GEMV=2 (default) is the plain int8 mode, =1 the +// error-feedback residual mode (~15-16 bit effective activation precision), =0 +// disables the path. Tensors outside the mul1 codebook are unaffected. +// Arbitrary m is handled as sequential row passes within the launch, so +// intended for the small-m regime. See benchmarks/exl3_m1_bench (variants +// 15-18) for derivation, microbenchmarks and profiling. + +bool exl3_gemv_int8_enabled(); + +// Highest K the int8 path accepts on `device` (per-arch, EXL3_INT8_GEMV_MAX_K +// override). Also bound to Python so the mgemm fusion heuristic can mirror the +// gate +int exl3_gemv_int8_max_k(int device); + +// Returns true if the operation was handled (false -> caller should fall +// through to the regular kernel) +bool exl3_gemv_int8(const at::Tensor& A, const at::Tensor& B, at::Tensor& C, + const c10::optional& suh, + const c10::optional& A_had, + const c10::optional& svh, cudaStream_t stream, + Graph* graph); diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_int8_kernel.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_int8_kernel.cuh new file mode 100644 index 0000000000..378cc329ee --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_int8_kernel.cuh @@ -0,0 +1,1168 @@ +#pragma once + +// Device side of the fused int8-activation GEMV (see comment below). Kernels +// are instantiated in comp_units/exl3_gemv_int8_inst_*.cu; the host code in +// exl3_gemv_int8.cu includes this header only for the launch-geometry constants +// and __host__ __device__ helpers + +#include +#include +#include +#include +#include +#include "../util.h" +#include "../util.cuh" +#include "../ptx.cuh" +#include "exl3_dq.cuh" +#include "hadamard_inner.cuh" + +namespace cg_gemv = cooperative_groups; + +// Fused int8-activation GEMV for mul1 (cb 2) tensors, single cooperative +// launch. +// +// The mul1 codebook value is affine in the byte sum of x * 0x83DCD12D, so with +// activations quantized to int8, dp4a(x * M, splat(a_int8), acc) evaluates +// codebook(x) * a in a single instruction with exact int32 accumulation, and +// +// y[n] = k_inv * (q * acc1[n] + q2 * acc2[n]) + (1024 * k_inv + k_bias) * (q +// * sum1 + q2 * sum2) +// +// recovers the result. In residual mode (EXL3_INT8_GEMV=1) the int8 rounding +// error r = a - q*i, which has range +/-q/2 by construction, is quantized with +// the fixed scale q2 = q/254 and accumulated by a second dp4a sharing the +// decoded products, for ~15-16 bit effective activation precision (KL at parity +// with the fp16 kernel or better). EXL3_INT8_GEMV=2 is the plain int8 mode. +// +// One cooperative launch with the same argument list as exl3_gemm_kernel; +// `locks` doubles as workspace: [2*size_n int32 accumulators][{float q, int s1, +// int s2, pad} per row][partial max per block]. Phases (persistent 256-thread +// blocks): +// 1a. input Hadamard A -> A_had (as in exl3_gemm_kernel) + accumulator +// zeroing; for m == 1 also a +// per-block partial max of the transformed activations +// 1b. (m > 1 only) per-row scale and exact int sums +// per row: +// 2. GEMV over (256-column x k-slice) units; activation splats are +// quantized INLINE while +// staging to shared memory (for m == 1, every block re-derives q from +// the phase-1a partial maxes - fmax is order-independent so this is +// deterministic - and block 0 computes the exact epilogue sums +// concurrently); grid.sync +// 3. epilogue: affine correction + output Hadamard + svh + accumulator +// reset, warp-striped +// +// K == 4 uses the wide unit: a warp owns an ADJACENT BLOCK PAIR; lane l's uint2 +// = words {2m, 2m+1} of the contiguous 64-word region are exactly the primary +// words of runs t = 8*(2m), 8*(2m+1), which scatter to the SAME two n values +// (accumulator count unchanged, splats merge into two uint4 loads, single-stage +// butterfly, boundary word via one shuffle). 256 B contiguous per warp per +// block row with two-row prefetch. Other K use a generic narrow unit (two +// blocks per warp, pointer-based extraction). Natural register allocation (2-3 +// resident blocks/SM) measures faster than forcing higher occupancy: with wide +// loads the per-warp ILP is worth more than the extra warps. + +#define NUM_THREADS 256 + +// --------------------------------------------------------------------------------------------------------- +// Extract 8 packed 16-bit trellis windows for positions t0..t0+7 as masked +// uint32s. Index math copied from the corresponding paths in exl3_dq.cuh +// (dq8_aligned_*, dq8, dq4, dq2x2). + +__device__ __forceinline__ int dp4a_us(uint32_t a, uint32_t b, int c) { + int d; + asm("dp4a.u32.s32 %0, %1, %2, %3;" : "=r"(d) : "r"(a), "r"(b), "r"(c)); + return d; +} + +// i0/i2 land in [0, 2*words); a compare+subtract replaces the modulo (words is +// not a power of two for odd bit widths) +template +__device__ __forceinline__ int wrap_idx(int i) { + constexpr int words = bits * 256 / 32; + return i >= words ? i - words : i; +} + +template +__device__ __forceinline__ void ext4w(const uint32_t* ptr, int t0, uint32_t& w0, + uint32_t& w1, uint32_t& w2, + uint32_t& w3) { + int b0 = (t0 + 257) * bits - 16; + int b2 = b0 + 3 * bits + 16; + int i0 = b0 / 32; + int i2 = (b2 - 1) / 32; + int s2 = (i2 + 1) * 32 - b2; + uint32_t a = ptr[wrap_idx(i0)]; + uint32_t b = ptr[wrap_idx(i2)]; + w3 = fshift(b, a, s2) & 0xffff; + w2 = fshift(b, a, s2 + bits) & 0xffff; + w1 = fshift(b, a, s2 + bits * 2) & 0xffff; + w0 = fshift(b, a, s2 + bits * 3) & 0xffff; +} + +template +__device__ __forceinline__ void ext2w(const uint32_t* ptr, int t0, uint32_t& w0, + uint32_t& w1) { + int b0 = (t0 + 257) * bits - 16; + int b2 = b0 + bits + 16; + int i0 = b0 / 32; + int i2 = (b2 - 1) / 32; + int s2 = (i2 + 1) * 32 - b2; + uint32_t a = ptr[wrap_idx(i0)]; + uint32_t b = ptr[wrap_idx(i2)]; + w1 = fshift(b, a, s2) & 0xffff; + w0 = fshift(b, a, s2 + bits) & 0xffff; +} + +template +__device__ __forceinline__ void ext8w(const uint32_t* ptr, int t0, uint32_t& w0, + uint32_t& w1, uint32_t& w2, uint32_t& w3, + uint32_t& w4, uint32_t& w5, uint32_t& w6, + uint32_t& w7) { + if constexpr (bits == 1) { + uint32_t i1 = t0 >> 5; + uint32_t i0 = (i1 + 7) & 7; + uint32_t a = ptr[i0]; + uint32_t b = ptr[i1]; + b = fshift(b, a, ((~t0) & 24)); + w7 = b & 0xffff; + BFE16_IMM(w6, b, 1); + BFE16_IMM(w5, b, 2); + BFE16_IMM(w4, b, 3); + BFE16_IMM(w3, b, 4); + BFE16_IMM(w2, b, 5); + BFE16_IMM(w1, b, 6); + BFE16_IMM(w0, b, 7); + } else if constexpr (bits == 2) { + uint32_t i1 = t0 >> 4; + uint32_t i0 = (i1 + 15) & 15; + uint32_t a = ptr[i0]; + uint32_t b = ptr[i1]; + b = fshift(b, a, ((~t0) & 8) << 1); + w7 = b & 0xffff; + BFE16_IMM(w6, b, 2); + BFE16_IMM(w5, b, 4); + BFE16_IMM(w4, b, 6); + BFE16_IMM(w3, b, 8); + BFE16_IMM(w2, b, 10); + BFE16_IMM(w1, b, 12); + BFE16_IMM(w0, b, 14); + } else if constexpr (bits == 3) { + int b1 = (t0 + 257) * bits; + int b0 = b1 - 16; + int b2 = b1 + bits * 7; + int i0 = b0 / 32; + int i2 = (b2 - 1) / 32; + int s2 = (i2 + 1) * 32 - b2; + uint32_t a = ptr[wrap_idx(i0)]; + uint32_t b = ptr[wrap_idx(i2)]; + w7 = fshift(b, a, s2); + w6 = w7 >> bits; + w5 = w6 >> bits; + w4 = w5 >> bits; + w3 = fshift(b, a, s2 + bits * 4); + w2 = w3 >> bits; + w1 = w2 >> bits; + w0 = w1 >> bits; + w7 &= 0xffff; + w6 &= 0xffff; + w5 &= 0xffff; + w4 &= 0xffff; + w3 &= 0xffff; + w2 &= 0xffff; + w1 &= 0xffff; + w0 &= 0xffff; + } else if constexpr (bits == 4) { + uint32_t i1 = t0 >> 3; + uint32_t i0 = (i1 + 31) & 31; + uint32_t a = ptr[i0]; + uint32_t b = ptr[i1]; + uint32_t s; + FSHF_IMM(s, b, a, 20); + w7 = b & 0xffff; + BFE16_IMM(w6, b, 4); + BFE16_IMM(w5, b, 8); + BFE16_IMM(w4, b, 12); + BFE16_IMM(w3, b, 16); + w2 = s & 0xffff; + BFE16_IMM(w1, s, 4); + BFE16_IMM(w0, s, 8); + } else if constexpr (bits == 7) { + ext2w(ptr, t0, w0, w1); + ext2w(ptr, t0 + 2, w2, w3); + ext2w(ptr, t0 + 4, w4, w5); + ext2w(ptr, t0 + 6, w6, w7); + } else // 5, 6, 8 + { + ext4w(ptr, t0, w0, w1, w2, w3); + ext4w(ptr, t0 + 4, w4, w5, w6, w7); + } +} + +// 4bpw extraction from two already-loaded words (same window order) +__device__ __forceinline__ void extract8_4bits_words( + uint32_t a, uint32_t b, uint32_t& w0, uint32_t& w1, uint32_t& w2, + uint32_t& w3, uint32_t& w4, uint32_t& w5, uint32_t& w6, uint32_t& w7) { + uint32_t s; + FSHF_IMM(s, b, a, 20); + w7 = b & 0xffff; + BFE16_IMM(w6, b, 4); + BFE16_IMM(w5, b, 8); + BFE16_IMM(w4, b, 12); + BFE16_IMM(w3, b, 16); + w2 = s & 0xffff; + BFE16_IMM(w1, s, 4); + BFE16_IMM(w0, s, 8); +} + +// --------------------------------------------------------------------------------------------------------- +// Device building blocks (also reusable from batched mgemm/MoE-style kernels) + +// Quantize one k-slice of the (Hadamard-transformed) activation row into int8 +// byte-splats in shared memory, plus optional error-feedback residual splats +template +__device__ __forceinline__ void gemv_int8_stage_splats( + const half* __restrict__ A_had_row, float q, uint32_t* __restrict__ sh_as, + uint32_t* __restrict__ sh_as2, int kb0, int nrows) { + __syncthreads(); + float rq = 1.0f / q; + float rq2 = rq * 254.0f; + for (int i = threadIdx.x; i < nrows * 16; i += NUM_THREADS) { + float a = __half2float(A_had_row[(kb0 << 4) + i]); + int v = __float2int_rn(a * rq); + v = max(-127, min(127, v)); + sh_as[i] = ((uint32_t)(uint8_t)(int8_t)v) * 0x01010101u; + if constexpr (residual) { + float r = a - q * (float)v; + int v2 = __float2int_rn(r * rq2); + v2 = max(-127, min(127, v2)); + sh_as2[i] = ((uint32_t)(uint8_t)(int8_t)v2) * 0x01010101u; + } + } + __syncthreads(); +} + +// Block-wide: exact int8(+residual) sums of one activation row, writes {q, s1, +// s2} to qsums_row +template +__device__ __forceinline__ void gemv_int8_row_sums( + const half* __restrict__ Ar, float q, int size_k, + float* __restrict__ qsums_row) { + __shared__ int sh_s1[32]; + __shared__ int sh_s2[32]; + int t = threadIdx.x; + float rq = 1.0f / q; + float rq2 = rq * 254.0f; + int s1 = 0, s2 = 0; + for (int i = t; i < size_k; i += NUM_THREADS) { + float a = __half2float(Ar[i]); + int v = __float2int_rn(a * rq); + v = max(-127, min(127, v)); + s1 += v; + if constexpr (residual) { + float r = a - q * (float)v; + int v2 = __float2int_rn(r * rq2); + s2 += max(-127, min(127, v2)); + } + } +#pragma unroll + for (int o = 16; o > 0; o >>= 1) { + s1 += __shfl_xor_sync(0xffffffff, s1, o); + s2 += __shfl_xor_sync(0xffffffff, s2, o); + } + if ((t & 31) == 0) { + sh_s1[t >> 5] = s1; + sh_s2[t >> 5] = s2; + } + __syncthreads(); + if (t < 32) { + int v1 = t < (NUM_THREADS >> 5) ? sh_s1[t] : 0; + int v2 = t < (NUM_THREADS >> 5) ? sh_s2[t] : 0; +#pragma unroll + for (int o = 16; o > 0; o >>= 1) { + v1 += __shfl_xor_sync(0xffffffff, v1, o); + v2 += __shfl_xor_sync(0xffffffff, v2, o); + } + if (t == 0) { + qsums_row[0] = q; + ((int*)qsums_row)[1] = v1; + ((int*)qsums_row)[2] = v2; + } + } + __syncthreads(); +} + +// The K cap (fall back to the regular kernel in the DRAM-bound regime) is +// per-arch; see exl3_gemv_int8_max_k in exl3_gemv_int8.cu +#define GEMV_STAGE_D \ + 4 // cp.async pipeline depth (rows) for the smem-staged unit +#define GEMV_STAGE_MAX_BYTES (8 * GEMV_STAGE_D * 16 * 8 * 4) // 8 warps, K = 8 + +// Per-slice-scale ("sq") kernel parameters +#define SQ_KSPLIT_CAP 64 +#define SQ_MINROWS 16 // minimum slice height (staging overhead amortization) +#define SQ_ROWS_MAX 512 // shared memory cap +#define SQ_COUNTERS_CAP 4096 // fixed counter region: size_n up to 1M +#define SQ_WS_RESERVED \ + (SQ_COUNTERS_CAP + \ + 4 * SQ_KSPLIT_CAP * 4) // sq-private region at workspace start (counters + + // per-slice-per-row scales, m <= 4) + +// Wide unit (4 bpw): one (256-column x k-slice) unit, warp per adjacent block +// pair, uint2 loads. M activation rows share the decoded weights: extraction +// and the B stream are amortized, each row only adds its dp4a chains against +// its own splat region (sh_as + r * slice_stride; residual splats at (M + r) * +// slice_stride - at M = 1 this is exactly the coop kernel's sh_as/sh_as2 +// layout). Row accumulators go to accs + r * acc_stride, atomically or with +// plain stores (exclusive per-slice partials of the sq kernel). +template +__device__ __forceinline__ void gemv_int8_unit_wide( + const uint16_t* __restrict__ B, int* __restrict__ accs, size_t acc_stride, + const uint32_t* __restrict__ sh_as, int slice_stride, int nb256, int kb0, + int nrows, int size_n) { + int warp = threadIdx.x >> 5; + int lane = threadIdx.x & 31; + int nbp = nb256 * 8 + warp; + const int row_stride = size_n * 2; // u32 per block row at 4 bpw + const uint32_t* bp = ((const uint32_t*)B) + (size_t)kb0 * row_stride + + (size_t)nbp * 64 + 2 * lane; + int c2 = (lane & 1) ? 4 : 0; + int shfl_src = (lane & 16) | ((lane + 15) & 15); + + int iacc0[M] = {}, iacc1[M] = {}, jacc0[M] = {}, jacc1[M] = {}; + uint2 r0 = *(const uint2*)bp; + uint2 r1 = {}; + if (nrows > 1) r1 = *(const uint2*)(bp + row_stride); + + for (int kb = 0; kb < nrows; ++kb) { + uint2 r2 = {}; + if (kb + 2 < nrows) + r2 = *(const uint2*)(bp + (size_t)(kb + 2) * row_stride); + uint32_t prev = __shfl_sync(0xffffffff, r0.y, shfl_src); + + uint32_t w0, w1, w2, w3, w4, w5, w6, w7; + uint32_t v0, v1, v2, v3, v4, v5, v6, v7; + extract8_4bits_words(prev, r0.x, w0, w1, w2, w3, w4, w5, w6, + w7); // run t = 8*(2m) + extract8_4bits_words(r0.x, r0.y, v0, v1, v2, v3, v4, v5, v6, + v7); // run t = 8*(2m+1) + w0 *= 0x83DCD12Du; + w1 *= 0x83DCD12Du; + w2 *= 0x83DCD12Du; + w3 *= 0x83DCD12Du; + w4 *= 0x83DCD12Du; + w5 *= 0x83DCD12Du; + w6 *= 0x83DCD12Du; + w7 *= 0x83DCD12Du; + v0 *= 0x83DCD12Du; + v1 *= 0x83DCD12Du; + v2 *= 0x83DCD12Du; + v3 *= 0x83DCD12Du; + v4 *= 0x83DCD12Du; + v5 *= 0x83DCD12Du; + v6 *= 0x83DCD12Du; + v7 *= 0x83DCD12Du; + +#pragma unroll + for (int r = 0; r < M; ++r) { + const uint32_t* as = sh_as + r * slice_stride + (kb << 4); + uint4 as0 = *(const uint4*)(as + c2); + uint4 as8 = *(const uint4*)(as + c2 + 8); + iacc0[r] = dp4a_us(w0, as0.x, iacc0[r]); + iacc0[r] = dp4a_us(w1, as0.y, iacc0[r]); + iacc0[r] = dp4a_us(w2, as8.x, iacc0[r]); + iacc0[r] = dp4a_us(w3, as8.y, iacc0[r]); + iacc1[r] = dp4a_us(w4, as0.x, iacc1[r]); + iacc1[r] = dp4a_us(w5, as0.y, iacc1[r]); + iacc1[r] = dp4a_us(w6, as8.x, iacc1[r]); + iacc1[r] = dp4a_us(w7, as8.y, iacc1[r]); + iacc0[r] = dp4a_us(v0, as0.z, iacc0[r]); + iacc0[r] = dp4a_us(v1, as0.w, iacc0[r]); + iacc0[r] = dp4a_us(v2, as8.z, iacc0[r]); + iacc0[r] = dp4a_us(v3, as8.w, iacc0[r]); + iacc1[r] = dp4a_us(v4, as0.z, iacc1[r]); + iacc1[r] = dp4a_us(v5, as0.w, iacc1[r]); + iacc1[r] = dp4a_us(v6, as8.z, iacc1[r]); + iacc1[r] = dp4a_us(v7, as8.w, iacc1[r]); + if constexpr (residual) { + const uint32_t* as2 = sh_as + (M + r) * slice_stride + (kb << 4); + uint4 bs0 = *(const uint4*)(as2 + c2); + uint4 bs8 = *(const uint4*)(as2 + c2 + 8); + jacc0[r] = dp4a_us(w0, bs0.x, jacc0[r]); + jacc0[r] = dp4a_us(w1, bs0.y, jacc0[r]); + jacc0[r] = dp4a_us(w2, bs8.x, jacc0[r]); + jacc0[r] = dp4a_us(w3, bs8.y, jacc0[r]); + jacc1[r] = dp4a_us(w4, bs0.x, jacc1[r]); + jacc1[r] = dp4a_us(w5, bs0.y, jacc1[r]); + jacc1[r] = dp4a_us(w6, bs8.x, jacc1[r]); + jacc1[r] = dp4a_us(w7, bs8.y, jacc1[r]); + jacc0[r] = dp4a_us(v0, bs0.z, jacc0[r]); + jacc0[r] = dp4a_us(v1, bs0.w, jacc0[r]); + jacc0[r] = dp4a_us(v2, bs8.z, jacc0[r]); + jacc0[r] = dp4a_us(v3, bs8.w, jacc0[r]); + jacc1[r] = dp4a_us(v4, bs0.z, jacc1[r]); + jacc1[r] = dp4a_us(v5, bs0.w, jacc1[r]); + jacc1[r] = dp4a_us(v6, bs8.z, jacc1[r]); + jacc1[r] = dp4a_us(v7, bs8.w, jacc1[r]); + } + } + + r0 = r1; + r1 = r2; + } + +// Lanes l, l^1 share both n values +#pragma unroll + for (int r = 0; r < M; ++r) { + iacc0[r] += __shfl_xor_sync(0xffffffff, iacc0[r], 1); + iacc1[r] += __shfl_xor_sync(0xffffffff, iacc1[r], 1); + if constexpr (residual) { + jacc0[r] += __shfl_xor_sync(0xffffffff, jacc0[r], 1); + jacc1[r] += __shfl_xor_sync(0xffffffff, jacc1[r], 1); + } + } + if (!(lane & 1)) { + int nb = nbp * 2 + (lane >> 4); + int n0 = nb * 16 + ((lane & 15) >> 1); +#pragma unroll + for (int r = 0; r < M; ++r) { + int* acc = accs + r * acc_stride; + if constexpr (atomic) { + atomicAdd(acc + n0, iacc0[r]); + atomicAdd(acc + n0 + 8, iacc1[r]); + if constexpr (residual) { + atomicAdd(acc + size_n + n0, jacc0[r]); + atomicAdd(acc + size_n + n0 + 8, jacc1[r]); + } + } else { + acc[n0] = iacc0[r]; + acc[n0 + 8] = iacc1[r]; + if constexpr (residual) { + acc[size_n + n0] = jacc0[r]; + acc[size_n + n0 + 8] = jacc1[r]; + } + } + } + } +} + +// One k-row of an adjacent block pair, generic K: extract + dp4a for both +// blocks from block pointers (global or shared memory), M rows sharing the +// extraction +template +__device__ __forceinline__ void gemv_int8_pair_row( + const uint32_t* blockA, const uint32_t* blockB, + const uint32_t* as_kb, // sh_as + (kb << 4) + int slice_stride, int c2, int t0, int* ia0, int* ia1, int* ib0, int* ib1, + int* ja0, int* ja1, int* jb0, int* jb1) { + uint32_t w0, w1, w2, w3, w4, w5, w6, w7; + ext8w(blockA, t0, w0, w1, w2, w3, w4, w5, w6, w7); + w0 *= 0x83DCD12Du; + w1 *= 0x83DCD12Du; + w2 *= 0x83DCD12Du; + w3 *= 0x83DCD12Du; + w4 *= 0x83DCD12Du; + w5 *= 0x83DCD12Du; + w6 *= 0x83DCD12Du; + w7 *= 0x83DCD12Du; +#pragma unroll + for (int r = 0; r < M; ++r) { + const uint32_t* as = as_kb + r * slice_stride; + uint2 as01 = *(const uint2*)(as + c2); + uint2 as89 = *(const uint2*)(as + c2 + 8); + ia0[r] = dp4a_us(w0, as01.x, ia0[r]); + ia0[r] = dp4a_us(w1, as01.y, ia0[r]); + ia0[r] = dp4a_us(w2, as89.x, ia0[r]); + ia0[r] = dp4a_us(w3, as89.y, ia0[r]); + ia1[r] = dp4a_us(w4, as01.x, ia1[r]); + ia1[r] = dp4a_us(w5, as01.y, ia1[r]); + ia1[r] = dp4a_us(w6, as89.x, ia1[r]); + ia1[r] = dp4a_us(w7, as89.y, ia1[r]); + if constexpr (residual) { + const uint32_t* as2 = as_kb + (M + r) * slice_stride; + uint2 bs01 = *(const uint2*)(as2 + c2); + uint2 bs89 = *(const uint2*)(as2 + c2 + 8); + ja0[r] = dp4a_us(w0, bs01.x, ja0[r]); + ja0[r] = dp4a_us(w1, bs01.y, ja0[r]); + ja0[r] = dp4a_us(w2, bs89.x, ja0[r]); + ja0[r] = dp4a_us(w3, bs89.y, ja0[r]); + ja1[r] = dp4a_us(w4, bs01.x, ja1[r]); + ja1[r] = dp4a_us(w5, bs01.y, ja1[r]); + ja1[r] = dp4a_us(w6, bs89.x, ja1[r]); + ja1[r] = dp4a_us(w7, bs89.y, ja1[r]); + } + } + + ext8w(blockB, t0, w0, w1, w2, w3, w4, w5, w6, w7); + w0 *= 0x83DCD12Du; + w1 *= 0x83DCD12Du; + w2 *= 0x83DCD12Du; + w3 *= 0x83DCD12Du; + w4 *= 0x83DCD12Du; + w5 *= 0x83DCD12Du; + w6 *= 0x83DCD12Du; + w7 *= 0x83DCD12Du; +#pragma unroll + for (int r = 0; r < M; ++r) { + const uint32_t* as = as_kb + r * slice_stride; + uint2 as01 = *(const uint2*)(as + c2); + uint2 as89 = *(const uint2*)(as + c2 + 8); + ib0[r] = dp4a_us(w0, as01.x, ib0[r]); + ib0[r] = dp4a_us(w1, as01.y, ib0[r]); + ib0[r] = dp4a_us(w2, as89.x, ib0[r]); + ib0[r] = dp4a_us(w3, as89.y, ib0[r]); + ib1[r] = dp4a_us(w4, as01.x, ib1[r]); + ib1[r] = dp4a_us(w5, as01.y, ib1[r]); + ib1[r] = dp4a_us(w6, as89.x, ib1[r]); + ib1[r] = dp4a_us(w7, as89.y, ib1[r]); + if constexpr (residual) { + const uint32_t* as2 = as_kb + (M + r) * slice_stride; + uint2 bs01 = *(const uint2*)(as2 + c2); + uint2 bs89 = *(const uint2*)(as2 + c2 + 8); + jb0[r] = dp4a_us(w0, bs01.x, jb0[r]); + jb0[r] = dp4a_us(w1, bs01.y, jb0[r]); + jb0[r] = dp4a_us(w2, bs89.x, jb0[r]); + jb0[r] = dp4a_us(w3, bs89.y, jb0[r]); + jb1[r] = dp4a_us(w4, bs01.x, jb1[r]); + jb1[r] = dp4a_us(w5, bs01.y, jb1[r]); + jb1[r] = dp4a_us(w6, bs89.x, jb1[r]); + jb1[r] = dp4a_us(w7, bs89.y, jb1[r]); + } + } +} + +// Shared reduction tail for the pair-per-warp generic units (atomic, or +// exclusive plain stores for the per-slice partials of the sq kernel): four +// lanes share each n +template +__device__ __forceinline__ void gemv_int8_pair_tail( + int* __restrict__ accs, size_t acc_stride, int nbp, int lane, int size_n, + int* ia0, int* ia1, int* ib0, int* ib1, int* ja0, int* ja1, int* jb0, + int* jb1) { +#pragma unroll + for (int r = 0; r < M; ++r) { +#pragma unroll + for (int o = 1; o < 4; o <<= 1) { + ia0[r] += __shfl_xor_sync(0xffffffff, ia0[r], o); + ia1[r] += __shfl_xor_sync(0xffffffff, ia1[r], o); + ib0[r] += __shfl_xor_sync(0xffffffff, ib0[r], o); + ib1[r] += __shfl_xor_sync(0xffffffff, ib1[r], o); + if constexpr (residual) { + ja0[r] += __shfl_xor_sync(0xffffffff, ja0[r], o); + ja1[r] += __shfl_xor_sync(0xffffffff, ja1[r], o); + jb0[r] += __shfl_xor_sync(0xffffffff, jb0[r], o); + jb1[r] += __shfl_xor_sync(0xffffffff, jb1[r], o); + } + } + } + if ((lane & 3) == 0) { + int nA = (nbp * 2) * 16 + (lane >> 2); + int nB = nA + 16; +#pragma unroll + for (int r = 0; r < M; ++r) { + int* acc = accs + r * acc_stride; + if constexpr (atomic) { + atomicAdd(acc + nA, ia0[r]); + atomicAdd(acc + nA + 8, ia1[r]); + atomicAdd(acc + nB, ib0[r]); + atomicAdd(acc + nB + 8, ib1[r]); + if constexpr (residual) { + atomicAdd(acc + size_n + nA, ja0[r]); + atomicAdd(acc + size_n + nA + 8, ja1[r]); + atomicAdd(acc + size_n + nB, jb0[r]); + atomicAdd(acc + size_n + nB + 8, jb1[r]); + } + } else { + acc[nA] = ia0[r]; + acc[nA + 8] = ia1[r]; + acc[nB] = ib0[r]; + acc[nB + 8] = ib1[r]; + if constexpr (residual) { + acc[size_n + nA] = ja0[r]; + acc[size_n + nA + 8] = ja1[r]; + acc[size_n + nB] = jb0[r]; + acc[size_n + nB + 8] = jb1[r]; + } + } + } + } +} + +// Narrow generic unit (any K): one (256-column x k-slice) unit, warp per +// adjacent block pair processed sequentially with pointer-based extraction +// straight from global memory +template +__device__ __forceinline__ void gemv_int8_unit_narrow( + const uint16_t* __restrict__ B, int* __restrict__ accs, size_t acc_stride, + const uint32_t* __restrict__ sh_as, int slice_stride, int nb256, int kb0, + int nrows, int size_n) { + int warp = threadIdx.x >> 5; + int lane = threadIdx.x & 31; + int nbp = nb256 * 8 + warp; + const int row_stride = size_n * bits / 2; + const uint32_t* bp = ((const uint32_t*)B) + (size_t)kb0 * row_stride + + (size_t)nbp * (bits * 16); + int c2 = 2 * (lane & 3); + int ia0[M] = {}, ia1[M] = {}, ib0[M] = {}, ib1[M] = {}; + int ja0[M] = {}, ja1[M] = {}, jb0[M] = {}, jb1[M] = {}; + + for (int kb = 0; kb < nrows; ++kb) { + const uint32_t* blockA = bp + (size_t)kb * row_stride; + gemv_int8_pair_row( + blockA, blockA + 8 * bits, sh_as + (kb << 4), slice_stride, c2, + lane << 3, ia0, ia1, ib0, ib1, ja0, ja1, jb0, jb1); + } + gemv_int8_pair_tail(accs, acc_stride, nbp, lane, size_n, + ia0, ia1, ib0, ib1, ja0, ja1, jb0, + jb1); +} + +// Smem-staged generic unit: the warp stages its block pair's rows into a +// warp-private shared memory slice with cp.async (coalesced 16 B chunks, one +// commit group per row, GEMV_STAGE_D rows deep) and extracts from shared +// memory. Used for the K where scattered pointer extraction leaves the most +// load latency exposed (3, 5, 7); warp-private slices need no block-level +// synchronization. +template +__device__ __forceinline__ void gemv_int8_unit_smem( + const uint16_t* __restrict__ B, int* __restrict__ accs, size_t acc_stride, + const uint32_t* __restrict__ sh_as, int slice_stride, + uint32_t* __restrict__ sh_b, int nb256, int kb0, int nrows, int size_n) { + constexpr int D = GEMV_STAGE_D; + constexpr int pairwords = 16 * bits; + constexpr int chunks = pairwords / 4; // 16 B cp.async chunks per pair row + int warp = threadIdx.x >> 5; + int lane = threadIdx.x & 31; + int nbp = nb256 * 8 + warp; + const int row_stride = size_n * bits / 2; + const uint32_t* bp = + ((const uint32_t*)B) + (size_t)kb0 * row_stride + (size_t)nbp * pairwords; + uint32_t* sb = sh_b + warp * (D * pairwords); + + auto stage_row = [&](int kb) { + if (kb < nrows && lane < chunks) + cp_async(sb + (kb % D) * pairwords + lane * 4, + bp + (size_t)kb * row_stride + lane * 4); + cp_async_fence(); + }; +#pragma unroll + for (int r = 0; r < D - 1; ++r) stage_row(r); + + int c2 = 2 * (lane & 3); + int ia0[M] = {}, ia1[M] = {}, ib0[M] = {}, ib1[M] = {}; + int ja0[M] = {}, ja1[M] = {}, jb0[M] = {}, jb1[M] = {}; + + for (int kb = 0; kb < nrows; ++kb) { + cp_async_wait(); + // Also orders the previous iteration's smem reads (all lanes) before the + // overwrite below + __syncwarp(); + stage_row(kb + D - 1); + + const uint32_t* blockA = sb + (kb % D) * pairwords; + gemv_int8_pair_row( + blockA, blockA + 8 * bits, sh_as + (kb << 4), slice_stride, c2, + lane << 3, ia0, ia1, ib0, ib1, ja0, ja1, jb0, jb1); + } + gemv_int8_pair_tail(accs, acc_stride, nbp, lane, size_n, + ia0, ia1, ib0, ib1, ja0, ja1, jb0, + jb1); +} + +// K values routed to the smem-staged unit (measured on 3090: K=3 -13%; narrow +// wins for 2/6/8 which are at the ALU floor / DRAM-bound, wide covers 4) +__host__ __device__ constexpr bool gemv_int8_stage_smem(int bits) { + return bits == 3 || bits == 5 || bits == 7; +} + +// Epilogue for one row: affine correction + output Hadamard + svh scale + +// accumulator reset, striped over all warps of the grid. sh_tmp: 128 floats per +// warp. +template +__device__ __forceinline__ void gemv_int8_epilogue( + int* __restrict__ accs, void* __restrict__ C_row, + const float* __restrict__ qrow, const half* __restrict__ svh, + float* __restrict__ sh_tmp, int size_n, float output_scale) { + int lane = threadIdx.x & 31; + int warps_grid = gridDim.x * NUM_THREADS / 32; + int this_warp = threadIdx.x / 32 + NUM_THREADS / 32 * blockIdx.x; + float* tmp = sh_tmp + (threadIdx.x / 32) * 128; + + float k_inv = __half2float(__ushort_as_half(0x1eee)); + float k_bias = __half2float(__ushort_as_half(0xc931)); + float q = qrow[0]; + float q2 = q * (1.0f / 254.0f); + float suma = q * (float)((const int*)qrow)[1]; + if constexpr (residual) suma += q2 * (float)((const int*)qrow)[2]; + float corr = (1024.0f * k_inv + k_bias) * suma; + + int total_chunks = size_n / 128; + for (; this_warp < total_chunks; this_warp += warps_grid) { + int base = this_warp * 128; +#pragma unroll + for (int i = 0; i < 4; ++i) { + int j = lane * 4 + i; + float s = q * (float)accs[base + j]; + accs[base + j] = 0; + if constexpr (residual) { + s += q2 * (float)accs[size_n + base + j]; + accs[size_n + base + j] = 0; + } + tmp[j] = k_inv * s + corr; + } + __syncwarp(); + // gridDim.y == 1, so the inner's blockIdx.y-based scale offset is zero; + // pre-offset svh + if constexpr (c_fp32) + had_ff_r_128_inner(tmp, ((float*)C_row) + base, svh + base, + 0.088388347648f * output_scale); + else + had_fh_r_128_inner(tmp, ((half*)C_row) + base, svh + base, + 0.088388347648f * output_scale); + __syncwarp(); + } +} + +// --------------------------------------------------------------------------------------------------------- +// Per-slice-scale ("sq") kernel for m == 1: kills ALL global pre-GEMV +// coordination. Each k-slice is Hadamard-transformed, maxed and quantized +// block-locally during staging with its own q_s = slicemax/127 (deterministic, +// so duplicating blocks agree bit-exactly - and strictly finer quantization +// than a global q), units write exact per-slice int32 partials with plain +// stores (exclusive writers - no atomics, no accumulator zeroing), and a +// per-256-column completion counter gates an inline epilogue that combines +// sum_s q_s*acc_s in fixed slice order (deterministic) plus the per-slice +// affine corrections. One REGULAR launch: no cooperative machinery, no +// grid.sync, no A_had traffic. Same 10 kernel arguments (A_had unused). +// Workspace layout (fixed offsets so mixed sq/coop calls of any shape can share +// the buffer): +// [counters: SQ_COUNTERS_CAP][{q_s, s1_s, s2_s, pad} x +// SQ_KSPLIT_CAP][partials: ksplit x pstride] +// The coop kernels use the region beyond SQ_WS_RESERVED. Counters are zeroed +// when the workspace is (re)allocated and reset by the finishing block, so they +// stay zero between calls. + +// Stage one slice for M activation rows: Hadamard from A into sh_ah, slice max +// -> q_s, splats + exact sums per row. Bit-identical in every block that stages +// the same slice. Rows >= size_m (padding at M = 4, m = 3) get zero splats and +// dummy scales. +template +__device__ __forceinline__ void gemv_int8_stage_slice( + const half* __restrict__ A, int size_m, int size_k, + const half* __restrict__ suh, + float* __restrict__ qs, // qsums + 4 * slice * M, rows consecutive, + // published (idempotent) + half* __restrict__ sh_ah, + uint32_t* __restrict__ sh_as, // M regions of slice_stride words (+ M more + // for residual) + int slice_stride, + float* __restrict__ sh_red, // 33 floats + int kb0, int nrows) { + int t = threadIdx.x; + int nel = nrows * 16; +#pragma unroll + for (int r = 0; r < M; ++r) { + uint32_t* as = sh_as + r * slice_stride; + uint32_t* as2 = sh_as + (M + r) * slice_stride; + float* qsr = qs + 4 * r; + __syncthreads(); + if (r >= size_m) { + for (int i = t; i < nel; i += NUM_THREADS) { + as[i] = 0; + if constexpr (residual) as2[i] = 0; + } + if (t == 0) { + qsr[0] = 1.0f; + ((int*)qsr)[1] = 0; + ((int*)qsr)[2] = 0; + } + continue; + } + const half* Ar = A + (size_t)r * size_k; + for (int sp = t >> 5; sp < (nel >> 7); sp += NUM_THREADS >> 5) + had_hf_r_128_inner( + Ar + (kb0 << 4) + (sp << 7), sh_ah + (sp << 7), + suh + (kb0 << 4) + (sp << 7), 0.088388347648f); + __syncthreads(); + + float mx = 0.0f; + for (int i = t; i < nel; i += NUM_THREADS) + mx = fmaxf(mx, fabsf(__half2float(sh_ah[i]))); +#pragma unroll + for (int o = 16; o > 0; o >>= 1) + mx = fmaxf(mx, __shfl_xor_sync(0xffffffff, mx, o)); + if ((t & 31) == 0) sh_red[t >> 5] = mx; + __syncthreads(); + if (t < 32) { + float v = t < (NUM_THREADS >> 5) ? sh_red[t] : 0.0f; +#pragma unroll + for (int o = 16; o > 0; o >>= 1) + v = fmaxf(v, __shfl_xor_sync(0xffffffff, v, o)); + if (t == 0) sh_red[32] = fmaxf(v, 1e-8f) / 127.0f; + } + __syncthreads(); + float q_s = sh_red[32]; + + float rq = 1.0f / q_s; + float rq2 = rq * 254.0f; + int l1 = 0, l2 = 0; + for (int i = t; i < nel; i += NUM_THREADS) { + float a = __half2float(sh_ah[i]); + int v = __float2int_rn(a * rq); + v = max(-127, min(127, v)); + as[i] = ((uint32_t)(uint8_t)(int8_t)v) * 0x01010101u; + l1 += v; + if constexpr (residual) { + float rr = a - q_s * (float)v; + int v2 = __float2int_rn(rr * rq2); + v2 = max(-127, min(127, v2)); + as2[i] = ((uint32_t)(uint8_t)(int8_t)v2) * 0x01010101u; + l2 += v2; + } + } +#pragma unroll + for (int o = 16; o > 0; o >>= 1) { + l1 += __shfl_xor_sync(0xffffffff, l1, o); + l2 += __shfl_xor_sync(0xffffffff, l2, o); + } + if ((t & 31) == 0) { + ((int*)sh_red)[t >> 5] = l1; + sh_red[16 + (t >> 5)] = __int_as_float(l2); + } + __syncthreads(); + if (t < 32) { + int v1 = t < (NUM_THREADS >> 5) ? ((int*)sh_red)[t] : 0; + int v2 = t < (NUM_THREADS >> 5) ? __float_as_int(sh_red[16 + t]) : 0; +#pragma unroll + for (int o = 16; o > 0; o >>= 1) { + v1 += __shfl_xor_sync(0xffffffff, v1, o); + v2 += __shfl_xor_sync(0xffffffff, v2, o); + } + if (t == 0) { + qsr[0] = sh_red[32]; + ((int*)qsr)[1] = v1; + ((int*)qsr)[2] = v2; + } + } + } + __syncthreads(); +} + +// Epilogue for one 256-column group: deterministic fixed-order combine over the +// per-slice partials, warp per (row, 128-span). Reads bypass L1 (__ldcg): the +// contributions arrived from other blocks with no grid-wide barrier. +template +__device__ __forceinline__ void gemv_int8_epilogue_group_sq( + const int* __restrict__ partials, const float* __restrict__ qsums, + int pstride, int ksplit, int size_m, void* __restrict__ C, + const half* __restrict__ svh, float* __restrict__ sh_tmp, int nb256, + int size_n) { + int warp = threadIdx.x >> 5; + int lane = threadIdx.x & 31; + int row = warp >> 1; + if (warp >= 2 * M || row >= size_m) return; + float k_inv = __half2float(__ushort_as_half(0x1eee)); + float k_bias = __half2float(__ushort_as_half(0xc931)); + float aff = 1024.0f * k_inv + k_bias; + + int base = nb256 * 256 + (warp & 1) * 128; + float* tmp = sh_tmp + warp * 128; + float acc[4] = {}; + float corr = 0.0f; + for (int sl = 0; sl < ksplit; ++sl) { + int idx = sl * M + row; + float q_s = qsums[4 * idx]; + float suma = q_s * (float)((const int*)qsums)[4 * idx + 1]; + const int* p = partials + (size_t)idx * pstride + base; +#pragma unroll + for (int i = 0; i < 4; ++i) acc[i] += q_s * (float)__ldcg(p + lane * 4 + i); + if constexpr (residual) { + float q2_s = q_s * (1.0f / 254.0f); + suma += q2_s * (float)((const int*)qsums)[4 * idx + 2]; +#pragma unroll + for (int i = 0; i < 4; ++i) + acc[i] += q2_s * (float)__ldcg(p + size_n + lane * 4 + i); + } + corr += aff * suma; + } +#pragma unroll + for (int i = 0; i < 4; ++i) tmp[lane * 4 + i] = k_inv * acc[i] + corr; + __syncwarp(); + if constexpr (c_fp32) + had_ff_r_128_inner(tmp, + ((float*)C) + (size_t)row * size_n + base, + svh + base, 0.088388347648f); + else + had_fh_r_128_inner(tmp, + ((half*)C) + (size_t)row * size_n + base, + svh + base, 0.088388347648f); +} + +// Shared-memory cap for the sq decomposition: row halfs (32 B/row) + M splat +// regions (64 B/row each, x2 residual), within ~80 KB so the stage region and +// epilogue staging still fit under the opt-in max +__host__ __device__ constexpr int gemv_int8_sq_rows_max(int M, bool residual) { + int cap = (80 * 1024) / (32 + 64 * M * (residual ? 2 : 1)); + cap &= ~7; + return cap < SQ_ROWS_MAX ? cap : SQ_ROWS_MAX; +} + +template +__global__ __launch_bounds__(NUM_THREADS) void exl3_gemv_int8_sq_kernel( + const half* __restrict__ A, const uint16_t* __restrict__ B, + void* __restrict__ C, + const int size_m, // 1 <= size_m <= M + const int size_k, const int size_n, int* __restrict__ locks, + const half* __restrict__ suh, half* __restrict__ A_had, + const half* __restrict__ svh) { + extern __shared__ uint32_t shmem[]; + + // Work decomposition: rows_per multiple of 8 (whole 128-spans for the local + // Hadamard); the host mirrors this for the shared memory size and workspace + // bound. Swept on 3090: the wall time is ~one unit's duration as long as all + // (slice x 256-column) units fit in one wave of the grid, so take the + // smallest slice height with units <= gridDim.x - but at least half-wave + // occupancy up to 32 rows, since very short slices inflate ksplit and the + // epilogue's serial per-slice combine + int rows_total = size_k >> 4; + int nb256_total = size_n / 256; + int r = CEIL_DIVIDE(rows_total * nb256_total, (int)gridDim.x); + int rows_per = (MAX(r, MIN(2 * r, 32)) + 7) & ~7; + rows_per = MAX(rows_per, SQ_MINROWS); + rows_per = MIN(rows_per, gemv_int8_sq_rows_max(M, residual)); + rows_per = MIN(rows_per, (rows_total + 7) & ~7); + int ksplit = CEIL_DIVIDE(rows_total, rows_per); + int units = nb256_total * ksplit; + int slice_stride = rows_per * 16; + int pstride = size_n * (residual ? 2 : 1); + + int* counters = locks; + float* qsums = (float*)(locks + SQ_COUNTERS_CAP); + int* partials = locks + SQ_WS_RESERVED; + + // Shared layout: [slice halfs][M x splats (+ M x residual splats)][B + // stage][epilogue tmp] + half* sh_ah = (half*)shmem; + uint32_t* sh_as = shmem + rows_per * 8; + uint32_t* sh_b = sh_as + slice_stride * M * (residual ? 2 : 1); + float* sh_tmp = + (float*)(sh_b + + (gemv_int8_stage_smem(bits) ? 8 * GEMV_STAGE_D * 16 * bits : 0)); + __shared__ float sh_red[33]; + __shared__ int sh_last; + + int t = threadIdx.x; + int prev_slice = -1; + for (int unit = blockIdx.x; unit < units; unit += gridDim.x) { + int slice = unit / nb256_total; + int nb256 = unit % nb256_total; + int kb0 = slice * rows_per; + int nrows = MIN(rows_per, rows_total - kb0); + if (slice != prev_slice) { + gemv_int8_stage_slice(A, size_m, size_k, suh, + qsums + 4 * slice * M, sh_ah, sh_as, + slice_stride, sh_red, kb0, nrows); + prev_slice = slice; + } + int* pacc = partials + (size_t)slice * M * pstride; + if constexpr (bits == 4) + gemv_int8_unit_wide( + B, pacc, pstride, sh_as, slice_stride, nb256, kb0, nrows, size_n); + else if constexpr (gemv_int8_stage_smem(bits)) + gemv_int8_unit_smem(B, pacc, pstride, sh_as, + slice_stride, sh_b, nb256, + kb0, nrows, size_n); + else + gemv_int8_unit_narrow( + B, pacc, pstride, sh_as, slice_stride, nb256, kb0, nrows, size_n); + + // Completion counter: the ksplit-th contributor runs the epilogue for this + // 256-column group. (sh_last reuse across iterations is ordered by the next + // iteration's __syncthreads.) + __threadfence(); + __syncthreads(); + if (t == 0) + sh_last = (atomicAdd(&counters[nb256], 1) == ksplit - 1) ? 1 : 0; + __syncthreads(); + if (sh_last) { + gemv_int8_epilogue_group_sq(partials, qsums, pstride, + ksplit, size_m, C, svh, + sh_tmp, nb256, size_n); + if (t == 0) counters[nb256] = 0; + } + } +} + +// --------------------------------------------------------------------------------------------------------- +// Cooperative kernel: same argument list as exl3_gemm_kernel + +template +__global__ __launch_bounds__(NUM_THREADS) void exl3_gemv_int8_coop_kernel( + const half* __restrict__ A, const uint16_t* __restrict__ B, + void* __restrict__ C, const int size_m, const int size_k, const int size_n, + int* __restrict__ locks, const half* __restrict__ suh, + half* __restrict__ A_had, const half* __restrict__ svh) { + auto grid = cg_gemv::this_grid(); + extern __shared__ uint32_t shmem[]; + + int* accs = locks; + float* qsums = (float*)(locks + 2 * size_n); + float* partial_max = qsums + 4 * size_m; // [gridDim.x], m == 1 fast path + + // Phase 1a: input Hadamard (as in exl3_gemm_kernel) + zero the accumulators. + // For m == 1, also track a per-block partial max of the transformed + // activations. + { + __shared__ float sh_m[32]; + int total_warps = size_m * size_k / 128; + int warps_grid = gridDim.x * NUM_THREADS / 32; + int this_warp = threadIdx.x / 32 + NUM_THREADS / 32 * blockIdx.x; + int lane = threadIdx.x & 31; + float mx = 0.0f; + for (; this_warp < total_warps; this_warp += warps_grid) { + had_hf_r_128_inner( + A + this_warp * 128, A_had + this_warp * 128, + suh + (this_warp * 128) % size_k, 0.088388347648f); + if (size_m == 1) { + __syncwarp(); + const half2* h2 = (const half2*)(A_had + this_warp * 128); +#pragma unroll + for (int i = 0; i < 2; ++i) { + half2 v = h2[lane * 2 + i]; + mx = fmaxf(mx, fabsf(__half2float(__low2half(v)))); + mx = fmaxf(mx, fabsf(__half2float(__high2half(v)))); + } + } + } + if (size_m == 1) { +#pragma unroll + for (int o = 16; o > 0; o >>= 1) + mx = fmaxf(mx, __shfl_xor_sync(0xffffffff, mx, o)); + if (lane == 0) sh_m[threadIdx.x >> 5] = mx; + __syncthreads(); + if (threadIdx.x < 32) { + float v = threadIdx.x < (NUM_THREADS >> 5) ? sh_m[threadIdx.x] : 0.0f; +#pragma unroll + for (int o = 16; o > 0; o >>= 1) + v = fmaxf(v, __shfl_xor_sync(0xffffffff, v, o)); + if (threadIdx.x == 0) partial_max[blockIdx.x] = v; + } + } + int tg = blockIdx.x * NUM_THREADS + threadIdx.x; + for (int i = tg; i < 2 * size_n; i += gridDim.x * NUM_THREADS) accs[i] = 0; + } + grid.sync(); + + // Phase 1b (m > 1 only): per-row activation scale and exact sums + if (size_m > 1) { + __shared__ float sh_r[33]; + for (int row = blockIdx.x; row < size_m; row += gridDim.x) { + const half* Ar = A_had + (size_t)row * size_k; + int t = threadIdx.x; + float mx = 0.0f; + for (int i = t; i < size_k; i += NUM_THREADS) + mx = fmaxf(mx, fabsf(__half2float(Ar[i]))); +#pragma unroll + for (int o = 16; o > 0; o >>= 1) + mx = fmaxf(mx, __shfl_xor_sync(0xffffffff, mx, o)); + if ((t & 31) == 0) sh_r[t >> 5] = mx; + __syncthreads(); + if (t < 32) { + float v = t < (NUM_THREADS >> 5) ? sh_r[t] : 0.0f; +#pragma unroll + for (int o = 16; o > 0; o >>= 1) + v = fmaxf(v, __shfl_xor_sync(0xffffffff, v, o)); + if (t == 0) sh_r[32] = fmaxf(v, 1e-8f) / 127.0f; + } + __syncthreads(); + gemv_int8_row_sums(Ar, sh_r[32], size_k, qsums + 4 * row); + } + grid.sync(); + } + + // Work decomposition for phase 2 (host must mirror this for the shared memory + // size). Units are 256 columns (warp per adjacent block pair) x k-slice; + // fine-grained (~4 per block) because with grid.sync at the end of the phase, + // tail imbalance stalls the whole grid. + int rows_total = size_k >> 4; + int nb256_total = size_n / 256; + int smem_rows_max = residual ? 384 : 768; + int ksplit = CEIL_DIVIDE(4 * gridDim.x, nb256_total); + ksplit = MAX(ksplit, CEIL_DIVIDE(rows_total, smem_rows_max)); + ksplit = MIN(ksplit, rows_total); + int rows_per = CEIL_DIVIDE(rows_total, ksplit); + int units = nb256_total * ksplit; + + uint32_t* sh_as = shmem; + uint32_t* sh_as2 = shmem + rows_per * 16; + uint32_t* sh_b = + shmem + rows_per * 16 * (residual ? 2 : 1); // smem-staged unit region + + __shared__ float sh_q[33]; + + for (int row = 0; row < size_m; ++row) { + const half* Ar = A_had + (size_t)row * size_k; + const float* qrow = qsums + 4 * row; + + // Row scale: for m == 1, derived from the phase-1a partial maxes + // (deterministic: fmax is order-independent). Block 0 also computes the + // exact sums for the epilogue, concurrently with the other blocks' GEMV + // work. + float q_row; + if (size_m == 1) { + float v = 0.0f; + for (int i = threadIdx.x; i < gridDim.x; i += NUM_THREADS) + v = fmaxf(v, partial_max[i]); +#pragma unroll + for (int o = 16; o > 0; o >>= 1) + v = fmaxf(v, __shfl_xor_sync(0xffffffff, v, o)); + if ((threadIdx.x & 31) == 0) sh_q[threadIdx.x >> 5] = v; + __syncthreads(); + if (threadIdx.x < 32) { + float w = threadIdx.x < (NUM_THREADS >> 5) ? sh_q[threadIdx.x] : 0.0f; +#pragma unroll + for (int o = 16; o > 0; o >>= 1) + w = fmaxf(w, __shfl_xor_sync(0xffffffff, w, o)); + if (threadIdx.x == 0) sh_q[32] = fmaxf(w, 1e-8f) / 127.0f; + } + __syncthreads(); + q_row = sh_q[32]; + if (blockIdx.x == 0) + gemv_int8_row_sums(Ar, q_row, size_k, qsums); + } else + q_row = qrow[0]; + + // Phase 2: GEMV over (nb256, k-slice) units, splats quantized inline during + // smem staging + int prev_slice = -1; + for (int unit = blockIdx.x; unit < units; unit += gridDim.x) { + int slice = unit / nb256_total; + int nb256 = unit % nb256_total; + int kb0 = slice * rows_per; + int nrows = MIN(rows_per, rows_total - kb0); + if (slice != prev_slice) { + gemv_int8_stage_splats(Ar, q_row, sh_as, sh_as2, kb0, nrows); + prev_slice = slice; + } + if constexpr (bits == 4) + gemv_int8_unit_wide<1, residual>(B, accs, 0, sh_as, rows_per * 16, + nb256, kb0, nrows, size_n); + else if constexpr (gemv_int8_stage_smem(bits)) + gemv_int8_unit_smem(B, accs, 0, sh_as, rows_per * 16, + sh_b, nb256, kb0, nrows, size_n); + else + gemv_int8_unit_narrow( + B, accs, 0, sh_as, rows_per * 16, nb256, kb0, nrows, size_n); + } + grid.sync(); + + // Phase 3: epilogue + output Hadamard (shared memory reused as per-warp + // staging) + void* C_row = c_fp32 ? (void*)(((float*)C) + (size_t)row * size_n) + : (void*)(((half*)C) + (size_t)row * size_n); + gemv_int8_epilogue(accs, C_row, qrow, svh, (float*)shmem, + size_n, 1.0f); + + if (row + 1 < size_m) grid.sync(); + } +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_kernel.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_kernel.cuh index 8895739661..88af0102c0 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_kernel.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_gemv_kernel.cuh @@ -1,327 +1,394 @@ #pragma once -#define TILESIZE_M 8 -#define TILESIZE_K 512 -#define TILESIZE_N 32 - +// Small-m GEMV path for the EXL3 GEMM, QTIP-style structure (see +// Cornell-RelaxML/qtip, qtip-kernels/src/inference.cu) on the unmodified EXL3 +// format: +// +// - warps split k and never synchronize during the main loop: no block-wide +// pipeline barriers; +// B streams straight to registers with ld.global.cs (evict-first; B is +// single-use) behind a register prefetch ring +// - the two-word bit windows of the trellis stream are resolved in-warp: with +// SMEM_STAGE = false +// via lane shuffles (the extraction helpers in exl3_dq.cuh read exactly two +// words per lane, at lane-computable indices), with SMEM_STAGE = true by +// staging the tile words through warp-private shared memory and calling the +// standard dq_dispatch +// - one m16n8k16 MMA pair per 16x16 weight tile with fp16 accumulation, folded +// to fp32 on a fixed +// cadence; per-block cross-warp reduction over the k splits through shared +// memory +// +// Same launch signature as exl3_gemm_kernel so kernel args and graph parameter +// patching are interchangeable. Cooperative launch: one grid.sync after the +// input Hadamard stage and one before the output stage, no other cross-block +// coordination. 2, 3 and 4 bpw. +// +// CFG 0 ("narrow", 512 threads, 2 n-tiles/warp, 16 k-splits) wins at +// attention-projection sizes; CFG 1 ("wide", 256 threads, 4 n-tiles/warp, 8 +// k-splits) wins at large-n FFN sizes. MMODE 0 is the m == 1 fast path, MMODE 1 +// covers 2 <= m <= 8 with row-guarded fragment loads. + +#include #include "../ptx.cuh" #include "exl3_dq.cuh" +#include "exl3_kernel_map.cuh" +#include "hadamard_inner.cuh" + +#define EXL3_GEMV_MAX_M 8 + +namespace exl3_gemv_ns { + +// mma.m16n8k16 with the A operand supplied as two FragB halves, fp16 accumulate +__device__ __forceinline__ void mma_ab_h(const FragB& a01, const FragB& a23, + const FragB& b, FragC_h& c) { + const uint32_t* a0 = reinterpret_cast(&a01); + const uint32_t* a1 = reinterpret_cast(&a23); + const uint32_t* bb = reinterpret_cast(&b); + uint32_t* cc = reinterpret_cast(&c); + asm("mma.sync.aligned.m16n8k16.row.col.f16.f16.f16.f16 " + "{%0,%1}, {%2,%3,%4,%5}, {%6,%7}, {%0,%1};\n" + : "+r"(cc[0]), "+r"(cc[1]) + : "r"(a0[0]), "r"(a0[1]), "r"(a1[0]), "r"(a1[1]), "r"(bb[0]), "r"(bb[1])); +} -using FragA_m8 = Vec; // {a0, a1, a2, a3} aliased to {a0, a0, a1, a1} -using FragC_m8 = Vec; // {c0, c1, c2, c3} aliased to {c0, c1, c2} +// mul1 codebook pair decode via dp4a byte sum (bit-identical to the vabsdiff4 +// form) +__device__ __forceinline__ half2 decode_pair_cb2_dp4a_(uint32_t x0, + uint32_t x1) { + x0 *= 0x83DCD12Du; + x1 *= 0x83DCD12Du; + uint32_t sum0 = __dp4a(x0, 0x01010101u, 0x6400u); + uint32_t sum1 = __dp4a(x1, 0x01010101u, 0x6400u); + half2 k_inv_h2 = __half2half2(__ushort_as_half(0x1eee)); + half2 k_bias_h2 = __half2half2(__ushort_as_half(0xc931)); + half_uint16 h0((uint16_t)sum0); + half_uint16 h1((uint16_t)sum1); + return __hfma2(__halves2half2(h0.as_half, h1.as_half), k_inv_h2, k_bias_h2); +} -// frag_c (FP32, m16n16) += frag_a (FP16, m8k16) @ frag_b (FP16, k16n16) -// FP16 @ FP16 + FP32 -> FP32 -__device__ inline void ptx_mma_m8n8k16(const FragA_m8& frag_a, - const FragB& frag_b, FragC_m8& frag_c) { - const uint32_t* a = reinterpret_cast(&frag_a); - const uint32_t* b = reinterpret_cast(&frag_b); - float* c = reinterpret_cast(&frag_c); +template +__device__ __forceinline__ void decode8(uint32_t w0, uint32_t w1, uint32_t w2, + uint32_t w3, uint32_t w4, uint32_t w5, + uint32_t w6, uint32_t w7, FragB& f0, + FragB& f1) { + if constexpr (cb == 2) { + f0[0] = decode_pair_cb2_dp4a_(w0, w1); + f0[1] = decode_pair_cb2_dp4a_(w2, w3); + f1[0] = decode_pair_cb2_dp4a_(w4, w5); + f1[1] = decode_pair_cb2_dp4a_(w6, w7); + } else { + f0[0] = decode_3inst_2(w0, w1); + f0[1] = decode_3inst_2(w2, w3); + f1[0] = decode_3inst_2(w4, w5); + f1[1] = decode_3inst_2(w6, w7); + } +} - asm("mma.sync.aligned.m16n8k16.row.col.f32.f16.f16.f32 " - "{%0,%1,%2,%2}, {%3,%3,%4,%4}, {%5,%6}, {%0,%1,%2,%3};\n" +// Window extraction from two already-loaded words, same order as +// dq8_aligned_4bits +template +__device__ __forceinline__ void dq8_regs_4bits(uint32_t a, uint32_t b, + FragB& f0, FragB& f1) { + uint32_t s, w0, w1, w2, w3, w4, w5, w6, w7; + FSHF_IMM(s, b, a, 20); + w7 = b & 0xffff; + BFE16_IMM(w6, b, 4); + BFE16_IMM(w5, b, 8); + BFE16_IMM(w4, b, 12); + BFE16_IMM(w3, b, 16); + w2 = s & 0xffff; + BFE16_IMM(w1, s, 4); + BFE16_IMM(w0, s, 8); + decode8(w0, w1, w2, w3, w4, w5, w6, w7, f0, f1); +} - : "+f"(c[0]), "+f"(c[1]), - "+f"(c[2]) // Todo: try to alias into m8 fragment - : "r"(a[0]), "r"(a[1]), "r"(b[0]), "r"(b[1])); +// Register form of dq8_aligned_2bits: the two words and the funnel shift are +// lane-dependent +template +__device__ __forceinline__ void dq8_regs_2bits(uint32_t a, uint32_t b, + int t_offset, FragB& f0, + FragB& f1) { + uint32_t w0, w1, w2, w3, w4, w5, w6, w7; + b = fshift(b, a, ((~t_offset) & 8) << 1); + w7 = b & 0xffff; + BFE16_IMM(w6, b, 2); + BFE16_IMM(w5, b, 4); + BFE16_IMM(w4, b, 6); + BFE16_IMM(w3, b, 8); + BFE16_IMM(w2, b, 10); + BFE16_IMM(w1, b, 12); + BFE16_IMM(w0, b, 14); + decode8(w0, w1, w2, w3, w4, w5, w6, w7, f0, f1); } -__device__ inline float2 shfl_float2(float2 v, int src, int width) { - return make_float2(__shfl_sync(0xffffffff, v.x, src, width), - __shfl_sync(0xffffffff, v.y, src, width)); +// Register form of dq8<3, cb, 4> with the per-lane funnel alignment precomputed +template +__device__ __forceinline__ void dq8_regs_3bits(uint32_t a, uint32_t b, int s2, + FragB& f0, FragB& f1) { + uint32_t w0, w1, w2, w3, w4, w5, w6, w7; + w7 = fshift(b, a, s2); + w6 = w7 >> 3; + w5 = w6 >> 3; + w4 = w5 >> 3; + w3 = fshift(b, a, s2 + 12); + w2 = w3 >> 3; + w1 = w2 >> 3; + w0 = w1 >> 3; + decode8(w0 & 0xffff, w1 & 0xffff, w2 & 0xffff, w3 & 0xffff, w4 & 0xffff, + w5 & 0xffff, w6 & 0xffff, w7 & 0xffff, f0, f1); } -template -__global__ __launch_bounds__(32 * TILESIZE_K / 16 * 1) void exl3_gemv_kernel( - const half* __restrict__ A, const uint16_t* __restrict__ B, - void* __restrict__ C, const int __grid_constant__ size_m, - const int __grid_constant__ size_k, const int __grid_constant__ size_n - // const half* __restrict__ suh, - // half* __restrict__ A_had, - // const half* __restrict__ svh, -) { - const int num_stages = 2; - - // TB covers TILESIZE_M/K/N elements (M == 8, K and N are multiples of 16.) - // block: (32, TILESIZE_N / 16, TILESIZE_K / 16) - // grid: (size_k / TILESIZE_K, size_n / TILESIZE_N) - const int ts = 32 * TILESIZE_K / 16 * TILESIZE_N / 16; - int t = threadIdx.x + (threadIdx.y + threadIdx.z * blockDim.y) * blockDim.x; - int lane_id = threadIdx.x; // & 31; - - // int k_slice = blockIdx.z; - - const int blocks_n = TILESIZE_N / 16; - const int blocks_k = TILESIZE_K / 16; - const int tiles_n = size_n / TILESIZE_N; - const int tiles_k = size_k / TILESIZE_K; - const int tiles_k_slice = tiles_k / split_k; - - const size_t str_A_gl_row = size_k * 2; // A global: row stride, M - const size_t str_A_gl_block_k = 32; // A global: block stride, K - const size_t str_A_gl_tile_k = TILESIZE_K * 2; // A global: tile stride, K - - const size_t str_B_gl_block_n = 256 * bits / 8; // B global: block stride, N - const size_t str_B_gl_block_k = - str_B_gl_block_n * (size_n / 16); // B global: block stride, K - const size_t str_B_gl_tile_n = - str_B_gl_block_n * blocks_n; // B global: tile stride, N - const size_t str_B_gl_tile_k = - str_B_gl_block_k * blocks_k; // B global: tile stride, K - - const size_t str_B_sh_block_n = - str_B_gl_block_n; // B shared: block stride, N - const size_t str_B_sh_block_k = - str_B_sh_block_n * blocks_n; // B shared: block stride, K - const size_t str_B_sh_tile_n = str_B_sh_block_k; // B shared: tile stride, N - const size_t str_B_sh_tile = - str_B_sh_block_k * blocks_k; // B shared: tile size - - constexpr int c_esize = c_fp32 ? 4 : 2; - const size_t str_C_gl_row = size_n * c_esize; // C global: row stride, M - const size_t str_C_gl_block_n = 16 * c_esize; // C global: block stride, N - const size_t str_C_gl_tile_n = - TILESIZE_N * c_esize; // C global: tile stride, N - - // const int block_n = threadIdx.y; - const int block_k = threadIdx.z; - // const int tile_k = blockIdx.x; - const int tile_n = blockIdx.y; - - uint8_t* A_gl_tile; - uint8_t* B_gl_tile; - uint8_t* C_gl_tile; - uint8_t* A_gl_block; - uint8_t* C_gl_block; - uint8_t* B_sh_block; - uint8_t* B_gl_block; - - // Tile buffer - constexpr int bsh0 = num_stages ? num_stages : 1; - constexpr int bsh1 = num_stages ? str_B_sh_tile : 32; - __shared__ uint8_t B_sh_tile[bsh0][bsh1]; - __shared__ float C_sh_red[MAX(blocks_k / 2, 1)][blocks_n][128]; - - // Fragments - register FragA_m8 frag_a; - register FragB frag_b[blocks_n][2]; - register FragC_m8 frag_c[blocks_n][2]; -#pragma unroll - for (int block_n = 0; block_n < blocks_n; ++block_n) { - frag_c[block_n][0] = {}; - frag_c[block_n][1] = {}; +} // namespace exl3_gemv_ns + +template +__global__ __launch_bounds__(CFG == 0 + ? 512 + : 256) void exl3_gemv_kernel(EXL3_GEMM_ARGS) { + static_assert(bits == 2 || bits == 3 || bits == 4, + "exl3_gemv_kernel supports 2, 3 and 4 bpw"); + constexpr int WK = CFG == 0 ? 16 : 8; // k-split (warps per block) + constexpr int WARP_N_TILES = CFG == 0 ? 2 : 4; // adjacent n-tiles per warp + constexpr int PF = CFG == 0 ? 4 : 2; // prefetch ring depth + constexpr int FOLD = + CFG == 0 ? 4 : 2; // fp16->fp32 fold cadence (divides PF) + constexpr int THREADS = WK * 32; + constexpr int ROWS = MMODE == 0 ? 1 : EXL3_GEMV_MAX_M; + constexpr int COLS = WARP_N_TILES * 16; + + constexpr int TILE_WORDS = 8 * bits; // uint32 per 16x16 tile + constexpr int LOADS = + bits == 2 ? WARP_N_TILES / 2 : WARP_N_TILES; // warp loads per k-slice + constexpr int LSTRIDE = bits == 3 ? 24 : 32; // uint32 per load + static_assert(bits != 2 || WARP_N_TILES % 2 == 0, + "2 bpw packs two tiles per warp load"); + + auto grid = cooperative_groups::this_grid(); + + // Input scales and Hadamard transform, same as exl3_gemm_kernel + { + int total_warps = size_m * size_k / 128; + int warps_grid = gridDim.x * blockDim.x / 32; + int this_warp = threadIdx.x / 32 + blockDim.x / 32 * blockIdx.x; + + for (; this_warp < total_warps; this_warp += warps_grid) + had_hf_r_128_inner(A + this_warp * 128, + A_had + this_warp * 128, + suh + (this_warp * 128) % size_k, + 0.088388347648f // 1/sqrt(128) + ); + + grid.sync(); + A = A_had; } - // Load A fragment from global (warp) - auto load_gl2fr_a = [&]() { - int frag_row = lane_id >> 2; - int frag_col = lane_id & 3; - if (frag_row < size_m) { - half2* lda = (half2*)(A_gl_block + str_A_gl_row * frag_row); - frag_a[0] = lda[frag_col]; - frag_a[1] = lda[frag_col + 4]; - } - }; + const int warp = threadIdx.x / 32; + const int lane = threadIdx.x % 32; + + const int ntiles = size_n / 16; + const int kslices = size_k / 16; + const int num_groups = size_n / COLS; + + const int chunk = CEIL_DIVIDE(kslices, WK); + const int ks0 = warp * chunk; + const int myn = max(0, min(chunk, kslices - ks0)); + + const uint32_t* B32 = (const uint32_t*)B; + const size_t slice_stride = + (size_t)ntiles * TILE_WORDS; // uint32 per k-slice row + const half2* A2 = (const half2*)A; + const half2 hzero = __half2half2(__ushort_as_half(0)); + + // A fragment row indices for this lane + const int r0 = lane >> 2; + const size_t a_row0 = (size_t)r0 * (size_k / 2); + const bool r0_ok = MMODE == 0 ? lane < 4 : r0 < size_m; + + // Per-lane extraction constants (see dq8_aligned_2bits / dq8<3, cb, 4> in + // exl3_dq.cuh) + [[maybe_unused]] int x_src_a = 0, x_src_b = 0, x_s2 = 0; + if constexpr (bits == 2) { + int i1 = lane >> 1; + x_src_b = i1; + x_src_a = (i1 + 15) & 15; + } + if constexpr (bits == 3) { + int t_offset = lane << 3; + int b1 = (t_offset + 257) * 3; + int b2 = b1 + 21; + int i0 = (b1 - 16) / 32; + int i2 = (b2 - 1) / 32; + x_s2 = (i2 + 1) * 32 - b2; + x_src_a = i0 % 24; + x_src_b = i2 % 24; + } + + __shared__ float sh_red[WK][ROWS][COLS]; + [[maybe_unused]] __shared__ uint32_t + sh_stage[SMEM_STAGE ? WK : 1][SMEM_STAGE ? LOADS * LSTRIDE : 1]; + + for (int group = blockIdx.x; group < num_groups; group += gridDim.x) { + const uint32_t* bp = B32 + (size_t)ks0 * slice_stride + + group * WARP_N_TILES * TILE_WORDS + lane; - // Load B shared tile from global (across warps) - auto load_gl2sh_b = [&](int buffer, bool pred) { - if (pred) { - uint4* src = (uint4*)B_gl_tile; - uint4* dst = (uint4*)B_sh_tile[buffer]; + // Prefetch ring (indices must be compile-time or pf lands in local memory) + auto ld_b = [&](int i, int l) -> uint32_t { + if constexpr (bits == 3) + return lane < 24 ? __ldcs(bp + (size_t)i * slice_stride + l * LSTRIDE) + : 0; + else + return __ldcs(bp + (size_t)i * slice_stride + l * LSTRIDE); + }; + + uint32_t pf[PF][LOADS]; #pragma unroll - for (int i = t; i < str_B_sh_tile / 16; i += ts) { - int x = i % (str_B_sh_tile_n / 16); - int y = i / (str_B_sh_tile_n / 16); - cp_async(dst + i, src + y * (str_B_gl_tile_n / 16 * tiles_n) + x); - } - } + for (int d = 0; d < PF; ++d) + if (d < myn) +#pragma unroll + for (int l = 0; l < LOADS; ++l) pf[d][l] = ld_b(d, l); - // Fence here to ensure number of fences matches number of waits - cp_async_fence(); - }; - - // Load B fragment from shared tile in warp - auto load_sh2fr_b = [&](int block_n) { - dq_dispatch((uint32_t*)B_sh_block, lane_id << 3, - frag_b[block_n][0], frag_b[block_n][1]); - }; - - // Load B fragment from gmem tile in warp - auto load_gl2fr_b = [&](int block_n) { - dq_dispatch((uint32_t*)B_gl_block, lane_id << 3, - frag_b[block_n][0], frag_b[block_n][1]); - }; - - // Perform matmul in current warp - auto matmul = [&](int block_n) { - ptx_mma_m8n8k16(frag_a, frag_b[block_n][0], frag_c[block_n][0]); - ptx_mma_m8n8k16(frag_a, frag_b[block_n][1], frag_c[block_n][1]); - }; - - // Reduce C fragments across threadblock - auto reduce_fr_c = [&]() { - int frag_row = lane_id >> 2; - // int frag_col = lane_id & 3; + FragC_h ch[WARP_N_TILES][2] = {}; + float2 acc0[WARP_N_TILES][2] = {}; + + for (int ib = 0; ib < myn; ib += PF) { +#pragma unroll + for (int d = 0; d < PF; ++d) { + const int i = ib + d; + if (i >= myn) break; + uint32_t bw[LOADS]; #pragma unroll - for (int r_k = blocks_k / 2; r_k > 0; r_k >>= 1) { - float* red; + for (int l = 0; l < LOADS; ++l) bw[l] = pf[d][l]; - // High blocks store - if (block_k < r_k * 2 && block_k >= r_k && frag_row < size_m) { + if (i + PF < myn) { #pragma unroll - for (int block_n = 0; block_n < blocks_n; ++block_n) { - red = &C_sh_red[block_k & (r_k - 1)][block_n][lane_id * 4]; - red[0] = frag_c[block_n][0][0]; - red[1] = frag_c[block_n][0][1]; - red[2] = frag_c[block_n][1][0]; - red[3] = frag_c[block_n][1][1]; + for (int l = 0; l < LOADS; ++l) pf[d][l] = ld_b(i + PF, l); } - } - __syncthreads(); - // Low blocks load - if (block_k < r_k && frag_row < size_m) { + if constexpr (SMEM_STAGE) { + __syncwarp(); #pragma unroll - for (int block_n = 0; block_n < blocks_n; ++block_n) { - red = &C_sh_red[block_k & (r_k - 1)][block_n][lane_id * 4]; - frag_c[block_n][0][0] += red[0]; - frag_c[block_n][0][1] += red[1]; - frag_c[block_n][1][0] += red[2]; - frag_c[block_n][1][1] += red[3]; + for (int l = 0; l < LOADS; ++l) + if (bits != 3 || lane < 24) + sh_stage[warp][l * LSTRIDE + lane] = bw[l]; + __syncwarp(); } - } - if (r_k) __syncthreads(); - } - }; - - // Store fragment - auto store_fr2gl_c = [&](int block_n) { - int frag_row = lane_id >> 2; - int frag_col = lane_id & 3; - if (frag_row < size_m) { - if (c_fp32) { - float2* stc = (float2*)(C_gl_block + str_C_gl_row * frag_row); - float2 c0 = make_float2(frag_c[block_n][0][0], frag_c[block_n][0][1]); - float2 c1 = make_float2(frag_c[block_n][1][0], frag_c[block_n][1][1]); - - // Thread has c[i] and c[i+4], shuffle so threads hold c[i] and c[i+1] - // in groups of four - int base = lane_id & (~3); - int src0 = base + ((2 * frag_col) & 3); - int src1 = base + ((2 * frag_col + 1) & 3); - float2 c00 = shfl_float2(c0, src0, 4); - float2 c01 = shfl_float2(c1, src0, 4); - float2 c10 = shfl_float2(c0, src1, 4); - float2 c11 = shfl_float2(c1, src1, 4); - bool low = frag_col < 2; - float2 s0 = low ? c00 : c01; - float2 s1 = low ? c10 : c11; - - // Store 4x4 bytes per thread, coalesced - float4 s01 = make_float4(s0.x, s0.y, s1.x, s1.y); - ((float4*)stc)[frag_col] = s01; - } else { - half2* stc = (half2*)(C_gl_block + str_C_gl_row * frag_row); - half2 c0 = - __floats2half2_rn(frag_c[block_n][0][0], frag_c[block_n][0][1]); - half2 c1 = - __floats2half2_rn(frag_c[block_n][1][0], frag_c[block_n][1][1]); - - // Thread has c[i] and c[i+4], shuffle so threads hold c[i] and c[i+1] - // in groups of four - int base = lane_id & (~3); - int src0 = base + ((2 * frag_col) & 3); - int src1 = base + ((2 * frag_col + 1) & 3); - half2 c00 = __shfl_sync(0xffffffff, c0, src0, 4); - half2 c01 = __shfl_sync(0xffffffff, c1, src0, 4); - half2 c10 = __shfl_sync(0xffffffff, c0, src1, 4); - half2 c11 = __shfl_sync(0xffffffff, c1, src1, 4); - bool low = frag_col < 2; - half2 s0 = low ? c00 : c01; - half2 s1 = low ? c10 : c11; - - // Store 4x2 bytes per thread, coalesced - half4 s01(s0, s1); - ((half4*)stc)[frag_col] = s01; - } - } - }; - - // Direct - if constexpr (num_stages == 0) { - for (int tile_k = 0; tile_k < tiles_k_slice; ++tile_k) { - // Load A frag - A_gl_tile = ((uint8_t*)A) + str_A_gl_tile_k * tile_k; - A_gl_block = A_gl_tile + str_A_gl_block_k * block_k; - load_gl2fr_a(); - - // Load B frag - B_gl_tile = - ((uint8_t*)B) + str_B_gl_tile_k * tile_k + str_B_gl_tile_n * tile_n; - B_gl_block = B_gl_tile + str_B_gl_block_k * block_k; + // A fragment: lane covers row lane/4, k pairs (2(lane%4), +1) and (+8, + // +9) + const size_t a_col = (size_t)(ks0 + i) * 8 + (lane & 3); + FragB a01, a23; + a01[0] = r0_ok ? A2[a_row0 + a_col] : hzero; + a23[0] = r0_ok ? A2[a_row0 + a_col + 4] : hzero; + a01[1] = hzero; + a23[1] = hzero; + #pragma unroll - for (int block_n = 0; block_n < blocks_n; ++block_n) { - load_gl2fr_b(block_n); - B_gl_block += str_B_gl_block_n; - } + for (int t = 0; t < WARP_N_TILES; ++t) { + FragB f0, f1; + if constexpr (SMEM_STAGE) { + const uint32_t* tp = &sh_stage[warp][t * TILE_WORDS]; + if constexpr (bits == 4) + exl3_gemv_ns::dq8_regs_4bits(tp[(lane + 31) & 31], tp[lane], + f0, f1); + else if constexpr (bits == 2) + exl3_gemv_ns::dq8_regs_2bits(tp[x_src_a], tp[x_src_b], + lane << 3, f0, f1); + else + exl3_gemv_ns::dq8_regs_3bits(tp[x_src_a], tp[x_src_b], x_s2, + f0, f1); + } else if constexpr (bits == 4) { + uint32_t aw = __shfl_sync(0xffffffffu, bw[t], (lane + 31) & 31); + exl3_gemv_ns::dq8_regs_4bits(aw, bw[t], f0, f1); + } else if constexpr (bits == 2) { + // Two tiles per loaded word group: tile t lives in lanes (t&1)*16 + // .. +15 + const uint32_t w = bw[t >> 1]; + const int base = (t & 1) << 4; + uint32_t bwv = __shfl_sync(0xffffffffu, w, base + x_src_b); + uint32_t awv = __shfl_sync(0xffffffffu, w, base + x_src_a); + exl3_gemv_ns::dq8_regs_2bits(awv, bwv, lane << 3, f0, f1); + } else // bits == 3 + { + uint32_t awv = __shfl_sync(0xffffffffu, bw[t], x_src_a); + uint32_t bwv = __shfl_sync(0xffffffffu, bw[t], x_src_b); + exl3_gemv_ns::dq8_regs_3bits(awv, bwv, x_s2, f0, f1); + } + + exl3_gemv_ns::mma_ab_h(a01, a23, f0, ch[t][0]); + exl3_gemv_ns::mma_ab_h(a01, a23, f1, ch[t][1]); + } - // Mul - for (int block_n = 0; block_n < blocks_n; ++block_n) { - matmul(block_n); + if ((d + 1) % FOLD == 0 || i + 1 == myn) { +#pragma unroll + for (int t = 0; t < WARP_N_TILES; ++t) +#pragma unroll + for (int f = 0; f < 2; ++f) { + acc0[t][f].x += __low2float(ch[t][f][0]); + acc0[t][f].y += __high2float(ch[t][f][0]); + ch[t][f][0] = hzero; + } + } } } - } - - // Staged - else { - // Load first B chunk - B_gl_tile = ((uint8_t*)B) + str_B_gl_tile_n * tile_n; - load_gl2sh_b(0, true); + // Cross-warp reduction over the k splits. Lane l holds row l/4, cols + // tile*16 + frag*8 + 2*(l%4) (+1) + { + const int c0 = 2 * (lane & 3); + const bool store0 = MMODE == 0 ? lane < 4 : r0 < ROWS; + const int sr0 = MMODE == 0 ? 0 : r0; + if (store0) { #pragma unroll - for (int tile_k = 0; tile_k < tiles_k_slice; ++tile_k) { - // Load next B chunk - B_gl_tile = ((uint8_t*)B) + str_B_gl_tile_k * (tile_k + 1) + - str_B_gl_tile_n * tile_n; - load_gl2sh_b((tile_k + 1) % num_stages, tile_k < tiles_k_slice - 1); - - // Load A frag - A_gl_tile = ((uint8_t*)A) + str_A_gl_tile_k * tile_k; - A_gl_block = A_gl_tile + str_A_gl_block_k * block_k; - load_gl2fr_a(); - - // Wait until at most one stage is pending - cp_async_wait<1>(); - __syncthreads(); - - // Load B frag - B_sh_block = B_sh_tile[tile_k % num_stages] + str_B_sh_block_k * block_k; + for (int t = 0; t < WARP_N_TILES; ++t) #pragma unroll - for (int block_n = 0; block_n < blocks_n; ++block_n) { - load_sh2fr_b(block_n); - B_sh_block += str_B_sh_block_n; + for (int f = 0; f < 2; ++f) { + const int col = t * 16 + f * 8 + c0; + sh_red[warp][sr0][col + 0] = acc0[t][f].x; + sh_red[warp][sr0][col + 1] = acc0[t][f].y; + } } + } + __syncthreads(); -// Mul + const int rows_out = MMODE == 0 ? 1 : min(size_m, ROWS); + for (int idx = threadIdx.x; idx < COLS * rows_out; idx += THREADS) { + const int r = idx / COLS; + const int c = idx % COLS; + float sum = 0.0f; #pragma unroll - for (int block_n = 0; block_n < blocks_n; ++block_n) { - matmul(block_n); - } + for (int j = 0; j < WK; ++j) sum += sh_red[j][r][c]; + const int col = group * COLS + c; + if constexpr (c_fp32) + ((float*)C)[(size_t)r * size_n + col] = sum; + else + ((half*)C)[(size_t)r * size_n + col] = __float2half_rn(sum); } + __syncthreads(); } - // Reduce - C_gl_tile = ((uint8_t*)C) + str_C_gl_tile_n * tile_n; - // C_gl_block = C_gl_tile + str_C_gl_block_n * block_n; - reduce_fr_c(); - - // Store - if (block_k == 0) { - for (int block_n = 0; block_n < blocks_n; ++block_n) { - C_gl_block = C_gl_tile + str_C_gl_block_n * block_n; - store_fr2gl_c(block_n); + // Output scales and Hadamard transform, same semantics as the inner GEMM + // epilogue + { + grid.sync(); + + int total_warps = size_m * size_n / 128; + int warps_grid = gridDim.x * blockDim.x / 32; + int this_warp = threadIdx.x / 32 + blockDim.x / 32 * blockIdx.x; + + for (; this_warp < total_warps; this_warp += warps_grid) { + if constexpr (c_fp32) + had_ff_r_128_inner(((const float*)C) + this_warp * 128, + ((float*)C) + this_warp * 128, + svh + (this_warp * 128) % size_n, + 0.088388347648f // 1/sqrt(128) + ); + else + had_hf_r_128_inner(((const half*)C) + this_warp * 128, + ((half*)C) + this_warp * 128, + svh + (this_warp * 128) % size_n, + 0.088388347648f // 1/sqrt(128) + ); } } -} \ No newline at end of file +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map.cu b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map.cu index 979b3a7e18..f36e3c46bc 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map.cu @@ -18,9 +18,6 @@ namespace cg = cooperative_groups; #include "comp_units/exl3_comp_unit_7.cuh" #include "comp_units/exl3_comp_unit_8.cuh" -#include "exl3_kernel_map_samples.cuh" -std::map _tuning_cache = {}; - int select_gemm_shape(int cc, int size_m, int size_k, int size_n, int K, bool multi, int bszm_in, int bszm_out) { bool mod_256 = (size_n % 256 == 0); @@ -52,7 +49,7 @@ int select_gemm_shape(int cc, int size_m, int size_k, int size_n, int K, if (mod_256) return 3; return 2; - // case CC_HOPPER: + case CC_HOPPER: case CC_BLACKWELL: if ((K == 4 || K == 2) && !multi) { if (size_k <= 2048) return 1; @@ -83,6 +80,46 @@ bool exl3_gemm_shape_compat(int shape_idx, int size_m, int size_k, int size_n, return (size_k % tilesize_k == 0) && (size_n % tilesize_n == 0); } +// Instance tables, [K][cb] -> array indexed by shape_idx. Row 0 unused (no K = +// 0 instances) + +#define EXL3_KERNEL_TABLE_ROW(fp, K) \ + {tfp_exl3_gemm_kernel_##fp##_b##K##_cb0, \ + tfp_exl3_gemm_kernel_##fp##_b##K##_cb1, \ + tfp_exl3_gemm_kernel_##fp##_b##K##_cb2} +#define EXL3_MKERNEL_TABLE_ROW(fp, K) \ + {tfp_exl3_mgemm_kernel_##fp##_b##K##_cb0, \ + tfp_exl3_mgemm_kernel_##fp##_b##K##_cb1, \ + tfp_exl3_mgemm_kernel_##fp##_b##K##_cb2} + +static fp_exl3_gemm_kernel* const tab_gemm_fp32[9][3] = { + {nullptr, nullptr, nullptr}, EXL3_KERNEL_TABLE_ROW(fp32, 1), + EXL3_KERNEL_TABLE_ROW(fp32, 2), EXL3_KERNEL_TABLE_ROW(fp32, 3), + EXL3_KERNEL_TABLE_ROW(fp32, 4), EXL3_KERNEL_TABLE_ROW(fp32, 5), + EXL3_KERNEL_TABLE_ROW(fp32, 6), EXL3_KERNEL_TABLE_ROW(fp32, 7), + EXL3_KERNEL_TABLE_ROW(fp32, 8)}; + +static fp_exl3_gemm_kernel* const tab_gemm_fp16[9][3] = { + {nullptr, nullptr, nullptr}, EXL3_KERNEL_TABLE_ROW(fp16, 1), + EXL3_KERNEL_TABLE_ROW(fp16, 2), EXL3_KERNEL_TABLE_ROW(fp16, 3), + EXL3_KERNEL_TABLE_ROW(fp16, 4), EXL3_KERNEL_TABLE_ROW(fp16, 5), + EXL3_KERNEL_TABLE_ROW(fp16, 6), EXL3_KERNEL_TABLE_ROW(fp16, 7), + EXL3_KERNEL_TABLE_ROW(fp16, 8)}; + +static fp_exl3_mgemm_kernel* const tab_mgemm_fp32[9][3] = { + {nullptr, nullptr, nullptr}, EXL3_MKERNEL_TABLE_ROW(fp32, 1), + EXL3_MKERNEL_TABLE_ROW(fp32, 2), EXL3_MKERNEL_TABLE_ROW(fp32, 3), + EXL3_MKERNEL_TABLE_ROW(fp32, 4), EXL3_MKERNEL_TABLE_ROW(fp32, 5), + EXL3_MKERNEL_TABLE_ROW(fp32, 6), EXL3_MKERNEL_TABLE_ROW(fp32, 7), + EXL3_MKERNEL_TABLE_ROW(fp32, 8)}; + +static fp_exl3_mgemm_kernel* const tab_mgemm_fp16[9][3] = { + {nullptr, nullptr, nullptr}, EXL3_MKERNEL_TABLE_ROW(fp16, 1), + EXL3_MKERNEL_TABLE_ROW(fp16, 2), EXL3_MKERNEL_TABLE_ROW(fp16, 3), + EXL3_MKERNEL_TABLE_ROW(fp16, 4), EXL3_MKERNEL_TABLE_ROW(fp16, 5), + EXL3_MKERNEL_TABLE_ROW(fp16, 6), EXL3_MKERNEL_TABLE_ROW(fp16, 7), + EXL3_MKERNEL_TABLE_ROW(fp16, 8)}; + fp_exl3_gemm_kernel select_exl3_gemm_kernel(int cc, int size_m, int size_k, int size_n, int K, bool c_fp32, int force_shape_idx, @@ -106,51 +143,9 @@ fp_exl3_gemm_kernel select_exl3_gemm_kernel(int cc, int size_m, int size_k, *num_sms = MAX(MIN(max_slices, *num_sms), 1); } - int kernel_idx = shape_idx + (EXL3_GEMM_NUM_SHAPES + 1) * cb; - - if (c_fp32) { - switch (K) { - case 1: - return tfp_exl3_gemm_kernel_fp32_b1[kernel_idx]; - case 2: - return tfp_exl3_gemm_kernel_fp32_b2[kernel_idx]; - case 3: - return tfp_exl3_gemm_kernel_fp32_b3[kernel_idx]; - case 4: - return tfp_exl3_gemm_kernel_fp32_b4[kernel_idx]; - case 5: - return tfp_exl3_gemm_kernel_fp32_b5[kernel_idx]; - case 6: - return tfp_exl3_gemm_kernel_fp32_b6[kernel_idx]; - case 7: - return tfp_exl3_gemm_kernel_fp32_b7[kernel_idx]; - case 8: - return tfp_exl3_gemm_kernel_fp32_b8[kernel_idx]; - default: - TORCH_CHECK(false, "No kernel for GEMM shape"); - } - } else { - switch (K) { - case 1: - return tfp_exl3_gemm_kernel_fp16_b1[kernel_idx]; - case 2: - return tfp_exl3_gemm_kernel_fp16_b2[kernel_idx]; - case 3: - return tfp_exl3_gemm_kernel_fp16_b3[kernel_idx]; - case 4: - return tfp_exl3_gemm_kernel_fp16_b4[kernel_idx]; - case 5: - return tfp_exl3_gemm_kernel_fp16_b5[kernel_idx]; - case 6: - return tfp_exl3_gemm_kernel_fp16_b6[kernel_idx]; - case 7: - return tfp_exl3_gemm_kernel_fp16_b7[kernel_idx]; - case 8: - return tfp_exl3_gemm_kernel_fp16_b8[kernel_idx]; - default: - TORCH_CHECK(false, "No kernel for GEMM shape"); - } - } + TORCH_CHECK(K >= 1 && K <= 8 && cb >= 0 && cb <= 2, + "No kernel for GEMM shape"); + return (c_fp32 ? tab_gemm_fp32 : tab_gemm_fp16)[K][cb][shape_idx]; } fp_exl3_mgemm_kernel select_exl3_mgemm_kernel( @@ -174,216 +169,21 @@ fp_exl3_mgemm_kernel select_exl3_mgemm_kernel( *num_sms = MIN(max_slices, *num_sms); } - int kernel_idx = shape_idx + (EXL3_GEMM_NUM_SHAPES + 1) * cb; - - if (c_fp32) { - switch (K) { - case 1: - return tfp_exl3_mgemm_kernel_fp32_b1[kernel_idx]; - case 2: - return tfp_exl3_mgemm_kernel_fp32_b2[kernel_idx]; - case 3: - return tfp_exl3_mgemm_kernel_fp32_b3[kernel_idx]; - case 4: - return tfp_exl3_mgemm_kernel_fp32_b4[kernel_idx]; - case 5: - return tfp_exl3_mgemm_kernel_fp32_b5[kernel_idx]; - case 6: - return tfp_exl3_mgemm_kernel_fp32_b6[kernel_idx]; - case 7: - return tfp_exl3_mgemm_kernel_fp32_b7[kernel_idx]; - case 8: - return tfp_exl3_mgemm_kernel_fp32_b8[kernel_idx]; - default: - TORCH_CHECK(false, "No kernel for GEMM shape"); - } - } else { - switch (K) { - case 1: - return tfp_exl3_mgemm_kernel_fp16_b1[kernel_idx]; - case 2: - return tfp_exl3_mgemm_kernel_fp16_b2[kernel_idx]; - case 3: - return tfp_exl3_mgemm_kernel_fp16_b3[kernel_idx]; - case 4: - return tfp_exl3_mgemm_kernel_fp16_b4[kernel_idx]; - case 5: - return tfp_exl3_mgemm_kernel_fp16_b5[kernel_idx]; - case 6: - return tfp_exl3_mgemm_kernel_fp16_b6[kernel_idx]; - case 7: - return tfp_exl3_mgemm_kernel_fp16_b7[kernel_idx]; - case 8: - return tfp_exl3_mgemm_kernel_fp16_b8[kernel_idx]; - default: - TORCH_CHECK(false, "No kernel for GEMM shape"); - } - } + TORCH_CHECK(K >= 1 && K <= 8 && cb >= 0 && cb <= 2, + "No kernel for GEMM shape"); + return (c_fp32 ? tab_mgemm_fp32 : tab_mgemm_fp16)[K][cb][shape_idx]; } fp_exl3_gemm_kernel get_gemm_kernel_ptr(int K, int shape_idx, bool c_fp32, int cb) { - int kernel_idx = shape_idx + (EXL3_GEMM_NUM_SHAPES + 1) * cb; - - if (c_fp32) { - switch (K) { - case 1: - return tfp_exl3_gemm_kernel_fp32_b1[kernel_idx]; - case 2: - return tfp_exl3_gemm_kernel_fp32_b2[kernel_idx]; - case 3: - return tfp_exl3_gemm_kernel_fp32_b3[kernel_idx]; - case 4: - return tfp_exl3_gemm_kernel_fp32_b4[kernel_idx]; - case 5: - return tfp_exl3_gemm_kernel_fp32_b5[kernel_idx]; - case 6: - return tfp_exl3_gemm_kernel_fp32_b6[kernel_idx]; - case 7: - return tfp_exl3_gemm_kernel_fp32_b7[kernel_idx]; - case 8: - return tfp_exl3_gemm_kernel_fp32_b8[kernel_idx]; - default: - TORCH_CHECK(false, "No kernel for GEMM shape"); - } - } else { - switch (K) { - case 1: - return tfp_exl3_gemm_kernel_fp16_b1[kernel_idx]; - case 2: - return tfp_exl3_gemm_kernel_fp16_b2[kernel_idx]; - case 3: - return tfp_exl3_gemm_kernel_fp16_b3[kernel_idx]; - case 4: - return tfp_exl3_gemm_kernel_fp16_b4[kernel_idx]; - case 5: - return tfp_exl3_gemm_kernel_fp16_b5[kernel_idx]; - case 6: - return tfp_exl3_gemm_kernel_fp16_b6[kernel_idx]; - case 7: - return tfp_exl3_gemm_kernel_fp16_b7[kernel_idx]; - case 8: - return tfp_exl3_gemm_kernel_fp16_b8[kernel_idx]; - default: - TORCH_CHECK(false, "No kernel for GEMM shape"); - } - } + TORCH_CHECK(K >= 1 && K <= 8 && cb >= 0 && cb <= 2, + "No kernel for GEMM shape"); + return (c_fp32 ? tab_gemm_fp32 : tab_gemm_fp16)[K][cb][shape_idx]; } fp_exl3_mgemm_kernel get_mgemm_kernel_ptr(int K, int shape_idx, bool c_fp32, int cb) { - int kernel_idx = shape_idx + (EXL3_GEMM_NUM_SHAPES + 1) * cb; - - if (c_fp32) { - switch (K) { - case 1: - return tfp_exl3_mgemm_kernel_fp32_b1[kernel_idx]; - case 2: - return tfp_exl3_mgemm_kernel_fp32_b2[kernel_idx]; - case 3: - return tfp_exl3_mgemm_kernel_fp32_b3[kernel_idx]; - case 4: - return tfp_exl3_mgemm_kernel_fp32_b4[kernel_idx]; - case 5: - return tfp_exl3_mgemm_kernel_fp32_b5[kernel_idx]; - case 6: - return tfp_exl3_mgemm_kernel_fp32_b6[kernel_idx]; - case 7: - return tfp_exl3_mgemm_kernel_fp32_b7[kernel_idx]; - case 8: - return tfp_exl3_mgemm_kernel_fp32_b8[kernel_idx]; - default: - TORCH_CHECK(false, "No kernel for GEMM shape"); - } - } else { - switch (K) { - case 1: - return tfp_exl3_mgemm_kernel_fp16_b1[kernel_idx]; - case 2: - return tfp_exl3_mgemm_kernel_fp16_b2[kernel_idx]; - case 3: - return tfp_exl3_mgemm_kernel_fp16_b3[kernel_idx]; - case 4: - return tfp_exl3_mgemm_kernel_fp16_b4[kernel_idx]; - case 5: - return tfp_exl3_mgemm_kernel_fp16_b5[kernel_idx]; - case 6: - return tfp_exl3_mgemm_kernel_fp16_b6[kernel_idx]; - case 7: - return tfp_exl3_mgemm_kernel_fp16_b7[kernel_idx]; - case 8: - return tfp_exl3_mgemm_kernel_fp16_b8[kernel_idx]; - default: - TORCH_CHECK(false, "No kernel for GEMM shape"); - } - } -} - -TResult f_tr; - -TResult* select_exl3_gemm_mgemm_kernel_new(int cc, int size_m, int size_k, - int size_n, int K, bool c_fp32, - int force_shape_idx, - int force_num_sms, int cb) { - // Force parameters for tuning/benchmarking - if (force_shape_idx > 0) { - TORCH_CHECK(force_num_sms, - "Must supply force_shape_idx and force_num_sms together"); - f_tr.kernel = get_gemm_kernel_ptr(K, force_shape_idx, c_fp32, cb); - f_tr.mkernel = get_mgemm_kernel_ptr(K, force_shape_idx, c_fp32, cb); - f_tr.shape_idx = force_shape_idx; - f_tr.num_sms = force_num_sms; - f_tr.block_dim = exl3_gemm_blockdim[force_shape_idx]; - return &f_tr; - }; - TORCH_CHECK(!force_num_sms, - "Must supply force_shape_idx and force_num_sms together."); - - // Cache parameters - uint64_t key = (((uint64_t)size_k) << 40) | (((uint64_t)size_n) << 16) | - (((uint64_t)cc) << 8) | (((uint64_t)K) << 4) | - (c_fp32 ? 0x01ull : 0x00ull); - - auto lookup = _tuning_cache.find(key); - if (lookup == _tuning_cache.end()) { - // Find closest kernel in map - bool mod512 = (size_n % 512 == 0); - bool mod256 = (size_n % 256 == 0); - bool mod128 = (size_n % 128 == 0); - TORCH_CHECK(mod128, "size_n must be a multiple of 128"); - TSample* cand = mod512 ? samples_512 : (mod256 ? samples_256 : samples_128); - TSample* best = nullptr; - int64_t best_dist = 1ll << 62; - - for (; cand->K; cand++) { - if (cand->K != K) continue; - if (cand->cc != cc) continue; - - int64_t distk = (int64_t)(size_k - cand->k); - int64_t distn = (int64_t)(size_n - cand->n); - int64_t dist = distk * distk + distn * distn; - if (dist < best_dist) { - best_dist = dist; - best = cand; - } - } - TORCH_CHECK(best, "Failed to find valid kernel for shape"); - - // Avoid empty blocks - int tilesize_k = exl3_gemm_tilesize_k[best->shape_idx]; - int tilesize_n = exl3_gemm_tilesize_n[best->shape_idx]; - int max_slices = size_k / tilesize_k * size_n / tilesize_n; - int num_sms = MAX(MIN(max_slices, best->num_sms), 1); - - // Results - TResult tr = {get_gemm_kernel_ptr(K, best->shape_idx, c_fp32, cb), - get_mgemm_kernel_ptr(K, best->shape_idx, c_fp32, cb), - best->shape_idx, num_sms, - exl3_gemm_blockdim[best->shape_idx]}; - - _tuning_cache[key] = tr; - } - - lookup = _tuning_cache.find(key); - return &(lookup->second); + TORCH_CHECK(K >= 1 && K <= 8 && cb >= 0 && cb <= 2, + "No kernel for GEMM shape"); + return (c_fp32 ? tab_mgemm_fp32 : tab_mgemm_fp16)[K][cb][shape_idx]; } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map.cuh index 09fe091d2e..31fc506a2b 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map.cuh @@ -24,7 +24,7 @@ bool exl3_gemm_shape_compat(int shape_idx, int size_m, int size_k, int size_n, const half **__restrict__ suh_list, half *__restrict__ A_had, \ const half **__restrict__ svh_list, int64_t *B_indices, half *B_weights, \ const int bszm_in, const int bszm_out, const int min_index, \ - const int max_index + const int max_index, const int num_tokens typedef void (*fp_exl3_gemm_kernel)(EXL3_GEMM_ARGS); typedef void (*fp_exl3_mgemm_kernel)(EXL3_MGEMM_ARGS); @@ -55,32 +55,33 @@ typedef void (*fp_exl3_mgemm_kernel)(EXL3_MGEMM_ARGS); #define EXL3_GEMM_BASE_THREADS 256 -#define ALL_EXL3_KERNEL_EXTERNS(K) \ - extern fp_exl3_gemm_kernel tfp_exl3_gemm_kernel_fp32_b##K[]; \ - extern fp_exl3_gemm_kernel tfp_exl3_gemm_kernel_fp16_b##K[]; \ - extern fp_exl3_mgemm_kernel tfp_exl3_mgemm_kernel_fp32_b##K[]; \ - extern fp_exl3_mgemm_kernel tfp_exl3_mgemm_kernel_fp16_b##K[]; - -#define ALL_EXL3_KERNEL_INSTANCES(K) \ - fp_exl3_gemm_kernel tfp_exl3_gemm_kernel_fp32_b##K[] = { \ - EXL3_GEMM_KERNEL_INSTANCES(K, true, 0), \ - EXL3_GEMM_KERNEL_INSTANCES(K, true, 1), \ - EXL3_GEMM_KERNEL_INSTANCES(K, true, 2)}; \ - \ - fp_exl3_gemm_kernel tfp_exl3_gemm_kernel_fp16_b##K[] = { \ - EXL3_GEMM_KERNEL_INSTANCES(K, false, 0), \ - EXL3_GEMM_KERNEL_INSTANCES(K, false, 1), \ - EXL3_GEMM_KERNEL_INSTANCES(K, false, 2)}; \ - \ - fp_exl3_mgemm_kernel tfp_exl3_mgemm_kernel_fp32_b##K[] = { \ - EXL3_MGEMM_KERNEL_INSTANCES(K, true, 0), \ - EXL3_MGEMM_KERNEL_INSTANCES(K, true, 1), \ - EXL3_MGEMM_KERNEL_INSTANCES(K, true, 2)}; \ - \ - fp_exl3_mgemm_kernel tfp_exl3_mgemm_kernel_fp16_b##K[] = { \ - EXL3_MGEMM_KERNEL_INSTANCES(K, false, 0), \ - EXL3_MGEMM_KERNEL_INSTANCES(K, false, 1), \ - EXL3_MGEMM_KERNEL_INSTANCES(K, false, 2)}; +// Instance arrays are indexed by shape and defined per (K, cb) so each codebook +// compiles as a separate translation unit (see +// comp_units/exl3_comp_unit_K_cbX.cu) + +#define EXL3_KERNEL_EXTERNS_CB(K, cb) \ + extern fp_exl3_gemm_kernel tfp_exl3_gemm_kernel_fp32_b##K##_cb##cb[]; \ + extern fp_exl3_gemm_kernel tfp_exl3_gemm_kernel_fp16_b##K##_cb##cb[]; \ + extern fp_exl3_mgemm_kernel tfp_exl3_mgemm_kernel_fp32_b##K##_cb##cb[]; \ + extern fp_exl3_mgemm_kernel tfp_exl3_mgemm_kernel_fp16_b##K##_cb##cb[]; + +#define ALL_EXL3_KERNEL_EXTERNS(K) \ + EXL3_KERNEL_EXTERNS_CB(K, 0) \ + EXL3_KERNEL_EXTERNS_CB(K, 1) \ + EXL3_KERNEL_EXTERNS_CB(K, 2) + +#define EXL3_KERNEL_INSTANCES_CB(K, cb) \ + fp_exl3_gemm_kernel tfp_exl3_gemm_kernel_fp32_b##K##_cb##cb[] = { \ + EXL3_GEMM_KERNEL_INSTANCES(K, true, cb)}; \ + \ + fp_exl3_gemm_kernel tfp_exl3_gemm_kernel_fp16_b##K##_cb##cb[] = { \ + EXL3_GEMM_KERNEL_INSTANCES(K, false, cb)}; \ + \ + fp_exl3_mgemm_kernel tfp_exl3_mgemm_kernel_fp32_b##K##_cb##cb[] = { \ + EXL3_MGEMM_KERNEL_INSTANCES(K, true, cb)}; \ + \ + fp_exl3_mgemm_kernel tfp_exl3_mgemm_kernel_fp16_b##K##_cb##cb[] = { \ + EXL3_MGEMM_KERNEL_INSTANCES(K, false, cb)}; fp_exl3_gemm_kernel select_exl3_gemm_kernel( const int cc, const int size_m, const int size_k, const int size_n, @@ -93,39 +94,7 @@ fp_exl3_mgemm_kernel select_exl3_mgemm_kernel( int* out_block_dim, int* out_shape_idx, int* out_num_sms, const int cb, const int bszm_in, const int bszm_out); -struct TSample { - int cc; - int K; - int m; - int k; - int n; - int shape_idx; - int num_sms; -}; - -struct TMSample { - int cc; - int K; - int m; - int k; - int n; - int shape_idx; - int num_sms; - int bszm_in; - int bszm_out; -}; - -struct TResult { - fp_exl3_gemm_kernel kernel; - fp_exl3_mgemm_kernel mkernel; - int shape_idx; - int num_sms; - int block_dim; -}; - -TResult* select_exl3_gemm_mgemm_kernel_new(const int cc, const int size_m, - const int size_k, const int size_n, - const int K, const bool c_fp32, - const int force_shape_idx, - const int force_num_sms, - const int cb); +fp_exl3_gemm_kernel get_gemm_kernel_ptr(int K, int shape_idx, bool c_fp32, + int cb); +fp_exl3_mgemm_kernel get_mgemm_kernel_ptr(int K, int shape_idx, bool c_fp32, + int cb); diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map_samples.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map_samples.cuh deleted file mode 100644 index cb4a07e083..0000000000 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_kernel_map_samples.cuh +++ /dev/null @@ -1,13109 +0,0 @@ -struct TSample samples_128[] = {{4, 1, 1, 128, 128, 1, 2}, - {4, 2, 1, 128, 128, 1, 2}, - {4, 3, 1, 128, 128, 1, 2}, - {4, 4, 1, 128, 128, 2, 1}, - {4, 5, 1, 128, 128, 1, 2}, - {4, 6, 1, 128, 128, 1, 2}, - {4, 7, 1, 128, 128, 1, 2}, - {4, 8, 1, 128, 128, 1, 2}, - {4, 1, 1, 128, 256, 1, 4}, - {4, 2, 1, 128, 256, 1, 4}, - {4, 3, 1, 128, 256, 1, 4}, - {4, 4, 1, 128, 256, 2, 2}, - {4, 5, 1, 128, 256, 1, 2}, - {4, 6, 1, 128, 256, 1, 4}, - {4, 7, 1, 128, 256, 1, 4}, - {4, 8, 1, 128, 256, 1, 4}, - {4, 1, 1, 128, 512, 1, 4}, - {4, 2, 1, 128, 512, 1, 8}, - {4, 3, 1, 128, 512, 2, 4}, - {4, 4, 1, 128, 512, 2, 4}, - {4, 5, 1, 128, 512, 2, 8}, - {4, 6, 1, 128, 512, 1, 8}, - {4, 7, 1, 128, 512, 1, 8}, - {4, 8, 1, 128, 512, 2, 4}, - {4, 1, 1, 128, 1024, 1, 16}, - {4, 2, 1, 128, 1024, 1, 16}, - {4, 3, 1, 128, 1024, 2, 8}, - {4, 4, 1, 128, 1024, 2, 8}, - {4, 5, 1, 128, 1024, 1, 16}, - {4, 6, 1, 128, 1024, 2, 8}, - {4, 7, 1, 128, 1024, 1, 8}, - {4, 8, 1, 128, 1024, 1, 16}, - {4, 1, 1, 128, 2048, 2, 16}, - {4, 2, 1, 128, 2048, 1, 16}, - {4, 3, 1, 128, 2048, 1, 16}, - {4, 4, 1, 128, 2048, 2, 16}, - {4, 5, 1, 128, 2048, 1, 32}, - {4, 6, 1, 128, 2048, 1, 32}, - {4, 7, 1, 128, 2048, 2, 128}, - {4, 8, 1, 128, 2048, 1, 32}, - {4, 1, 1, 128, 3072, 1, 32}, - {4, 2, 1, 128, 3072, 1, 48}, - {4, 3, 1, 128, 3072, 1, 24}, - {4, 4, 1, 128, 3072, 1, 24}, - {4, 5, 1, 128, 3072, 1, 48}, - {4, 6, 1, 128, 3072, 1, 48}, - {4, 7, 1, 128, 3072, 1, 50}, - {4, 8, 1, 128, 3072, 1, 48}, - {4, 1, 1, 128, 4096, 1, 64}, - {4, 2, 1, 128, 4096, 2, 32}, - {4, 3, 1, 128, 4096, 2, 32}, - {4, 4, 1, 128, 4096, 1, 64}, - {4, 5, 1, 128, 4096, 1, 64}, - {4, 6, 1, 128, 4096, 1, 64}, - {4, 7, 1, 128, 4096, 2, 92}, - {4, 8, 1, 128, 4096, 1, 64}, - {4, 1, 1, 128, 5120, 1, 80}, - {4, 2, 1, 128, 5120, 1, 40}, - {4, 3, 1, 128, 5120, 1, 40}, - {4, 4, 1, 128, 5120, 2, 40}, - {4, 5, 1, 128, 5120, 1, 80}, - {4, 6, 1, 128, 5120, 1, 60}, - {4, 7, 1, 128, 5120, 2, 48}, - {4, 8, 1, 128, 5120, 1, 80}, - {4, 1, 1, 128, 8192, 1, 64}, - {4, 2, 1, 128, 8192, 2, 64}, - {4, 3, 1, 128, 8192, 1, 64}, - {4, 4, 1, 128, 8192, 2, 64}, - {4, 5, 1, 128, 8192, 2, 152}, - {4, 6, 1, 128, 8192, 1, 64}, - {4, 7, 1, 128, 8192, 1, 116}, - {4, 8, 1, 128, 8192, 1, 64}, - {4, 1, 1, 128, 12288, 2, 96}, - {4, 2, 1, 128, 12288, 1, 96}, - {4, 3, 1, 128, 12288, 2, 162}, - {4, 4, 1, 128, 12288, 1, 96}, - {4, 5, 1, 128, 12288, 2, 146}, - {4, 6, 1, 128, 12288, 1, 152}, - {4, 7, 1, 128, 12288, 1, 164}, - {4, 8, 1, 128, 12288, 1, 96}, - {4, 1, 1, 128, 14336, 2, 112}, - {4, 2, 1, 128, 14336, 1, 112}, - {4, 3, 1, 128, 14336, 2, 112}, - {4, 4, 1, 128, 14336, 1, 112}, - {4, 5, 1, 128, 14336, 1, 134}, - {4, 6, 1, 128, 14336, 1, 144}, - {4, 7, 1, 128, 14336, 1, 166}, - {4, 8, 1, 128, 14336, 1, 112}, - {4, 1, 1, 128, 16384, 1, 128}, - {4, 2, 1, 128, 16384, 1, 128}, - {4, 3, 1, 128, 16384, 2, 128}, - {4, 4, 1, 128, 16384, 2, 128}, - {4, 5, 1, 128, 16384, 2, 108}, - {4, 6, 1, 128, 16384, 1, 118}, - {4, 7, 1, 128, 16384, 1, 158}, - {4, 8, 1, 128, 16384, 1, 128}, - {4, 1, 1, 128, 24576, 2, 146}, - {4, 2, 1, 128, 24576, 2, 96}, - {4, 3, 1, 128, 24576, 2, 144}, - {4, 4, 1, 128, 24576, 1, 164}, - {4, 5, 1, 128, 24576, 1, 170}, - {4, 6, 1, 128, 24576, 2, 152}, - {4, 7, 1, 128, 24576, 1, 158}, - {4, 8, 1, 128, 24576, 1, 156}, - {4, 1, 1, 128, 51200, 2, 156}, - {4, 2, 1, 128, 51200, 2, 152}, - {4, 3, 1, 128, 51200, 2, 160}, - {4, 4, 1, 128, 51200, 2, 152}, - {4, 5, 1, 128, 51200, 2, 152}, - {4, 6, 1, 128, 51200, 2, 152}, - {4, 7, 1, 128, 51200, 1, 160}, - {4, 8, 1, 128, 51200, 1, 160}, - {4, 1, 1, 128, 128000, 2, 168}, - {4, 2, 1, 128, 128000, 2, 160}, - {4, 3, 1, 128, 128000, 2, 170}, - {4, 4, 1, 128, 128000, 2, 166}, - {4, 5, 1, 128, 128000, 2, 166}, - {4, 6, 1, 128, 128000, 2, 166}, - {4, 7, 1, 128, 128000, 2, 168}, - {4, 8, 1, 128, 128000, 2, 144}, - {4, 1, 1, 256, 128, 2, 2}, - {4, 2, 1, 256, 128, 2, 4}, - {4, 3, 1, 256, 128, 2, 1}, - {4, 4, 1, 256, 128, 1, 1}, - {4, 5, 1, 256, 128, 1, 2}, - {4, 6, 1, 256, 128, 2, 4}, - {4, 7, 1, 256, 128, 1, 2}, - {4, 8, 1, 256, 128, 2, 1}, - {4, 1, 1, 256, 256, 2, 8}, - {4, 2, 1, 256, 256, 2, 2}, - {4, 3, 1, 256, 256, 2, 4}, - {4, 4, 1, 256, 256, 1, 8}, - {4, 5, 1, 256, 256, 1, 4}, - {4, 6, 1, 256, 256, 1, 8}, - {4, 7, 1, 256, 256, 1, 4}, - {4, 8, 1, 256, 256, 2, 4}, - {4, 1, 1, 256, 512, 2, 14}, - {4, 2, 1, 256, 512, 1, 6}, - {4, 3, 1, 256, 512, 2, 16}, - {4, 4, 1, 256, 512, 2, 4}, - {4, 5, 1, 256, 512, 1, 12}, - {4, 6, 1, 256, 512, 1, 8}, - {4, 7, 1, 256, 512, 2, 12}, - {4, 8, 1, 256, 512, 1, 16}, - {4, 1, 1, 256, 1024, 2, 10}, - {4, 2, 1, 256, 1024, 1, 18}, - {4, 3, 1, 256, 1024, 2, 8}, - {4, 4, 1, 256, 1024, 2, 16}, - {4, 5, 1, 256, 1024, 2, 12}, - {4, 6, 1, 256, 1024, 2, 18}, - {4, 7, 1, 256, 1024, 2, 16}, - {4, 8, 1, 256, 1024, 2, 8}, - {4, 1, 1, 256, 2048, 1, 20}, - {4, 2, 1, 256, 2048, 1, 26}, - {4, 3, 1, 256, 2048, 2, 24}, - {4, 4, 1, 256, 2048, 1, 32}, - {4, 5, 1, 256, 2048, 2, 42}, - {4, 6, 1, 256, 2048, 1, 42}, - {4, 7, 1, 256, 2048, 2, 32}, - {4, 8, 1, 256, 2048, 1, 30}, - {4, 1, 1, 256, 3072, 1, 76}, - {4, 2, 1, 256, 3072, 2, 32}, - {4, 3, 1, 256, 3072, 2, 42}, - {4, 4, 1, 256, 3072, 1, 66}, - {4, 5, 1, 256, 3072, 2, 48}, - {4, 6, 1, 256, 3072, 2, 42}, - {4, 7, 1, 256, 3072, 2, 54}, - {4, 8, 1, 256, 3072, 2, 48}, - {4, 1, 1, 256, 4096, 2, 80}, - {4, 2, 1, 256, 4096, 1, 82}, - {4, 3, 1, 256, 4096, 1, 96}, - {4, 4, 1, 256, 4096, 2, 64}, - {4, 5, 1, 256, 4096, 2, 64}, - {4, 6, 1, 256, 4096, 2, 70}, - {4, 7, 1, 256, 4096, 1, 64}, - {4, 8, 1, 256, 4096, 1, 64}, - {4, 1, 1, 256, 5120, 2, 98}, - {4, 2, 1, 256, 5120, 2, 92}, - {4, 3, 1, 256, 5120, 2, 62}, - {4, 4, 1, 256, 5120, 2, 112}, - {4, 5, 1, 256, 5120, 1, 114}, - {4, 6, 1, 256, 5120, 2, 84}, - {4, 7, 1, 256, 5120, 1, 80}, - {4, 8, 1, 256, 5120, 1, 130}, - {4, 1, 1, 256, 8192, 2, 112}, - {4, 2, 1, 256, 8192, 2, 96}, - {4, 3, 1, 256, 8192, 2, 152}, - {4, 4, 1, 256, 8192, 2, 160}, - {4, 5, 1, 256, 8192, 2, 152}, - {4, 6, 1, 256, 8192, 1, 144}, - {4, 7, 1, 256, 8192, 2, 128}, - {4, 8, 1, 256, 8192, 1, 126}, - {4, 1, 1, 256, 12288, 2, 152}, - {4, 2, 1, 256, 12288, 2, 160}, - {4, 3, 1, 256, 12288, 2, 138}, - {4, 4, 1, 256, 12288, 1, 146}, - {4, 5, 1, 256, 12288, 2, 156}, - {4, 6, 1, 256, 12288, 1, 158}, - {4, 7, 1, 256, 12288, 1, 170}, - {4, 8, 1, 256, 12288, 1, 144}, - {4, 1, 1, 256, 14336, 2, 156}, - {4, 2, 1, 256, 14336, 2, 132}, - {4, 3, 1, 256, 14336, 2, 160}, - {4, 4, 1, 256, 14336, 2, 158}, - {4, 5, 1, 256, 14336, 1, 168}, - {4, 6, 1, 256, 14336, 1, 168}, - {4, 7, 1, 256, 14336, 2, 112}, - {4, 8, 1, 256, 14336, 1, 156}, - {4, 1, 1, 256, 16384, 2, 154}, - {4, 2, 1, 256, 16384, 2, 158}, - {4, 3, 1, 256, 16384, 2, 150}, - {4, 4, 1, 256, 16384, 1, 170}, - {4, 5, 1, 256, 16384, 1, 164}, - {4, 6, 1, 256, 16384, 1, 166}, - {4, 7, 1, 256, 16384, 1, 170}, - {4, 8, 1, 256, 16384, 1, 128}, - {4, 1, 1, 256, 24576, 2, 168}, - {4, 2, 1, 256, 24576, 2, 168}, - {4, 3, 1, 256, 24576, 2, 168}, - {4, 4, 1, 256, 24576, 2, 168}, - {4, 5, 1, 256, 24576, 2, 144}, - {4, 6, 1, 256, 24576, 2, 136}, - {4, 7, 1, 256, 24576, 2, 168}, - {4, 8, 1, 256, 24576, 1, 164}, - {4, 1, 1, 256, 51200, 2, 156}, - {4, 2, 1, 256, 51200, 2, 152}, - {4, 3, 1, 256, 51200, 2, 156}, - {4, 4, 1, 256, 51200, 2, 152}, - {4, 5, 1, 256, 51200, 2, 160}, - {4, 6, 1, 256, 51200, 2, 160}, - {4, 7, 1, 256, 51200, 2, 168}, - {4, 8, 1, 256, 51200, 2, 168}, - {4, 1, 1, 256, 128000, 2, 170}, - {4, 2, 1, 256, 128000, 2, 168}, - {4, 3, 1, 256, 128000, 2, 170}, - {4, 4, 1, 256, 128000, 2, 170}, - {4, 5, 1, 256, 128000, 2, 170}, - {4, 6, 1, 256, 128000, 2, 168}, - {4, 7, 1, 256, 128000, 2, 170}, - {4, 8, 1, 256, 128000, 2, 168}, - {4, 1, 1, 512, 128, 2, 4}, - {4, 2, 1, 512, 128, 2, 2}, - {4, 3, 1, 512, 128, 2, 2}, - {4, 4, 1, 512, 128, 2, 2}, - {4, 5, 1, 512, 128, 2, 2}, - {4, 6, 1, 512, 128, 2, 2}, - {4, 7, 1, 512, 128, 1, 6}, - {4, 8, 1, 512, 128, 2, 2}, - {4, 1, 1, 512, 256, 2, 6}, - {4, 2, 1, 512, 256, 2, 6}, - {4, 3, 1, 512, 256, 2, 4}, - {4, 4, 1, 512, 256, 2, 6}, - {4, 5, 1, 512, 256, 2, 4}, - {4, 6, 1, 512, 256, 2, 4}, - {4, 7, 1, 512, 256, 2, 10}, - {4, 8, 1, 512, 256, 2, 4}, - {4, 1, 1, 512, 512, 2, 12}, - {4, 2, 1, 512, 512, 2, 12}, - {4, 3, 1, 512, 512, 2, 8}, - {4, 4, 1, 512, 512, 2, 12}, - {4, 5, 1, 512, 512, 2, 12}, - {4, 6, 1, 512, 512, 1, 16}, - {4, 7, 1, 512, 512, 2, 14}, - {4, 8, 1, 512, 512, 2, 8}, - {4, 1, 1, 512, 1024, 1, 24}, - {4, 2, 1, 512, 1024, 1, 24}, - {4, 3, 1, 512, 1024, 2, 24}, - {4, 4, 1, 512, 1024, 2, 24}, - {4, 5, 1, 512, 1024, 2, 24}, - {4, 6, 1, 512, 1024, 1, 32}, - {4, 7, 1, 512, 1024, 2, 42}, - {4, 8, 1, 512, 1024, 1, 24}, - {4, 1, 1, 512, 2048, 1, 48}, - {4, 2, 1, 512, 2048, 2, 32}, - {4, 3, 1, 512, 2048, 2, 32}, - {4, 4, 1, 512, 2048, 2, 32}, - {4, 5, 1, 512, 2048, 2, 32}, - {4, 6, 1, 512, 2048, 2, 48}, - {4, 7, 1, 512, 2048, 1, 46}, - {4, 8, 1, 512, 2048, 2, 48}, - {4, 1, 1, 512, 3072, 2, 48}, - {4, 2, 1, 512, 3072, 2, 48}, - {4, 3, 1, 512, 3072, 2, 48}, - {4, 4, 1, 512, 3072, 2, 48}, - {4, 5, 1, 512, 3072, 2, 48}, - {4, 6, 1, 512, 3072, 2, 48}, - {4, 7, 1, 512, 3072, 2, 96}, - {4, 8, 1, 512, 3072, 2, 72}, - {4, 1, 1, 512, 4096, 2, 64}, - {4, 2, 1, 512, 4096, 2, 64}, - {4, 3, 1, 512, 4096, 2, 64}, - {4, 4, 1, 512, 4096, 2, 64}, - {4, 5, 1, 512, 4096, 2, 64}, - {4, 6, 1, 512, 4096, 2, 64}, - {4, 7, 1, 512, 4096, 1, 126}, - {4, 8, 1, 512, 4096, 2, 64}, - {4, 1, 1, 512, 5120, 1, 120}, - {4, 2, 1, 512, 5120, 1, 120}, - {4, 3, 1, 512, 5120, 2, 80}, - {4, 4, 1, 512, 5120, 2, 80}, - {4, 5, 1, 512, 5120, 2, 80}, - {4, 6, 1, 512, 5120, 1, 120}, - {4, 7, 1, 512, 5120, 1, 124}, - {4, 8, 1, 512, 5120, 1, 120}, - {4, 1, 1, 512, 8192, 2, 128}, - {4, 2, 1, 512, 8192, 2, 128}, - {4, 3, 1, 512, 8192, 2, 128}, - {4, 4, 1, 512, 8192, 2, 128}, - {4, 5, 1, 512, 8192, 2, 152}, - {4, 6, 1, 512, 8192, 1, 128}, - {4, 7, 1, 512, 8192, 1, 156}, - {4, 8, 1, 512, 8192, 1, 144}, - {4, 1, 1, 512, 12288, 2, 170}, - {4, 2, 1, 512, 12288, 2, 160}, - {4, 3, 1, 512, 12288, 2, 132}, - {4, 4, 1, 512, 12288, 2, 152}, - {4, 5, 1, 512, 12288, 2, 152}, - {4, 6, 1, 512, 12288, 2, 128}, - {4, 7, 1, 512, 12288, 2, 156}, - {4, 8, 1, 512, 12288, 2, 152}, - {4, 1, 1, 512, 14336, 2, 112}, - {4, 2, 1, 512, 14336, 1, 152}, - {4, 3, 1, 512, 14336, 2, 120}, - {4, 4, 1, 512, 14336, 2, 112}, - {4, 5, 1, 512, 14336, 2, 156}, - {4, 6, 1, 512, 14336, 2, 156}, - {4, 7, 1, 512, 14336, 2, 168}, - {4, 8, 1, 512, 14336, 1, 170}, - {4, 1, 1, 512, 16384, 2, 166}, - {4, 2, 1, 512, 16384, 2, 160}, - {4, 3, 1, 512, 16384, 1, 156}, - {4, 4, 1, 512, 16384, 2, 136}, - {4, 5, 1, 512, 16384, 2, 160}, - {4, 6, 1, 512, 16384, 2, 156}, - {4, 7, 1, 512, 16384, 2, 162}, - {4, 8, 1, 512, 16384, 1, 164}, - {4, 1, 1, 512, 24576, 2, 152}, - {4, 2, 1, 512, 24576, 2, 168}, - {4, 3, 1, 512, 24576, 1, 160}, - {4, 4, 1, 512, 24576, 2, 168}, - {4, 5, 1, 512, 24576, 2, 168}, - {4, 6, 1, 512, 24576, 2, 168}, - {4, 7, 1, 512, 24576, 2, 168}, - {4, 8, 1, 512, 24576, 1, 168}, - {4, 1, 1, 512, 51200, 2, 168}, - {4, 2, 1, 512, 51200, 2, 164}, - {4, 3, 1, 512, 51200, 2, 160}, - {4, 4, 1, 512, 51200, 2, 170}, - {4, 5, 1, 512, 51200, 2, 170}, - {4, 6, 1, 512, 51200, 2, 164}, - {4, 7, 1, 512, 51200, 2, 168}, - {4, 8, 1, 512, 51200, 1, 168}, - {4, 1, 1, 512, 128000, 2, 170}, - {4, 2, 1, 512, 128000, 2, 170}, - {4, 3, 1, 512, 128000, 2, 170}, - {4, 4, 1, 512, 128000, 2, 170}, - {4, 5, 1, 512, 128000, 2, 170}, - {4, 6, 1, 512, 128000, 2, 170}, - {4, 7, 1, 512, 128000, 2, 170}, - {4, 8, 1, 512, 128000, 2, 156}, - {4, 1, 1, 1024, 128, 2, 2}, - {4, 2, 1, 1024, 128, 2, 2}, - {4, 3, 1, 1024, 128, 2, 2}, - {4, 4, 1, 1024, 128, 2, 6}, - {4, 5, 1, 1024, 128, 2, 4}, - {4, 6, 1, 1024, 128, 2, 4}, - {4, 7, 1, 1024, 128, 2, 4}, - {4, 8, 1, 1024, 128, 1, 4}, - {4, 1, 1, 1024, 256, 2, 8}, - {4, 2, 1, 1024, 256, 2, 4}, - {4, 3, 1, 1024, 256, 2, 8}, - {4, 4, 1, 1024, 256, 2, 6}, - {4, 5, 1, 1024, 256, 2, 8}, - {4, 6, 1, 1024, 256, 2, 10}, - {4, 7, 1, 1024, 256, 2, 8}, - {4, 8, 1, 1024, 256, 1, 10}, - {4, 1, 1, 1024, 512, 1, 16}, - {4, 2, 1, 1024, 512, 2, 16}, - {4, 3, 1, 1024, 512, 2, 14}, - {4, 4, 1, 1024, 512, 2, 12}, - {4, 5, 1, 1024, 512, 2, 16}, - {4, 6, 1, 1024, 512, 2, 16}, - {4, 7, 1, 1024, 512, 2, 16}, - {4, 8, 1, 1024, 512, 2, 12}, - {4, 1, 1, 1024, 1024, 2, 24}, - {4, 2, 1, 1024, 1024, 2, 28}, - {4, 3, 1, 1024, 1024, 2, 38}, - {4, 4, 1, 1024, 1024, 2, 24}, - {4, 5, 1, 1024, 1024, 2, 32}, - {4, 6, 1, 1024, 1024, 2, 30}, - {4, 7, 1, 1024, 1024, 2, 32}, - {4, 8, 1, 1024, 1024, 2, 32}, - {4, 1, 1, 1024, 2048, 2, 46}, - {4, 2, 1, 1024, 2048, 2, 64}, - {4, 3, 1, 1024, 2048, 2, 76}, - {4, 4, 1, 1024, 2048, 2, 74}, - {4, 5, 1, 1024, 2048, 2, 64}, - {4, 6, 1, 1024, 2048, 2, 64}, - {4, 7, 1, 1024, 2048, 1, 104}, - {4, 8, 1, 1024, 2048, 2, 64}, - {4, 1, 1, 1024, 3072, 2, 94}, - {4, 2, 1, 1024, 3072, 2, 78}, - {4, 3, 1, 1024, 3072, 2, 96}, - {4, 4, 1, 1024, 3072, 2, 70}, - {4, 5, 1, 1024, 3072, 2, 96}, - {4, 6, 1, 1024, 3072, 2, 96}, - {4, 7, 1, 1024, 3072, 1, 120}, - {4, 8, 1, 1024, 3072, 1, 88}, - {4, 1, 1, 1024, 4096, 2, 96}, - {4, 2, 1, 1024, 4096, 2, 118}, - {4, 3, 1, 1024, 4096, 2, 128}, - {4, 4, 1, 1024, 4096, 2, 96}, - {4, 5, 1, 1024, 4096, 1, 120}, - {4, 6, 1, 1024, 4096, 1, 124}, - {4, 7, 1, 1024, 4096, 1, 128}, - {4, 8, 1, 1024, 4096, 1, 162}, - {4, 1, 1, 1024, 5120, 2, 128}, - {4, 2, 1, 1024, 5120, 1, 160}, - {4, 3, 1, 1024, 5120, 2, 120}, - {4, 4, 1, 1024, 5120, 2, 144}, - {4, 5, 1, 1024, 5120, 2, 112}, - {4, 6, 1, 1024, 5120, 2, 122}, - {4, 7, 1, 1024, 5120, 2, 160}, - {4, 8, 1, 1024, 5120, 1, 160}, - {4, 1, 1, 1024, 8192, 2, 158}, - {4, 2, 1, 1024, 8192, 2, 168}, - {4, 3, 1, 1024, 8192, 2, 166}, - {4, 4, 1, 1024, 8192, 2, 154}, - {4, 5, 1, 1024, 8192, 2, 136}, - {4, 6, 1, 1024, 8192, 2, 168}, - {4, 7, 1, 1024, 8192, 2, 158}, - {4, 8, 1, 1024, 8192, 2, 156}, - {4, 1, 1, 1024, 12288, 2, 162}, - {4, 2, 1, 1024, 12288, 2, 156}, - {4, 3, 1, 1024, 12288, 2, 170}, - {4, 4, 1, 1024, 12288, 2, 168}, - {4, 5, 1, 1024, 12288, 2, 162}, - {4, 6, 1, 1024, 12288, 2, 170}, - {4, 7, 1, 1024, 12288, 2, 170}, - {4, 8, 1, 1024, 12288, 2, 136}, - {4, 1, 1, 1024, 14336, 2, 164}, - {4, 2, 1, 1024, 14336, 2, 156}, - {4, 3, 1, 1024, 14336, 2, 168}, - {4, 4, 1, 1024, 14336, 2, 168}, - {4, 5, 1, 1024, 14336, 2, 170}, - {4, 6, 1, 1024, 14336, 2, 152}, - {4, 7, 1, 1024, 14336, 2, 168}, - {4, 8, 1, 1024, 14336, 1, 168}, - {4, 1, 1, 1024, 16384, 2, 170}, - {4, 2, 1, 1024, 16384, 2, 156}, - {4, 3, 1, 1024, 16384, 2, 166}, - {4, 4, 1, 1024, 16384, 2, 168}, - {4, 5, 1, 1024, 16384, 2, 160}, - {4, 6, 1, 1024, 16384, 2, 170}, - {4, 7, 1, 1024, 16384, 2, 170}, - {4, 8, 1, 1024, 16384, 1, 168}, - {4, 1, 1, 1024, 24576, 2, 168}, - {4, 2, 1, 1024, 24576, 2, 168}, - {4, 3, 1, 1024, 24576, 2, 158}, - {4, 4, 1, 1024, 24576, 2, 160}, - {4, 5, 1, 1024, 24576, 2, 168}, - {4, 6, 1, 1024, 24576, 2, 170}, - {4, 7, 1, 1024, 24576, 2, 170}, - {4, 8, 1, 1024, 24576, 1, 168}, - {4, 1, 1, 1024, 51200, 2, 168}, - {4, 2, 1, 1024, 51200, 2, 170}, - {4, 3, 1, 1024, 51200, 2, 170}, - {4, 4, 1, 1024, 51200, 2, 168}, - {4, 5, 1, 1024, 51200, 2, 170}, - {4, 6, 1, 1024, 51200, 2, 160}, - {4, 7, 1, 1024, 51200, 2, 170}, - {4, 8, 1, 1024, 51200, 1, 166}, - {4, 1, 1, 1024, 128000, 2, 170}, - {4, 2, 1, 1024, 128000, 2, 170}, - {4, 3, 1, 1024, 128000, 2, 170}, - {4, 4, 1, 1024, 128000, 2, 170}, - {4, 5, 1, 1024, 128000, 2, 170}, - {4, 6, 1, 1024, 128000, 2, 170}, - {4, 7, 1, 1024, 128000, 2, 166}, - {4, 8, 1, 1024, 128000, 2, 156}, - {4, 1, 1, 2048, 128, 2, 4}, - {4, 2, 1, 2048, 128, 1, 4}, - {4, 3, 1, 2048, 128, 2, 6}, - {4, 4, 1, 2048, 128, 2, 4}, - {4, 5, 1, 2048, 128, 2, 6}, - {4, 6, 1, 2048, 128, 2, 6}, - {4, 7, 1, 2048, 128, 2, 8}, - {4, 8, 1, 2048, 128, 2, 6}, - {4, 1, 1, 2048, 256, 1, 10}, - {4, 2, 1, 2048, 256, 1, 16}, - {4, 3, 1, 2048, 256, 2, 8}, - {4, 4, 1, 2048, 256, 2, 10}, - {4, 5, 1, 2048, 256, 2, 10}, - {4, 6, 1, 2048, 256, 2, 10}, - {4, 7, 1, 2048, 256, 2, 8}, - {4, 8, 1, 2048, 256, 2, 10}, - {4, 1, 1, 2048, 512, 2, 16}, - {4, 2, 1, 2048, 512, 1, 24}, - {4, 3, 1, 2048, 512, 2, 26}, - {4, 4, 1, 2048, 512, 1, 26}, - {4, 5, 1, 2048, 512, 2, 24}, - {4, 6, 1, 2048, 512, 2, 24}, - {4, 7, 1, 2048, 512, 2, 24}, - {4, 8, 1, 2048, 512, 2, 24}, - {4, 1, 1, 2048, 1024, 2, 30}, - {4, 2, 1, 2048, 1024, 2, 36}, - {4, 3, 1, 2048, 1024, 2, 48}, - {4, 4, 1, 2048, 1024, 2, 54}, - {4, 5, 1, 2048, 1024, 2, 40}, - {4, 6, 1, 2048, 1024, 2, 48}, - {4, 7, 1, 2048, 1024, 2, 48}, - {4, 8, 1, 2048, 1024, 2, 48}, - {4, 1, 1, 2048, 2048, 2, 76}, - {4, 2, 1, 2048, 2048, 2, 96}, - {4, 3, 1, 2048, 2048, 2, 74}, - {4, 4, 1, 2048, 2048, 2, 62}, - {4, 5, 1, 2048, 2048, 2, 76}, - {4, 6, 1, 2048, 2048, 1, 80}, - {4, 7, 1, 2048, 2048, 2, 80}, - {4, 8, 1, 2048, 2048, 2, 72}, - {4, 1, 1, 2048, 3072, 2, 114}, - {4, 2, 1, 2048, 3072, 2, 140}, - {4, 3, 1, 2048, 3072, 2, 120}, - {4, 4, 1, 2048, 3072, 2, 112}, - {4, 5, 1, 2048, 3072, 1, 144}, - {4, 6, 1, 2048, 3072, 2, 136}, - {4, 7, 1, 2048, 3072, 2, 112}, - {4, 8, 1, 2048, 3072, 2, 104}, - {4, 1, 1, 2048, 4096, 2, 124}, - {4, 2, 1, 2048, 4096, 2, 158}, - {4, 3, 1, 2048, 4096, 2, 120}, - {4, 4, 1, 2048, 4096, 1, 160}, - {4, 5, 1, 2048, 4096, 2, 160}, - {4, 6, 1, 2048, 4096, 2, 148}, - {4, 7, 1, 2048, 4096, 2, 126}, - {4, 8, 1, 2048, 4096, 1, 160}, - {4, 1, 1, 2048, 5120, 2, 160}, - {4, 2, 1, 2048, 5120, 2, 160}, - {4, 3, 1, 2048, 5120, 2, 158}, - {4, 4, 1, 2048, 5120, 2, 152}, - {4, 5, 1, 2048, 5120, 2, 160}, - {4, 6, 1, 2048, 5120, 2, 160}, - {4, 7, 1, 2048, 5120, 2, 160}, - {4, 8, 1, 2048, 5120, 1, 160}, - {4, 1, 1, 2048, 8192, 2, 160}, - {4, 2, 1, 2048, 8192, 2, 170}, - {4, 3, 1, 2048, 8192, 2, 170}, - {4, 4, 1, 2048, 8192, 2, 170}, - {4, 5, 1, 2048, 8192, 2, 168}, - {4, 6, 1, 2048, 8192, 2, 170}, - {4, 7, 1, 2048, 8192, 2, 170}, - {4, 8, 1, 2048, 8192, 1, 160}, - {4, 1, 1, 2048, 12288, 2, 168}, - {4, 2, 1, 2048, 12288, 2, 170}, - {4, 3, 1, 2048, 12288, 2, 168}, - {4, 4, 1, 2048, 12288, 2, 164}, - {4, 5, 1, 2048, 12288, 2, 170}, - {4, 6, 1, 2048, 12288, 2, 164}, - {4, 7, 1, 2048, 12288, 2, 164}, - {4, 8, 1, 2048, 12288, 1, 162}, - {4, 1, 1, 2048, 14336, 2, 168}, - {4, 2, 1, 2048, 14336, 2, 170}, - {4, 3, 1, 2048, 14336, 2, 168}, - {4, 4, 1, 2048, 14336, 2, 168}, - {4, 5, 1, 2048, 14336, 2, 164}, - {4, 6, 1, 2048, 14336, 2, 168}, - {4, 7, 1, 2048, 14336, 2, 164}, - {4, 8, 1, 2048, 14336, 1, 168}, - {4, 1, 1, 2048, 16384, 2, 166}, - {4, 2, 1, 2048, 16384, 2, 170}, - {4, 3, 1, 2048, 16384, 2, 168}, - {4, 4, 1, 2048, 16384, 2, 168}, - {4, 5, 1, 2048, 16384, 2, 164}, - {4, 6, 1, 2048, 16384, 2, 170}, - {4, 7, 1, 2048, 16384, 2, 160}, - {4, 8, 1, 2048, 16384, 1, 168}, - {4, 1, 1, 2048, 24576, 2, 166}, - {4, 2, 1, 2048, 24576, 2, 170}, - {4, 3, 1, 2048, 24576, 2, 168}, - {4, 4, 1, 2048, 24576, 2, 168}, - {4, 5, 1, 2048, 24576, 2, 168}, - {4, 6, 1, 2048, 24576, 2, 160}, - {4, 7, 1, 2048, 24576, 2, 170}, - {4, 8, 1, 2048, 24576, 1, 168}, - {4, 1, 1, 2048, 51200, 2, 170}, - {4, 2, 1, 2048, 51200, 2, 170}, - {4, 3, 1, 2048, 51200, 2, 170}, - {4, 4, 1, 2048, 51200, 2, 170}, - {4, 5, 1, 2048, 51200, 2, 170}, - {4, 6, 1, 2048, 51200, 2, 160}, - {4, 7, 1, 2048, 51200, 2, 166}, - {4, 8, 1, 2048, 51200, 2, 150}, - {4, 1, 1, 2048, 128000, 2, 170}, - {4, 2, 1, 2048, 128000, 2, 170}, - {4, 3, 1, 2048, 128000, 2, 170}, - {4, 4, 1, 2048, 128000, 2, 168}, - {4, 5, 1, 2048, 128000, 2, 170}, - {4, 6, 1, 2048, 128000, 2, 170}, - {4, 7, 1, 2048, 128000, 2, 166}, - {4, 8, 1, 2048, 128000, 2, 166}, - {4, 1, 1, 3072, 128, 2, 6}, - {4, 2, 1, 3072, 128, 2, 6}, - {4, 3, 1, 3072, 128, 2, 6}, - {4, 4, 1, 3072, 128, 2, 6}, - {4, 5, 1, 3072, 128, 2, 8}, - {4, 6, 1, 3072, 128, 1, 8}, - {4, 7, 1, 3072, 128, 2, 8}, - {4, 8, 1, 3072, 128, 2, 6}, - {4, 1, 1, 3072, 256, 2, 12}, - {4, 2, 1, 3072, 256, 1, 12}, - {4, 3, 1, 3072, 256, 2, 16}, - {4, 4, 1, 3072, 256, 2, 12}, - {4, 5, 1, 3072, 256, 2, 14}, - {4, 6, 1, 3072, 256, 2, 12}, - {4, 7, 1, 3072, 256, 2, 18}, - {4, 8, 1, 3072, 256, 2, 12}, - {4, 1, 1, 3072, 512, 1, 24}, - {4, 2, 1, 3072, 512, 2, 24}, - {4, 3, 1, 3072, 512, 2, 24}, - {4, 4, 1, 3072, 512, 2, 24}, - {4, 5, 1, 3072, 512, 2, 28}, - {4, 6, 1, 3072, 512, 2, 24}, - {4, 7, 1, 3072, 512, 2, 38}, - {4, 8, 1, 3072, 512, 2, 24}, - {4, 1, 1, 3072, 1024, 2, 68}, - {4, 2, 1, 3072, 1024, 1, 56}, - {4, 3, 1, 3072, 1024, 1, 56}, - {4, 4, 1, 3072, 1024, 2, 66}, - {4, 5, 1, 3072, 1024, 2, 48}, - {4, 6, 1, 3072, 1024, 2, 56}, - {4, 7, 1, 3072, 1024, 2, 64}, - {4, 8, 1, 3072, 1024, 2, 56}, - {4, 1, 1, 3072, 2048, 2, 86}, - {4, 2, 1, 3072, 2048, 2, 96}, - {4, 3, 1, 3072, 2048, 2, 90}, - {4, 4, 1, 3072, 2048, 2, 128}, - {4, 5, 1, 3072, 2048, 2, 124}, - {4, 6, 1, 3072, 2048, 2, 98}, - {4, 7, 1, 3072, 2048, 2, 112}, - {4, 8, 1, 3072, 2048, 1, 126}, - {4, 1, 1, 3072, 3072, 1, 162}, - {4, 2, 1, 3072, 3072, 2, 96}, - {4, 3, 1, 3072, 3072, 2, 112}, - {4, 4, 1, 3072, 3072, 2, 136}, - {4, 5, 1, 3072, 3072, 1, 136}, - {4, 6, 1, 3072, 3072, 1, 156}, - {4, 7, 1, 3072, 3072, 1, 158}, - {4, 8, 1, 3072, 3072, 1, 156}, - {4, 1, 1, 3072, 4096, 2, 136}, - {4, 2, 1, 3072, 4096, 2, 160}, - {4, 3, 1, 3072, 4096, 2, 160}, - {4, 4, 1, 3072, 4096, 2, 152}, - {4, 5, 1, 3072, 4096, 2, 160}, - {4, 6, 1, 3072, 4096, 2, 160}, - {4, 7, 1, 3072, 4096, 2, 160}, - {4, 8, 1, 3072, 4096, 1, 160}, - {4, 1, 1, 3072, 5120, 2, 160}, - {4, 2, 1, 3072, 5120, 2, 152}, - {4, 3, 1, 3072, 5120, 2, 152}, - {4, 4, 1, 3072, 5120, 2, 160}, - {4, 5, 1, 3072, 5120, 2, 160}, - {4, 6, 1, 3072, 5120, 2, 160}, - {4, 7, 1, 3072, 5120, 2, 162}, - {4, 8, 1, 3072, 5120, 1, 160}, - {4, 1, 1, 3072, 8192, 2, 164}, - {4, 2, 1, 3072, 8192, 2, 158}, - {4, 3, 1, 3072, 8192, 2, 164}, - {4, 4, 1, 3072, 8192, 2, 164}, - {4, 5, 1, 3072, 8192, 2, 170}, - {4, 6, 1, 3072, 8192, 2, 160}, - {4, 7, 1, 3072, 8192, 2, 166}, - {4, 8, 1, 3072, 8192, 1, 160}, - {4, 1, 1, 3072, 12288, 2, 170}, - {4, 2, 1, 3072, 12288, 2, 168}, - {4, 3, 1, 3072, 12288, 2, 168}, - {4, 4, 1, 3072, 12288, 2, 168}, - {4, 5, 1, 3072, 12288, 2, 168}, - {4, 6, 1, 3072, 12288, 2, 160}, - {4, 7, 1, 3072, 12288, 2, 170}, - {4, 8, 1, 3072, 12288, 1, 168}, - {4, 1, 1, 3072, 14336, 2, 170}, - {4, 2, 1, 3072, 14336, 2, 170}, - {4, 3, 1, 3072, 14336, 2, 170}, - {4, 4, 1, 3072, 14336, 2, 168}, - {4, 5, 1, 3072, 14336, 2, 170}, - {4, 6, 1, 3072, 14336, 2, 168}, - {4, 7, 1, 3072, 14336, 2, 168}, - {4, 8, 1, 3072, 14336, 1, 168}, - {4, 1, 1, 3072, 16384, 2, 170}, - {4, 2, 1, 3072, 16384, 2, 164}, - {4, 3, 1, 3072, 16384, 2, 170}, - {4, 4, 1, 3072, 16384, 2, 170}, - {4, 5, 1, 3072, 16384, 2, 170}, - {4, 6, 1, 3072, 16384, 2, 170}, - {4, 7, 1, 3072, 16384, 2, 166}, - {4, 8, 1, 3072, 16384, 1, 164}, - {4, 1, 1, 3072, 24576, 2, 170}, - {4, 2, 1, 3072, 24576, 2, 168}, - {4, 3, 1, 3072, 24576, 2, 170}, - {4, 4, 1, 3072, 24576, 2, 168}, - {4, 5, 1, 3072, 24576, 2, 168}, - {4, 6, 1, 3072, 24576, 2, 170}, - {4, 7, 1, 3072, 24576, 2, 166}, - {4, 8, 1, 3072, 24576, 1, 168}, - {4, 1, 1, 3072, 51200, 2, 168}, - {4, 2, 1, 3072, 51200, 2, 170}, - {4, 3, 1, 3072, 51200, 2, 170}, - {4, 4, 1, 3072, 51200, 2, 170}, - {4, 5, 1, 3072, 51200, 2, 170}, - {4, 6, 1, 3072, 51200, 2, 160}, - {4, 7, 1, 3072, 51200, 2, 166}, - {4, 8, 1, 3072, 51200, 2, 168}, - {4, 1, 1, 3072, 128000, 2, 170}, - {4, 2, 1, 3072, 128000, 2, 170}, - {4, 3, 1, 3072, 128000, 2, 170}, - {4, 4, 1, 3072, 128000, 2, 170}, - {4, 5, 1, 3072, 128000, 2, 170}, - {4, 6, 1, 3072, 128000, 2, 166}, - {4, 7, 1, 3072, 128000, 2, 166}, - {4, 8, 1, 3072, 128000, 2, 170}, - {4, 1, 1, 4096, 128, 2, 8}, - {4, 2, 1, 4096, 128, 2, 8}, - {4, 3, 1, 4096, 128, 2, 8}, - {4, 4, 1, 4096, 128, 2, 6}, - {4, 5, 1, 4096, 128, 1, 8}, - {4, 6, 1, 4096, 128, 2, 12}, - {4, 7, 1, 4096, 128, 2, 10}, - {4, 8, 1, 4096, 128, 2, 8}, - {4, 1, 1, 4096, 256, 2, 16}, - {4, 2, 1, 4096, 256, 2, 14}, - {4, 3, 1, 4096, 256, 2, 14}, - {4, 4, 1, 4096, 256, 2, 16}, - {4, 5, 1, 4096, 256, 2, 18}, - {4, 6, 1, 4096, 256, 2, 24}, - {4, 7, 1, 4096, 256, 2, 16}, - {4, 8, 1, 4096, 256, 2, 16}, - {4, 1, 1, 4096, 512, 2, 32}, - {4, 2, 1, 4096, 512, 2, 32}, - {4, 3, 1, 4096, 512, 2, 32}, - {4, 4, 1, 4096, 512, 2, 32}, - {4, 5, 1, 4096, 512, 2, 26}, - {4, 6, 1, 4096, 512, 2, 38}, - {4, 7, 1, 4096, 512, 2, 32}, - {4, 8, 1, 4096, 512, 2, 32}, - {4, 1, 1, 4096, 1024, 2, 56}, - {4, 2, 1, 4096, 1024, 2, 64}, - {4, 3, 1, 4096, 1024, 2, 64}, - {4, 4, 1, 4096, 1024, 2, 64}, - {4, 5, 1, 4096, 1024, 2, 48}, - {4, 6, 1, 4096, 1024, 2, 64}, - {4, 7, 1, 4096, 1024, 2, 62}, - {4, 8, 1, 4096, 1024, 2, 48}, - {4, 1, 1, 4096, 2048, 2, 128}, - {4, 2, 1, 4096, 2048, 2, 108}, - {4, 3, 1, 4096, 2048, 2, 108}, - {4, 4, 1, 4096, 2048, 2, 120}, - {4, 5, 1, 4096, 2048, 2, 128}, - {4, 6, 1, 4096, 2048, 2, 108}, - {4, 7, 1, 4096, 2048, 2, 128}, - {4, 8, 1, 4096, 2048, 2, 104}, - {4, 1, 1, 4096, 3072, 2, 160}, - {4, 2, 1, 4096, 3072, 2, 140}, - {4, 3, 1, 4096, 3072, 2, 162}, - {4, 4, 1, 4096, 3072, 2, 136}, - {4, 5, 1, 4096, 3072, 2, 170}, - {4, 6, 1, 4096, 3072, 2, 156}, - {4, 7, 1, 4096, 3072, 2, 168}, - {4, 8, 1, 4096, 3072, 2, 120}, - {4, 1, 1, 4096, 4096, 2, 128}, - {4, 2, 1, 4096, 4096, 2, 152}, - {4, 3, 1, 4096, 4096, 2, 156}, - {4, 4, 1, 4096, 4096, 2, 160}, - {4, 5, 1, 4096, 4096, 2, 154}, - {4, 6, 1, 4096, 4096, 2, 160}, - {4, 7, 1, 4096, 4096, 2, 160}, - {4, 8, 1, 4096, 4096, 2, 126}, - {4, 1, 1, 4096, 5120, 2, 160}, - {4, 2, 1, 4096, 5120, 2, 160}, - {4, 3, 1, 4096, 5120, 2, 158}, - {4, 4, 1, 4096, 5120, 2, 162}, - {4, 5, 1, 4096, 5120, 2, 160}, - {4, 6, 1, 4096, 5120, 2, 158}, - {4, 7, 1, 4096, 5120, 2, 160}, - {4, 8, 1, 4096, 5120, 1, 160}, - {4, 1, 1, 4096, 8192, 2, 168}, - {4, 2, 1, 4096, 8192, 2, 170}, - {4, 3, 1, 4096, 8192, 2, 170}, - {4, 4, 1, 4096, 8192, 2, 164}, - {4, 5, 1, 4096, 8192, 2, 168}, - {4, 6, 1, 4096, 8192, 2, 170}, - {4, 7, 1, 4096, 8192, 2, 166}, - {4, 8, 1, 4096, 8192, 1, 160}, - {4, 1, 1, 4096, 12288, 2, 162}, - {4, 2, 1, 4096, 12288, 2, 170}, - {4, 3, 1, 4096, 12288, 2, 170}, - {4, 4, 1, 4096, 12288, 2, 168}, - {4, 5, 1, 4096, 12288, 2, 168}, - {4, 6, 1, 4096, 12288, 2, 160}, - {4, 7, 1, 4096, 12288, 2, 166}, - {4, 8, 1, 4096, 12288, 1, 162}, - {4, 1, 1, 4096, 14336, 2, 170}, - {4, 2, 1, 4096, 14336, 2, 170}, - {4, 3, 1, 4096, 14336, 2, 168}, - {4, 4, 1, 4096, 14336, 2, 168}, - {4, 5, 1, 4096, 14336, 2, 168}, - {4, 6, 1, 4096, 14336, 2, 168}, - {4, 7, 1, 4096, 14336, 2, 168}, - {4, 8, 1, 4096, 14336, 1, 168}, - {4, 1, 1, 4096, 16384, 2, 170}, - {4, 2, 1, 4096, 16384, 2, 166}, - {4, 3, 1, 4096, 16384, 2, 170}, - {4, 4, 1, 4096, 16384, 2, 170}, - {4, 5, 1, 4096, 16384, 2, 168}, - {4, 6, 1, 4096, 16384, 2, 170}, - {4, 7, 1, 4096, 16384, 2, 170}, - {4, 8, 1, 4096, 16384, 1, 168}, - {4, 1, 1, 4096, 24576, 2, 170}, - {4, 2, 1, 4096, 24576, 2, 170}, - {4, 3, 1, 4096, 24576, 2, 170}, - {4, 4, 1, 4096, 24576, 2, 168}, - {4, 5, 1, 4096, 24576, 2, 168}, - {4, 6, 1, 4096, 24576, 2, 168}, - {4, 7, 1, 4096, 24576, 2, 168}, - {4, 8, 1, 4096, 24576, 1, 168}, - {4, 1, 1, 4096, 51200, 2, 170}, - {4, 2, 1, 4096, 51200, 2, 170}, - {4, 3, 1, 4096, 51200, 2, 170}, - {4, 4, 1, 4096, 51200, 2, 170}, - {4, 5, 1, 4096, 51200, 2, 170}, - {4, 6, 1, 4096, 51200, 2, 160}, - {4, 7, 1, 4096, 51200, 2, 166}, - {4, 8, 1, 4096, 51200, 2, 164}, - {4, 1, 1, 4096, 128000, 2, 170}, - {4, 2, 1, 4096, 128000, 2, 170}, - {4, 3, 1, 4096, 128000, 2, 170}, - {4, 4, 1, 4096, 128000, 2, 170}, - {4, 5, 1, 4096, 128000, 2, 170}, - {4, 6, 1, 4096, 128000, 2, 170}, - {4, 7, 1, 4096, 128000, 2, 166}, - {4, 8, 1, 4096, 128000, 2, 166}, - {4, 1, 1, 5120, 128, 2, 6}, - {4, 2, 1, 5120, 128, 1, 8}, - {4, 3, 1, 5120, 128, 2, 6}, - {4, 4, 1, 5120, 128, 2, 8}, - {4, 5, 1, 5120, 128, 2, 10}, - {4, 6, 1, 5120, 128, 2, 8}, - {4, 7, 1, 5120, 128, 2, 10}, - {4, 8, 1, 5120, 128, 2, 8}, - {4, 1, 1, 5120, 256, 2, 16}, - {4, 2, 1, 5120, 256, 2, 16}, - {4, 3, 1, 5120, 256, 2, 22}, - {4, 4, 1, 5120, 256, 2, 18}, - {4, 5, 1, 5120, 256, 2, 16}, - {4, 6, 1, 5120, 256, 2, 16}, - {4, 7, 1, 5120, 256, 2, 20}, - {4, 8, 1, 5120, 256, 2, 16}, - {4, 1, 1, 5120, 512, 2, 30}, - {4, 2, 1, 5120, 512, 2, 34}, - {4, 3, 1, 5120, 512, 2, 40}, - {4, 4, 1, 5120, 512, 2, 34}, - {4, 5, 1, 5120, 512, 2, 32}, - {4, 6, 1, 5120, 512, 2, 32}, - {4, 7, 1, 5120, 512, 2, 40}, - {4, 8, 1, 5120, 512, 2, 36}, - {4, 1, 1, 5120, 1024, 2, 48}, - {4, 2, 1, 5120, 1024, 2, 88}, - {4, 3, 1, 5120, 1024, 2, 72}, - {4, 4, 1, 5120, 1024, 2, 72}, - {4, 5, 1, 5120, 1024, 2, 76}, - {4, 6, 1, 5120, 1024, 2, 56}, - {4, 7, 1, 5120, 1024, 2, 72}, - {4, 8, 1, 5120, 1024, 2, 56}, - {4, 1, 1, 5120, 2048, 2, 138}, - {4, 2, 1, 5120, 2048, 2, 112}, - {4, 3, 1, 5120, 2048, 2, 128}, - {4, 4, 1, 5120, 2048, 2, 104}, - {4, 5, 1, 5120, 2048, 2, 112}, - {4, 6, 1, 5120, 2048, 2, 120}, - {4, 7, 1, 5120, 2048, 2, 142}, - {4, 8, 1, 5120, 2048, 2, 112}, - {4, 1, 1, 5120, 3072, 2, 168}, - {4, 2, 1, 5120, 3072, 2, 168}, - {4, 3, 1, 5120, 3072, 2, 168}, - {4, 4, 1, 5120, 3072, 2, 168}, - {4, 5, 1, 5120, 3072, 2, 168}, - {4, 6, 1, 5120, 3072, 2, 168}, - {4, 7, 1, 5120, 3072, 2, 168}, - {4, 8, 1, 5120, 3072, 1, 168}, - {4, 1, 1, 5120, 4096, 2, 162}, - {4, 2, 1, 5120, 4096, 2, 160}, - {4, 3, 1, 5120, 4096, 2, 166}, - {4, 4, 1, 5120, 4096, 2, 168}, - {4, 5, 1, 5120, 4096, 2, 156}, - {4, 6, 1, 5120, 4096, 2, 160}, - {4, 7, 1, 5120, 4096, 2, 160}, - {4, 8, 1, 5120, 4096, 1, 160}, - {4, 1, 1, 5120, 5120, 2, 160}, - {4, 2, 1, 5120, 5120, 2, 160}, - {4, 3, 1, 5120, 5120, 2, 146}, - {4, 4, 1, 5120, 5120, 2, 152}, - {4, 5, 1, 5120, 5120, 2, 160}, - {4, 6, 1, 5120, 5120, 2, 160}, - {4, 7, 1, 5120, 5120, 2, 160}, - {4, 8, 1, 5120, 5120, 1, 160}, - {4, 1, 1, 5120, 8192, 2, 170}, - {4, 2, 1, 5120, 8192, 2, 168}, - {4, 3, 1, 5120, 8192, 2, 168}, - {4, 4, 1, 5120, 8192, 2, 164}, - {4, 5, 1, 5120, 8192, 2, 164}, - {4, 6, 1, 5120, 8192, 2, 160}, - {4, 7, 1, 5120, 8192, 2, 170}, - {4, 8, 1, 5120, 8192, 1, 160}, - {4, 1, 1, 5120, 12288, 2, 170}, - {4, 2, 1, 5120, 12288, 2, 170}, - {4, 3, 1, 5120, 12288, 2, 168}, - {4, 4, 1, 5120, 12288, 2, 168}, - {4, 5, 1, 5120, 12288, 2, 168}, - {4, 6, 1, 5120, 12288, 2, 160}, - {4, 7, 1, 5120, 12288, 2, 170}, - {4, 8, 1, 5120, 12288, 1, 168}, - {4, 1, 1, 5120, 14336, 2, 170}, - {4, 2, 1, 5120, 14336, 2, 168}, - {4, 3, 1, 5120, 14336, 2, 170}, - {4, 4, 1, 5120, 14336, 2, 168}, - {4, 5, 1, 5120, 14336, 2, 168}, - {4, 6, 1, 5120, 14336, 2, 168}, - {4, 7, 1, 5120, 14336, 2, 168}, - {4, 8, 1, 5120, 14336, 1, 168}, - {4, 1, 1, 5120, 16384, 2, 170}, - {4, 2, 1, 5120, 16384, 2, 170}, - {4, 3, 1, 5120, 16384, 2, 170}, - {4, 4, 1, 5120, 16384, 2, 170}, - {4, 5, 1, 5120, 16384, 2, 168}, - {4, 6, 1, 5120, 16384, 2, 170}, - {4, 7, 1, 5120, 16384, 2, 166}, - {4, 8, 1, 5120, 16384, 1, 168}, - {4, 1, 1, 5120, 24576, 2, 170}, - {4, 2, 1, 5120, 24576, 2, 170}, - {4, 3, 1, 5120, 24576, 2, 170}, - {4, 4, 1, 5120, 24576, 2, 168}, - {4, 5, 1, 5120, 24576, 2, 168}, - {4, 6, 1, 5120, 24576, 2, 168}, - {4, 7, 1, 5120, 24576, 2, 166}, - {4, 8, 1, 5120, 24576, 1, 168}, - {4, 1, 1, 5120, 51200, 2, 170}, - {4, 2, 1, 5120, 51200, 2, 170}, - {4, 3, 1, 5120, 51200, 2, 170}, - {4, 4, 1, 5120, 51200, 2, 168}, - {4, 5, 1, 5120, 51200, 2, 170}, - {4, 6, 1, 5120, 51200, 2, 160}, - {4, 7, 1, 5120, 51200, 2, 170}, - {4, 8, 1, 5120, 51200, 2, 164}, - {4, 1, 1, 5120, 128000, 2, 170}, - {4, 2, 1, 5120, 128000, 2, 170}, - {4, 3, 1, 5120, 128000, 2, 170}, - {4, 4, 1, 5120, 128000, 2, 170}, - {4, 5, 1, 5120, 128000, 2, 170}, - {4, 6, 1, 5120, 128000, 2, 170}, - {4, 7, 1, 5120, 128000, 2, 170}, - {4, 8, 1, 5120, 128000, 2, 166}, - {4, 1, 1, 8192, 128, 2, 10}, - {4, 2, 1, 8192, 128, 2, 10}, - {4, 3, 1, 8192, 128, 2, 10}, - {4, 4, 1, 8192, 128, 2, 10}, - {4, 5, 1, 8192, 128, 2, 8}, - {4, 6, 1, 8192, 128, 2, 8}, - {4, 7, 1, 8192, 128, 2, 16}, - {4, 8, 1, 8192, 128, 2, 10}, - {4, 1, 1, 8192, 256, 2, 22}, - {4, 2, 1, 8192, 256, 2, 22}, - {4, 3, 1, 8192, 256, 2, 20}, - {4, 4, 1, 8192, 256, 2, 16}, - {4, 5, 1, 8192, 256, 2, 24}, - {4, 6, 1, 8192, 256, 2, 22}, - {4, 7, 1, 8192, 256, 2, 20}, - {4, 8, 1, 8192, 256, 2, 20}, - {4, 1, 1, 8192, 512, 2, 32}, - {4, 2, 1, 8192, 512, 2, 36}, - {4, 3, 1, 8192, 512, 2, 40}, - {4, 4, 1, 8192, 512, 2, 38}, - {4, 5, 1, 8192, 512, 2, 40}, - {4, 6, 1, 8192, 512, 2, 44}, - {4, 7, 1, 8192, 512, 2, 48}, - {4, 8, 1, 8192, 512, 2, 32}, - {4, 1, 1, 8192, 1024, 2, 64}, - {4, 2, 1, 8192, 1024, 2, 72}, - {4, 3, 1, 8192, 1024, 2, 80}, - {4, 4, 1, 8192, 1024, 2, 64}, - {4, 5, 1, 8192, 1024, 2, 88}, - {4, 6, 1, 8192, 1024, 2, 72}, - {4, 7, 1, 8192, 1024, 2, 80}, - {4, 8, 1, 8192, 1024, 2, 80}, - {4, 1, 1, 8192, 2048, 2, 144}, - {4, 2, 1, 8192, 2048, 2, 152}, - {4, 3, 1, 8192, 2048, 2, 156}, - {4, 4, 1, 8192, 2048, 2, 112}, - {4, 5, 1, 8192, 2048, 2, 152}, - {4, 6, 1, 8192, 2048, 2, 160}, - {4, 7, 1, 8192, 2048, 2, 156}, - {4, 8, 1, 8192, 2048, 2, 128}, - {4, 1, 1, 8192, 3072, 2, 156}, - {4, 2, 1, 8192, 3072, 2, 168}, - {4, 3, 1, 8192, 3072, 2, 168}, - {4, 4, 1, 8192, 3072, 2, 168}, - {4, 5, 1, 8192, 3072, 2, 168}, - {4, 6, 1, 8192, 3072, 2, 168}, - {4, 7, 1, 8192, 3072, 2, 168}, - {4, 8, 1, 8192, 3072, 1, 164}, - {4, 1, 1, 8192, 4096, 2, 156}, - {4, 2, 1, 8192, 4096, 2, 170}, - {4, 3, 1, 8192, 4096, 2, 170}, - {4, 4, 1, 8192, 4096, 2, 160}, - {4, 5, 1, 8192, 4096, 2, 162}, - {4, 6, 1, 8192, 4096, 2, 160}, - {4, 7, 1, 8192, 4096, 2, 160}, - {4, 8, 1, 8192, 4096, 1, 160}, - {4, 1, 1, 8192, 5120, 2, 168}, - {4, 2, 1, 8192, 5120, 2, 166}, - {4, 3, 1, 8192, 5120, 2, 168}, - {4, 4, 1, 8192, 5120, 2, 160}, - {4, 5, 1, 8192, 5120, 2, 166}, - {4, 6, 1, 8192, 5120, 2, 160}, - {4, 7, 1, 8192, 5120, 2, 160}, - {4, 8, 1, 8192, 5120, 1, 160}, - {4, 1, 1, 8192, 8192, 2, 170}, - {4, 2, 1, 8192, 8192, 2, 170}, - {4, 3, 1, 8192, 8192, 2, 170}, - {4, 4, 1, 8192, 8192, 2, 170}, - {4, 5, 1, 8192, 8192, 2, 170}, - {4, 6, 1, 8192, 8192, 2, 170}, - {4, 7, 1, 8192, 8192, 2, 170}, - {4, 8, 1, 8192, 8192, 2, 128}, - {4, 1, 1, 8192, 12288, 2, 170}, - {4, 2, 1, 8192, 12288, 2, 170}, - {4, 3, 1, 8192, 12288, 2, 170}, - {4, 4, 1, 8192, 12288, 2, 168}, - {4, 5, 1, 8192, 12288, 2, 168}, - {4, 6, 1, 8192, 12288, 2, 160}, - {4, 7, 1, 8192, 12288, 2, 168}, - {4, 8, 1, 8192, 12288, 2, 144}, - {4, 1, 1, 8192, 14336, 2, 170}, - {4, 2, 1, 8192, 14336, 2, 170}, - {4, 3, 1, 8192, 14336, 2, 168}, - {4, 4, 1, 8192, 14336, 2, 168}, - {4, 5, 1, 8192, 14336, 2, 168}, - {4, 6, 1, 8192, 14336, 2, 168}, - {4, 7, 1, 8192, 14336, 2, 168}, - {4, 8, 1, 8192, 14336, 1, 168}, - {4, 1, 1, 8192, 16384, 2, 170}, - {4, 2, 1, 8192, 16384, 2, 170}, - {4, 3, 1, 8192, 16384, 2, 170}, - {4, 4, 1, 8192, 16384, 2, 170}, - {4, 5, 1, 8192, 16384, 2, 168}, - {4, 6, 1, 8192, 16384, 2, 170}, - {4, 7, 1, 8192, 16384, 2, 170}, - {4, 8, 1, 8192, 16384, 1, 168}, - {4, 1, 1, 8192, 24576, 2, 170}, - {4, 2, 1, 8192, 24576, 2, 170}, - {4, 3, 1, 8192, 24576, 2, 170}, - {4, 4, 1, 8192, 24576, 2, 168}, - {4, 5, 1, 8192, 24576, 2, 168}, - {4, 6, 1, 8192, 24576, 2, 168}, - {4, 7, 1, 8192, 24576, 2, 168}, - {4, 8, 1, 8192, 24576, 1, 168}, - {4, 1, 1, 8192, 51200, 2, 170}, - {4, 2, 1, 8192, 51200, 2, 170}, - {4, 3, 1, 8192, 51200, 2, 170}, - {4, 4, 1, 8192, 51200, 2, 170}, - {4, 5, 1, 8192, 51200, 2, 168}, - {4, 6, 1, 8192, 51200, 2, 160}, - {4, 7, 1, 8192, 51200, 2, 170}, - {4, 8, 1, 8192, 51200, 2, 160}, - {4, 1, 1, 8192, 128000, 2, 170}, - {4, 2, 1, 8192, 128000, 2, 170}, - {4, 3, 1, 8192, 128000, 2, 170}, - {4, 4, 1, 8192, 128000, 2, 170}, - {4, 5, 1, 8192, 128000, 2, 170}, - {4, 6, 1, 8192, 128000, 2, 170}, - {4, 7, 1, 8192, 128000, 2, 166}, - {4, 8, 1, 8192, 128000, 2, 166}, - {4, 1, 1, 12288, 128, 2, 12}, - {4, 2, 1, 12288, 128, 2, 12}, - {4, 3, 1, 12288, 128, 2, 12}, - {4, 4, 1, 12288, 128, 2, 12}, - {4, 5, 1, 12288, 128, 2, 12}, - {4, 6, 1, 12288, 128, 2, 12}, - {4, 7, 1, 12288, 128, 2, 16}, - {4, 8, 1, 12288, 128, 2, 12}, - {4, 1, 1, 12288, 256, 2, 24}, - {4, 2, 1, 12288, 256, 2, 24}, - {4, 3, 1, 12288, 256, 2, 24}, - {4, 4, 1, 12288, 256, 2, 24}, - {4, 5, 1, 12288, 256, 2, 26}, - {4, 6, 1, 12288, 256, 2, 24}, - {4, 7, 1, 12288, 256, 2, 26}, - {4, 8, 1, 12288, 256, 2, 24}, - {4, 1, 1, 12288, 512, 2, 48}, - {4, 2, 1, 12288, 512, 2, 48}, - {4, 3, 1, 12288, 512, 2, 44}, - {4, 4, 1, 12288, 512, 2, 48}, - {4, 5, 1, 12288, 512, 2, 42}, - {4, 6, 1, 12288, 512, 2, 48}, - {4, 7, 1, 12288, 512, 2, 56}, - {4, 8, 1, 12288, 512, 2, 48}, - {4, 1, 1, 12288, 1024, 2, 88}, - {4, 2, 1, 12288, 1024, 2, 94}, - {4, 3, 1, 12288, 1024, 2, 88}, - {4, 4, 1, 12288, 1024, 2, 100}, - {4, 5, 1, 12288, 1024, 2, 112}, - {4, 6, 1, 12288, 1024, 2, 110}, - {4, 7, 1, 12288, 1024, 2, 120}, - {4, 8, 1, 12288, 1024, 2, 98}, - {4, 1, 1, 12288, 2048, 2, 156}, - {4, 2, 1, 12288, 2048, 2, 152}, - {4, 3, 1, 12288, 2048, 2, 162}, - {4, 4, 1, 12288, 2048, 2, 160}, - {4, 5, 1, 12288, 2048, 2, 160}, - {4, 6, 1, 12288, 2048, 2, 168}, - {4, 7, 1, 12288, 2048, 2, 160}, - {4, 8, 1, 12288, 2048, 2, 128}, - {4, 1, 1, 12288, 3072, 2, 168}, - {4, 2, 1, 12288, 3072, 2, 168}, - {4, 3, 1, 12288, 3072, 2, 168}, - {4, 4, 1, 12288, 3072, 2, 168}, - {4, 5, 1, 12288, 3072, 2, 168}, - {4, 6, 1, 12288, 3072, 2, 168}, - {4, 7, 1, 12288, 3072, 2, 168}, - {4, 8, 1, 12288, 3072, 1, 168}, - {4, 1, 1, 12288, 4096, 2, 170}, - {4, 2, 1, 12288, 4096, 2, 168}, - {4, 3, 1, 12288, 4096, 2, 170}, - {4, 4, 1, 12288, 4096, 2, 160}, - {4, 5, 1, 12288, 4096, 2, 168}, - {4, 6, 1, 12288, 4096, 2, 160}, - {4, 7, 1, 12288, 4096, 2, 166}, - {4, 8, 1, 12288, 4096, 1, 160}, - {4, 1, 1, 12288, 5120, 2, 164}, - {4, 2, 1, 12288, 5120, 2, 164}, - {4, 3, 1, 12288, 5120, 2, 170}, - {4, 4, 1, 12288, 5120, 2, 160}, - {4, 5, 1, 12288, 5120, 2, 168}, - {4, 6, 1, 12288, 5120, 2, 160}, - {4, 7, 1, 12288, 5120, 2, 160}, - {4, 8, 1, 12288, 5120, 1, 160}, - {4, 1, 1, 12288, 8192, 2, 170}, - {4, 2, 1, 12288, 8192, 2, 170}, - {4, 3, 1, 12288, 8192, 2, 170}, - {4, 4, 1, 12288, 8192, 2, 170}, - {4, 5, 1, 12288, 8192, 2, 170}, - {4, 6, 1, 12288, 8192, 2, 160}, - {4, 7, 1, 12288, 8192, 2, 168}, - {4, 8, 1, 12288, 8192, 1, 160}, - {4, 1, 1, 12288, 12288, 2, 170}, - {4, 2, 1, 12288, 12288, 2, 170}, - {4, 3, 1, 12288, 12288, 2, 170}, - {4, 4, 1, 12288, 12288, 2, 168}, - {4, 5, 1, 12288, 12288, 2, 168}, - {4, 6, 1, 12288, 12288, 2, 168}, - {4, 7, 1, 12288, 12288, 2, 168}, - {4, 8, 1, 12288, 12288, 1, 162}, - {4, 1, 1, 12288, 14336, 2, 170}, - {4, 2, 1, 12288, 14336, 2, 170}, - {4, 3, 1, 12288, 14336, 2, 168}, - {4, 4, 1, 12288, 14336, 2, 168}, - {4, 5, 1, 12288, 14336, 2, 168}, - {4, 6, 1, 12288, 14336, 2, 168}, - {4, 7, 1, 12288, 14336, 2, 168}, - {4, 8, 1, 12288, 14336, 1, 168}, - {4, 1, 1, 12288, 16384, 2, 170}, - {4, 2, 1, 12288, 16384, 2, 170}, - {4, 3, 1, 12288, 16384, 2, 170}, - {4, 4, 1, 12288, 16384, 2, 168}, - {4, 5, 1, 12288, 16384, 2, 168}, - {4, 6, 1, 12288, 16384, 2, 168}, - {4, 7, 1, 12288, 16384, 2, 166}, - {4, 8, 1, 12288, 16384, 1, 168}, - {4, 1, 1, 12288, 24576, 2, 170}, - {4, 2, 1, 12288, 24576, 2, 170}, - {4, 3, 1, 12288, 24576, 2, 170}, - {4, 4, 1, 12288, 24576, 2, 168}, - {4, 5, 1, 12288, 24576, 2, 170}, - {4, 6, 1, 12288, 24576, 2, 160}, - {4, 7, 1, 12288, 24576, 2, 168}, - {4, 8, 1, 12288, 24576, 1, 168}, - {4, 1, 1, 12288, 51200, 2, 170}, - {4, 2, 1, 12288, 51200, 2, 170}, - {4, 3, 1, 12288, 51200, 2, 170}, - {4, 4, 1, 12288, 51200, 2, 170}, - {4, 5, 1, 12288, 51200, 2, 170}, - {4, 6, 1, 12288, 51200, 2, 160}, - {4, 7, 1, 12288, 51200, 2, 170}, - {4, 8, 1, 12288, 51200, 2, 166}, - {4, 1, 1, 12288, 128000, 2, 170}, - {4, 2, 1, 12288, 128000, 2, 170}, - {4, 3, 1, 12288, 128000, 2, 170}, - {4, 4, 1, 12288, 128000, 2, 170}, - {4, 5, 1, 12288, 128000, 2, 170}, - {4, 6, 1, 12288, 128000, 2, 170}, - {4, 7, 1, 12288, 128000, 2, 170}, - {4, 8, 1, 12288, 128000, 2, 164}, - {4, 1, 1, 14336, 128, 2, 16}, - {4, 2, 1, 14336, 128, 2, 16}, - {4, 3, 1, 14336, 128, 2, 14}, - {4, 4, 1, 14336, 128, 2, 14}, - {4, 5, 1, 14336, 128, 2, 14}, - {4, 6, 1, 14336, 128, 2, 12}, - {4, 7, 1, 14336, 128, 2, 16}, - {4, 8, 1, 14336, 128, 2, 16}, - {4, 1, 1, 14336, 256, 2, 32}, - {4, 2, 1, 14336, 256, 2, 28}, - {4, 3, 1, 14336, 256, 2, 26}, - {4, 4, 1, 14336, 256, 2, 28}, - {4, 5, 1, 14336, 256, 2, 26}, - {4, 6, 1, 14336, 256, 2, 30}, - {4, 7, 1, 14336, 256, 2, 32}, - {4, 8, 1, 14336, 256, 2, 26}, - {4, 1, 1, 14336, 512, 2, 48}, - {4, 2, 1, 14336, 512, 2, 56}, - {4, 3, 1, 14336, 512, 2, 48}, - {4, 4, 1, 14336, 512, 2, 48}, - {4, 5, 1, 14336, 512, 2, 56}, - {4, 6, 1, 14336, 512, 2, 56}, - {4, 7, 1, 14336, 512, 2, 64}, - {4, 8, 1, 14336, 512, 2, 56}, - {4, 1, 1, 14336, 1024, 2, 104}, - {4, 2, 1, 14336, 1024, 2, 104}, - {4, 3, 1, 14336, 1024, 2, 96}, - {4, 4, 1, 14336, 1024, 2, 104}, - {4, 5, 1, 14336, 1024, 2, 112}, - {4, 6, 1, 14336, 1024, 2, 106}, - {4, 7, 1, 14336, 1024, 2, 152}, - {4, 8, 1, 14336, 1024, 2, 112}, - {4, 1, 1, 14336, 2048, 2, 162}, - {4, 2, 1, 14336, 2048, 2, 164}, - {4, 3, 1, 14336, 2048, 2, 170}, - {4, 4, 1, 14336, 2048, 2, 160}, - {4, 5, 1, 14336, 2048, 2, 168}, - {4, 6, 1, 14336, 2048, 2, 160}, - {4, 7, 1, 14336, 2048, 2, 160}, - {4, 8, 1, 14336, 2048, 2, 128}, - {4, 1, 1, 14336, 3072, 2, 168}, - {4, 2, 1, 14336, 3072, 2, 168}, - {4, 3, 1, 14336, 3072, 2, 168}, - {4, 4, 1, 14336, 3072, 2, 168}, - {4, 5, 1, 14336, 3072, 2, 168}, - {4, 6, 1, 14336, 3072, 2, 168}, - {4, 7, 1, 14336, 3072, 2, 168}, - {4, 8, 1, 14336, 3072, 1, 168}, - {4, 1, 1, 14336, 4096, 2, 170}, - {4, 2, 1, 14336, 4096, 2, 170}, - {4, 3, 1, 14336, 4096, 2, 170}, - {4, 4, 1, 14336, 4096, 2, 168}, - {4, 5, 1, 14336, 4096, 2, 168}, - {4, 6, 1, 14336, 4096, 2, 160}, - {4, 7, 1, 14336, 4096, 2, 160}, - {4, 8, 1, 14336, 4096, 1, 160}, - {4, 1, 1, 14336, 5120, 2, 170}, - {4, 2, 1, 14336, 5120, 2, 170}, - {4, 3, 1, 14336, 5120, 2, 170}, - {4, 4, 1, 14336, 5120, 2, 160}, - {4, 5, 1, 14336, 5120, 2, 170}, - {4, 6, 1, 14336, 5120, 2, 160}, - {4, 7, 1, 14336, 5120, 2, 160}, - {4, 8, 1, 14336, 5120, 1, 160}, - {4, 1, 1, 14336, 8192, 2, 170}, - {4, 2, 1, 14336, 8192, 2, 170}, - {4, 3, 1, 14336, 8192, 2, 170}, - {4, 4, 1, 14336, 8192, 2, 168}, - {4, 5, 1, 14336, 8192, 2, 168}, - {4, 6, 1, 14336, 8192, 2, 168}, - {4, 7, 1, 14336, 8192, 2, 168}, - {4, 8, 1, 14336, 8192, 1, 160}, - {4, 1, 1, 14336, 12288, 2, 170}, - {4, 2, 1, 14336, 12288, 2, 170}, - {4, 3, 1, 14336, 12288, 2, 170}, - {4, 4, 1, 14336, 12288, 2, 168}, - {4, 5, 1, 14336, 12288, 2, 170}, - {4, 6, 1, 14336, 12288, 2, 168}, - {4, 7, 1, 14336, 12288, 2, 168}, - {4, 8, 1, 14336, 12288, 2, 144}, - {4, 1, 1, 14336, 14336, 2, 170}, - {4, 2, 1, 14336, 14336, 2, 170}, - {4, 3, 1, 14336, 14336, 2, 170}, - {4, 4, 1, 14336, 14336, 2, 168}, - {4, 5, 1, 14336, 14336, 2, 168}, - {4, 6, 1, 14336, 14336, 2, 168}, - {4, 7, 1, 14336, 14336, 2, 168}, - {4, 8, 1, 14336, 14336, 1, 168}, - {4, 1, 1, 14336, 16384, 2, 170}, - {4, 2, 1, 14336, 16384, 2, 170}, - {4, 3, 1, 14336, 16384, 2, 170}, - {4, 4, 1, 14336, 16384, 2, 168}, - {4, 5, 1, 14336, 16384, 2, 168}, - {4, 6, 1, 14336, 16384, 2, 170}, - {4, 7, 1, 14336, 16384, 2, 166}, - {4, 8, 1, 14336, 16384, 1, 168}, - {4, 1, 1, 14336, 24576, 2, 170}, - {4, 2, 1, 14336, 24576, 2, 170}, - {4, 3, 1, 14336, 24576, 2, 170}, - {4, 4, 1, 14336, 24576, 2, 168}, - {4, 5, 1, 14336, 24576, 2, 168}, - {4, 6, 1, 14336, 24576, 2, 160}, - {4, 7, 1, 14336, 24576, 2, 168}, - {4, 8, 1, 14336, 24576, 1, 168}, - {4, 1, 1, 14336, 51200, 2, 170}, - {4, 2, 1, 14336, 51200, 2, 170}, - {4, 3, 1, 14336, 51200, 2, 170}, - {4, 4, 1, 14336, 51200, 2, 170}, - {4, 5, 1, 14336, 51200, 2, 170}, - {4, 6, 1, 14336, 51200, 2, 160}, - {4, 7, 1, 14336, 51200, 2, 170}, - {4, 8, 1, 14336, 51200, 2, 170}, - {4, 1, 1, 14336, 128000, 2, 170}, - {4, 2, 1, 14336, 128000, 2, 170}, - {4, 3, 1, 14336, 128000, 2, 170}, - {4, 4, 1, 14336, 128000, 2, 170}, - {4, 5, 1, 14336, 128000, 2, 170}, - {4, 6, 1, 14336, 128000, 2, 170}, - {4, 7, 1, 14336, 128000, 2, 170}, - {4, 8, 1, 14336, 128000, 2, 170}, - {4, 1, 1, 16384, 128, 2, 14}, - {4, 2, 1, 16384, 128, 2, 14}, - {4, 3, 1, 16384, 128, 2, 14}, - {4, 4, 1, 16384, 128, 2, 12}, - {4, 5, 1, 16384, 128, 2, 16}, - {4, 6, 1, 16384, 128, 2, 16}, - {4, 7, 1, 16384, 128, 2, 18}, - {4, 8, 1, 16384, 128, 2, 16}, - {4, 1, 1, 16384, 256, 2, 26}, - {4, 2, 1, 16384, 256, 2, 28}, - {4, 3, 1, 16384, 256, 2, 28}, - {4, 4, 1, 16384, 256, 2, 26}, - {4, 5, 1, 16384, 256, 2, 24}, - {4, 6, 1, 16384, 256, 2, 30}, - {4, 7, 1, 16384, 256, 2, 32}, - {4, 8, 1, 16384, 256, 2, 30}, - {4, 1, 1, 16384, 512, 2, 56}, - {4, 2, 1, 16384, 512, 2, 56}, - {4, 3, 1, 16384, 512, 2, 48}, - {4, 4, 1, 16384, 512, 2, 52}, - {4, 5, 1, 16384, 512, 2, 62}, - {4, 6, 1, 16384, 512, 2, 56}, - {4, 7, 1, 16384, 512, 2, 64}, - {4, 8, 1, 16384, 512, 2, 72}, - {4, 1, 1, 16384, 1024, 2, 108}, - {4, 2, 1, 16384, 1024, 2, 104}, - {4, 3, 1, 16384, 1024, 2, 104}, - {4, 4, 1, 16384, 1024, 2, 100}, - {4, 5, 1, 16384, 1024, 2, 128}, - {4, 6, 1, 16384, 1024, 2, 128}, - {4, 7, 1, 16384, 1024, 2, 128}, - {4, 8, 1, 16384, 1024, 2, 100}, - {4, 1, 1, 16384, 2048, 2, 158}, - {4, 2, 1, 16384, 2048, 2, 164}, - {4, 3, 1, 16384, 2048, 2, 168}, - {4, 4, 1, 16384, 2048, 2, 144}, - {4, 5, 1, 16384, 2048, 2, 168}, - {4, 6, 1, 16384, 2048, 2, 152}, - {4, 7, 1, 16384, 2048, 2, 168}, - {4, 8, 1, 16384, 2048, 1, 160}, - {4, 1, 1, 16384, 3072, 2, 170}, - {4, 2, 1, 16384, 3072, 2, 170}, - {4, 3, 1, 16384, 3072, 2, 168}, - {4, 4, 1, 16384, 3072, 2, 170}, - {4, 5, 1, 16384, 3072, 2, 168}, - {4, 6, 1, 16384, 3072, 2, 168}, - {4, 7, 1, 16384, 3072, 2, 168}, - {4, 8, 1, 16384, 3072, 1, 168}, - {4, 1, 1, 16384, 4096, 2, 170}, - {4, 2, 1, 16384, 4096, 2, 168}, - {4, 3, 1, 16384, 4096, 2, 170}, - {4, 4, 1, 16384, 4096, 2, 170}, - {4, 5, 1, 16384, 4096, 2, 170}, - {4, 6, 1, 16384, 4096, 2, 160}, - {4, 7, 1, 16384, 4096, 2, 170}, - {4, 8, 1, 16384, 4096, 1, 160}, - {4, 1, 1, 16384, 5120, 2, 170}, - {4, 2, 1, 16384, 5120, 2, 170}, - {4, 3, 1, 16384, 5120, 2, 170}, - {4, 4, 1, 16384, 5120, 2, 170}, - {4, 5, 1, 16384, 5120, 2, 170}, - {4, 6, 1, 16384, 5120, 2, 160}, - {4, 7, 1, 16384, 5120, 2, 168}, - {4, 8, 1, 16384, 5120, 1, 160}, - {4, 1, 1, 16384, 8192, 2, 170}, - {4, 2, 1, 16384, 8192, 2, 170}, - {4, 3, 1, 16384, 8192, 2, 170}, - {4, 4, 1, 16384, 8192, 2, 170}, - {4, 5, 1, 16384, 8192, 2, 168}, - {4, 6, 1, 16384, 8192, 2, 168}, - {4, 7, 1, 16384, 8192, 2, 168}, - {4, 8, 1, 16384, 8192, 1, 160}, - {4, 1, 1, 16384, 12288, 2, 170}, - {4, 2, 1, 16384, 12288, 2, 170}, - {4, 3, 1, 16384, 12288, 2, 170}, - {4, 4, 1, 16384, 12288, 2, 168}, - {4, 5, 1, 16384, 12288, 2, 168}, - {4, 6, 1, 16384, 12288, 2, 160}, - {4, 7, 1, 16384, 12288, 2, 168}, - {4, 8, 1, 16384, 12288, 2, 150}, - {4, 1, 1, 16384, 14336, 2, 170}, - {4, 2, 1, 16384, 14336, 2, 170}, - {4, 3, 1, 16384, 14336, 2, 170}, - {4, 4, 1, 16384, 14336, 2, 168}, - {4, 5, 1, 16384, 14336, 2, 168}, - {4, 6, 1, 16384, 14336, 2, 168}, - {4, 7, 1, 16384, 14336, 2, 168}, - {4, 8, 1, 16384, 14336, 1, 168}, - {4, 1, 1, 16384, 16384, 2, 170}, - {4, 2, 1, 16384, 16384, 2, 170}, - {4, 3, 1, 16384, 16384, 2, 170}, - {4, 4, 1, 16384, 16384, 2, 168}, - {4, 5, 1, 16384, 16384, 2, 168}, - {4, 6, 1, 16384, 16384, 2, 170}, - {4, 7, 1, 16384, 16384, 2, 170}, - {4, 8, 1, 16384, 16384, 1, 168}, - {4, 1, 1, 16384, 24576, 2, 170}, - {4, 2, 1, 16384, 24576, 2, 170}, - {4, 3, 1, 16384, 24576, 2, 170}, - {4, 4, 1, 16384, 24576, 2, 168}, - {4, 5, 1, 16384, 24576, 2, 168}, - {4, 6, 1, 16384, 24576, 2, 160}, - {4, 7, 1, 16384, 24576, 2, 168}, - {4, 8, 1, 16384, 24576, 1, 168}, - {4, 1, 1, 16384, 51200, 2, 170}, - {4, 2, 1, 16384, 51200, 2, 170}, - {4, 3, 1, 16384, 51200, 2, 170}, - {4, 4, 1, 16384, 51200, 2, 170}, - {4, 5, 1, 16384, 51200, 2, 170}, - {4, 6, 1, 16384, 51200, 2, 160}, - {4, 7, 1, 16384, 51200, 2, 168}, - {4, 8, 1, 16384, 51200, 2, 156}, - {4, 1, 1, 16384, 128000, 2, 170}, - {4, 2, 1, 16384, 128000, 2, 170}, - {4, 3, 1, 16384, 128000, 2, 170}, - {4, 4, 1, 16384, 128000, 2, 170}, - {4, 5, 1, 16384, 128000, 2, 170}, - {4, 6, 1, 16384, 128000, 2, 170}, - {4, 7, 1, 16384, 128000, 2, 170}, - {4, 8, 1, 16384, 128000, 2, 170}, - {4, 1, 1, 24576, 128, 2, 18}, - {4, 2, 1, 24576, 128, 2, 16}, - {4, 3, 1, 24576, 128, 2, 16}, - {4, 4, 1, 24576, 128, 2, 16}, - {4, 5, 1, 24576, 128, 2, 18}, - {4, 6, 1, 24576, 128, 2, 18}, - {4, 7, 1, 24576, 128, 2, 24}, - {4, 8, 1, 24576, 128, 2, 18}, - {4, 1, 1, 24576, 256, 2, 32}, - {4, 2, 1, 24576, 256, 2, 32}, - {4, 3, 1, 24576, 256, 2, 32}, - {4, 4, 1, 24576, 256, 2, 24}, - {4, 5, 1, 24576, 256, 2, 34}, - {4, 6, 1, 24576, 256, 2, 44}, - {4, 7, 1, 24576, 256, 2, 44}, - {4, 8, 1, 24576, 256, 2, 36}, - {4, 1, 1, 24576, 512, 2, 64}, - {4, 2, 1, 24576, 512, 2, 70}, - {4, 3, 1, 24576, 512, 2, 70}, - {4, 4, 1, 24576, 512, 2, 56}, - {4, 5, 1, 24576, 512, 2, 74}, - {4, 6, 1, 24576, 512, 2, 72}, - {4, 7, 1, 24576, 512, 2, 88}, - {4, 8, 1, 24576, 512, 2, 72}, - {4, 1, 1, 24576, 1024, 2, 132}, - {4, 2, 1, 24576, 1024, 2, 144}, - {4, 3, 1, 24576, 1024, 2, 144}, - {4, 4, 1, 24576, 1024, 2, 120}, - {4, 5, 1, 24576, 1024, 2, 140}, - {4, 6, 1, 24576, 1024, 2, 144}, - {4, 7, 1, 24576, 1024, 2, 144}, - {4, 8, 1, 24576, 1024, 2, 120}, - {4, 1, 1, 24576, 2048, 2, 170}, - {4, 2, 1, 24576, 2048, 2, 170}, - {4, 3, 1, 24576, 2048, 2, 158}, - {4, 4, 1, 24576, 2048, 2, 162}, - {4, 5, 1, 24576, 2048, 2, 168}, - {4, 6, 1, 24576, 2048, 2, 160}, - {4, 7, 1, 24576, 2048, 2, 160}, - {4, 8, 1, 24576, 2048, 1, 160}, - {4, 1, 1, 24576, 3072, 2, 170}, - {4, 2, 1, 24576, 3072, 2, 170}, - {4, 3, 1, 24576, 3072, 2, 168}, - {4, 4, 1, 24576, 3072, 2, 168}, - {4, 5, 1, 24576, 3072, 2, 168}, - {4, 6, 1, 24576, 3072, 2, 168}, - {4, 7, 1, 24576, 3072, 2, 168}, - {4, 8, 1, 24576, 3072, 1, 168}, - {4, 1, 1, 24576, 4096, 2, 170}, - {4, 2, 1, 24576, 4096, 2, 170}, - {4, 3, 1, 24576, 4096, 2, 170}, - {4, 4, 1, 24576, 4096, 2, 170}, - {4, 5, 1, 24576, 4096, 2, 170}, - {4, 6, 1, 24576, 4096, 2, 160}, - {4, 7, 1, 24576, 4096, 2, 168}, - {4, 8, 1, 24576, 4096, 1, 160}, - {4, 1, 1, 24576, 5120, 2, 170}, - {4, 2, 1, 24576, 5120, 2, 170}, - {4, 3, 1, 24576, 5120, 2, 170}, - {4, 4, 1, 24576, 5120, 2, 160}, - {4, 5, 1, 24576, 5120, 2, 170}, - {4, 6, 1, 24576, 5120, 2, 160}, - {4, 7, 1, 24576, 5120, 2, 168}, - {4, 8, 1, 24576, 5120, 1, 160}, - {4, 1, 1, 24576, 8192, 2, 170}, - {4, 2, 1, 24576, 8192, 2, 170}, - {4, 3, 1, 24576, 8192, 2, 170}, - {4, 4, 1, 24576, 8192, 2, 168}, - {4, 5, 1, 24576, 8192, 2, 170}, - {4, 6, 1, 24576, 8192, 2, 160}, - {4, 7, 1, 24576, 8192, 2, 168}, - {4, 8, 1, 24576, 8192, 1, 160}, - {4, 1, 1, 24576, 12288, 2, 170}, - {4, 2, 1, 24576, 12288, 2, 170}, - {4, 3, 1, 24576, 12288, 2, 170}, - {4, 4, 1, 24576, 12288, 2, 168}, - {4, 5, 1, 24576, 12288, 2, 170}, - {4, 6, 1, 24576, 12288, 2, 160}, - {4, 7, 1, 24576, 12288, 2, 168}, - {4, 8, 1, 24576, 12288, 2, 156}, - {4, 1, 1, 24576, 14336, 2, 170}, - {4, 2, 1, 24576, 14336, 2, 170}, - {4, 3, 1, 24576, 14336, 2, 170}, - {4, 4, 1, 24576, 14336, 2, 168}, - {4, 5, 1, 24576, 14336, 2, 168}, - {4, 6, 1, 24576, 14336, 2, 168}, - {4, 7, 1, 24576, 14336, 2, 168}, - {4, 8, 1, 24576, 14336, 1, 168}, - {4, 1, 1, 24576, 16384, 2, 170}, - {4, 2, 1, 24576, 16384, 2, 170}, - {4, 3, 1, 24576, 16384, 2, 170}, - {4, 4, 1, 24576, 16384, 2, 170}, - {4, 5, 1, 24576, 16384, 2, 168}, - {4, 6, 1, 24576, 16384, 2, 170}, - {4, 7, 1, 24576, 16384, 2, 170}, - {4, 8, 1, 24576, 16384, 1, 168}, - {4, 1, 1, 24576, 24576, 2, 170}, - {4, 2, 1, 24576, 24576, 2, 170}, - {4, 3, 1, 24576, 24576, 2, 170}, - {4, 4, 1, 24576, 24576, 2, 168}, - {4, 5, 1, 24576, 24576, 2, 170}, - {4, 6, 1, 24576, 24576, 2, 170}, - {4, 7, 1, 24576, 24576, 2, 168}, - {4, 8, 1, 24576, 24576, 2, 168}, - {4, 1, 1, 24576, 51200, 2, 170}, - {4, 2, 1, 24576, 51200, 2, 170}, - {4, 3, 1, 24576, 51200, 2, 170}, - {4, 4, 1, 24576, 51200, 2, 170}, - {4, 5, 1, 24576, 51200, 2, 170}, - {4, 6, 1, 24576, 51200, 2, 160}, - {4, 7, 1, 24576, 51200, 2, 170}, - {4, 8, 1, 24576, 51200, 2, 166}, - {4, 1, 1, 24576, 128000, 2, 170}, - {4, 2, 1, 24576, 128000, 2, 170}, - {4, 3, 1, 24576, 128000, 2, 170}, - {4, 4, 1, 24576, 128000, 2, 170}, - {4, 5, 1, 24576, 128000, 2, 170}, - {4, 6, 1, 24576, 128000, 2, 170}, - {4, 7, 1, 24576, 128000, 2, 170}, - {4, 8, 1, 24576, 128000, 2, 170}, - {3, 1, 1, 128, 128, 1, 2}, - {3, 2, 1, 128, 128, 1, 2}, - {3, 3, 1, 128, 128, 2, 2}, - {3, 4, 1, 128, 128, 1, 2}, - {3, 5, 1, 128, 128, 1, 2}, - {3, 6, 1, 128, 128, 1, 2}, - {3, 7, 1, 128, 128, 1, 2}, - {3, 8, 1, 128, 128, 1, 2}, - {3, 1, 1, 128, 256, 1, 4}, - {3, 2, 1, 128, 256, 1, 4}, - {3, 3, 1, 128, 256, 1, 4}, - {3, 4, 1, 128, 256, 1, 4}, - {3, 5, 1, 128, 256, 1, 4}, - {3, 6, 1, 128, 256, 1, 4}, - {3, 7, 1, 128, 256, 1, 4}, - {3, 8, 1, 128, 256, 1, 4}, - {3, 1, 1, 128, 512, 1, 8}, - {3, 2, 1, 128, 512, 2, 4}, - {3, 3, 1, 128, 512, 1, 8}, - {3, 4, 1, 128, 512, 1, 8}, - {3, 5, 1, 128, 512, 1, 8}, - {3, 6, 1, 128, 512, 1, 8}, - {3, 7, 1, 128, 512, 1, 8}, - {3, 8, 1, 128, 512, 2, 8}, - {3, 1, 1, 128, 1024, 1, 16}, - {3, 2, 1, 128, 1024, 1, 16}, - {3, 3, 1, 128, 1024, 1, 16}, - {3, 4, 1, 128, 1024, 1, 16}, - {3, 5, 1, 128, 1024, 1, 16}, - {3, 6, 1, 128, 1024, 1, 16}, - {3, 7, 1, 128, 1024, 1, 16}, - {3, 8, 1, 128, 1024, 1, 16}, - {3, 1, 1, 128, 2048, 1, 32}, - {3, 2, 1, 128, 2048, 1, 32}, - {3, 3, 1, 128, 2048, 1, 32}, - {3, 4, 1, 128, 2048, 1, 32}, - {3, 5, 1, 128, 2048, 1, 32}, - {3, 6, 1, 128, 2048, 1, 32}, - {3, 7, 1, 128, 2048, 1, 32}, - {3, 8, 1, 128, 2048, 1, 32}, - {3, 1, 1, 128, 3072, 1, 48}, - {3, 2, 1, 128, 3072, 1, 48}, - {3, 3, 1, 128, 3072, 1, 48}, - {3, 4, 1, 128, 3072, 1, 48}, - {3, 5, 1, 128, 3072, 1, 48}, - {3, 6, 1, 128, 3072, 1, 48}, - {3, 7, 1, 128, 3072, 1, 48}, - {3, 8, 1, 128, 3072, 1, 48}, - {3, 1, 1, 128, 4096, 1, 64}, - {3, 2, 1, 128, 4096, 1, 64}, - {3, 3, 1, 128, 4096, 1, 64}, - {3, 4, 1, 128, 4096, 1, 64}, - {3, 5, 1, 128, 4096, 1, 64}, - {3, 6, 1, 128, 4096, 1, 64}, - {3, 7, 1, 128, 4096, 1, 64}, - {3, 8, 1, 128, 4096, 1, 64}, - {3, 1, 1, 128, 5120, 1, 40}, - {3, 2, 1, 128, 5120, 1, 80}, - {3, 3, 1, 128, 5120, 1, 80}, - {3, 4, 1, 128, 5120, 1, 80}, - {3, 5, 1, 128, 5120, 1, 80}, - {3, 6, 1, 128, 5120, 1, 80}, - {3, 7, 1, 128, 5120, 1, 80}, - {3, 8, 1, 128, 5120, 1, 80}, - {3, 1, 1, 128, 8192, 1, 128}, - {3, 2, 1, 128, 8192, 1, 128}, - {3, 3, 1, 128, 8192, 1, 128}, - {3, 4, 1, 128, 8192, 1, 128}, - {3, 5, 1, 128, 8192, 1, 128}, - {3, 6, 1, 128, 8192, 1, 128}, - {3, 7, 1, 128, 8192, 1, 128}, - {3, 8, 1, 128, 8192, 1, 128}, - {3, 1, 1, 128, 12288, 1, 96}, - {3, 2, 1, 128, 12288, 1, 96}, - {3, 3, 1, 128, 12288, 1, 96}, - {3, 4, 1, 128, 12288, 1, 96}, - {3, 5, 1, 128, 12288, 1, 96}, - {3, 6, 1, 128, 12288, 1, 96}, - {3, 7, 1, 128, 12288, 1, 96}, - {3, 8, 1, 128, 12288, 1, 96}, - {3, 1, 1, 128, 14336, 1, 112}, - {3, 2, 1, 128, 14336, 1, 112}, - {3, 3, 1, 128, 14336, 1, 112}, - {3, 4, 1, 128, 14336, 1, 112}, - {3, 5, 1, 128, 14336, 1, 112}, - {3, 6, 1, 128, 14336, 1, 112}, - {3, 7, 1, 128, 14336, 1, 112}, - {3, 8, 1, 128, 14336, 1, 112}, - {3, 1, 1, 128, 16384, 1, 128}, - {3, 2, 1, 128, 16384, 1, 128}, - {3, 3, 1, 128, 16384, 1, 128}, - {3, 4, 1, 128, 16384, 1, 128}, - {3, 5, 1, 128, 16384, 1, 128}, - {3, 6, 1, 128, 16384, 1, 128}, - {3, 7, 1, 128, 16384, 1, 128}, - {3, 8, 1, 128, 16384, 1, 128}, - {3, 1, 1, 128, 24576, 2, 128}, - {3, 2, 1, 128, 24576, 2, 128}, - {3, 3, 1, 128, 24576, 1, 128}, - {3, 4, 1, 128, 24576, 2, 128}, - {3, 5, 1, 128, 24576, 1, 128}, - {3, 6, 1, 128, 24576, 1, 128}, - {3, 7, 1, 128, 24576, 1, 128}, - {3, 8, 1, 128, 24576, 1, 116}, - {3, 1, 1, 128, 51200, 2, 128}, - {3, 2, 1, 128, 51200, 2, 128}, - {3, 3, 1, 128, 51200, 1, 128}, - {3, 4, 1, 128, 51200, 2, 128}, - {3, 5, 1, 128, 51200, 2, 126}, - {3, 6, 1, 128, 51200, 2, 126}, - {3, 7, 1, 128, 51200, 2, 124}, - {3, 8, 1, 128, 51200, 1, 128}, - {3, 1, 1, 128, 128000, 2, 128}, - {3, 2, 1, 128, 128000, 2, 128}, - {3, 3, 1, 128, 128000, 2, 128}, - {3, 4, 1, 128, 128000, 2, 128}, - {3, 5, 1, 128, 128000, 2, 126}, - {3, 6, 1, 128, 128000, 2, 126}, - {3, 7, 1, 128, 128000, 2, 122}, - {3, 8, 1, 128, 128000, 1, 128}, - {3, 1, 1, 256, 128, 2, 2}, - {3, 2, 1, 256, 128, 2, 2}, - {3, 3, 1, 256, 128, 2, 2}, - {3, 4, 1, 256, 128, 2, 2}, - {3, 5, 1, 256, 128, 2, 2}, - {3, 6, 1, 256, 128, 2, 2}, - {3, 7, 1, 256, 128, 2, 2}, - {3, 8, 1, 256, 128, 2, 2}, - {3, 1, 1, 256, 256, 2, 4}, - {3, 2, 1, 256, 256, 2, 4}, - {3, 3, 1, 256, 256, 2, 4}, - {3, 4, 1, 256, 256, 2, 4}, - {3, 5, 1, 256, 256, 2, 4}, - {3, 6, 1, 256, 256, 2, 4}, - {3, 7, 1, 256, 256, 2, 4}, - {3, 8, 1, 256, 256, 2, 4}, - {3, 1, 1, 256, 512, 2, 8}, - {3, 2, 1, 256, 512, 2, 8}, - {3, 3, 1, 256, 512, 2, 8}, - {3, 4, 1, 256, 512, 2, 8}, - {3, 5, 1, 256, 512, 2, 8}, - {3, 6, 1, 256, 512, 2, 8}, - {3, 7, 1, 256, 512, 2, 8}, - {3, 8, 1, 256, 512, 2, 8}, - {3, 1, 1, 256, 1024, 2, 16}, - {3, 2, 1, 256, 1024, 2, 16}, - {3, 3, 1, 256, 1024, 2, 16}, - {3, 4, 1, 256, 1024, 2, 16}, - {3, 5, 1, 256, 1024, 2, 16}, - {3, 6, 1, 256, 1024, 2, 16}, - {3, 7, 1, 256, 1024, 2, 16}, - {3, 8, 1, 256, 1024, 2, 16}, - {3, 1, 1, 256, 2048, 2, 32}, - {3, 2, 1, 256, 2048, 2, 32}, - {3, 3, 1, 256, 2048, 1, 32}, - {3, 4, 1, 256, 2048, 2, 32}, - {3, 5, 1, 256, 2048, 1, 32}, - {3, 6, 1, 256, 2048, 1, 32}, - {3, 7, 1, 256, 2048, 2, 32}, - {3, 8, 1, 256, 2048, 1, 32}, - {3, 1, 1, 256, 3072, 2, 48}, - {3, 2, 1, 256, 3072, 2, 48}, - {3, 3, 1, 256, 3072, 2, 48}, - {3, 4, 1, 256, 3072, 2, 48}, - {3, 5, 1, 256, 3072, 1, 48}, - {3, 6, 1, 256, 3072, 1, 48}, - {3, 7, 1, 256, 3072, 1, 48}, - {3, 8, 1, 256, 3072, 1, 48}, - {3, 1, 1, 256, 4096, 2, 64}, - {3, 2, 1, 256, 4096, 1, 64}, - {3, 3, 1, 256, 4096, 1, 64}, - {3, 4, 1, 256, 4096, 2, 64}, - {3, 5, 1, 256, 4096, 1, 64}, - {3, 6, 1, 256, 4096, 1, 64}, - {3, 7, 1, 256, 4096, 1, 64}, - {3, 8, 1, 256, 4096, 1, 64}, - {3, 1, 1, 256, 5120, 2, 80}, - {3, 2, 1, 256, 5120, 1, 80}, - {3, 3, 1, 256, 5120, 1, 80}, - {3, 4, 1, 256, 5120, 2, 80}, - {3, 5, 1, 256, 5120, 1, 80}, - {3, 6, 1, 256, 5120, 1, 80}, - {3, 7, 1, 256, 5120, 1, 80}, - {3, 8, 1, 256, 5120, 1, 80}, - {3, 1, 1, 256, 8192, 2, 128}, - {3, 2, 1, 256, 8192, 2, 128}, - {3, 3, 1, 256, 8192, 1, 128}, - {3, 4, 1, 256, 8192, 1, 128}, - {3, 5, 1, 256, 8192, 1, 128}, - {3, 6, 1, 256, 8192, 1, 128}, - {3, 7, 1, 256, 8192, 1, 128}, - {3, 8, 1, 256, 8192, 1, 128}, - {3, 1, 1, 256, 12288, 2, 96}, - {3, 2, 1, 256, 12288, 2, 128}, - {3, 3, 1, 256, 12288, 1, 128}, - {3, 4, 1, 256, 12288, 2, 96}, - {3, 5, 1, 256, 12288, 1, 128}, - {3, 6, 1, 256, 12288, 2, 116}, - {3, 7, 1, 256, 12288, 2, 116}, - {3, 8, 1, 256, 12288, 1, 116}, - {3, 1, 1, 256, 14336, 2, 112}, - {3, 2, 1, 256, 14336, 2, 112}, - {3, 3, 1, 256, 14336, 2, 112}, - {3, 4, 1, 256, 14336, 2, 112}, - {3, 5, 1, 256, 14336, 1, 112}, - {3, 6, 1, 256, 14336, 1, 112}, - {3, 7, 1, 256, 14336, 1, 112}, - {3, 8, 1, 256, 14336, 1, 112}, - {3, 1, 1, 256, 16384, 2, 128}, - {3, 2, 1, 256, 16384, 2, 128}, - {3, 3, 1, 256, 16384, 2, 128}, - {3, 4, 1, 256, 16384, 1, 128}, - {3, 5, 1, 256, 16384, 1, 128}, - {3, 6, 1, 256, 16384, 1, 128}, - {3, 7, 1, 256, 16384, 1, 128}, - {3, 8, 1, 256, 16384, 2, 116}, - {3, 1, 1, 256, 24576, 2, 128}, - {3, 2, 1, 256, 24576, 2, 128}, - {3, 3, 1, 256, 24576, 1, 128}, - {3, 4, 1, 256, 24576, 2, 128}, - {3, 5, 1, 256, 24576, 1, 128}, - {3, 6, 1, 256, 24576, 1, 128}, - {3, 7, 1, 256, 24576, 1, 128}, - {3, 8, 1, 256, 24576, 1, 128}, - {3, 1, 1, 256, 51200, 2, 128}, - {3, 2, 1, 256, 51200, 2, 128}, - {3, 3, 1, 256, 51200, 2, 128}, - {3, 4, 1, 256, 51200, 2, 128}, - {3, 5, 1, 256, 51200, 2, 128}, - {3, 6, 1, 256, 51200, 2, 128}, - {3, 7, 1, 256, 51200, 2, 120}, - {3, 8, 1, 256, 51200, 1, 120}, - {3, 1, 1, 256, 128000, 2, 128}, - {3, 2, 1, 256, 128000, 2, 128}, - {3, 3, 1, 256, 128000, 2, 128}, - {3, 4, 1, 256, 128000, 2, 128}, - {3, 5, 1, 256, 128000, 2, 128}, - {3, 6, 1, 256, 128000, 2, 120}, - {3, 7, 1, 256, 128000, 2, 122}, - {3, 8, 1, 256, 128000, 1, 126}, - {3, 1, 1, 512, 128, 2, 2}, - {3, 2, 1, 512, 128, 2, 2}, - {3, 3, 1, 512, 128, 2, 4}, - {3, 4, 1, 512, 128, 2, 2}, - {3, 5, 1, 512, 128, 2, 4}, - {3, 6, 1, 512, 128, 2, 4}, - {3, 7, 1, 512, 128, 2, 4}, - {3, 8, 1, 512, 128, 2, 4}, - {3, 1, 1, 512, 256, 2, 4}, - {3, 2, 1, 512, 256, 2, 4}, - {3, 3, 1, 512, 256, 2, 8}, - {3, 4, 1, 512, 256, 2, 4}, - {3, 5, 1, 512, 256, 2, 8}, - {3, 6, 1, 512, 256, 2, 8}, - {3, 7, 1, 512, 256, 2, 8}, - {3, 8, 1, 512, 256, 2, 8}, - {3, 1, 1, 512, 512, 2, 8}, - {3, 2, 1, 512, 512, 2, 8}, - {3, 3, 1, 512, 512, 2, 16}, - {3, 4, 1, 512, 512, 2, 8}, - {3, 5, 1, 512, 512, 2, 16}, - {3, 6, 1, 512, 512, 2, 16}, - {3, 7, 1, 512, 512, 2, 16}, - {3, 8, 1, 512, 512, 2, 16}, - {3, 1, 1, 512, 1024, 2, 16}, - {3, 2, 1, 512, 1024, 2, 16}, - {3, 3, 1, 512, 1024, 2, 32}, - {3, 4, 1, 512, 1024, 2, 16}, - {3, 5, 1, 512, 1024, 2, 32}, - {3, 6, 1, 512, 1024, 2, 32}, - {3, 7, 1, 512, 1024, 2, 32}, - {3, 8, 1, 512, 1024, 2, 32}, - {3, 1, 1, 512, 2048, 2, 32}, - {3, 2, 1, 512, 2048, 2, 32}, - {3, 3, 1, 512, 2048, 1, 64}, - {3, 4, 1, 512, 2048, 2, 32}, - {3, 5, 1, 512, 2048, 1, 64}, - {3, 6, 1, 512, 2048, 1, 64}, - {3, 7, 1, 512, 2048, 1, 64}, - {3, 8, 1, 512, 2048, 1, 64}, - {3, 1, 1, 512, 3072, 2, 48}, - {3, 2, 1, 512, 3072, 2, 48}, - {3, 3, 1, 512, 3072, 1, 72}, - {3, 4, 1, 512, 3072, 2, 48}, - {3, 5, 1, 512, 3072, 1, 96}, - {3, 6, 1, 512, 3072, 1, 72}, - {3, 7, 1, 512, 3072, 1, 96}, - {3, 8, 1, 512, 3072, 1, 96}, - {3, 1, 1, 512, 4096, 2, 64}, - {3, 2, 1, 512, 4096, 2, 64}, - {3, 3, 1, 512, 4096, 1, 96}, - {3, 4, 1, 512, 4096, 2, 64}, - {3, 5, 1, 512, 4096, 1, 128}, - {3, 6, 1, 512, 4096, 1, 128}, - {3, 7, 1, 512, 4096, 1, 128}, - {3, 8, 1, 512, 4096, 1, 94}, - {3, 1, 1, 512, 5120, 2, 80}, - {3, 2, 1, 512, 5120, 2, 80}, - {3, 3, 1, 512, 5120, 1, 120}, - {3, 4, 1, 512, 5120, 2, 80}, - {3, 5, 1, 512, 5120, 1, 120}, - {3, 6, 1, 512, 5120, 1, 120}, - {3, 7, 1, 512, 5120, 1, 120}, - {3, 8, 1, 512, 5120, 2, 112}, - {3, 1, 1, 512, 8192, 2, 128}, - {3, 2, 1, 512, 8192, 2, 128}, - {3, 3, 1, 512, 8192, 2, 128}, - {3, 4, 1, 512, 8192, 2, 116}, - {3, 5, 1, 512, 8192, 2, 116}, - {3, 6, 1, 512, 8192, 1, 128}, - {3, 7, 1, 512, 8192, 2, 116}, - {3, 8, 1, 512, 8192, 1, 116}, - {3, 1, 1, 512, 12288, 2, 128}, - {3, 2, 1, 512, 12288, 2, 128}, - {3, 3, 1, 512, 12288, 1, 128}, - {3, 4, 1, 512, 12288, 2, 116}, - {3, 5, 1, 512, 12288, 2, 116}, - {3, 6, 1, 512, 12288, 1, 128}, - {3, 7, 1, 512, 12288, 2, 96}, - {3, 8, 1, 512, 12288, 1, 96}, - {3, 1, 1, 512, 14336, 2, 112}, - {3, 2, 1, 512, 14336, 2, 112}, - {3, 3, 1, 512, 14336, 2, 112}, - {3, 4, 1, 512, 14336, 2, 112}, - {3, 5, 1, 512, 14336, 2, 112}, - {3, 6, 1, 512, 14336, 1, 112}, - {3, 7, 1, 512, 14336, 1, 112}, - {3, 8, 1, 512, 14336, 1, 112}, - {3, 1, 1, 512, 16384, 2, 128}, - {3, 2, 1, 512, 16384, 2, 128}, - {3, 3, 1, 512, 16384, 2, 128}, - {3, 4, 1, 512, 16384, 2, 128}, - {3, 5, 1, 512, 16384, 1, 128}, - {3, 6, 1, 512, 16384, 1, 128}, - {3, 7, 1, 512, 16384, 1, 128}, - {3, 8, 1, 512, 16384, 1, 128}, - {3, 1, 1, 512, 24576, 2, 128}, - {3, 2, 1, 512, 24576, 2, 128}, - {3, 3, 1, 512, 24576, 2, 128}, - {3, 4, 1, 512, 24576, 2, 128}, - {3, 5, 1, 512, 24576, 2, 128}, - {3, 6, 1, 512, 24576, 1, 128}, - {3, 7, 1, 512, 24576, 1, 128}, - {3, 8, 1, 512, 24576, 1, 128}, - {3, 1, 1, 512, 51200, 2, 128}, - {3, 2, 1, 512, 51200, 2, 128}, - {3, 3, 1, 512, 51200, 2, 128}, - {3, 4, 1, 512, 51200, 2, 128}, - {3, 5, 1, 512, 51200, 2, 128}, - {3, 6, 1, 512, 51200, 1, 128}, - {3, 7, 1, 512, 51200, 2, 120}, - {3, 8, 1, 512, 51200, 1, 120}, - {3, 1, 1, 512, 128000, 2, 128}, - {3, 2, 1, 512, 128000, 2, 128}, - {3, 3, 1, 512, 128000, 2, 128}, - {3, 4, 1, 512, 128000, 2, 128}, - {3, 5, 1, 512, 128000, 2, 124}, - {3, 6, 1, 512, 128000, 2, 116}, - {3, 7, 1, 512, 128000, 2, 122}, - {3, 8, 1, 512, 128000, 1, 126}, - {3, 1, 1, 1024, 128, 2, 4}, - {3, 2, 1, 1024, 128, 2, 4}, - {3, 3, 1, 1024, 128, 2, 4}, - {3, 4, 1, 1024, 128, 2, 4}, - {3, 5, 1, 1024, 128, 2, 4}, - {3, 6, 1, 1024, 128, 2, 4}, - {3, 7, 1, 1024, 128, 2, 4}, - {3, 8, 1, 1024, 128, 2, 4}, - {3, 1, 1, 1024, 256, 2, 8}, - {3, 2, 1, 1024, 256, 2, 8}, - {3, 3, 1, 1024, 256, 2, 8}, - {3, 4, 1, 1024, 256, 2, 8}, - {3, 5, 1, 1024, 256, 2, 8}, - {3, 6, 1, 1024, 256, 2, 8}, - {3, 7, 1, 1024, 256, 2, 8}, - {3, 8, 1, 1024, 256, 2, 8}, - {3, 1, 1, 1024, 512, 2, 16}, - {3, 2, 1, 1024, 512, 2, 16}, - {3, 3, 1, 1024, 512, 2, 16}, - {3, 4, 1, 1024, 512, 2, 16}, - {3, 5, 1, 1024, 512, 2, 16}, - {3, 6, 1, 1024, 512, 2, 16}, - {3, 7, 1, 1024, 512, 2, 16}, - {3, 8, 1, 1024, 512, 2, 16}, - {3, 1, 1, 1024, 1024, 2, 32}, - {3, 2, 1, 1024, 1024, 2, 32}, - {3, 3, 1, 1024, 1024, 2, 32}, - {3, 4, 1, 1024, 1024, 2, 32}, - {3, 5, 1, 1024, 1024, 2, 32}, - {3, 6, 1, 1024, 1024, 2, 32}, - {3, 7, 1, 1024, 1024, 2, 32}, - {3, 8, 1, 1024, 1024, 2, 32}, - {3, 1, 1, 1024, 2048, 2, 64}, - {3, 2, 1, 1024, 2048, 2, 64}, - {3, 3, 1, 1024, 2048, 2, 64}, - {3, 4, 1, 1024, 2048, 2, 64}, - {3, 5, 1, 1024, 2048, 2, 64}, - {3, 6, 1, 1024, 2048, 2, 64}, - {3, 7, 1, 1024, 2048, 2, 64}, - {3, 8, 1, 1024, 2048, 1, 78}, - {3, 1, 1, 1024, 3072, 2, 96}, - {3, 2, 1, 1024, 3072, 2, 96}, - {3, 3, 1, 1024, 3072, 2, 96}, - {3, 4, 1, 1024, 3072, 2, 96}, - {3, 5, 1, 1024, 3072, 2, 88}, - {3, 6, 1, 1024, 3072, 2, 88}, - {3, 7, 1, 1024, 3072, 2, 88}, - {3, 8, 1, 1024, 3072, 2, 88}, - {3, 1, 1, 1024, 4096, 2, 128}, - {3, 2, 1, 1024, 4096, 2, 128}, - {3, 3, 1, 1024, 4096, 2, 128}, - {3, 4, 1, 1024, 4096, 2, 120}, - {3, 5, 1, 1024, 4096, 2, 116}, - {3, 6, 1, 1024, 4096, 1, 124}, - {3, 7, 1, 1024, 4096, 2, 116}, - {3, 8, 1, 1024, 4096, 1, 116}, - {3, 1, 1, 1024, 5120, 2, 120}, - {3, 2, 1, 1024, 5120, 2, 120}, - {3, 3, 1, 1024, 5120, 2, 112}, - {3, 4, 1, 1024, 5120, 2, 112}, - {3, 5, 1, 1024, 5120, 2, 112}, - {3, 6, 1, 1024, 5120, 2, 112}, - {3, 7, 1, 1024, 5120, 2, 112}, - {3, 8, 1, 1024, 5120, 1, 104}, - {3, 1, 1, 1024, 8192, 2, 128}, - {3, 2, 1, 1024, 8192, 2, 128}, - {3, 3, 1, 1024, 8192, 2, 128}, - {3, 4, 1, 1024, 8192, 2, 116}, - {3, 5, 1, 1024, 8192, 2, 124}, - {3, 6, 1, 1024, 8192, 1, 128}, - {3, 7, 1, 1024, 8192, 1, 128}, - {3, 8, 1, 1024, 8192, 1, 124}, - {3, 1, 1, 1024, 12288, 2, 128}, - {3, 2, 1, 1024, 12288, 2, 128}, - {3, 3, 1, 1024, 12288, 2, 128}, - {3, 4, 1, 1024, 12288, 2, 128}, - {3, 5, 1, 1024, 12288, 2, 128}, - {3, 6, 1, 1024, 12288, 1, 128}, - {3, 7, 1, 1024, 12288, 2, 96}, - {3, 8, 1, 1024, 12288, 1, 96}, - {3, 1, 1, 1024, 14336, 2, 128}, - {3, 2, 1, 1024, 14336, 2, 128}, - {3, 3, 1, 1024, 14336, 2, 128}, - {3, 4, 1, 1024, 14336, 2, 128}, - {3, 5, 1, 1024, 14336, 2, 112}, - {3, 6, 1, 1024, 14336, 1, 128}, - {3, 7, 1, 1024, 14336, 1, 128}, - {3, 8, 1, 1024, 14336, 1, 110}, - {3, 1, 1, 1024, 16384, 2, 128}, - {3, 2, 1, 1024, 16384, 2, 128}, - {3, 3, 1, 1024, 16384, 2, 128}, - {3, 4, 1, 1024, 16384, 2, 128}, - {3, 5, 1, 1024, 16384, 2, 128}, - {3, 6, 1, 1024, 16384, 1, 128}, - {3, 7, 1, 1024, 16384, 1, 128}, - {3, 8, 1, 1024, 16384, 1, 126}, - {3, 1, 1, 1024, 24576, 2, 128}, - {3, 2, 1, 1024, 24576, 2, 128}, - {3, 3, 1, 1024, 24576, 2, 128}, - {3, 4, 1, 1024, 24576, 2, 128}, - {3, 5, 1, 1024, 24576, 2, 124}, - {3, 6, 1, 1024, 24576, 1, 128}, - {3, 7, 1, 1024, 24576, 1, 128}, - {3, 8, 1, 1024, 24576, 1, 128}, - {3, 1, 1, 1024, 51200, 2, 128}, - {3, 2, 1, 1024, 51200, 2, 128}, - {3, 3, 1, 1024, 51200, 2, 128}, - {3, 4, 1, 1024, 51200, 2, 120}, - {3, 5, 1, 1024, 51200, 2, 128}, - {3, 6, 1, 1024, 51200, 1, 128}, - {3, 7, 1, 1024, 51200, 2, 110}, - {3, 8, 1, 1024, 51200, 1, 120}, - {3, 1, 1, 1024, 128000, 2, 128}, - {3, 2, 1, 1024, 128000, 2, 128}, - {3, 3, 1, 1024, 128000, 2, 128}, - {3, 4, 1, 1024, 128000, 2, 128}, - {3, 5, 1, 1024, 128000, 2, 128}, - {3, 6, 1, 1024, 128000, 2, 116}, - {3, 7, 1, 1024, 128000, 2, 104}, - {3, 8, 1, 1024, 128000, 1, 126}, - {3, 1, 1, 2048, 128, 2, 6}, - {3, 2, 1, 2048, 128, 2, 6}, - {3, 3, 1, 2048, 128, 2, 6}, - {3, 4, 1, 2048, 128, 2, 6}, - {3, 5, 1, 2048, 128, 2, 6}, - {3, 6, 1, 2048, 128, 2, 6}, - {3, 7, 1, 2048, 128, 2, 6}, - {3, 8, 1, 2048, 128, 2, 6}, - {3, 1, 1, 2048, 256, 2, 10}, - {3, 2, 1, 2048, 256, 2, 10}, - {3, 3, 1, 2048, 256, 2, 12}, - {3, 4, 1, 2048, 256, 2, 10}, - {3, 5, 1, 2048, 256, 2, 12}, - {3, 6, 1, 2048, 256, 2, 12}, - {3, 7, 1, 2048, 256, 2, 12}, - {3, 8, 1, 2048, 256, 2, 12}, - {3, 1, 1, 2048, 512, 2, 20}, - {3, 2, 1, 2048, 512, 2, 20}, - {3, 3, 1, 2048, 512, 2, 24}, - {3, 4, 1, 2048, 512, 2, 20}, - {3, 5, 1, 2048, 512, 2, 24}, - {3, 6, 1, 2048, 512, 2, 24}, - {3, 7, 1, 2048, 512, 2, 24}, - {3, 8, 1, 2048, 512, 2, 24}, - {3, 1, 1, 2048, 1024, 2, 40}, - {3, 2, 1, 2048, 1024, 2, 40}, - {3, 3, 1, 2048, 1024, 2, 48}, - {3, 4, 1, 2048, 1024, 2, 40}, - {3, 5, 1, 2048, 1024, 2, 48}, - {3, 6, 1, 2048, 1024, 2, 40}, - {3, 7, 1, 2048, 1024, 2, 48}, - {3, 8, 1, 2048, 1024, 2, 40}, - {3, 1, 1, 2048, 2048, 2, 80}, - {3, 2, 1, 2048, 2048, 2, 80}, - {3, 3, 1, 2048, 2048, 2, 96}, - {3, 4, 1, 2048, 2048, 2, 80}, - {3, 5, 1, 2048, 2048, 2, 80}, - {3, 6, 1, 2048, 2048, 2, 88}, - {3, 7, 1, 2048, 2048, 2, 88}, - {3, 8, 1, 2048, 2048, 2, 88}, - {3, 1, 1, 2048, 3072, 2, 120}, - {3, 2, 1, 2048, 3072, 2, 120}, - {3, 3, 1, 2048, 3072, 2, 112}, - {3, 4, 1, 2048, 3072, 2, 112}, - {3, 5, 1, 2048, 3072, 2, 112}, - {3, 6, 1, 2048, 3072, 1, 112}, - {3, 7, 1, 2048, 3072, 2, 96}, - {3, 8, 1, 2048, 3072, 1, 94}, - {3, 1, 1, 2048, 4096, 2, 128}, - {3, 2, 1, 2048, 4096, 2, 128}, - {3, 3, 1, 2048, 4096, 2, 128}, - {3, 4, 1, 2048, 4096, 2, 116}, - {3, 5, 1, 2048, 4096, 2, 124}, - {3, 6, 1, 2048, 4096, 1, 126}, - {3, 7, 1, 2048, 4096, 1, 126}, - {3, 8, 1, 2048, 4096, 1, 98}, - {3, 1, 1, 2048, 5120, 2, 120}, - {3, 2, 1, 2048, 5120, 2, 128}, - {3, 3, 1, 2048, 5120, 2, 128}, - {3, 4, 1, 2048, 5120, 2, 116}, - {3, 5, 1, 2048, 5120, 2, 118}, - {3, 6, 1, 2048, 5120, 1, 126}, - {3, 7, 1, 2048, 5120, 1, 126}, - {3, 8, 1, 2048, 5120, 1, 112}, - {3, 1, 1, 2048, 8192, 2, 128}, - {3, 2, 1, 2048, 8192, 2, 128}, - {3, 3, 1, 2048, 8192, 2, 128}, - {3, 4, 1, 2048, 8192, 2, 126}, - {3, 5, 1, 2048, 8192, 2, 124}, - {3, 6, 1, 2048, 8192, 1, 126}, - {3, 7, 1, 2048, 8192, 1, 128}, - {3, 8, 1, 2048, 8192, 1, 116}, - {3, 1, 1, 2048, 12288, 2, 128}, - {3, 2, 1, 2048, 12288, 2, 128}, - {3, 3, 1, 2048, 12288, 2, 128}, - {3, 4, 1, 2048, 12288, 2, 124}, - {3, 5, 1, 2048, 12288, 2, 122}, - {3, 6, 1, 2048, 12288, 1, 128}, - {3, 7, 1, 2048, 12288, 1, 126}, - {3, 8, 1, 2048, 12288, 1, 96}, - {3, 1, 1, 2048, 14336, 2, 128}, - {3, 2, 1, 2048, 14336, 2, 128}, - {3, 3, 1, 2048, 14336, 2, 128}, - {3, 4, 1, 2048, 14336, 2, 112}, - {3, 5, 1, 2048, 14336, 2, 112}, - {3, 6, 1, 2048, 14336, 1, 126}, - {3, 7, 1, 2048, 14336, 1, 128}, - {3, 8, 1, 2048, 14336, 1, 110}, - {3, 1, 1, 2048, 16384, 2, 128}, - {3, 2, 1, 2048, 16384, 2, 128}, - {3, 3, 1, 2048, 16384, 2, 128}, - {3, 4, 1, 2048, 16384, 2, 126}, - {3, 5, 1, 2048, 16384, 2, 128}, - {3, 6, 1, 2048, 16384, 1, 128}, - {3, 7, 1, 2048, 16384, 1, 128}, - {3, 8, 1, 2048, 16384, 1, 124}, - {3, 1, 1, 2048, 24576, 2, 128}, - {3, 2, 1, 2048, 24576, 2, 128}, - {3, 3, 1, 2048, 24576, 2, 128}, - {3, 4, 1, 2048, 24576, 2, 128}, - {3, 5, 1, 2048, 24576, 2, 120}, - {3, 6, 1, 2048, 24576, 1, 128}, - {3, 7, 1, 2048, 24576, 1, 126}, - {3, 8, 1, 2048, 24576, 1, 96}, - {3, 1, 1, 2048, 51200, 2, 128}, - {3, 2, 1, 2048, 51200, 2, 128}, - {3, 3, 1, 2048, 51200, 2, 128}, - {3, 4, 1, 2048, 51200, 2, 120}, - {3, 5, 1, 2048, 51200, 2, 128}, - {3, 6, 1, 2048, 51200, 1, 128}, - {3, 7, 1, 2048, 51200, 2, 110}, - {3, 8, 1, 2048, 51200, 1, 124}, - {3, 1, 1, 2048, 128000, 2, 128}, - {3, 2, 1, 2048, 128000, 2, 128}, - {3, 3, 1, 2048, 128000, 2, 128}, - {3, 4, 1, 2048, 128000, 2, 128}, - {3, 5, 1, 2048, 128000, 2, 128}, - {3, 6, 1, 2048, 128000, 2, 116}, - {3, 7, 1, 2048, 128000, 1, 128}, - {3, 8, 1, 2048, 128000, 2, 118}, - {3, 1, 1, 3072, 128, 2, 6}, - {3, 2, 1, 3072, 128, 2, 6}, - {3, 3, 1, 3072, 128, 2, 8}, - {3, 4, 1, 3072, 128, 2, 6}, - {3, 5, 1, 3072, 128, 2, 8}, - {3, 6, 1, 3072, 128, 2, 8}, - {3, 7, 1, 3072, 128, 2, 8}, - {3, 8, 1, 3072, 128, 2, 8}, - {3, 1, 1, 3072, 256, 2, 12}, - {3, 2, 1, 3072, 256, 2, 12}, - {3, 3, 1, 3072, 256, 2, 16}, - {3, 4, 1, 3072, 256, 2, 12}, - {3, 5, 1, 3072, 256, 2, 16}, - {3, 6, 1, 3072, 256, 2, 16}, - {3, 7, 1, 3072, 256, 2, 16}, - {3, 8, 1, 3072, 256, 2, 16}, - {3, 1, 1, 3072, 512, 2, 24}, - {3, 2, 1, 3072, 512, 2, 24}, - {3, 3, 1, 3072, 512, 2, 32}, - {3, 4, 1, 3072, 512, 2, 24}, - {3, 5, 1, 3072, 512, 2, 32}, - {3, 6, 1, 3072, 512, 2, 32}, - {3, 7, 1, 3072, 512, 2, 32}, - {3, 8, 1, 3072, 512, 2, 32}, - {3, 1, 1, 3072, 1024, 2, 48}, - {3, 2, 1, 3072, 1024, 2, 48}, - {3, 3, 1, 3072, 1024, 2, 64}, - {3, 4, 1, 3072, 1024, 2, 48}, - {3, 5, 1, 3072, 1024, 2, 56}, - {3, 6, 1, 3072, 1024, 2, 48}, - {3, 7, 1, 3072, 1024, 2, 56}, - {3, 8, 1, 3072, 1024, 2, 56}, - {3, 1, 1, 3072, 2048, 2, 96}, - {3, 2, 1, 3072, 2048, 2, 96}, - {3, 3, 1, 3072, 2048, 2, 128}, - {3, 4, 1, 3072, 2048, 2, 88}, - {3, 5, 1, 3072, 2048, 2, 96}, - {3, 6, 1, 3072, 2048, 2, 96}, - {3, 7, 1, 3072, 2048, 2, 96}, - {3, 8, 1, 3072, 2048, 1, 88}, - {3, 1, 1, 3072, 3072, 2, 128}, - {3, 2, 1, 3072, 3072, 2, 116}, - {3, 3, 1, 3072, 3072, 2, 116}, - {3, 4, 1, 3072, 3072, 2, 116}, - {3, 5, 1, 3072, 3072, 2, 118}, - {3, 6, 1, 3072, 3072, 1, 118}, - {3, 7, 1, 3072, 3072, 2, 94}, - {3, 8, 1, 3072, 3072, 1, 96}, - {3, 1, 1, 3072, 4096, 2, 128}, - {3, 2, 1, 3072, 4096, 2, 128}, - {3, 3, 1, 3072, 4096, 2, 128}, - {3, 4, 1, 3072, 4096, 2, 128}, - {3, 5, 1, 3072, 4096, 2, 128}, - {3, 6, 1, 3072, 4096, 1, 124}, - {3, 7, 1, 3072, 4096, 1, 128}, - {3, 8, 1, 3072, 4096, 1, 98}, - {3, 1, 1, 3072, 5120, 2, 128}, - {3, 2, 1, 3072, 5120, 2, 128}, - {3, 3, 1, 3072, 5120, 2, 128}, - {3, 4, 1, 3072, 5120, 2, 124}, - {3, 5, 1, 3072, 5120, 2, 120}, - {3, 6, 1, 3072, 5120, 1, 126}, - {3, 7, 1, 3072, 5120, 1, 128}, - {3, 8, 1, 3072, 5120, 1, 98}, - {3, 1, 1, 3072, 8192, 2, 128}, - {3, 2, 1, 3072, 8192, 2, 128}, - {3, 3, 1, 3072, 8192, 2, 128}, - {3, 4, 1, 3072, 8192, 2, 122}, - {3, 5, 1, 3072, 8192, 2, 126}, - {3, 6, 1, 3072, 8192, 1, 128}, - {3, 7, 1, 3072, 8192, 1, 128}, - {3, 8, 1, 3072, 8192, 1, 116}, - {3, 1, 1, 3072, 12288, 2, 128}, - {3, 2, 1, 3072, 12288, 2, 128}, - {3, 3, 1, 3072, 12288, 2, 128}, - {3, 4, 1, 3072, 12288, 2, 128}, - {3, 5, 1, 3072, 12288, 2, 128}, - {3, 6, 1, 3072, 12288, 1, 128}, - {3, 7, 1, 3072, 12288, 1, 126}, - {3, 8, 1, 3072, 12288, 1, 96}, - {3, 1, 1, 3072, 14336, 2, 128}, - {3, 2, 1, 3072, 14336, 2, 128}, - {3, 3, 1, 3072, 14336, 2, 128}, - {3, 4, 1, 3072, 14336, 2, 112}, - {3, 5, 1, 3072, 14336, 2, 112}, - {3, 6, 1, 3072, 14336, 1, 128}, - {3, 7, 1, 3072, 14336, 1, 128}, - {3, 8, 1, 3072, 14336, 1, 110}, - {3, 1, 1, 3072, 16384, 2, 128}, - {3, 2, 1, 3072, 16384, 2, 128}, - {3, 3, 1, 3072, 16384, 2, 128}, - {3, 4, 1, 3072, 16384, 2, 128}, - {3, 5, 1, 3072, 16384, 2, 128}, - {3, 6, 1, 3072, 16384, 1, 128}, - {3, 7, 1, 3072, 16384, 1, 128}, - {3, 8, 1, 3072, 16384, 1, 126}, - {3, 1, 1, 3072, 24576, 2, 128}, - {3, 2, 1, 3072, 24576, 2, 128}, - {3, 3, 1, 3072, 24576, 2, 128}, - {3, 4, 1, 3072, 24576, 2, 126}, - {3, 5, 1, 3072, 24576, 2, 126}, - {3, 6, 1, 3072, 24576, 1, 128}, - {3, 7, 1, 3072, 24576, 1, 126}, - {3, 8, 1, 3072, 24576, 1, 96}, - {3, 1, 1, 3072, 51200, 2, 128}, - {3, 2, 1, 3072, 51200, 2, 128}, - {3, 3, 1, 3072, 51200, 2, 128}, - {3, 4, 1, 3072, 51200, 2, 120}, - {3, 5, 1, 3072, 51200, 2, 128}, - {3, 6, 1, 3072, 51200, 2, 128}, - {3, 7, 1, 3072, 51200, 2, 102}, - {3, 8, 1, 3072, 51200, 1, 124}, - {3, 1, 1, 3072, 128000, 2, 128}, - {3, 2, 1, 3072, 128000, 2, 128}, - {3, 3, 1, 3072, 128000, 2, 128}, - {3, 4, 1, 3072, 128000, 2, 128}, - {3, 5, 1, 3072, 128000, 2, 124}, - {3, 6, 1, 3072, 128000, 2, 116}, - {3, 7, 1, 3072, 128000, 2, 122}, - {3, 8, 1, 3072, 128000, 2, 118}, - {3, 1, 1, 4096, 128, 2, 8}, - {3, 2, 1, 4096, 128, 2, 8}, - {3, 3, 1, 4096, 128, 2, 8}, - {3, 4, 1, 4096, 128, 2, 8}, - {3, 5, 1, 4096, 128, 2, 8}, - {3, 6, 1, 4096, 128, 2, 8}, - {3, 7, 1, 4096, 128, 2, 8}, - {3, 8, 1, 4096, 128, 2, 8}, - {3, 1, 1, 4096, 256, 2, 16}, - {3, 2, 1, 4096, 256, 2, 16}, - {3, 3, 1, 4096, 256, 2, 16}, - {3, 4, 1, 4096, 256, 2, 16}, - {3, 5, 1, 4096, 256, 2, 16}, - {3, 6, 1, 4096, 256, 2, 16}, - {3, 7, 1, 4096, 256, 2, 16}, - {3, 8, 1, 4096, 256, 2, 16}, - {3, 1, 1, 4096, 512, 2, 32}, - {3, 2, 1, 4096, 512, 2, 32}, - {3, 3, 1, 4096, 512, 2, 32}, - {3, 4, 1, 4096, 512, 2, 32}, - {3, 5, 1, 4096, 512, 2, 32}, - {3, 6, 1, 4096, 512, 2, 32}, - {3, 7, 1, 4096, 512, 2, 32}, - {3, 8, 1, 4096, 512, 2, 32}, - {3, 1, 1, 4096, 1024, 2, 64}, - {3, 2, 1, 4096, 1024, 2, 64}, - {3, 3, 1, 4096, 1024, 2, 64}, - {3, 4, 1, 4096, 1024, 2, 56}, - {3, 5, 1, 4096, 1024, 2, 64}, - {3, 6, 1, 4096, 1024, 2, 62}, - {3, 7, 1, 4096, 1024, 2, 62}, - {3, 8, 1, 4096, 1024, 2, 62}, - {3, 1, 1, 4096, 2048, 2, 128}, - {3, 2, 1, 4096, 2048, 2, 128}, - {3, 3, 1, 4096, 2048, 2, 128}, - {3, 4, 1, 4096, 2048, 2, 116}, - {3, 5, 1, 4096, 2048, 2, 116}, - {3, 6, 1, 4096, 2048, 2, 92}, - {3, 7, 1, 4096, 2048, 2, 94}, - {3, 8, 1, 4096, 2048, 1, 96}, - {3, 1, 1, 4096, 3072, 2, 128}, - {3, 2, 1, 4096, 3072, 2, 128}, - {3, 3, 1, 4096, 3072, 2, 128}, - {3, 4, 1, 4096, 3072, 2, 110}, - {3, 5, 1, 4096, 3072, 2, 110}, - {3, 6, 1, 4096, 3072, 1, 128}, - {3, 7, 1, 4096, 3072, 2, 96}, - {3, 8, 1, 4096, 3072, 1, 96}, - {3, 1, 1, 4096, 4096, 2, 128}, - {3, 2, 1, 4096, 4096, 2, 128}, - {3, 3, 1, 4096, 4096, 2, 126}, - {3, 4, 1, 4096, 4096, 2, 128}, - {3, 5, 1, 4096, 4096, 2, 126}, - {3, 6, 1, 4096, 4096, 1, 124}, - {3, 7, 1, 4096, 4096, 1, 126}, - {3, 8, 1, 4096, 4096, 1, 102}, - {3, 1, 1, 4096, 5120, 2, 128}, - {3, 2, 1, 4096, 5120, 2, 128}, - {3, 3, 1, 4096, 5120, 2, 128}, - {3, 4, 1, 4096, 5120, 2, 118}, - {3, 5, 1, 4096, 5120, 2, 128}, - {3, 6, 1, 4096, 5120, 1, 122}, - {3, 7, 1, 4096, 5120, 1, 128}, - {3, 8, 1, 4096, 5120, 1, 96}, - {3, 1, 1, 4096, 8192, 2, 128}, - {3, 2, 1, 4096, 8192, 2, 128}, - {3, 3, 1, 4096, 8192, 2, 128}, - {3, 4, 1, 4096, 8192, 2, 128}, - {3, 5, 1, 4096, 8192, 2, 128}, - {3, 6, 1, 4096, 8192, 1, 128}, - {3, 7, 1, 4096, 8192, 1, 128}, - {3, 8, 1, 4096, 8192, 1, 126}, - {3, 1, 1, 4096, 12288, 2, 128}, - {3, 2, 1, 4096, 12288, 2, 128}, - {3, 3, 1, 4096, 12288, 2, 128}, - {3, 4, 1, 4096, 12288, 2, 128}, - {3, 5, 1, 4096, 12288, 2, 128}, - {3, 6, 1, 4096, 12288, 1, 128}, - {3, 7, 1, 4096, 12288, 1, 126}, - {3, 8, 1, 4096, 12288, 1, 96}, - {3, 1, 1, 4096, 14336, 2, 128}, - {3, 2, 1, 4096, 14336, 2, 128}, - {3, 3, 1, 4096, 14336, 2, 128}, - {3, 4, 1, 4096, 14336, 2, 122}, - {3, 5, 1, 4096, 14336, 2, 112}, - {3, 6, 1, 4096, 14336, 1, 128}, - {3, 7, 1, 4096, 14336, 1, 128}, - {3, 8, 1, 4096, 14336, 1, 110}, - {3, 1, 1, 4096, 16384, 2, 128}, - {3, 2, 1, 4096, 16384, 2, 128}, - {3, 3, 1, 4096, 16384, 2, 128}, - {3, 4, 1, 4096, 16384, 2, 126}, - {3, 5, 1, 4096, 16384, 2, 128}, - {3, 6, 1, 4096, 16384, 1, 128}, - {3, 7, 1, 4096, 16384, 1, 128}, - {3, 8, 1, 4096, 16384, 2, 128}, - {3, 1, 1, 4096, 24576, 2, 128}, - {3, 2, 1, 4096, 24576, 2, 128}, - {3, 3, 1, 4096, 24576, 2, 128}, - {3, 4, 1, 4096, 24576, 2, 126}, - {3, 5, 1, 4096, 24576, 2, 126}, - {3, 6, 1, 4096, 24576, 1, 128}, - {3, 7, 1, 4096, 24576, 1, 126}, - {3, 8, 1, 4096, 24576, 1, 96}, - {3, 1, 1, 4096, 51200, 2, 128}, - {3, 2, 1, 4096, 51200, 2, 128}, - {3, 3, 1, 4096, 51200, 2, 128}, - {3, 4, 1, 4096, 51200, 2, 120}, - {3, 5, 1, 4096, 51200, 2, 128}, - {3, 6, 1, 4096, 51200, 1, 128}, - {3, 7, 1, 4096, 51200, 2, 126}, - {3, 8, 1, 4096, 51200, 1, 124}, - {3, 1, 1, 4096, 128000, 2, 128}, - {3, 2, 1, 4096, 128000, 2, 128}, - {3, 3, 1, 4096, 128000, 2, 128}, - {3, 4, 1, 4096, 128000, 2, 128}, - {3, 5, 1, 4096, 128000, 2, 128}, - {3, 6, 1, 4096, 128000, 2, 120}, - {3, 7, 1, 4096, 128000, 2, 108}, - {3, 8, 1, 4096, 128000, 1, 126}, - {3, 1, 1, 5120, 128, 2, 10}, - {3, 2, 1, 5120, 128, 2, 8}, - {3, 3, 1, 5120, 128, 2, 10}, - {3, 4, 1, 5120, 128, 2, 8}, - {3, 5, 1, 5120, 128, 2, 10}, - {3, 6, 1, 5120, 128, 2, 10}, - {3, 7, 1, 5120, 128, 2, 10}, - {3, 8, 1, 5120, 128, 2, 10}, - {3, 1, 1, 5120, 256, 2, 18}, - {3, 2, 1, 5120, 256, 2, 18}, - {3, 3, 1, 5120, 256, 2, 20}, - {3, 4, 1, 5120, 256, 2, 18}, - {3, 5, 1, 5120, 256, 2, 20}, - {3, 6, 1, 5120, 256, 2, 20}, - {3, 7, 1, 5120, 256, 2, 20}, - {3, 8, 1, 5120, 256, 2, 20}, - {3, 1, 1, 5120, 512, 2, 32}, - {3, 2, 1, 5120, 512, 2, 36}, - {3, 3, 1, 5120, 512, 2, 40}, - {3, 4, 1, 5120, 512, 2, 32}, - {3, 5, 1, 5120, 512, 2, 40}, - {3, 6, 1, 5120, 512, 2, 32}, - {3, 7, 1, 5120, 512, 2, 32}, - {3, 8, 1, 5120, 512, 2, 32}, - {3, 1, 1, 5120, 1024, 2, 72}, - {3, 2, 1, 5120, 1024, 2, 72}, - {3, 3, 1, 5120, 1024, 2, 72}, - {3, 4, 1, 5120, 1024, 2, 64}, - {3, 5, 1, 5120, 1024, 2, 72}, - {3, 6, 1, 5120, 1024, 2, 72}, - {3, 7, 1, 5120, 1024, 2, 72}, - {3, 8, 1, 5120, 1024, 2, 72}, - {3, 1, 1, 5120, 2048, 2, 128}, - {3, 2, 1, 5120, 2048, 2, 128}, - {3, 3, 1, 5120, 2048, 2, 124}, - {3, 4, 1, 5120, 2048, 2, 112}, - {3, 5, 1, 5120, 2048, 2, 110}, - {3, 6, 1, 5120, 2048, 2, 90}, - {3, 7, 1, 5120, 2048, 2, 90}, - {3, 8, 1, 5120, 2048, 2, 80}, - {3, 1, 1, 5120, 3072, 2, 128}, - {3, 2, 1, 5120, 3072, 2, 128}, - {3, 3, 1, 5120, 3072, 2, 128}, - {3, 4, 1, 5120, 3072, 2, 116}, - {3, 5, 1, 5120, 3072, 2, 120}, - {3, 6, 1, 5120, 3072, 1, 128}, - {3, 7, 1, 5120, 3072, 2, 94}, - {3, 8, 1, 5120, 3072, 1, 96}, - {3, 1, 1, 5120, 4096, 2, 128}, - {3, 2, 1, 5120, 4096, 2, 128}, - {3, 3, 1, 5120, 4096, 2, 128}, - {3, 4, 1, 5120, 4096, 2, 128}, - {3, 5, 1, 5120, 4096, 2, 126}, - {3, 6, 1, 5120, 4096, 1, 126}, - {3, 7, 1, 5120, 4096, 1, 128}, - {3, 8, 1, 5120, 4096, 1, 94}, - {3, 1, 1, 5120, 5120, 2, 128}, - {3, 2, 1, 5120, 5120, 2, 128}, - {3, 3, 1, 5120, 5120, 2, 128}, - {3, 4, 1, 5120, 5120, 2, 118}, - {3, 5, 1, 5120, 5120, 2, 116}, - {3, 6, 1, 5120, 5120, 1, 122}, - {3, 7, 1, 5120, 5120, 1, 128}, - {3, 8, 1, 5120, 5120, 1, 102}, - {3, 1, 1, 5120, 8192, 2, 128}, - {3, 2, 1, 5120, 8192, 2, 128}, - {3, 3, 1, 5120, 8192, 2, 128}, - {3, 4, 1, 5120, 8192, 2, 128}, - {3, 5, 1, 5120, 8192, 2, 128}, - {3, 6, 1, 5120, 8192, 1, 128}, - {3, 7, 1, 5120, 8192, 1, 128}, - {3, 8, 1, 5120, 8192, 1, 126}, - {3, 1, 1, 5120, 12288, 2, 128}, - {3, 2, 1, 5120, 12288, 2, 128}, - {3, 3, 1, 5120, 12288, 2, 128}, - {3, 4, 1, 5120, 12288, 2, 128}, - {3, 5, 1, 5120, 12288, 2, 122}, - {3, 6, 1, 5120, 12288, 1, 128}, - {3, 7, 1, 5120, 12288, 1, 126}, - {3, 8, 1, 5120, 12288, 1, 96}, - {3, 1, 1, 5120, 14336, 2, 128}, - {3, 2, 1, 5120, 14336, 2, 128}, - {3, 3, 1, 5120, 14336, 2, 128}, - {3, 4, 1, 5120, 14336, 2, 112}, - {3, 5, 1, 5120, 14336, 2, 112}, - {3, 6, 1, 5120, 14336, 1, 128}, - {3, 7, 1, 5120, 14336, 1, 128}, - {3, 8, 1, 5120, 14336, 1, 110}, - {3, 1, 1, 5120, 16384, 2, 128}, - {3, 2, 1, 5120, 16384, 2, 128}, - {3, 3, 1, 5120, 16384, 2, 128}, - {3, 4, 1, 5120, 16384, 2, 128}, - {3, 5, 1, 5120, 16384, 2, 128}, - {3, 6, 1, 5120, 16384, 1, 128}, - {3, 7, 1, 5120, 16384, 1, 128}, - {3, 8, 1, 5120, 16384, 1, 126}, - {3, 1, 1, 5120, 24576, 2, 128}, - {3, 2, 1, 5120, 24576, 2, 128}, - {3, 3, 1, 5120, 24576, 2, 128}, - {3, 4, 1, 5120, 24576, 2, 128}, - {3, 5, 1, 5120, 24576, 2, 126}, - {3, 6, 1, 5120, 24576, 1, 128}, - {3, 7, 1, 5120, 24576, 1, 126}, - {3, 8, 1, 5120, 24576, 1, 96}, - {3, 1, 1, 5120, 51200, 2, 128}, - {3, 2, 1, 5120, 51200, 2, 128}, - {3, 3, 1, 5120, 51200, 2, 128}, - {3, 4, 1, 5120, 51200, 2, 120}, - {3, 5, 1, 5120, 51200, 2, 126}, - {3, 6, 1, 5120, 51200, 2, 128}, - {3, 7, 1, 5120, 51200, 2, 102}, - {3, 8, 1, 5120, 51200, 1, 124}, - {3, 1, 1, 5120, 128000, 2, 128}, - {3, 2, 1, 5120, 128000, 2, 128}, - {3, 3, 1, 5120, 128000, 2, 128}, - {3, 4, 1, 5120, 128000, 2, 128}, - {3, 5, 1, 5120, 128000, 2, 124}, - {3, 6, 1, 5120, 128000, 2, 116}, - {3, 7, 1, 5120, 128000, 2, 124}, - {3, 8, 1, 5120, 128000, 2, 118}, - {3, 1, 1, 8192, 128, 2, 10}, - {3, 2, 1, 8192, 128, 2, 10}, - {3, 3, 1, 8192, 128, 2, 12}, - {3, 4, 1, 8192, 128, 2, 10}, - {3, 5, 1, 8192, 128, 2, 12}, - {3, 6, 1, 8192, 128, 2, 12}, - {3, 7, 1, 8192, 128, 2, 12}, - {3, 8, 1, 8192, 128, 2, 12}, - {3, 1, 1, 8192, 256, 2, 20}, - {3, 2, 1, 8192, 256, 2, 20}, - {3, 3, 1, 8192, 256, 2, 24}, - {3, 4, 1, 8192, 256, 2, 20}, - {3, 5, 1, 8192, 256, 2, 26}, - {3, 6, 1, 8192, 256, 2, 26}, - {3, 7, 1, 8192, 256, 2, 26}, - {3, 8, 1, 8192, 256, 2, 26}, - {3, 1, 1, 8192, 512, 2, 48}, - {3, 2, 1, 8192, 512, 2, 40}, - {3, 3, 1, 8192, 512, 2, 54}, - {3, 4, 1, 8192, 512, 2, 32}, - {3, 5, 1, 8192, 512, 2, 40}, - {3, 6, 1, 8192, 512, 2, 40}, - {3, 7, 1, 8192, 512, 2, 54}, - {3, 8, 1, 8192, 512, 2, 54}, - {3, 1, 1, 8192, 1024, 2, 86}, - {3, 2, 1, 8192, 1024, 2, 72}, - {3, 3, 1, 8192, 1024, 2, 88}, - {3, 4, 1, 8192, 1024, 2, 72}, - {3, 5, 1, 8192, 1024, 2, 86}, - {3, 6, 1, 8192, 1024, 2, 86}, - {3, 7, 1, 8192, 1024, 2, 86}, - {3, 8, 1, 8192, 1024, 2, 76}, - {3, 1, 1, 8192, 2048, 2, 128}, - {3, 2, 1, 8192, 2048, 2, 128}, - {3, 3, 1, 8192, 2048, 2, 128}, - {3, 4, 1, 8192, 2048, 2, 112}, - {3, 5, 1, 8192, 2048, 2, 114}, - {3, 6, 1, 8192, 2048, 1, 126}, - {3, 7, 1, 8192, 2048, 2, 96}, - {3, 8, 1, 8192, 2048, 1, 96}, - {3, 1, 1, 8192, 3072, 2, 128}, - {3, 2, 1, 8192, 3072, 2, 128}, - {3, 3, 1, 8192, 3072, 2, 128}, - {3, 4, 1, 8192, 3072, 2, 118}, - {3, 5, 1, 8192, 3072, 2, 122}, - {3, 6, 1, 8192, 3072, 1, 126}, - {3, 7, 1, 8192, 3072, 2, 96}, - {3, 8, 1, 8192, 3072, 1, 96}, - {3, 1, 1, 8192, 4096, 2, 128}, - {3, 2, 1, 8192, 4096, 2, 128}, - {3, 3, 1, 8192, 4096, 2, 128}, - {3, 4, 1, 8192, 4096, 2, 128}, - {3, 5, 1, 8192, 4096, 2, 126}, - {3, 6, 1, 8192, 4096, 1, 128}, - {3, 7, 1, 8192, 4096, 1, 126}, - {3, 8, 1, 8192, 4096, 1, 98}, - {3, 1, 1, 8192, 5120, 2, 128}, - {3, 2, 1, 8192, 5120, 2, 128}, - {3, 3, 1, 8192, 5120, 2, 128}, - {3, 4, 1, 8192, 5120, 2, 118}, - {3, 5, 1, 8192, 5120, 2, 120}, - {3, 6, 1, 8192, 5120, 1, 126}, - {3, 7, 1, 8192, 5120, 1, 126}, - {3, 8, 1, 8192, 5120, 1, 96}, - {3, 1, 1, 8192, 8192, 2, 128}, - {3, 2, 1, 8192, 8192, 2, 128}, - {3, 3, 1, 8192, 8192, 2, 128}, - {3, 4, 1, 8192, 8192, 2, 128}, - {3, 5, 1, 8192, 8192, 2, 128}, - {3, 6, 1, 8192, 8192, 1, 128}, - {3, 7, 1, 8192, 8192, 1, 128}, - {3, 8, 1, 8192, 8192, 1, 126}, - {3, 1, 1, 8192, 12288, 2, 128}, - {3, 2, 1, 8192, 12288, 2, 128}, - {3, 3, 1, 8192, 12288, 2, 128}, - {3, 4, 1, 8192, 12288, 2, 128}, - {3, 5, 1, 8192, 12288, 2, 126}, - {3, 6, 1, 8192, 12288, 1, 128}, - {3, 7, 1, 8192, 12288, 1, 126}, - {3, 8, 1, 8192, 12288, 1, 96}, - {3, 1, 1, 8192, 14336, 2, 128}, - {3, 2, 1, 8192, 14336, 2, 128}, - {3, 3, 1, 8192, 14336, 2, 128}, - {3, 4, 1, 8192, 14336, 2, 124}, - {3, 5, 1, 8192, 14336, 2, 112}, - {3, 6, 1, 8192, 14336, 1, 128}, - {3, 7, 1, 8192, 14336, 1, 128}, - {3, 8, 1, 8192, 14336, 1, 114}, - {3, 1, 1, 8192, 16384, 2, 128}, - {3, 2, 1, 8192, 16384, 2, 128}, - {3, 3, 1, 8192, 16384, 2, 128}, - {3, 4, 1, 8192, 16384, 2, 128}, - {3, 5, 1, 8192, 16384, 2, 128}, - {3, 6, 1, 8192, 16384, 1, 128}, - {3, 7, 1, 8192, 16384, 1, 128}, - {3, 8, 1, 8192, 16384, 2, 128}, - {3, 1, 1, 8192, 24576, 2, 128}, - {3, 2, 1, 8192, 24576, 2, 128}, - {3, 3, 1, 8192, 24576, 2, 128}, - {3, 4, 1, 8192, 24576, 2, 122}, - {3, 5, 1, 8192, 24576, 2, 126}, - {3, 6, 1, 8192, 24576, 1, 128}, - {3, 7, 1, 8192, 24576, 2, 96}, - {3, 8, 1, 8192, 24576, 1, 96}, - {3, 1, 1, 8192, 51200, 2, 128}, - {3, 2, 1, 8192, 51200, 2, 128}, - {3, 3, 1, 8192, 51200, 2, 128}, - {3, 4, 1, 8192, 51200, 2, 120}, - {3, 5, 1, 8192, 51200, 2, 128}, - {3, 6, 1, 8192, 51200, 2, 128}, - {3, 7, 1, 8192, 51200, 2, 122}, - {3, 8, 1, 8192, 51200, 2, 120}, - {3, 1, 1, 8192, 128000, 2, 128}, - {3, 2, 1, 8192, 128000, 2, 128}, - {3, 3, 1, 8192, 128000, 2, 128}, - {3, 4, 1, 8192, 128000, 2, 128}, - {3, 5, 1, 8192, 128000, 2, 124}, - {3, 6, 1, 8192, 128000, 2, 116}, - {3, 7, 1, 8192, 128000, 2, 128}, - {3, 8, 1, 8192, 128000, 2, 126}, - {3, 1, 1, 12288, 128, 2, 12}, - {3, 2, 1, 12288, 128, 2, 12}, - {3, 3, 1, 12288, 128, 2, 16}, - {3, 4, 1, 12288, 128, 2, 12}, - {3, 5, 1, 12288, 128, 2, 16}, - {3, 6, 1, 12288, 128, 2, 16}, - {3, 7, 1, 12288, 128, 2, 16}, - {3, 8, 1, 12288, 128, 2, 16}, - {3, 1, 1, 12288, 256, 2, 26}, - {3, 2, 1, 12288, 256, 2, 26}, - {3, 3, 1, 12288, 256, 2, 32}, - {3, 4, 1, 12288, 256, 2, 24}, - {3, 5, 1, 12288, 256, 2, 24}, - {3, 6, 1, 12288, 256, 2, 32}, - {3, 7, 1, 12288, 256, 2, 32}, - {3, 8, 1, 12288, 256, 2, 32}, - {3, 1, 1, 12288, 512, 2, 48}, - {3, 2, 1, 12288, 512, 2, 52}, - {3, 3, 1, 12288, 512, 2, 62}, - {3, 4, 1, 12288, 512, 2, 52}, - {3, 5, 1, 12288, 512, 2, 56}, - {3, 6, 1, 12288, 512, 2, 56}, - {3, 7, 1, 12288, 512, 2, 64}, - {3, 8, 1, 12288, 512, 2, 62}, - {3, 1, 1, 12288, 1024, 2, 102}, - {3, 2, 1, 12288, 1024, 2, 104}, - {3, 3, 1, 12288, 1024, 2, 124}, - {3, 4, 1, 12288, 1024, 2, 96}, - {3, 5, 1, 12288, 1024, 2, 96}, - {3, 6, 1, 12288, 1024, 2, 96}, - {3, 7, 1, 12288, 1024, 2, 88}, - {3, 8, 1, 12288, 1024, 2, 76}, - {3, 1, 1, 12288, 2048, 2, 128}, - {3, 2, 1, 12288, 2048, 2, 128}, - {3, 3, 1, 12288, 2048, 2, 128}, - {3, 4, 1, 12288, 2048, 2, 112}, - {3, 5, 1, 12288, 2048, 2, 114}, - {3, 6, 1, 12288, 2048, 2, 94}, - {3, 7, 1, 12288, 2048, 2, 96}, - {3, 8, 1, 12288, 2048, 1, 96}, - {3, 1, 1, 12288, 3072, 2, 128}, - {3, 2, 1, 12288, 3072, 2, 128}, - {3, 3, 1, 12288, 3072, 2, 128}, - {3, 4, 1, 12288, 3072, 2, 118}, - {3, 5, 1, 12288, 3072, 2, 120}, - {3, 6, 1, 12288, 3072, 1, 128}, - {3, 7, 1, 12288, 3072, 2, 96}, - {3, 8, 1, 12288, 3072, 1, 96}, - {3, 1, 1, 12288, 4096, 2, 128}, - {3, 2, 1, 12288, 4096, 2, 128}, - {3, 3, 1, 12288, 4096, 2, 128}, - {3, 4, 1, 12288, 4096, 2, 128}, - {3, 5, 1, 12288, 4096, 2, 128}, - {3, 6, 1, 12288, 4096, 1, 128}, - {3, 7, 1, 12288, 4096, 1, 128}, - {3, 8, 1, 12288, 4096, 1, 98}, - {3, 1, 1, 12288, 5120, 2, 128}, - {3, 2, 1, 12288, 5120, 2, 128}, - {3, 3, 1, 12288, 5120, 2, 128}, - {3, 4, 1, 12288, 5120, 2, 120}, - {3, 5, 1, 12288, 5120, 2, 120}, - {3, 6, 1, 12288, 5120, 1, 120}, - {3, 7, 1, 12288, 5120, 1, 126}, - {3, 8, 1, 12288, 5120, 1, 120}, - {3, 1, 1, 12288, 8192, 2, 128}, - {3, 2, 1, 12288, 8192, 2, 128}, - {3, 3, 1, 12288, 8192, 2, 128}, - {3, 4, 1, 12288, 8192, 2, 128}, - {3, 5, 1, 12288, 8192, 2, 128}, - {3, 6, 1, 12288, 8192, 1, 128}, - {3, 7, 1, 12288, 8192, 1, 128}, - {3, 8, 1, 12288, 8192, 1, 116}, - {3, 1, 1, 12288, 12288, 2, 128}, - {3, 2, 1, 12288, 12288, 2, 128}, - {3, 3, 1, 12288, 12288, 2, 128}, - {3, 4, 1, 12288, 12288, 2, 128}, - {3, 5, 1, 12288, 12288, 2, 126}, - {3, 6, 1, 12288, 12288, 1, 128}, - {3, 7, 1, 12288, 12288, 1, 126}, - {3, 8, 1, 12288, 12288, 1, 96}, - {3, 1, 1, 12288, 14336, 2, 128}, - {3, 2, 1, 12288, 14336, 2, 128}, - {3, 3, 1, 12288, 14336, 2, 128}, - {3, 4, 1, 12288, 14336, 2, 128}, - {3, 5, 1, 12288, 14336, 2, 112}, - {3, 6, 1, 12288, 14336, 2, 110}, - {3, 7, 1, 12288, 14336, 1, 128}, - {3, 8, 1, 12288, 14336, 2, 112}, - {3, 1, 1, 12288, 16384, 2, 128}, - {3, 2, 1, 12288, 16384, 2, 128}, - {3, 3, 1, 12288, 16384, 2, 128}, - {3, 4, 1, 12288, 16384, 2, 128}, - {3, 5, 1, 12288, 16384, 2, 128}, - {3, 6, 1, 12288, 16384, 1, 128}, - {3, 7, 1, 12288, 16384, 1, 128}, - {3, 8, 1, 12288, 16384, 2, 128}, - {3, 1, 1, 12288, 24576, 2, 128}, - {3, 2, 1, 12288, 24576, 2, 128}, - {3, 3, 1, 12288, 24576, 2, 128}, - {3, 4, 1, 12288, 24576, 2, 128}, - {3, 5, 1, 12288, 24576, 2, 120}, - {3, 6, 1, 12288, 24576, 1, 128}, - {3, 7, 1, 12288, 24576, 2, 96}, - {3, 8, 1, 12288, 24576, 1, 96}, - {3, 1, 1, 12288, 51200, 2, 128}, - {3, 2, 1, 12288, 51200, 2, 128}, - {3, 3, 1, 12288, 51200, 2, 128}, - {3, 4, 1, 12288, 51200, 2, 120}, - {3, 5, 1, 12288, 51200, 2, 126}, - {3, 6, 1, 12288, 51200, 2, 128}, - {3, 7, 1, 12288, 51200, 2, 122}, - {3, 8, 1, 12288, 51200, 2, 124}, - {3, 1, 1, 12288, 128000, 2, 128}, - {3, 2, 1, 12288, 128000, 2, 128}, - {3, 3, 1, 12288, 128000, 2, 128}, - {3, 4, 1, 12288, 128000, 2, 128}, - {3, 5, 1, 12288, 128000, 2, 128}, - {3, 6, 1, 12288, 128000, 2, 120}, - {3, 7, 1, 12288, 128000, 2, 128}, - {3, 8, 1, 12288, 128000, 2, 118}, - {3, 1, 1, 14336, 128, 2, 16}, - {3, 2, 1, 14336, 128, 2, 14}, - {3, 3, 1, 14336, 128, 2, 16}, - {3, 4, 1, 14336, 128, 2, 14}, - {3, 5, 1, 14336, 128, 2, 16}, - {3, 6, 1, 14336, 128, 2, 16}, - {3, 7, 1, 14336, 128, 2, 18}, - {3, 8, 1, 14336, 128, 2, 16}, - {3, 1, 1, 14336, 256, 2, 30}, - {3, 2, 1, 14336, 256, 2, 30}, - {3, 3, 1, 14336, 256, 2, 32}, - {3, 4, 1, 14336, 256, 2, 30}, - {3, 5, 1, 14336, 256, 2, 32}, - {3, 6, 1, 14336, 256, 2, 32}, - {3, 7, 1, 14336, 256, 2, 32}, - {3, 8, 1, 14336, 256, 2, 32}, - {3, 1, 1, 14336, 512, 2, 60}, - {3, 2, 1, 14336, 512, 2, 56}, - {3, 3, 1, 14336, 512, 2, 64}, - {3, 4, 1, 14336, 512, 2, 56}, - {3, 5, 1, 14336, 512, 2, 56}, - {3, 6, 1, 14336, 512, 2, 58}, - {3, 7, 1, 14336, 512, 2, 62}, - {3, 8, 1, 14336, 512, 2, 62}, - {3, 1, 1, 14336, 1024, 2, 112}, - {3, 2, 1, 14336, 1024, 2, 112}, - {3, 3, 1, 14336, 1024, 2, 128}, - {3, 4, 1, 14336, 1024, 2, 96}, - {3, 5, 1, 14336, 1024, 2, 106}, - {3, 6, 1, 14336, 1024, 2, 92}, - {3, 7, 1, 14336, 1024, 2, 92}, - {3, 8, 1, 14336, 1024, 2, 72}, - {3, 1, 1, 14336, 2048, 2, 128}, - {3, 2, 1, 14336, 2048, 2, 128}, - {3, 3, 1, 14336, 2048, 2, 128}, - {3, 4, 1, 14336, 2048, 2, 112}, - {3, 5, 1, 14336, 2048, 2, 114}, - {3, 6, 1, 14336, 2048, 2, 96}, - {3, 7, 1, 14336, 2048, 2, 96}, - {3, 8, 1, 14336, 2048, 1, 96}, - {3, 1, 1, 14336, 3072, 2, 128}, - {3, 2, 1, 14336, 3072, 2, 128}, - {3, 3, 1, 14336, 3072, 2, 128}, - {3, 4, 1, 14336, 3072, 2, 120}, - {3, 5, 1, 14336, 3072, 2, 120}, - {3, 6, 1, 14336, 3072, 1, 126}, - {3, 7, 1, 14336, 3072, 2, 96}, - {3, 8, 1, 14336, 3072, 1, 96}, - {3, 1, 1, 14336, 4096, 2, 128}, - {3, 2, 1, 14336, 4096, 2, 128}, - {3, 3, 1, 14336, 4096, 2, 128}, - {3, 4, 1, 14336, 4096, 2, 128}, - {3, 5, 1, 14336, 4096, 2, 128}, - {3, 6, 1, 14336, 4096, 1, 128}, - {3, 7, 1, 14336, 4096, 1, 128}, - {3, 8, 1, 14336, 4096, 1, 96}, - {3, 1, 1, 14336, 5120, 2, 128}, - {3, 2, 1, 14336, 5120, 2, 128}, - {3, 3, 1, 14336, 5120, 2, 128}, - {3, 4, 1, 14336, 5120, 2, 120}, - {3, 5, 1, 14336, 5120, 2, 120}, - {3, 6, 1, 14336, 5120, 1, 126}, - {3, 7, 1, 14336, 5120, 1, 128}, - {3, 8, 1, 14336, 5120, 1, 96}, - {3, 1, 1, 14336, 8192, 2, 128}, - {3, 2, 1, 14336, 8192, 2, 128}, - {3, 3, 1, 14336, 8192, 2, 128}, - {3, 4, 1, 14336, 8192, 2, 128}, - {3, 5, 1, 14336, 8192, 2, 128}, - {3, 6, 1, 14336, 8192, 1, 128}, - {3, 7, 1, 14336, 8192, 1, 128}, - {3, 8, 1, 14336, 8192, 2, 128}, - {3, 1, 1, 14336, 12288, 2, 128}, - {3, 2, 1, 14336, 12288, 2, 128}, - {3, 3, 1, 14336, 12288, 2, 128}, - {3, 4, 1, 14336, 12288, 2, 128}, - {3, 5, 1, 14336, 12288, 2, 126}, - {3, 6, 1, 14336, 12288, 1, 128}, - {3, 7, 1, 14336, 12288, 1, 126}, - {3, 8, 1, 14336, 12288, 1, 96}, - {3, 1, 1, 14336, 14336, 2, 128}, - {3, 2, 1, 14336, 14336, 2, 128}, - {3, 3, 1, 14336, 14336, 2, 128}, - {3, 4, 1, 14336, 14336, 2, 122}, - {3, 5, 1, 14336, 14336, 2, 112}, - {3, 6, 1, 14336, 14336, 2, 110}, - {3, 7, 1, 14336, 14336, 1, 128}, - {3, 8, 1, 14336, 14336, 2, 112}, - {3, 1, 1, 14336, 16384, 2, 128}, - {3, 2, 1, 14336, 16384, 2, 128}, - {3, 3, 1, 14336, 16384, 2, 128}, - {3, 4, 1, 14336, 16384, 2, 128}, - {3, 5, 1, 14336, 16384, 2, 128}, - {3, 6, 1, 14336, 16384, 1, 128}, - {3, 7, 1, 14336, 16384, 1, 128}, - {3, 8, 1, 14336, 16384, 2, 128}, - {3, 1, 1, 14336, 24576, 2, 128}, - {3, 2, 1, 14336, 24576, 2, 128}, - {3, 3, 1, 14336, 24576, 2, 128}, - {3, 4, 1, 14336, 24576, 2, 128}, - {3, 5, 1, 14336, 24576, 2, 120}, - {3, 6, 1, 14336, 24576, 1, 128}, - {3, 7, 1, 14336, 24576, 2, 96}, - {3, 8, 1, 14336, 24576, 1, 96}, - {3, 1, 1, 14336, 51200, 2, 128}, - {3, 2, 1, 14336, 51200, 2, 128}, - {3, 3, 1, 14336, 51200, 2, 128}, - {3, 4, 1, 14336, 51200, 2, 120}, - {3, 5, 1, 14336, 51200, 2, 126}, - {3, 6, 1, 14336, 51200, 2, 128}, - {3, 7, 1, 14336, 51200, 2, 126}, - {3, 8, 1, 14336, 51200, 2, 124}, - {3, 1, 1, 14336, 128000, 2, 128}, - {3, 2, 1, 14336, 128000, 2, 128}, - {3, 3, 1, 14336, 128000, 2, 128}, - {3, 4, 1, 14336, 128000, 2, 128}, - {3, 5, 1, 14336, 128000, 2, 128}, - {3, 6, 1, 14336, 128000, 2, 120}, - {3, 7, 1, 14336, 128000, 2, 124}, - {3, 8, 1, 14336, 128000, 2, 116}, - {3, 1, 1, 16384, 128, 2, 16}, - {3, 2, 1, 16384, 128, 2, 16}, - {3, 3, 1, 16384, 128, 2, 16}, - {3, 4, 1, 16384, 128, 2, 14}, - {3, 5, 1, 16384, 128, 2, 16}, - {3, 6, 1, 16384, 128, 2, 16}, - {3, 7, 1, 16384, 128, 2, 18}, - {3, 8, 1, 16384, 128, 2, 16}, - {3, 1, 1, 16384, 256, 2, 32}, - {3, 2, 1, 16384, 256, 2, 32}, - {3, 3, 1, 16384, 256, 2, 38}, - {3, 4, 1, 16384, 256, 2, 32}, - {3, 5, 1, 16384, 256, 2, 32}, - {3, 6, 1, 16384, 256, 2, 32}, - {3, 7, 1, 16384, 256, 2, 38}, - {3, 8, 1, 16384, 256, 2, 32}, - {3, 1, 1, 16384, 512, 2, 62}, - {3, 2, 1, 16384, 512, 2, 62}, - {3, 3, 1, 16384, 512, 2, 64}, - {3, 4, 1, 16384, 512, 2, 56}, - {3, 5, 1, 16384, 512, 2, 64}, - {3, 6, 1, 16384, 512, 2, 64}, - {3, 7, 1, 16384, 512, 2, 64}, - {3, 8, 1, 16384, 512, 2, 66}, - {3, 1, 1, 16384, 1024, 2, 128}, - {3, 2, 1, 16384, 1024, 2, 104}, - {3, 3, 1, 16384, 1024, 2, 126}, - {3, 4, 1, 16384, 1024, 2, 96}, - {3, 5, 1, 16384, 1024, 2, 108}, - {3, 6, 1, 16384, 1024, 2, 96}, - {3, 7, 1, 16384, 1024, 2, 88}, - {3, 8, 1, 16384, 1024, 2, 80}, - {3, 1, 1, 16384, 2048, 2, 128}, - {3, 2, 1, 16384, 2048, 2, 128}, - {3, 3, 1, 16384, 2048, 2, 128}, - {3, 4, 1, 16384, 2048, 2, 128}, - {3, 5, 1, 16384, 2048, 2, 126}, - {3, 6, 1, 16384, 2048, 2, 96}, - {3, 7, 1, 16384, 2048, 1, 128}, - {3, 8, 1, 16384, 2048, 1, 96}, - {3, 1, 1, 16384, 3072, 2, 128}, - {3, 2, 1, 16384, 3072, 2, 128}, - {3, 3, 1, 16384, 3072, 2, 128}, - {3, 4, 1, 16384, 3072, 2, 128}, - {3, 5, 1, 16384, 3072, 2, 120}, - {3, 6, 1, 16384, 3072, 1, 128}, - {3, 7, 1, 16384, 3072, 2, 96}, - {3, 8, 1, 16384, 3072, 1, 96}, - {3, 1, 1, 16384, 4096, 2, 128}, - {3, 2, 1, 16384, 4096, 2, 128}, - {3, 3, 1, 16384, 4096, 2, 128}, - {3, 4, 1, 16384, 4096, 2, 128}, - {3, 5, 1, 16384, 4096, 2, 128}, - {3, 6, 1, 16384, 4096, 1, 124}, - {3, 7, 1, 16384, 4096, 1, 128}, - {3, 8, 1, 16384, 4096, 1, 96}, - {3, 1, 1, 16384, 5120, 2, 128}, - {3, 2, 1, 16384, 5120, 2, 128}, - {3, 3, 1, 16384, 5120, 2, 128}, - {3, 4, 1, 16384, 5120, 2, 120}, - {3, 5, 1, 16384, 5120, 2, 120}, - {3, 6, 1, 16384, 5120, 1, 120}, - {3, 7, 1, 16384, 5120, 1, 128}, - {3, 8, 1, 16384, 5120, 1, 96}, - {3, 1, 1, 16384, 8192, 2, 128}, - {3, 2, 1, 16384, 8192, 2, 128}, - {3, 3, 1, 16384, 8192, 2, 128}, - {3, 4, 1, 16384, 8192, 2, 128}, - {3, 5, 1, 16384, 8192, 2, 128}, - {3, 6, 1, 16384, 8192, 1, 128}, - {3, 7, 1, 16384, 8192, 1, 128}, - {3, 8, 1, 16384, 8192, 2, 128}, - {3, 1, 1, 16384, 12288, 2, 128}, - {3, 2, 1, 16384, 12288, 2, 128}, - {3, 3, 1, 16384, 12288, 2, 128}, - {3, 4, 1, 16384, 12288, 2, 120}, - {3, 5, 1, 16384, 12288, 2, 126}, - {3, 6, 1, 16384, 12288, 1, 128}, - {3, 7, 1, 16384, 12288, 2, 96}, - {3, 8, 1, 16384, 12288, 1, 96}, - {3, 1, 1, 16384, 14336, 2, 128}, - {3, 2, 1, 16384, 14336, 2, 128}, - {3, 3, 1, 16384, 14336, 2, 128}, - {3, 4, 1, 16384, 14336, 2, 124}, - {3, 5, 1, 16384, 14336, 2, 112}, - {3, 6, 1, 16384, 14336, 2, 110}, - {3, 7, 1, 16384, 14336, 1, 128}, - {3, 8, 1, 16384, 14336, 2, 112}, - {3, 1, 1, 16384, 16384, 2, 128}, - {3, 2, 1, 16384, 16384, 2, 128}, - {3, 3, 1, 16384, 16384, 2, 128}, - {3, 4, 1, 16384, 16384, 2, 128}, - {3, 5, 1, 16384, 16384, 2, 128}, - {3, 6, 1, 16384, 16384, 1, 128}, - {3, 7, 1, 16384, 16384, 1, 128}, - {3, 8, 1, 16384, 16384, 2, 128}, - {3, 1, 1, 16384, 24576, 2, 128}, - {3, 2, 1, 16384, 24576, 2, 128}, - {3, 3, 1, 16384, 24576, 2, 128}, - {3, 4, 1, 16384, 24576, 2, 128}, - {3, 5, 1, 16384, 24576, 2, 120}, - {3, 6, 1, 16384, 24576, 1, 128}, - {3, 7, 1, 16384, 24576, 2, 96}, - {3, 8, 1, 16384, 24576, 1, 96}, - {3, 1, 1, 16384, 51200, 2, 128}, - {3, 2, 1, 16384, 51200, 2, 128}, - {3, 3, 1, 16384, 51200, 2, 128}, - {3, 4, 1, 16384, 51200, 2, 120}, - {3, 5, 1, 16384, 51200, 2, 126}, - {3, 6, 1, 16384, 51200, 2, 128}, - {3, 7, 1, 16384, 51200, 2, 126}, - {3, 8, 1, 16384, 51200, 2, 126}, - {3, 1, 1, 16384, 128000, 2, 128}, - {3, 2, 1, 16384, 128000, 2, 128}, - {3, 3, 1, 16384, 128000, 2, 128}, - {3, 4, 1, 16384, 128000, 2, 126}, - {3, 5, 1, 16384, 128000, 2, 128}, - {3, 6, 1, 16384, 128000, 2, 122}, - {3, 7, 1, 16384, 128000, 2, 128}, - {3, 8, 1, 16384, 128000, 2, 116}, - {3, 1, 1, 24576, 128, 2, 18}, - {3, 2, 1, 24576, 128, 2, 18}, - {3, 3, 1, 24576, 128, 2, 22}, - {3, 4, 1, 24576, 128, 2, 18}, - {3, 5, 1, 24576, 128, 2, 22}, - {3, 6, 1, 24576, 128, 2, 22}, - {3, 7, 1, 24576, 128, 2, 22}, - {3, 8, 1, 24576, 128, 2, 22}, - {3, 1, 1, 24576, 256, 2, 36}, - {3, 2, 1, 24576, 256, 2, 36}, - {3, 3, 1, 24576, 256, 2, 44}, - {3, 4, 1, 24576, 256, 2, 36}, - {3, 5, 1, 24576, 256, 2, 42}, - {3, 6, 1, 24576, 256, 2, 40}, - {3, 7, 1, 24576, 256, 2, 44}, - {3, 8, 1, 24576, 256, 2, 44}, - {3, 1, 1, 24576, 512, 2, 72}, - {3, 2, 1, 24576, 512, 2, 72}, - {3, 3, 1, 24576, 512, 2, 84}, - {3, 4, 1, 24576, 512, 2, 72}, - {3, 5, 1, 24576, 512, 2, 84}, - {3, 6, 1, 24576, 512, 2, 80}, - {3, 7, 1, 24576, 512, 2, 84}, - {3, 8, 1, 24576, 512, 2, 72}, - {3, 1, 1, 24576, 1024, 2, 128}, - {3, 2, 1, 24576, 1024, 2, 126}, - {3, 3, 1, 24576, 1024, 2, 128}, - {3, 4, 1, 24576, 1024, 2, 112}, - {3, 5, 1, 24576, 1024, 2, 108}, - {3, 6, 1, 24576, 1024, 2, 96}, - {3, 7, 1, 24576, 1024, 2, 96}, - {3, 8, 1, 24576, 1024, 2, 80}, - {3, 1, 1, 24576, 2048, 2, 128}, - {3, 2, 1, 24576, 2048, 2, 128}, - {3, 3, 1, 24576, 2048, 2, 128}, - {3, 4, 1, 24576, 2048, 2, 128}, - {3, 5, 1, 24576, 2048, 2, 126}, - {3, 6, 1, 24576, 2048, 2, 96}, - {3, 7, 1, 24576, 2048, 2, 96}, - {3, 8, 1, 24576, 2048, 1, 96}, - {3, 1, 1, 24576, 3072, 2, 128}, - {3, 2, 1, 24576, 3072, 2, 128}, - {3, 3, 1, 24576, 3072, 2, 128}, - {3, 4, 1, 24576, 3072, 2, 128}, - {3, 5, 1, 24576, 3072, 2, 120}, - {3, 6, 1, 24576, 3072, 1, 128}, - {3, 7, 1, 24576, 3072, 2, 96}, - {3, 8, 1, 24576, 3072, 1, 96}, - {3, 1, 1, 24576, 4096, 2, 128}, - {3, 2, 1, 24576, 4096, 2, 128}, - {3, 3, 1, 24576, 4096, 2, 128}, - {3, 4, 1, 24576, 4096, 2, 128}, - {3, 5, 1, 24576, 4096, 2, 128}, - {3, 6, 1, 24576, 4096, 1, 128}, - {3, 7, 1, 24576, 4096, 1, 128}, - {3, 8, 1, 24576, 4096, 1, 96}, - {3, 1, 1, 24576, 5120, 2, 128}, - {3, 2, 1, 24576, 5120, 2, 128}, - {3, 3, 1, 24576, 5120, 2, 128}, - {3, 4, 1, 24576, 5120, 2, 120}, - {3, 5, 1, 24576, 5120, 2, 120}, - {3, 6, 1, 24576, 5120, 2, 120}, - {3, 7, 1, 24576, 5120, 2, 120}, - {3, 8, 1, 24576, 5120, 1, 96}, - {3, 1, 1, 24576, 8192, 2, 128}, - {3, 2, 1, 24576, 8192, 2, 128}, - {3, 3, 1, 24576, 8192, 2, 128}, - {3, 4, 1, 24576, 8192, 2, 128}, - {3, 5, 1, 24576, 8192, 2, 128}, - {3, 6, 1, 24576, 8192, 1, 128}, - {3, 7, 1, 24576, 8192, 1, 128}, - {3, 8, 1, 24576, 8192, 2, 128}, - {3, 1, 1, 24576, 12288, 2, 128}, - {3, 2, 1, 24576, 12288, 2, 128}, - {3, 3, 1, 24576, 12288, 2, 128}, - {3, 4, 1, 24576, 12288, 2, 128}, - {3, 5, 1, 24576, 12288, 2, 126}, - {3, 6, 1, 24576, 12288, 1, 128}, - {3, 7, 1, 24576, 12288, 2, 96}, - {3, 8, 1, 24576, 12288, 1, 96}, - {3, 1, 1, 24576, 14336, 2, 128}, - {3, 2, 1, 24576, 14336, 2, 128}, - {3, 3, 1, 24576, 14336, 2, 128}, - {3, 4, 1, 24576, 14336, 2, 124}, - {3, 5, 1, 24576, 14336, 2, 112}, - {3, 6, 1, 24576, 14336, 2, 118}, - {3, 7, 1, 24576, 14336, 1, 128}, - {3, 8, 1, 24576, 14336, 2, 112}, - {3, 1, 1, 24576, 16384, 2, 128}, - {3, 2, 1, 24576, 16384, 2, 128}, - {3, 3, 1, 24576, 16384, 2, 128}, - {3, 4, 1, 24576, 16384, 2, 128}, - {3, 5, 1, 24576, 16384, 2, 128}, - {3, 6, 1, 24576, 16384, 1, 128}, - {3, 7, 1, 24576, 16384, 1, 128}, - {3, 8, 1, 24576, 16384, 2, 128}, - {3, 1, 1, 24576, 24576, 2, 128}, - {3, 2, 1, 24576, 24576, 2, 128}, - {3, 3, 1, 24576, 24576, 2, 128}, - {3, 4, 1, 24576, 24576, 2, 128}, - {3, 5, 1, 24576, 24576, 2, 120}, - {3, 6, 1, 24576, 24576, 1, 128}, - {3, 7, 1, 24576, 24576, 2, 96}, - {3, 8, 1, 24576, 24576, 1, 96}, - {3, 1, 1, 24576, 51200, 2, 128}, - {3, 2, 1, 24576, 51200, 2, 128}, - {3, 3, 1, 24576, 51200, 2, 128}, - {3, 4, 1, 24576, 51200, 2, 120}, - {3, 5, 1, 24576, 51200, 2, 126}, - {3, 6, 1, 24576, 51200, 2, 128}, - {3, 7, 1, 24576, 51200, 2, 120}, - {3, 8, 1, 24576, 51200, 2, 120}, - {3, 1, 1, 24576, 128000, 2, 128}, - {3, 2, 1, 24576, 128000, 2, 128}, - {3, 3, 1, 24576, 128000, 2, 128}, - {3, 4, 1, 24576, 128000, 2, 126}, - {3, 5, 1, 24576, 128000, 2, 128}, - {3, 6, 1, 24576, 128000, 2, 128}, - {3, 7, 1, 24576, 128000, 2, 124}, - {3, 8, 1, 24576, 128000, 2, 126}, - {2, 1, 1, 128, 128, 1, 2}, - {2, 2, 1, 128, 128, 1, 2}, - {2, 3, 1, 128, 128, 1, 2}, - {2, 4, 1, 128, 128, 1, 2}, - {2, 5, 1, 128, 128, 1, 2}, - {2, 6, 1, 128, 128, 1, 2}, - {2, 7, 1, 128, 128, 1, 2}, - {2, 8, 1, 128, 128, 1, 2}, - {2, 1, 1, 128, 256, 1, 4}, - {2, 2, 1, 128, 256, 1, 4}, - {2, 3, 1, 128, 256, 1, 4}, - {2, 4, 1, 128, 256, 1, 4}, - {2, 5, 1, 128, 256, 1, 4}, - {2, 6, 1, 128, 256, 1, 4}, - {2, 7, 1, 128, 256, 1, 4}, - {2, 8, 1, 128, 256, 1, 4}, - {2, 1, 1, 128, 512, 1, 8}, - {2, 2, 1, 128, 512, 1, 8}, - {2, 3, 1, 128, 512, 1, 8}, - {2, 4, 1, 128, 512, 1, 8}, - {2, 5, 1, 128, 512, 1, 8}, - {2, 6, 1, 128, 512, 1, 8}, - {2, 7, 1, 128, 512, 1, 8}, - {2, 8, 1, 128, 512, 1, 8}, - {2, 1, 1, 128, 1024, 1, 16}, - {2, 2, 1, 128, 1024, 1, 16}, - {2, 3, 1, 128, 1024, 1, 16}, - {2, 4, 1, 128, 1024, 1, 16}, - {2, 5, 1, 128, 1024, 1, 16}, - {2, 6, 1, 128, 1024, 1, 16}, - {2, 7, 1, 128, 1024, 1, 16}, - {2, 8, 1, 128, 1024, 1, 16}, - {2, 1, 1, 128, 2048, 1, 32}, - {2, 2, 1, 128, 2048, 1, 32}, - {2, 3, 1, 128, 2048, 1, 32}, - {2, 4, 1, 128, 2048, 1, 32}, - {2, 5, 1, 128, 2048, 1, 32}, - {2, 6, 1, 128, 2048, 1, 32}, - {2, 7, 1, 128, 2048, 1, 32}, - {2, 8, 1, 128, 2048, 1, 32}, - {2, 1, 1, 128, 3072, 1, 48}, - {2, 2, 1, 128, 3072, 1, 48}, - {2, 3, 1, 128, 3072, 1, 48}, - {2, 4, 1, 128, 3072, 1, 48}, - {2, 5, 1, 128, 3072, 1, 48}, - {2, 6, 1, 128, 3072, 1, 48}, - {2, 7, 1, 128, 3072, 1, 48}, - {2, 8, 1, 128, 3072, 1, 48}, - {2, 1, 1, 128, 4096, 1, 64}, - {2, 2, 1, 128, 4096, 1, 64}, - {2, 3, 1, 128, 4096, 1, 64}, - {2, 4, 1, 128, 4096, 1, 64}, - {2, 5, 1, 128, 4096, 1, 64}, - {2, 6, 1, 128, 4096, 1, 64}, - {2, 7, 1, 128, 4096, 1, 64}, - {2, 8, 1, 128, 4096, 1, 64}, - {2, 1, 1, 128, 5120, 1, 80}, - {2, 2, 1, 128, 5120, 1, 80}, - {2, 3, 1, 128, 5120, 1, 80}, - {2, 4, 1, 128, 5120, 1, 80}, - {2, 5, 1, 128, 5120, 1, 80}, - {2, 6, 1, 128, 5120, 1, 80}, - {2, 7, 1, 128, 5120, 1, 64}, - {2, 8, 1, 128, 5120, 1, 80}, - {2, 1, 1, 128, 8192, 1, 64}, - {2, 2, 1, 128, 8192, 1, 64}, - {2, 3, 1, 128, 8192, 1, 64}, - {2, 4, 1, 128, 8192, 1, 64}, - {2, 5, 1, 128, 8192, 1, 64}, - {2, 6, 1, 128, 8192, 1, 64}, - {2, 7, 1, 128, 8192, 1, 64}, - {2, 8, 1, 128, 8192, 1, 64}, - {2, 1, 1, 128, 12288, 1, 84}, - {2, 2, 1, 128, 12288, 1, 84}, - {2, 3, 1, 128, 12288, 1, 84}, - {2, 4, 1, 128, 12288, 1, 84}, - {2, 5, 1, 128, 12288, 1, 84}, - {2, 6, 1, 128, 12288, 1, 84}, - {2, 7, 1, 128, 12288, 1, 84}, - {2, 8, 1, 128, 12288, 1, 80}, - {2, 1, 1, 128, 14336, 2, 84}, - {2, 2, 1, 128, 14336, 1, 84}, - {2, 3, 1, 128, 14336, 1, 84}, - {2, 4, 1, 128, 14336, 1, 84}, - {2, 5, 1, 128, 14336, 1, 84}, - {2, 6, 1, 128, 14336, 1, 84}, - {2, 7, 1, 128, 14336, 1, 84}, - {2, 8, 1, 128, 14336, 1, 84}, - {2, 1, 1, 128, 16384, 2, 64}, - {2, 2, 1, 128, 16384, 2, 64}, - {2, 3, 1, 128, 16384, 1, 84}, - {2, 4, 1, 128, 16384, 2, 64}, - {2, 5, 1, 128, 16384, 1, 82}, - {2, 6, 1, 128, 16384, 1, 84}, - {2, 7, 1, 128, 16384, 1, 84}, - {2, 8, 1, 128, 16384, 1, 64}, - {2, 1, 1, 128, 24576, 2, 84}, - {2, 2, 1, 128, 24576, 2, 84}, - {2, 3, 1, 128, 24576, 1, 82}, - {2, 4, 1, 128, 24576, 2, 84}, - {2, 5, 1, 128, 24576, 2, 84}, - {2, 6, 1, 128, 24576, 2, 84}, - {2, 7, 1, 128, 24576, 2, 84}, - {2, 8, 1, 128, 24576, 2, 84}, - {2, 1, 1, 128, 51200, 2, 80}, - {2, 2, 1, 128, 51200, 2, 80}, - {2, 3, 1, 128, 51200, 2, 80}, - {2, 4, 1, 128, 51200, 2, 80}, - {2, 5, 1, 128, 51200, 2, 80}, - {2, 6, 1, 128, 51200, 2, 80}, - {2, 7, 1, 128, 51200, 2, 80}, - {2, 8, 1, 128, 51200, 2, 80}, - {2, 1, 1, 128, 128000, 2, 84}, - {2, 2, 1, 128, 128000, 2, 84}, - {2, 3, 1, 128, 128000, 2, 84}, - {2, 4, 1, 128, 128000, 2, 84}, - {2, 5, 1, 128, 128000, 2, 84}, - {2, 6, 1, 128, 128000, 2, 84}, - {2, 7, 1, 128, 128000, 2, 84}, - {2, 8, 1, 128, 128000, 2, 84}, - {2, 1, 1, 256, 128, 2, 2}, - {2, 2, 1, 256, 128, 2, 2}, - {2, 3, 1, 256, 128, 2, 2}, - {2, 4, 1, 256, 128, 2, 2}, - {2, 5, 1, 256, 128, 2, 2}, - {2, 6, 1, 256, 128, 2, 2}, - {2, 7, 1, 256, 128, 2, 2}, - {2, 8, 1, 256, 128, 2, 2}, - {2, 1, 1, 256, 256, 2, 4}, - {2, 2, 1, 256, 256, 2, 4}, - {2, 3, 1, 256, 256, 2, 4}, - {2, 4, 1, 256, 256, 2, 4}, - {2, 5, 1, 256, 256, 2, 4}, - {2, 6, 1, 256, 256, 2, 4}, - {2, 7, 1, 256, 256, 2, 4}, - {2, 8, 1, 256, 256, 2, 4}, - {2, 1, 1, 256, 512, 2, 8}, - {2, 2, 1, 256, 512, 2, 8}, - {2, 3, 1, 256, 512, 2, 8}, - {2, 4, 1, 256, 512, 2, 8}, - {2, 5, 1, 256, 512, 2, 8}, - {2, 6, 1, 256, 512, 2, 8}, - {2, 7, 1, 256, 512, 2, 8}, - {2, 8, 1, 256, 512, 2, 8}, - {2, 1, 1, 256, 1024, 2, 16}, - {2, 2, 1, 256, 1024, 2, 16}, - {2, 3, 1, 256, 1024, 2, 16}, - {2, 4, 1, 256, 1024, 2, 16}, - {2, 5, 1, 256, 1024, 1, 16}, - {2, 6, 1, 256, 1024, 2, 16}, - {2, 7, 1, 256, 1024, 1, 16}, - {2, 8, 1, 256, 1024, 1, 16}, - {2, 1, 1, 256, 2048, 2, 32}, - {2, 2, 1, 256, 2048, 2, 32}, - {2, 3, 1, 256, 2048, 1, 32}, - {2, 4, 1, 256, 2048, 1, 32}, - {2, 5, 1, 256, 2048, 1, 32}, - {2, 6, 1, 256, 2048, 1, 32}, - {2, 7, 1, 256, 2048, 1, 32}, - {2, 8, 1, 256, 2048, 1, 32}, - {2, 1, 1, 256, 3072, 2, 48}, - {2, 2, 1, 256, 3072, 1, 48}, - {2, 3, 1, 256, 3072, 1, 48}, - {2, 4, 1, 256, 3072, 1, 48}, - {2, 5, 1, 256, 3072, 1, 48}, - {2, 6, 1, 256, 3072, 1, 48}, - {2, 7, 1, 256, 3072, 1, 48}, - {2, 8, 1, 256, 3072, 1, 48}, - {2, 1, 1, 256, 4096, 2, 64}, - {2, 2, 1, 256, 4096, 1, 64}, - {2, 3, 1, 256, 4096, 1, 64}, - {2, 4, 1, 256, 4096, 1, 64}, - {2, 5, 1, 256, 4096, 1, 64}, - {2, 6, 1, 256, 4096, 1, 64}, - {2, 7, 1, 256, 4096, 1, 64}, - {2, 8, 1, 256, 4096, 1, 64}, - {2, 1, 1, 256, 5120, 1, 80}, - {2, 2, 1, 256, 5120, 1, 80}, - {2, 3, 1, 256, 5120, 1, 80}, - {2, 4, 1, 256, 5120, 1, 80}, - {2, 5, 1, 256, 5120, 1, 80}, - {2, 6, 1, 256, 5120, 1, 80}, - {2, 7, 1, 256, 5120, 1, 80}, - {2, 8, 1, 256, 5120, 1, 80}, - {2, 1, 1, 256, 8192, 2, 64}, - {2, 2, 1, 256, 8192, 2, 64}, - {2, 3, 1, 256, 8192, 1, 84}, - {2, 4, 1, 256, 8192, 2, 64}, - {2, 5, 1, 256, 8192, 1, 84}, - {2, 6, 1, 256, 8192, 1, 84}, - {2, 7, 1, 256, 8192, 1, 84}, - {2, 8, 1, 256, 8192, 1, 84}, - {2, 1, 1, 256, 12288, 2, 84}, - {2, 2, 1, 256, 12288, 2, 84}, - {2, 3, 1, 256, 12288, 1, 84}, - {2, 4, 1, 256, 12288, 2, 84}, - {2, 5, 1, 256, 12288, 1, 84}, - {2, 6, 1, 256, 12288, 1, 84}, - {2, 7, 1, 256, 12288, 2, 84}, - {2, 8, 1, 256, 12288, 1, 84}, - {2, 1, 1, 256, 14336, 2, 84}, - {2, 2, 1, 256, 14336, 2, 84}, - {2, 3, 1, 256, 14336, 1, 84}, - {2, 4, 1, 256, 14336, 2, 84}, - {2, 5, 1, 256, 14336, 2, 84}, - {2, 6, 1, 256, 14336, 2, 84}, - {2, 7, 1, 256, 14336, 2, 84}, - {2, 8, 1, 256, 14336, 1, 84}, - {2, 1, 1, 256, 16384, 2, 82}, - {2, 2, 1, 256, 16384, 2, 82}, - {2, 3, 1, 256, 16384, 1, 82}, - {2, 4, 1, 256, 16384, 2, 84}, - {2, 5, 1, 256, 16384, 2, 84}, - {2, 6, 1, 256, 16384, 2, 84}, - {2, 7, 1, 256, 16384, 2, 84}, - {2, 8, 1, 256, 16384, 1, 84}, - {2, 1, 1, 256, 24576, 2, 84}, - {2, 2, 1, 256, 24576, 2, 82}, - {2, 3, 1, 256, 24576, 2, 82}, - {2, 4, 1, 256, 24576, 2, 82}, - {2, 5, 1, 256, 24576, 2, 82}, - {2, 6, 1, 256, 24576, 2, 82}, - {2, 7, 1, 256, 24576, 2, 82}, - {2, 8, 1, 256, 24576, 2, 82}, - {2, 1, 1, 256, 51200, 2, 80}, - {2, 2, 1, 256, 51200, 2, 80}, - {2, 3, 1, 256, 51200, 2, 80}, - {2, 4, 1, 256, 51200, 2, 80}, - {2, 5, 1, 256, 51200, 2, 80}, - {2, 6, 1, 256, 51200, 2, 80}, - {2, 7, 1, 256, 51200, 2, 80}, - {2, 8, 1, 256, 51200, 2, 80}, - {2, 1, 1, 256, 128000, 2, 84}, - {2, 2, 1, 256, 128000, 2, 84}, - {2, 3, 1, 256, 128000, 2, 84}, - {2, 4, 1, 256, 128000, 2, 84}, - {2, 5, 1, 256, 128000, 2, 84}, - {2, 6, 1, 256, 128000, 2, 84}, - {2, 7, 1, 256, 128000, 2, 84}, - {2, 8, 1, 256, 128000, 2, 84}, - {2, 1, 1, 512, 128, 2, 2}, - {2, 2, 1, 512, 128, 2, 2}, - {2, 3, 1, 512, 128, 2, 4}, - {2, 4, 1, 512, 128, 2, 2}, - {2, 5, 1, 512, 128, 2, 4}, - {2, 6, 1, 512, 128, 2, 4}, - {2, 7, 1, 512, 128, 2, 4}, - {2, 8, 1, 512, 128, 2, 4}, - {2, 1, 1, 512, 256, 2, 4}, - {2, 2, 1, 512, 256, 2, 4}, - {2, 3, 1, 512, 256, 2, 8}, - {2, 4, 1, 512, 256, 2, 4}, - {2, 5, 1, 512, 256, 2, 8}, - {2, 6, 1, 512, 256, 2, 8}, - {2, 7, 1, 512, 256, 2, 8}, - {2, 8, 1, 512, 256, 2, 8}, - {2, 1, 1, 512, 512, 2, 8}, - {2, 2, 1, 512, 512, 2, 16}, - {2, 3, 1, 512, 512, 2, 16}, - {2, 4, 1, 512, 512, 2, 8}, - {2, 5, 1, 512, 512, 2, 16}, - {2, 6, 1, 512, 512, 1, 16}, - {2, 7, 1, 512, 512, 1, 16}, - {2, 8, 1, 512, 512, 1, 16}, - {2, 1, 1, 512, 1024, 2, 24}, - {2, 2, 1, 512, 1024, 2, 16}, - {2, 3, 1, 512, 1024, 1, 24}, - {2, 4, 1, 512, 1024, 1, 24}, - {2, 5, 1, 512, 1024, 1, 24}, - {2, 6, 1, 512, 1024, 1, 32}, - {2, 7, 1, 512, 1024, 1, 32}, - {2, 8, 1, 512, 1024, 1, 32}, - {2, 1, 1, 512, 2048, 2, 32}, - {2, 2, 1, 512, 2048, 1, 48}, - {2, 3, 1, 512, 2048, 1, 64}, - {2, 4, 1, 512, 2048, 1, 48}, - {2, 5, 1, 512, 2048, 1, 64}, - {2, 6, 1, 512, 2048, 1, 64}, - {2, 7, 1, 512, 2048, 1, 64}, - {2, 8, 1, 512, 2048, 1, 64}, - {2, 1, 1, 512, 3072, 2, 48}, - {2, 2, 1, 512, 3072, 1, 72}, - {2, 3, 1, 512, 3072, 1, 72}, - {2, 4, 1, 512, 3072, 1, 72}, - {2, 5, 1, 512, 3072, 1, 72}, - {2, 6, 1, 512, 3072, 1, 72}, - {2, 7, 1, 512, 3072, 1, 72}, - {2, 8, 1, 512, 3072, 1, 72}, - {2, 1, 1, 512, 4096, 2, 64}, - {2, 2, 1, 512, 4096, 2, 64}, - {2, 3, 1, 512, 4096, 1, 84}, - {2, 4, 1, 512, 4096, 2, 64}, - {2, 5, 1, 512, 4096, 1, 84}, - {2, 6, 1, 512, 4096, 1, 84}, - {2, 7, 1, 512, 4096, 1, 84}, - {2, 8, 1, 512, 4096, 1, 84}, - {2, 1, 1, 512, 5120, 2, 80}, - {2, 2, 1, 512, 5120, 2, 80}, - {2, 3, 1, 512, 5120, 1, 80}, - {2, 4, 1, 512, 5120, 2, 80}, - {2, 5, 1, 512, 5120, 1, 80}, - {2, 6, 1, 512, 5120, 1, 80}, - {2, 7, 1, 512, 5120, 2, 80}, - {2, 8, 1, 512, 5120, 1, 80}, - {2, 1, 1, 512, 8192, 2, 84}, - {2, 2, 1, 512, 8192, 2, 84}, - {2, 3, 1, 512, 8192, 1, 84}, - {2, 4, 1, 512, 8192, 2, 84}, - {2, 5, 1, 512, 8192, 2, 84}, - {2, 6, 1, 512, 8192, 2, 84}, - {2, 7, 1, 512, 8192, 2, 84}, - {2, 8, 1, 512, 8192, 2, 84}, - {2, 1, 1, 512, 12288, 2, 84}, - {2, 2, 1, 512, 12288, 2, 84}, - {2, 3, 1, 512, 12288, 2, 84}, - {2, 4, 1, 512, 12288, 2, 84}, - {2, 5, 1, 512, 12288, 2, 84}, - {2, 6, 1, 512, 12288, 2, 84}, - {2, 7, 1, 512, 12288, 2, 84}, - {2, 8, 1, 512, 12288, 2, 84}, - {2, 1, 1, 512, 14336, 2, 84}, - {2, 2, 1, 512, 14336, 2, 84}, - {2, 3, 1, 512, 14336, 2, 84}, - {2, 4, 1, 512, 14336, 2, 84}, - {2, 5, 1, 512, 14336, 2, 84}, - {2, 6, 1, 512, 14336, 2, 84}, - {2, 7, 1, 512, 14336, 2, 84}, - {2, 8, 1, 512, 14336, 2, 84}, - {2, 1, 1, 512, 16384, 2, 84}, - {2, 2, 1, 512, 16384, 2, 82}, - {2, 3, 1, 512, 16384, 2, 84}, - {2, 4, 1, 512, 16384, 2, 84}, - {2, 5, 1, 512, 16384, 2, 84}, - {2, 6, 1, 512, 16384, 2, 84}, - {2, 7, 1, 512, 16384, 2, 84}, - {2, 8, 1, 512, 16384, 2, 84}, - {2, 1, 1, 512, 24576, 2, 84}, - {2, 2, 1, 512, 24576, 2, 84}, - {2, 3, 1, 512, 24576, 2, 84}, - {2, 4, 1, 512, 24576, 2, 84}, - {2, 5, 1, 512, 24576, 2, 84}, - {2, 6, 1, 512, 24576, 2, 84}, - {2, 7, 1, 512, 24576, 2, 84}, - {2, 8, 1, 512, 24576, 2, 84}, - {2, 1, 1, 512, 51200, 2, 84}, - {2, 2, 1, 512, 51200, 2, 84}, - {2, 3, 1, 512, 51200, 2, 84}, - {2, 4, 1, 512, 51200, 2, 84}, - {2, 5, 1, 512, 51200, 2, 84}, - {2, 6, 1, 512, 51200, 2, 84}, - {2, 7, 1, 512, 51200, 2, 84}, - {2, 8, 1, 512, 51200, 2, 84}, - {2, 1, 1, 512, 128000, 2, 84}, - {2, 2, 1, 512, 128000, 2, 84}, - {2, 3, 1, 512, 128000, 2, 84}, - {2, 4, 1, 512, 128000, 2, 84}, - {2, 5, 1, 512, 128000, 2, 84}, - {2, 6, 1, 512, 128000, 2, 84}, - {2, 7, 1, 512, 128000, 2, 84}, - {2, 8, 1, 512, 128000, 2, 84}, - {2, 1, 1, 1024, 128, 2, 4}, - {2, 2, 1, 1024, 128, 2, 4}, - {2, 3, 1, 1024, 128, 2, 4}, - {2, 4, 1, 1024, 128, 2, 4}, - {2, 5, 1, 1024, 128, 2, 4}, - {2, 6, 1, 1024, 128, 2, 4}, - {2, 7, 1, 1024, 128, 2, 4}, - {2, 8, 1, 1024, 128, 2, 4}, - {2, 1, 1, 1024, 256, 2, 8}, - {2, 2, 1, 1024, 256, 2, 8}, - {2, 3, 1, 1024, 256, 2, 8}, - {2, 4, 1, 1024, 256, 2, 8}, - {2, 5, 1, 1024, 256, 2, 8}, - {2, 6, 1, 1024, 256, 2, 8}, - {2, 7, 1, 1024, 256, 2, 8}, - {2, 8, 1, 1024, 256, 2, 8}, - {2, 1, 1, 1024, 512, 2, 16}, - {2, 2, 1, 1024, 512, 2, 16}, - {2, 3, 1, 1024, 512, 2, 16}, - {2, 4, 1, 1024, 512, 2, 16}, - {2, 5, 1, 1024, 512, 2, 16}, - {2, 6, 1, 1024, 512, 2, 16}, - {2, 7, 1, 1024, 512, 2, 16}, - {2, 8, 1, 1024, 512, 2, 16}, - {2, 1, 1, 1024, 1024, 2, 32}, - {2, 2, 1, 1024, 1024, 2, 32}, - {2, 3, 1, 1024, 1024, 2, 32}, - {2, 4, 1, 1024, 1024, 2, 32}, - {2, 5, 1, 1024, 1024, 2, 32}, - {2, 6, 1, 1024, 1024, 2, 32}, - {2, 7, 1, 1024, 1024, 2, 32}, - {2, 8, 1, 1024, 1024, 2, 32}, - {2, 1, 1, 1024, 2048, 2, 64}, - {2, 2, 1, 1024, 2048, 2, 64}, - {2, 3, 1, 1024, 2048, 1, 64}, - {2, 4, 1, 1024, 2048, 2, 64}, - {2, 5, 1, 1024, 2048, 2, 64}, - {2, 6, 1, 1024, 2048, 2, 64}, - {2, 7, 1, 1024, 2048, 2, 64}, - {2, 8, 1, 1024, 2048, 1, 80}, - {2, 1, 1, 1024, 3072, 2, 72}, - {2, 2, 1, 1024, 3072, 2, 72}, - {2, 3, 1, 1024, 3072, 2, 72}, - {2, 4, 1, 1024, 3072, 2, 72}, - {2, 5, 1, 1024, 3072, 2, 72}, - {2, 6, 1, 1024, 3072, 2, 72}, - {2, 7, 1, 1024, 3072, 2, 72}, - {2, 8, 1, 1024, 3072, 2, 82}, - {2, 1, 1, 1024, 4096, 2, 84}, - {2, 2, 1, 1024, 4096, 2, 84}, - {2, 3, 1, 1024, 4096, 2, 84}, - {2, 4, 1, 1024, 4096, 2, 84}, - {2, 5, 1, 1024, 4096, 2, 84}, - {2, 6, 1, 1024, 4096, 2, 84}, - {2, 7, 1, 1024, 4096, 2, 84}, - {2, 8, 1, 1024, 4096, 2, 84}, - {2, 1, 1, 1024, 5120, 2, 80}, - {2, 2, 1, 1024, 5120, 2, 80}, - {2, 3, 1, 1024, 5120, 2, 80}, - {2, 4, 1, 1024, 5120, 2, 80}, - {2, 5, 1, 1024, 5120, 2, 80}, - {2, 6, 1, 1024, 5120, 2, 80}, - {2, 7, 1, 1024, 5120, 2, 80}, - {2, 8, 1, 1024, 5120, 2, 80}, - {2, 1, 1, 1024, 8192, 2, 84}, - {2, 2, 1, 1024, 8192, 2, 84}, - {2, 3, 1, 1024, 8192, 2, 84}, - {2, 4, 1, 1024, 8192, 2, 82}, - {2, 5, 1, 1024, 8192, 2, 84}, - {2, 6, 1, 1024, 8192, 2, 84}, - {2, 7, 1, 1024, 8192, 2, 84}, - {2, 8, 1, 1024, 8192, 2, 84}, - {2, 1, 1, 1024, 12288, 2, 84}, - {2, 2, 1, 1024, 12288, 2, 84}, - {2, 3, 1, 1024, 12288, 2, 84}, - {2, 4, 1, 1024, 12288, 2, 84}, - {2, 5, 1, 1024, 12288, 2, 84}, - {2, 6, 1, 1024, 12288, 2, 84}, - {2, 7, 1, 1024, 12288, 2, 84}, - {2, 8, 1, 1024, 12288, 2, 84}, - {2, 1, 1, 1024, 14336, 2, 84}, - {2, 2, 1, 1024, 14336, 2, 84}, - {2, 3, 1, 1024, 14336, 2, 84}, - {2, 4, 1, 1024, 14336, 2, 84}, - {2, 5, 1, 1024, 14336, 2, 84}, - {2, 6, 1, 1024, 14336, 2, 84}, - {2, 7, 1, 1024, 14336, 2, 84}, - {2, 8, 1, 1024, 14336, 2, 84}, - {2, 1, 1, 1024, 16384, 2, 84}, - {2, 2, 1, 1024, 16384, 2, 84}, - {2, 3, 1, 1024, 16384, 2, 84}, - {2, 4, 1, 1024, 16384, 2, 84}, - {2, 5, 1, 1024, 16384, 2, 84}, - {2, 6, 1, 1024, 16384, 2, 84}, - {2, 7, 1, 1024, 16384, 2, 84}, - {2, 8, 1, 1024, 16384, 2, 84}, - {2, 1, 1, 1024, 24576, 2, 84}, - {2, 2, 1, 1024, 24576, 2, 84}, - {2, 3, 1, 1024, 24576, 2, 84}, - {2, 4, 1, 1024, 24576, 2, 84}, - {2, 5, 1, 1024, 24576, 2, 84}, - {2, 6, 1, 1024, 24576, 2, 84}, - {2, 7, 1, 1024, 24576, 2, 84}, - {2, 8, 1, 1024, 24576, 2, 84}, - {2, 1, 1, 1024, 51200, 2, 84}, - {2, 2, 1, 1024, 51200, 2, 84}, - {2, 3, 1, 1024, 51200, 2, 84}, - {2, 4, 1, 1024, 51200, 2, 84}, - {2, 5, 1, 1024, 51200, 2, 84}, - {2, 6, 1, 1024, 51200, 2, 84}, - {2, 7, 1, 1024, 51200, 2, 84}, - {2, 8, 1, 1024, 51200, 2, 84}, - {2, 1, 1, 1024, 128000, 2, 84}, - {2, 2, 1, 1024, 128000, 2, 84}, - {2, 3, 1, 1024, 128000, 2, 84}, - {2, 4, 1, 1024, 128000, 2, 84}, - {2, 5, 1, 1024, 128000, 2, 84}, - {2, 6, 1, 1024, 128000, 2, 84}, - {2, 7, 1, 1024, 128000, 2, 84}, - {2, 8, 1, 1024, 128000, 2, 84}, - {2, 1, 1, 2048, 128, 2, 6}, - {2, 2, 1, 2048, 128, 2, 6}, - {2, 3, 1, 2048, 128, 2, 6}, - {2, 4, 1, 2048, 128, 2, 6}, - {2, 5, 1, 2048, 128, 2, 6}, - {2, 6, 1, 2048, 128, 2, 6}, - {2, 7, 1, 2048, 128, 2, 8}, - {2, 8, 1, 2048, 128, 2, 6}, - {2, 1, 1, 2048, 256, 2, 10}, - {2, 2, 1, 2048, 256, 2, 10}, - {2, 3, 1, 2048, 256, 2, 12}, - {2, 4, 1, 2048, 256, 2, 10}, - {2, 5, 1, 2048, 256, 2, 12}, - {2, 6, 1, 2048, 256, 2, 12}, - {2, 7, 1, 2048, 256, 2, 12}, - {2, 8, 1, 2048, 256, 2, 12}, - {2, 1, 1, 2048, 512, 2, 20}, - {2, 2, 1, 2048, 512, 2, 20}, - {2, 3, 1, 2048, 512, 2, 26}, - {2, 4, 1, 2048, 512, 2, 20}, - {2, 5, 1, 2048, 512, 2, 24}, - {2, 6, 1, 2048, 512, 2, 24}, - {2, 7, 1, 2048, 512, 2, 24}, - {2, 8, 1, 2048, 512, 2, 26}, - {2, 1, 1, 2048, 1024, 2, 40}, - {2, 2, 1, 2048, 1024, 2, 40}, - {2, 3, 1, 2048, 1024, 2, 52}, - {2, 4, 1, 2048, 1024, 2, 40}, - {2, 5, 1, 2048, 1024, 2, 40}, - {2, 6, 1, 2048, 1024, 2, 40}, - {2, 7, 1, 2048, 1024, 2, 48}, - {2, 8, 1, 2048, 1024, 2, 48}, - {2, 1, 1, 2048, 2048, 2, 80}, - {2, 2, 1, 2048, 2048, 2, 80}, - {2, 3, 1, 2048, 2048, 2, 80}, - {2, 4, 1, 2048, 2048, 2, 80}, - {2, 5, 1, 2048, 2048, 2, 80}, - {2, 6, 1, 2048, 2048, 2, 80}, - {2, 7, 1, 2048, 2048, 2, 84}, - {2, 8, 1, 2048, 2048, 2, 80}, - {2, 1, 1, 2048, 3072, 2, 78}, - {2, 2, 1, 2048, 3072, 2, 84}, - {2, 3, 1, 2048, 3072, 2, 84}, - {2, 4, 1, 2048, 3072, 2, 82}, - {2, 5, 1, 2048, 3072, 2, 84}, - {2, 6, 1, 2048, 3072, 2, 82}, - {2, 7, 1, 2048, 3072, 2, 82}, - {2, 8, 1, 2048, 3072, 2, 82}, - {2, 1, 1, 2048, 4096, 2, 84}, - {2, 2, 1, 2048, 4096, 2, 84}, - {2, 3, 1, 2048, 4096, 2, 84}, - {2, 4, 1, 2048, 4096, 2, 84}, - {2, 5, 1, 2048, 4096, 2, 84}, - {2, 6, 1, 2048, 4096, 2, 84}, - {2, 7, 1, 2048, 4096, 2, 84}, - {2, 8, 1, 2048, 4096, 2, 84}, - {2, 1, 1, 2048, 5120, 2, 80}, - {2, 2, 1, 2048, 5120, 2, 80}, - {2, 3, 1, 2048, 5120, 2, 84}, - {2, 4, 1, 2048, 5120, 2, 84}, - {2, 5, 1, 2048, 5120, 2, 84}, - {2, 6, 1, 2048, 5120, 2, 84}, - {2, 7, 1, 2048, 5120, 2, 84}, - {2, 8, 1, 2048, 5120, 2, 84}, - {2, 1, 1, 2048, 8192, 2, 84}, - {2, 2, 1, 2048, 8192, 2, 84}, - {2, 3, 1, 2048, 8192, 2, 84}, - {2, 4, 1, 2048, 8192, 2, 84}, - {2, 5, 1, 2048, 8192, 2, 84}, - {2, 6, 1, 2048, 8192, 2, 84}, - {2, 7, 1, 2048, 8192, 2, 84}, - {2, 8, 1, 2048, 8192, 2, 84}, - {2, 1, 1, 2048, 12288, 2, 84}, - {2, 2, 1, 2048, 12288, 2, 84}, - {2, 3, 1, 2048, 12288, 2, 84}, - {2, 4, 1, 2048, 12288, 2, 84}, - {2, 5, 1, 2048, 12288, 2, 84}, - {2, 6, 1, 2048, 12288, 2, 84}, - {2, 7, 1, 2048, 12288, 2, 84}, - {2, 8, 1, 2048, 12288, 2, 84}, - {2, 1, 1, 2048, 14336, 2, 84}, - {2, 2, 1, 2048, 14336, 2, 84}, - {2, 3, 1, 2048, 14336, 2, 84}, - {2, 4, 1, 2048, 14336, 2, 84}, - {2, 5, 1, 2048, 14336, 2, 84}, - {2, 6, 1, 2048, 14336, 2, 84}, - {2, 7, 1, 2048, 14336, 2, 84}, - {2, 8, 1, 2048, 14336, 2, 84}, - {2, 1, 1, 2048, 16384, 2, 84}, - {2, 2, 1, 2048, 16384, 2, 84}, - {2, 3, 1, 2048, 16384, 2, 84}, - {2, 4, 1, 2048, 16384, 2, 84}, - {2, 5, 1, 2048, 16384, 2, 84}, - {2, 6, 1, 2048, 16384, 2, 84}, - {2, 7, 1, 2048, 16384, 2, 84}, - {2, 8, 1, 2048, 16384, 2, 84}, - {2, 1, 1, 2048, 24576, 2, 84}, - {2, 2, 1, 2048, 24576, 2, 84}, - {2, 3, 1, 2048, 24576, 2, 84}, - {2, 4, 1, 2048, 24576, 2, 84}, - {2, 5, 1, 2048, 24576, 2, 84}, - {2, 6, 1, 2048, 24576, 2, 84}, - {2, 7, 1, 2048, 24576, 2, 84}, - {2, 8, 1, 2048, 24576, 2, 84}, - {2, 1, 1, 2048, 51200, 2, 84}, - {2, 2, 1, 2048, 51200, 2, 84}, - {2, 3, 1, 2048, 51200, 2, 84}, - {2, 4, 1, 2048, 51200, 2, 84}, - {2, 5, 1, 2048, 51200, 2, 84}, - {2, 6, 1, 2048, 51200, 2, 84}, - {2, 7, 1, 2048, 51200, 2, 84}, - {2, 8, 1, 2048, 51200, 2, 84}, - {2, 1, 1, 2048, 128000, 2, 84}, - {2, 2, 1, 2048, 128000, 2, 84}, - {2, 3, 1, 2048, 128000, 2, 84}, - {2, 4, 1, 2048, 128000, 2, 84}, - {2, 5, 1, 2048, 128000, 2, 84}, - {2, 6, 1, 2048, 128000, 2, 84}, - {2, 7, 1, 2048, 128000, 2, 84}, - {2, 8, 1, 2048, 128000, 2, 84}, - {2, 1, 1, 3072, 128, 2, 8}, - {2, 2, 1, 3072, 128, 2, 8}, - {2, 3, 1, 3072, 128, 2, 8}, - {2, 4, 1, 3072, 128, 2, 8}, - {2, 5, 1, 3072, 128, 2, 8}, - {2, 6, 1, 3072, 128, 2, 8}, - {2, 7, 1, 3072, 128, 2, 8}, - {2, 8, 1, 3072, 128, 2, 8}, - {2, 1, 1, 3072, 256, 2, 16}, - {2, 2, 1, 3072, 256, 2, 16}, - {2, 3, 1, 3072, 256, 2, 16}, - {2, 4, 1, 3072, 256, 2, 16}, - {2, 5, 1, 3072, 256, 2, 16}, - {2, 6, 1, 3072, 256, 2, 16}, - {2, 7, 1, 3072, 256, 2, 16}, - {2, 8, 1, 3072, 256, 2, 16}, - {2, 1, 1, 3072, 512, 2, 24}, - {2, 2, 1, 3072, 512, 2, 32}, - {2, 3, 1, 3072, 512, 2, 32}, - {2, 4, 1, 3072, 512, 2, 24}, - {2, 5, 1, 3072, 512, 2, 32}, - {2, 6, 1, 3072, 512, 2, 32}, - {2, 7, 1, 3072, 512, 2, 32}, - {2, 8, 1, 3072, 512, 2, 32}, - {2, 1, 1, 3072, 1024, 2, 56}, - {2, 2, 1, 3072, 1024, 2, 48}, - {2, 3, 1, 3072, 1024, 2, 64}, - {2, 4, 1, 3072, 1024, 2, 48}, - {2, 5, 1, 3072, 1024, 2, 64}, - {2, 6, 1, 3072, 1024, 2, 64}, - {2, 7, 1, 3072, 1024, 2, 64}, - {2, 8, 1, 3072, 1024, 2, 64}, - {2, 1, 1, 3072, 2048, 2, 82}, - {2, 2, 1, 3072, 2048, 2, 84}, - {2, 3, 1, 3072, 2048, 2, 82}, - {2, 4, 1, 3072, 2048, 2, 82}, - {2, 5, 1, 3072, 2048, 2, 82}, - {2, 6, 1, 3072, 2048, 2, 84}, - {2, 7, 1, 3072, 2048, 2, 82}, - {2, 8, 1, 3072, 2048, 2, 82}, - {2, 1, 1, 3072, 3072, 2, 84}, - {2, 2, 1, 3072, 3072, 2, 84}, - {2, 3, 1, 3072, 3072, 2, 84}, - {2, 4, 1, 3072, 3072, 2, 82}, - {2, 5, 1, 3072, 3072, 2, 84}, - {2, 6, 1, 3072, 3072, 2, 82}, - {2, 7, 1, 3072, 3072, 2, 84}, - {2, 8, 1, 3072, 3072, 2, 84}, - {2, 1, 1, 3072, 4096, 2, 84}, - {2, 2, 1, 3072, 4096, 2, 84}, - {2, 3, 1, 3072, 4096, 2, 84}, - {2, 4, 1, 3072, 4096, 2, 84}, - {2, 5, 1, 3072, 4096, 2, 84}, - {2, 6, 1, 3072, 4096, 2, 84}, - {2, 7, 1, 3072, 4096, 2, 84}, - {2, 8, 1, 3072, 4096, 2, 84}, - {2, 1, 1, 3072, 5120, 2, 84}, - {2, 2, 1, 3072, 5120, 2, 84}, - {2, 3, 1, 3072, 5120, 2, 84}, - {2, 4, 1, 3072, 5120, 2, 84}, - {2, 5, 1, 3072, 5120, 2, 84}, - {2, 6, 1, 3072, 5120, 2, 84}, - {2, 7, 1, 3072, 5120, 2, 84}, - {2, 8, 1, 3072, 5120, 2, 84}, - {2, 1, 1, 3072, 8192, 2, 84}, - {2, 2, 1, 3072, 8192, 2, 84}, - {2, 3, 1, 3072, 8192, 2, 84}, - {2, 4, 1, 3072, 8192, 2, 84}, - {2, 5, 1, 3072, 8192, 2, 84}, - {2, 6, 1, 3072, 8192, 2, 84}, - {2, 7, 1, 3072, 8192, 2, 84}, - {2, 8, 1, 3072, 8192, 2, 84}, - {2, 1, 1, 3072, 12288, 2, 84}, - {2, 2, 1, 3072, 12288, 2, 84}, - {2, 3, 1, 3072, 12288, 2, 84}, - {2, 4, 1, 3072, 12288, 2, 84}, - {2, 5, 1, 3072, 12288, 2, 84}, - {2, 6, 1, 3072, 12288, 2, 84}, - {2, 7, 1, 3072, 12288, 2, 84}, - {2, 8, 1, 3072, 12288, 2, 84}, - {2, 1, 1, 3072, 14336, 2, 84}, - {2, 2, 1, 3072, 14336, 2, 84}, - {2, 3, 1, 3072, 14336, 2, 84}, - {2, 4, 1, 3072, 14336, 2, 84}, - {2, 5, 1, 3072, 14336, 2, 84}, - {2, 6, 1, 3072, 14336, 2, 84}, - {2, 7, 1, 3072, 14336, 2, 84}, - {2, 8, 1, 3072, 14336, 2, 84}, - {2, 1, 1, 3072, 16384, 2, 84}, - {2, 2, 1, 3072, 16384, 2, 84}, - {2, 3, 1, 3072, 16384, 2, 84}, - {2, 4, 1, 3072, 16384, 2, 84}, - {2, 5, 1, 3072, 16384, 2, 84}, - {2, 6, 1, 3072, 16384, 2, 84}, - {2, 7, 1, 3072, 16384, 2, 84}, - {2, 8, 1, 3072, 16384, 2, 84}, - {2, 1, 1, 3072, 24576, 2, 84}, - {2, 2, 1, 3072, 24576, 2, 84}, - {2, 3, 1, 3072, 24576, 2, 84}, - {2, 4, 1, 3072, 24576, 2, 84}, - {2, 5, 1, 3072, 24576, 2, 84}, - {2, 6, 1, 3072, 24576, 2, 84}, - {2, 7, 1, 3072, 24576, 2, 84}, - {2, 8, 1, 3072, 24576, 2, 84}, - {2, 1, 1, 3072, 51200, 2, 84}, - {2, 2, 1, 3072, 51200, 2, 84}, - {2, 3, 1, 3072, 51200, 2, 84}, - {2, 4, 1, 3072, 51200, 2, 84}, - {2, 5, 1, 3072, 51200, 2, 84}, - {2, 6, 1, 3072, 51200, 2, 84}, - {2, 7, 1, 3072, 51200, 2, 84}, - {2, 8, 1, 3072, 51200, 2, 84}, - {2, 1, 1, 3072, 128000, 2, 84}, - {2, 2, 1, 3072, 128000, 2, 84}, - {2, 3, 1, 3072, 128000, 2, 84}, - {2, 4, 1, 3072, 128000, 2, 84}, - {2, 5, 1, 3072, 128000, 2, 84}, - {2, 6, 1, 3072, 128000, 2, 84}, - {2, 7, 1, 3072, 128000, 2, 84}, - {2, 8, 1, 3072, 128000, 2, 84}, - {2, 1, 1, 4096, 128, 2, 8}, - {2, 2, 1, 4096, 128, 2, 8}, - {2, 3, 1, 4096, 128, 2, 8}, - {2, 4, 1, 4096, 128, 2, 8}, - {2, 5, 1, 4096, 128, 2, 8}, - {2, 6, 1, 4096, 128, 2, 8}, - {2, 7, 1, 4096, 128, 2, 10}, - {2, 8, 1, 4096, 128, 2, 8}, - {2, 1, 1, 4096, 256, 2, 16}, - {2, 2, 1, 4096, 256, 2, 16}, - {2, 3, 1, 4096, 256, 2, 16}, - {2, 4, 1, 4096, 256, 2, 16}, - {2, 5, 1, 4096, 256, 2, 16}, - {2, 6, 1, 4096, 256, 2, 16}, - {2, 7, 1, 4096, 256, 2, 20}, - {2, 8, 1, 4096, 256, 2, 20}, - {2, 1, 1, 4096, 512, 2, 32}, - {2, 2, 1, 4096, 512, 2, 32}, - {2, 3, 1, 4096, 512, 2, 32}, - {2, 4, 1, 4096, 512, 2, 32}, - {2, 5, 1, 4096, 512, 2, 32}, - {2, 6, 1, 4096, 512, 2, 32}, - {2, 7, 1, 4096, 512, 2, 32}, - {2, 8, 1, 4096, 512, 2, 32}, - {2, 1, 1, 4096, 1024, 2, 64}, - {2, 2, 1, 4096, 1024, 2, 64}, - {2, 3, 1, 4096, 1024, 2, 64}, - {2, 4, 1, 4096, 1024, 2, 64}, - {2, 5, 1, 4096, 1024, 2, 64}, - {2, 6, 1, 4096, 1024, 2, 64}, - {2, 7, 1, 4096, 1024, 2, 70}, - {2, 8, 1, 4096, 1024, 2, 64}, - {2, 1, 1, 4096, 2048, 2, 82}, - {2, 2, 1, 4096, 2048, 2, 82}, - {2, 3, 1, 4096, 2048, 2, 82}, - {2, 4, 1, 4096, 2048, 2, 82}, - {2, 5, 1, 4096, 2048, 2, 82}, - {2, 6, 1, 4096, 2048, 2, 82}, - {2, 7, 1, 4096, 2048, 2, 82}, - {2, 8, 1, 4096, 2048, 2, 82}, - {2, 1, 1, 4096, 3072, 2, 84}, - {2, 2, 1, 4096, 3072, 2, 84}, - {2, 3, 1, 4096, 3072, 2, 84}, - {2, 4, 1, 4096, 3072, 2, 82}, - {2, 5, 1, 4096, 3072, 2, 84}, - {2, 6, 1, 4096, 3072, 2, 84}, - {2, 7, 1, 4096, 3072, 2, 84}, - {2, 8, 1, 4096, 3072, 2, 84}, - {2, 1, 1, 4096, 4096, 2, 84}, - {2, 2, 1, 4096, 4096, 2, 84}, - {2, 3, 1, 4096, 4096, 2, 84}, - {2, 4, 1, 4096, 4096, 2, 84}, - {2, 5, 1, 4096, 4096, 2, 84}, - {2, 6, 1, 4096, 4096, 2, 84}, - {2, 7, 1, 4096, 4096, 2, 84}, - {2, 8, 1, 4096, 4096, 2, 84}, - {2, 1, 1, 4096, 5120, 2, 84}, - {2, 2, 1, 4096, 5120, 2, 84}, - {2, 3, 1, 4096, 5120, 2, 84}, - {2, 4, 1, 4096, 5120, 2, 84}, - {2, 5, 1, 4096, 5120, 2, 84}, - {2, 6, 1, 4096, 5120, 2, 84}, - {2, 7, 1, 4096, 5120, 2, 84}, - {2, 8, 1, 4096, 5120, 2, 84}, - {2, 1, 1, 4096, 8192, 2, 84}, - {2, 2, 1, 4096, 8192, 2, 84}, - {2, 3, 1, 4096, 8192, 2, 84}, - {2, 4, 1, 4096, 8192, 2, 84}, - {2, 5, 1, 4096, 8192, 2, 84}, - {2, 6, 1, 4096, 8192, 2, 84}, - {2, 7, 1, 4096, 8192, 2, 84}, - {2, 8, 1, 4096, 8192, 2, 84}, - {2, 1, 1, 4096, 12288, 2, 84}, - {2, 2, 1, 4096, 12288, 2, 84}, - {2, 3, 1, 4096, 12288, 2, 84}, - {2, 4, 1, 4096, 12288, 2, 84}, - {2, 5, 1, 4096, 12288, 2, 84}, - {2, 6, 1, 4096, 12288, 2, 84}, - {2, 7, 1, 4096, 12288, 2, 84}, - {2, 8, 1, 4096, 12288, 2, 84}, - {2, 1, 1, 4096, 14336, 2, 84}, - {2, 2, 1, 4096, 14336, 2, 84}, - {2, 3, 1, 4096, 14336, 2, 84}, - {2, 4, 1, 4096, 14336, 2, 84}, - {2, 5, 1, 4096, 14336, 2, 84}, - {2, 6, 1, 4096, 14336, 2, 84}, - {2, 7, 1, 4096, 14336, 2, 84}, - {2, 8, 1, 4096, 14336, 2, 84}, - {2, 1, 1, 4096, 16384, 2, 84}, - {2, 2, 1, 4096, 16384, 2, 84}, - {2, 3, 1, 4096, 16384, 2, 84}, - {2, 4, 1, 4096, 16384, 2, 84}, - {2, 5, 1, 4096, 16384, 2, 84}, - {2, 6, 1, 4096, 16384, 2, 84}, - {2, 7, 1, 4096, 16384, 2, 84}, - {2, 8, 1, 4096, 16384, 2, 84}, - {2, 1, 1, 4096, 24576, 2, 84}, - {2, 2, 1, 4096, 24576, 2, 84}, - {2, 3, 1, 4096, 24576, 2, 84}, - {2, 4, 1, 4096, 24576, 2, 84}, - {2, 5, 1, 4096, 24576, 2, 84}, - {2, 6, 1, 4096, 24576, 2, 84}, - {2, 7, 1, 4096, 24576, 2, 84}, - {2, 8, 1, 4096, 24576, 2, 84}, - {2, 1, 1, 4096, 51200, 2, 84}, - {2, 2, 1, 4096, 51200, 2, 84}, - {2, 3, 1, 4096, 51200, 2, 84}, - {2, 4, 1, 4096, 51200, 2, 84}, - {2, 5, 1, 4096, 51200, 2, 84}, - {2, 6, 1, 4096, 51200, 2, 84}, - {2, 7, 1, 4096, 51200, 2, 84}, - {2, 8, 1, 4096, 51200, 2, 84}, - {2, 1, 1, 4096, 128000, 2, 84}, - {2, 2, 1, 4096, 128000, 2, 84}, - {2, 3, 1, 4096, 128000, 2, 84}, - {2, 4, 1, 4096, 128000, 2, 84}, - {2, 5, 1, 4096, 128000, 2, 84}, - {2, 6, 1, 4096, 128000, 2, 84}, - {2, 7, 1, 4096, 128000, 2, 84}, - {2, 8, 1, 4096, 128000, 2, 84}, - {2, 1, 1, 5120, 128, 2, 10}, - {2, 2, 1, 5120, 128, 2, 10}, - {2, 3, 1, 5120, 128, 2, 10}, - {2, 4, 1, 5120, 128, 2, 10}, - {2, 5, 1, 5120, 128, 2, 10}, - {2, 6, 1, 5120, 128, 2, 10}, - {2, 7, 1, 5120, 128, 2, 10}, - {2, 8, 1, 5120, 128, 2, 10}, - {2, 1, 1, 5120, 256, 2, 18}, - {2, 2, 1, 5120, 256, 2, 18}, - {2, 3, 1, 5120, 256, 2, 20}, - {2, 4, 1, 5120, 256, 2, 18}, - {2, 5, 1, 5120, 256, 2, 20}, - {2, 6, 1, 5120, 256, 2, 20}, - {2, 7, 1, 5120, 256, 2, 20}, - {2, 8, 1, 5120, 256, 2, 20}, - {2, 1, 1, 5120, 512, 2, 32}, - {2, 2, 1, 5120, 512, 2, 36}, - {2, 3, 1, 5120, 512, 2, 40}, - {2, 4, 1, 5120, 512, 2, 36}, - {2, 5, 1, 5120, 512, 2, 40}, - {2, 6, 1, 5120, 512, 2, 40}, - {2, 7, 1, 5120, 512, 2, 40}, - {2, 8, 1, 5120, 512, 2, 40}, - {2, 1, 1, 5120, 1024, 2, 64}, - {2, 2, 1, 5120, 1024, 2, 64}, - {2, 3, 1, 5120, 1024, 2, 80}, - {2, 4, 1, 5120, 1024, 2, 72}, - {2, 5, 1, 5120, 1024, 2, 78}, - {2, 6, 1, 5120, 1024, 2, 78}, - {2, 7, 1, 5120, 1024, 2, 78}, - {2, 8, 1, 5120, 1024, 2, 78}, - {2, 1, 1, 5120, 2048, 2, 84}, - {2, 2, 1, 5120, 2048, 2, 84}, - {2, 3, 1, 5120, 2048, 2, 84}, - {2, 4, 1, 5120, 2048, 2, 84}, - {2, 5, 1, 5120, 2048, 2, 84}, - {2, 6, 1, 5120, 2048, 2, 84}, - {2, 7, 1, 5120, 2048, 2, 84}, - {2, 8, 1, 5120, 2048, 2, 84}, - {2, 1, 1, 5120, 3072, 2, 84}, - {2, 2, 1, 5120, 3072, 2, 84}, - {2, 3, 1, 5120, 3072, 2, 84}, - {2, 4, 1, 5120, 3072, 2, 84}, - {2, 5, 1, 5120, 3072, 2, 84}, - {2, 6, 1, 5120, 3072, 2, 84}, - {2, 7, 1, 5120, 3072, 2, 84}, - {2, 8, 1, 5120, 3072, 2, 84}, - {2, 1, 1, 5120, 4096, 2, 84}, - {2, 2, 1, 5120, 4096, 2, 84}, - {2, 3, 1, 5120, 4096, 2, 84}, - {2, 4, 1, 5120, 4096, 2, 84}, - {2, 5, 1, 5120, 4096, 2, 84}, - {2, 6, 1, 5120, 4096, 2, 84}, - {2, 7, 1, 5120, 4096, 2, 84}, - {2, 8, 1, 5120, 4096, 2, 84}, - {2, 1, 1, 5120, 5120, 2, 84}, - {2, 2, 1, 5120, 5120, 2, 84}, - {2, 3, 1, 5120, 5120, 2, 84}, - {2, 4, 1, 5120, 5120, 2, 84}, - {2, 5, 1, 5120, 5120, 2, 84}, - {2, 6, 1, 5120, 5120, 2, 84}, - {2, 7, 1, 5120, 5120, 2, 84}, - {2, 8, 1, 5120, 5120, 2, 84}, - {2, 1, 1, 5120, 8192, 2, 84}, - {2, 2, 1, 5120, 8192, 2, 84}, - {2, 3, 1, 5120, 8192, 2, 84}, - {2, 4, 1, 5120, 8192, 2, 84}, - {2, 5, 1, 5120, 8192, 2, 84}, - {2, 6, 1, 5120, 8192, 2, 84}, - {2, 7, 1, 5120, 8192, 2, 84}, - {2, 8, 1, 5120, 8192, 2, 84}, - {2, 1, 1, 5120, 12288, 2, 84}, - {2, 2, 1, 5120, 12288, 2, 84}, - {2, 3, 1, 5120, 12288, 2, 84}, - {2, 4, 1, 5120, 12288, 2, 84}, - {2, 5, 1, 5120, 12288, 2, 84}, - {2, 6, 1, 5120, 12288, 2, 84}, - {2, 7, 1, 5120, 12288, 2, 84}, - {2, 8, 1, 5120, 12288, 2, 84}, - {2, 1, 1, 5120, 14336, 2, 84}, - {2, 2, 1, 5120, 14336, 2, 84}, - {2, 3, 1, 5120, 14336, 2, 84}, - {2, 4, 1, 5120, 14336, 2, 84}, - {2, 5, 1, 5120, 14336, 2, 84}, - {2, 6, 1, 5120, 14336, 2, 84}, - {2, 7, 1, 5120, 14336, 2, 84}, - {2, 8, 1, 5120, 14336, 2, 84}, - {2, 1, 1, 5120, 16384, 2, 84}, - {2, 2, 1, 5120, 16384, 2, 84}, - {2, 3, 1, 5120, 16384, 2, 84}, - {2, 4, 1, 5120, 16384, 2, 84}, - {2, 5, 1, 5120, 16384, 2, 84}, - {2, 6, 1, 5120, 16384, 2, 84}, - {2, 7, 1, 5120, 16384, 2, 84}, - {2, 8, 1, 5120, 16384, 2, 84}, - {2, 1, 1, 5120, 24576, 2, 84}, - {2, 2, 1, 5120, 24576, 2, 84}, - {2, 3, 1, 5120, 24576, 2, 84}, - {2, 4, 1, 5120, 24576, 2, 84}, - {2, 5, 1, 5120, 24576, 2, 84}, - {2, 6, 1, 5120, 24576, 2, 84}, - {2, 7, 1, 5120, 24576, 2, 84}, - {2, 8, 1, 5120, 24576, 2, 84}, - {2, 1, 1, 5120, 51200, 2, 84}, - {2, 2, 1, 5120, 51200, 2, 84}, - {2, 3, 1, 5120, 51200, 2, 84}, - {2, 4, 1, 5120, 51200, 2, 84}, - {2, 5, 1, 5120, 51200, 2, 84}, - {2, 6, 1, 5120, 51200, 2, 84}, - {2, 7, 1, 5120, 51200, 2, 84}, - {2, 8, 1, 5120, 51200, 2, 84}, - {2, 1, 1, 5120, 128000, 2, 84}, - {2, 2, 1, 5120, 128000, 2, 84}, - {2, 3, 1, 5120, 128000, 2, 84}, - {2, 4, 1, 5120, 128000, 2, 84}, - {2, 5, 1, 5120, 128000, 2, 84}, - {2, 6, 1, 5120, 128000, 2, 84}, - {2, 7, 1, 5120, 128000, 2, 84}, - {2, 8, 1, 5120, 128000, 2, 84}, - {2, 1, 1, 8192, 128, 2, 12}, - {2, 2, 1, 8192, 128, 2, 12}, - {2, 3, 1, 8192, 128, 2, 12}, - {2, 4, 1, 8192, 128, 2, 10}, - {2, 5, 1, 8192, 128, 2, 12}, - {2, 6, 1, 8192, 128, 2, 12}, - {2, 7, 1, 8192, 128, 2, 16}, - {2, 8, 1, 8192, 128, 2, 12}, - {2, 1, 1, 8192, 256, 2, 24}, - {2, 2, 1, 8192, 256, 2, 24}, - {2, 3, 1, 8192, 256, 2, 26}, - {2, 4, 1, 8192, 256, 2, 24}, - {2, 5, 1, 8192, 256, 2, 26}, - {2, 6, 1, 8192, 256, 2, 26}, - {2, 7, 1, 8192, 256, 2, 26}, - {2, 8, 1, 8192, 256, 2, 26}, - {2, 1, 1, 8192, 512, 2, 48}, - {2, 2, 1, 8192, 512, 2, 42}, - {2, 3, 1, 8192, 512, 2, 52}, - {2, 4, 1, 8192, 512, 2, 42}, - {2, 5, 1, 8192, 512, 2, 52}, - {2, 6, 1, 8192, 512, 2, 52}, - {2, 7, 1, 8192, 512, 2, 52}, - {2, 8, 1, 8192, 512, 2, 52}, - {2, 1, 1, 8192, 1024, 2, 82}, - {2, 2, 1, 8192, 1024, 2, 82}, - {2, 3, 1, 8192, 1024, 2, 82}, - {2, 4, 1, 8192, 1024, 2, 82}, - {2, 5, 1, 8192, 1024, 2, 82}, - {2, 6, 1, 8192, 1024, 2, 82}, - {2, 7, 1, 8192, 1024, 2, 82}, - {2, 8, 1, 8192, 1024, 2, 82}, - {2, 1, 1, 8192, 2048, 2, 84}, - {2, 2, 1, 8192, 2048, 2, 84}, - {2, 3, 1, 8192, 2048, 2, 84}, - {2, 4, 1, 8192, 2048, 2, 84}, - {2, 5, 1, 8192, 2048, 2, 84}, - {2, 6, 1, 8192, 2048, 2, 84}, - {2, 7, 1, 8192, 2048, 2, 84}, - {2, 8, 1, 8192, 2048, 2, 84}, - {2, 1, 1, 8192, 3072, 2, 84}, - {2, 2, 1, 8192, 3072, 2, 84}, - {2, 3, 1, 8192, 3072, 2, 84}, - {2, 4, 1, 8192, 3072, 2, 84}, - {2, 5, 1, 8192, 3072, 2, 84}, - {2, 6, 1, 8192, 3072, 2, 84}, - {2, 7, 1, 8192, 3072, 2, 84}, - {2, 8, 1, 8192, 3072, 2, 84}, - {2, 1, 1, 8192, 4096, 2, 84}, - {2, 2, 1, 8192, 4096, 2, 84}, - {2, 3, 1, 8192, 4096, 2, 84}, - {2, 4, 1, 8192, 4096, 2, 84}, - {2, 5, 1, 8192, 4096, 2, 84}, - {2, 6, 1, 8192, 4096, 2, 84}, - {2, 7, 1, 8192, 4096, 2, 84}, - {2, 8, 1, 8192, 4096, 2, 84}, - {2, 1, 1, 8192, 5120, 2, 84}, - {2, 2, 1, 8192, 5120, 2, 84}, - {2, 3, 1, 8192, 5120, 2, 84}, - {2, 4, 1, 8192, 5120, 2, 84}, - {2, 5, 1, 8192, 5120, 2, 84}, - {2, 6, 1, 8192, 5120, 2, 84}, - {2, 7, 1, 8192, 5120, 2, 84}, - {2, 8, 1, 8192, 5120, 2, 84}, - {2, 1, 1, 8192, 8192, 2, 84}, - {2, 2, 1, 8192, 8192, 2, 84}, - {2, 3, 1, 8192, 8192, 2, 84}, - {2, 4, 1, 8192, 8192, 2, 84}, - {2, 5, 1, 8192, 8192, 2, 84}, - {2, 6, 1, 8192, 8192, 2, 84}, - {2, 7, 1, 8192, 8192, 2, 84}, - {2, 8, 1, 8192, 8192, 2, 84}, - {2, 1, 1, 8192, 12288, 2, 84}, - {2, 2, 1, 8192, 12288, 2, 84}, - {2, 3, 1, 8192, 12288, 2, 84}, - {2, 4, 1, 8192, 12288, 2, 84}, - {2, 5, 1, 8192, 12288, 2, 84}, - {2, 6, 1, 8192, 12288, 2, 84}, - {2, 7, 1, 8192, 12288, 2, 84}, - {2, 8, 1, 8192, 12288, 2, 84}, - {2, 1, 1, 8192, 14336, 2, 84}, - {2, 2, 1, 8192, 14336, 2, 84}, - {2, 3, 1, 8192, 14336, 2, 84}, - {2, 4, 1, 8192, 14336, 2, 84}, - {2, 5, 1, 8192, 14336, 2, 84}, - {2, 6, 1, 8192, 14336, 2, 84}, - {2, 7, 1, 8192, 14336, 2, 84}, - {2, 8, 1, 8192, 14336, 2, 84}, - {2, 1, 1, 8192, 16384, 2, 84}, - {2, 2, 1, 8192, 16384, 2, 84}, - {2, 3, 1, 8192, 16384, 2, 84}, - {2, 4, 1, 8192, 16384, 2, 84}, - {2, 5, 1, 8192, 16384, 2, 84}, - {2, 6, 1, 8192, 16384, 2, 84}, - {2, 7, 1, 8192, 16384, 2, 84}, - {2, 8, 1, 8192, 16384, 2, 84}, - {2, 1, 1, 8192, 24576, 2, 84}, - {2, 2, 1, 8192, 24576, 2, 84}, - {2, 3, 1, 8192, 24576, 2, 84}, - {2, 4, 1, 8192, 24576, 2, 84}, - {2, 5, 1, 8192, 24576, 2, 84}, - {2, 6, 1, 8192, 24576, 2, 84}, - {2, 7, 1, 8192, 24576, 2, 84}, - {2, 8, 1, 8192, 24576, 2, 84}, - {2, 1, 1, 8192, 51200, 2, 84}, - {2, 2, 1, 8192, 51200, 2, 84}, - {2, 3, 1, 8192, 51200, 2, 84}, - {2, 4, 1, 8192, 51200, 2, 84}, - {2, 5, 1, 8192, 51200, 2, 84}, - {2, 6, 1, 8192, 51200, 2, 84}, - {2, 7, 1, 8192, 51200, 2, 84}, - {2, 8, 1, 8192, 51200, 2, 84}, - {2, 1, 1, 8192, 128000, 2, 84}, - {2, 2, 1, 8192, 128000, 2, 84}, - {2, 3, 1, 8192, 128000, 2, 84}, - {2, 4, 1, 8192, 128000, 2, 84}, - {2, 5, 1, 8192, 128000, 2, 84}, - {2, 6, 1, 8192, 128000, 2, 84}, - {2, 7, 1, 8192, 128000, 2, 84}, - {2, 8, 1, 8192, 128000, 2, 84}, - {2, 1, 1, 12288, 128, 2, 16}, - {2, 2, 1, 12288, 128, 2, 16}, - {2, 3, 1, 12288, 128, 2, 16}, - {2, 4, 1, 12288, 128, 2, 16}, - {2, 5, 1, 12288, 128, 2, 16}, - {2, 6, 1, 12288, 128, 2, 16}, - {2, 7, 1, 12288, 128, 2, 16}, - {2, 8, 1, 12288, 128, 2, 16}, - {2, 1, 1, 12288, 256, 2, 32}, - {2, 2, 1, 12288, 256, 2, 32}, - {2, 3, 1, 12288, 256, 2, 32}, - {2, 4, 1, 12288, 256, 2, 24}, - {2, 5, 1, 12288, 256, 2, 32}, - {2, 6, 1, 12288, 256, 2, 32}, - {2, 7, 1, 12288, 256, 2, 34}, - {2, 8, 1, 12288, 256, 2, 32}, - {2, 1, 1, 12288, 512, 2, 64}, - {2, 2, 1, 12288, 512, 2, 64}, - {2, 3, 1, 12288, 512, 2, 64}, - {2, 4, 1, 12288, 512, 2, 52}, - {2, 5, 1, 12288, 512, 2, 64}, - {2, 6, 1, 12288, 512, 2, 64}, - {2, 7, 1, 12288, 512, 2, 64}, - {2, 8, 1, 12288, 512, 2, 64}, - {2, 1, 1, 12288, 1024, 2, 84}, - {2, 2, 1, 12288, 1024, 2, 84}, - {2, 3, 1, 12288, 1024, 2, 84}, - {2, 4, 1, 12288, 1024, 2, 84}, - {2, 5, 1, 12288, 1024, 2, 84}, - {2, 6, 1, 12288, 1024, 2, 84}, - {2, 7, 1, 12288, 1024, 2, 84}, - {2, 8, 1, 12288, 1024, 2, 84}, - {2, 1, 1, 12288, 2048, 2, 84}, - {2, 2, 1, 12288, 2048, 2, 84}, - {2, 3, 1, 12288, 2048, 2, 84}, - {2, 4, 1, 12288, 2048, 2, 84}, - {2, 5, 1, 12288, 2048, 2, 84}, - {2, 6, 1, 12288, 2048, 2, 84}, - {2, 7, 1, 12288, 2048, 2, 84}, - {2, 8, 1, 12288, 2048, 2, 84}, - {2, 1, 1, 12288, 3072, 2, 84}, - {2, 2, 1, 12288, 3072, 2, 84}, - {2, 3, 1, 12288, 3072, 2, 84}, - {2, 4, 1, 12288, 3072, 2, 84}, - {2, 5, 1, 12288, 3072, 2, 84}, - {2, 6, 1, 12288, 3072, 2, 84}, - {2, 7, 1, 12288, 3072, 2, 84}, - {2, 8, 1, 12288, 3072, 2, 84}, - {2, 1, 1, 12288, 4096, 2, 84}, - {2, 2, 1, 12288, 4096, 2, 84}, - {2, 3, 1, 12288, 4096, 2, 84}, - {2, 4, 1, 12288, 4096, 2, 84}, - {2, 5, 1, 12288, 4096, 2, 84}, - {2, 6, 1, 12288, 4096, 2, 84}, - {2, 7, 1, 12288, 4096, 2, 84}, - {2, 8, 1, 12288, 4096, 2, 84}, - {2, 1, 1, 12288, 5120, 2, 84}, - {2, 2, 1, 12288, 5120, 2, 84}, - {2, 3, 1, 12288, 5120, 2, 84}, - {2, 4, 1, 12288, 5120, 2, 84}, - {2, 5, 1, 12288, 5120, 2, 84}, - {2, 6, 1, 12288, 5120, 2, 84}, - {2, 7, 1, 12288, 5120, 2, 84}, - {2, 8, 1, 12288, 5120, 2, 84}, - {2, 1, 1, 12288, 8192, 2, 84}, - {2, 2, 1, 12288, 8192, 2, 84}, - {2, 3, 1, 12288, 8192, 2, 84}, - {2, 4, 1, 12288, 8192, 2, 84}, - {2, 5, 1, 12288, 8192, 2, 84}, - {2, 6, 1, 12288, 8192, 2, 84}, - {2, 7, 1, 12288, 8192, 2, 84}, - {2, 8, 1, 12288, 8192, 2, 84}, - {2, 1, 1, 12288, 12288, 2, 84}, - {2, 2, 1, 12288, 12288, 2, 84}, - {2, 3, 1, 12288, 12288, 2, 84}, - {2, 4, 1, 12288, 12288, 2, 84}, - {2, 5, 1, 12288, 12288, 2, 84}, - {2, 6, 1, 12288, 12288, 2, 84}, - {2, 7, 1, 12288, 12288, 2, 84}, - {2, 8, 1, 12288, 12288, 2, 84}, - {2, 1, 1, 12288, 14336, 2, 84}, - {2, 2, 1, 12288, 14336, 2, 84}, - {2, 3, 1, 12288, 14336, 2, 84}, - {2, 4, 1, 12288, 14336, 2, 84}, - {2, 5, 1, 12288, 14336, 2, 84}, - {2, 6, 1, 12288, 14336, 2, 84}, - {2, 7, 1, 12288, 14336, 2, 84}, - {2, 8, 1, 12288, 14336, 2, 84}, - {2, 1, 1, 12288, 16384, 2, 84}, - {2, 2, 1, 12288, 16384, 2, 84}, - {2, 3, 1, 12288, 16384, 2, 84}, - {2, 4, 1, 12288, 16384, 2, 84}, - {2, 5, 1, 12288, 16384, 2, 84}, - {2, 6, 1, 12288, 16384, 2, 84}, - {2, 7, 1, 12288, 16384, 2, 84}, - {2, 8, 1, 12288, 16384, 2, 84}, - {2, 1, 1, 12288, 24576, 2, 84}, - {2, 2, 1, 12288, 24576, 2, 84}, - {2, 3, 1, 12288, 24576, 2, 84}, - {2, 4, 1, 12288, 24576, 2, 84}, - {2, 5, 1, 12288, 24576, 2, 84}, - {2, 6, 1, 12288, 24576, 2, 84}, - {2, 7, 1, 12288, 24576, 2, 84}, - {2, 8, 1, 12288, 24576, 2, 84}, - {2, 1, 1, 12288, 51200, 2, 84}, - {2, 2, 1, 12288, 51200, 2, 84}, - {2, 3, 1, 12288, 51200, 2, 84}, - {2, 4, 1, 12288, 51200, 2, 84}, - {2, 5, 1, 12288, 51200, 2, 84}, - {2, 6, 1, 12288, 51200, 2, 84}, - {2, 7, 1, 12288, 51200, 2, 84}, - {2, 8, 1, 12288, 51200, 2, 84}, - {2, 1, 1, 12288, 128000, 2, 84}, - {2, 2, 1, 12288, 128000, 2, 84}, - {2, 3, 1, 12288, 128000, 2, 84}, - {2, 4, 1, 12288, 128000, 2, 84}, - {2, 5, 1, 12288, 128000, 2, 84}, - {2, 6, 1, 12288, 128000, 2, 84}, - {2, 7, 1, 12288, 128000, 2, 84}, - {2, 8, 1, 12288, 128000, 2, 84}, - {2, 1, 1, 14336, 128, 2, 16}, - {2, 2, 1, 14336, 128, 2, 16}, - {2, 3, 1, 14336, 128, 2, 18}, - {2, 4, 1, 14336, 128, 2, 16}, - {2, 5, 1, 14336, 128, 2, 18}, - {2, 6, 1, 14336, 128, 2, 16}, - {2, 7, 1, 14336, 128, 2, 18}, - {2, 8, 1, 14336, 128, 2, 16}, - {2, 1, 1, 14336, 256, 2, 32}, - {2, 2, 1, 14336, 256, 2, 30}, - {2, 3, 1, 14336, 256, 2, 32}, - {2, 4, 1, 14336, 256, 2, 30}, - {2, 5, 1, 14336, 256, 2, 32}, - {2, 6, 1, 14336, 256, 2, 36}, - {2, 7, 1, 14336, 256, 2, 36}, - {2, 8, 1, 14336, 256, 2, 36}, - {2, 1, 1, 14336, 512, 2, 60}, - {2, 2, 1, 14336, 512, 2, 64}, - {2, 3, 1, 14336, 512, 2, 64}, - {2, 4, 1, 14336, 512, 2, 60}, - {2, 5, 1, 14336, 512, 2, 64}, - {2, 6, 1, 14336, 512, 2, 64}, - {2, 7, 1, 14336, 512, 2, 72}, - {2, 8, 1, 14336, 512, 2, 64}, - {2, 1, 1, 14336, 1024, 2, 84}, - {2, 2, 1, 14336, 1024, 2, 84}, - {2, 3, 1, 14336, 1024, 2, 84}, - {2, 4, 1, 14336, 1024, 2, 84}, - {2, 5, 1, 14336, 1024, 2, 84}, - {2, 6, 1, 14336, 1024, 2, 84}, - {2, 7, 1, 14336, 1024, 2, 84}, - {2, 8, 1, 14336, 1024, 2, 84}, - {2, 1, 1, 14336, 2048, 2, 84}, - {2, 2, 1, 14336, 2048, 2, 84}, - {2, 3, 1, 14336, 2048, 2, 84}, - {2, 4, 1, 14336, 2048, 2, 84}, - {2, 5, 1, 14336, 2048, 2, 84}, - {2, 6, 1, 14336, 2048, 2, 84}, - {2, 7, 1, 14336, 2048, 2, 84}, - {2, 8, 1, 14336, 2048, 2, 84}, - {2, 1, 1, 14336, 3072, 2, 84}, - {2, 2, 1, 14336, 3072, 2, 84}, - {2, 3, 1, 14336, 3072, 2, 84}, - {2, 4, 1, 14336, 3072, 2, 84}, - {2, 5, 1, 14336, 3072, 2, 84}, - {2, 6, 1, 14336, 3072, 2, 84}, - {2, 7, 1, 14336, 3072, 2, 84}, - {2, 8, 1, 14336, 3072, 2, 84}, - {2, 1, 1, 14336, 4096, 2, 84}, - {2, 2, 1, 14336, 4096, 2, 84}, - {2, 3, 1, 14336, 4096, 2, 84}, - {2, 4, 1, 14336, 4096, 2, 84}, - {2, 5, 1, 14336, 4096, 2, 84}, - {2, 6, 1, 14336, 4096, 2, 84}, - {2, 7, 1, 14336, 4096, 2, 84}, - {2, 8, 1, 14336, 4096, 2, 84}, - {2, 1, 1, 14336, 5120, 2, 84}, - {2, 2, 1, 14336, 5120, 2, 84}, - {2, 3, 1, 14336, 5120, 2, 84}, - {2, 4, 1, 14336, 5120, 2, 84}, - {2, 5, 1, 14336, 5120, 2, 84}, - {2, 6, 1, 14336, 5120, 2, 84}, - {2, 7, 1, 14336, 5120, 2, 84}, - {2, 8, 1, 14336, 5120, 2, 84}, - {2, 1, 1, 14336, 8192, 2, 84}, - {2, 2, 1, 14336, 8192, 2, 84}, - {2, 3, 1, 14336, 8192, 2, 84}, - {2, 4, 1, 14336, 8192, 2, 84}, - {2, 5, 1, 14336, 8192, 2, 84}, - {2, 6, 1, 14336, 8192, 2, 84}, - {2, 7, 1, 14336, 8192, 2, 84}, - {2, 8, 1, 14336, 8192, 2, 84}, - {2, 1, 1, 14336, 12288, 2, 84}, - {2, 2, 1, 14336, 12288, 2, 84}, - {2, 3, 1, 14336, 12288, 2, 84}, - {2, 4, 1, 14336, 12288, 2, 84}, - {2, 5, 1, 14336, 12288, 2, 84}, - {2, 6, 1, 14336, 12288, 2, 84}, - {2, 7, 1, 14336, 12288, 2, 84}, - {2, 8, 1, 14336, 12288, 2, 84}, - {2, 1, 1, 14336, 14336, 2, 84}, - {2, 2, 1, 14336, 14336, 2, 84}, - {2, 3, 1, 14336, 14336, 2, 84}, - {2, 4, 1, 14336, 14336, 2, 84}, - {2, 5, 1, 14336, 14336, 2, 84}, - {2, 6, 1, 14336, 14336, 2, 84}, - {2, 7, 1, 14336, 14336, 2, 84}, - {2, 8, 1, 14336, 14336, 2, 84}, - {2, 1, 1, 14336, 16384, 2, 84}, - {2, 2, 1, 14336, 16384, 2, 84}, - {2, 3, 1, 14336, 16384, 2, 84}, - {2, 4, 1, 14336, 16384, 2, 84}, - {2, 5, 1, 14336, 16384, 2, 84}, - {2, 6, 1, 14336, 16384, 2, 84}, - {2, 7, 1, 14336, 16384, 2, 84}, - {2, 8, 1, 14336, 16384, 2, 84}, - {2, 1, 1, 14336, 24576, 2, 84}, - {2, 2, 1, 14336, 24576, 2, 84}, - {2, 3, 1, 14336, 24576, 2, 84}, - {2, 4, 1, 14336, 24576, 2, 84}, - {2, 5, 1, 14336, 24576, 2, 84}, - {2, 6, 1, 14336, 24576, 2, 84}, - {2, 7, 1, 14336, 24576, 2, 84}, - {2, 8, 1, 14336, 24576, 2, 84}, - {2, 1, 1, 14336, 51200, 2, 84}, - {2, 2, 1, 14336, 51200, 2, 84}, - {2, 3, 1, 14336, 51200, 2, 84}, - {2, 4, 1, 14336, 51200, 2, 84}, - {2, 5, 1, 14336, 51200, 2, 84}, - {2, 6, 1, 14336, 51200, 2, 84}, - {2, 7, 1, 14336, 51200, 2, 84}, - {2, 8, 1, 14336, 51200, 2, 84}, - {2, 1, 1, 14336, 128000, 2, 84}, - {2, 2, 1, 14336, 128000, 2, 84}, - {2, 3, 1, 14336, 128000, 2, 84}, - {2, 4, 1, 14336, 128000, 2, 84}, - {2, 5, 1, 14336, 128000, 2, 84}, - {2, 6, 1, 14336, 128000, 2, 84}, - {2, 7, 1, 14336, 128000, 2, 84}, - {2, 8, 1, 14336, 128000, 2, 84}, - {2, 1, 1, 16384, 128, 2, 16}, - {2, 2, 1, 16384, 128, 2, 16}, - {2, 3, 1, 16384, 128, 2, 16}, - {2, 4, 1, 16384, 128, 2, 16}, - {2, 5, 1, 16384, 128, 2, 16}, - {2, 6, 1, 16384, 128, 2, 16}, - {2, 7, 1, 16384, 128, 2, 20}, - {2, 8, 1, 16384, 128, 2, 20}, - {2, 1, 1, 16384, 256, 2, 38}, - {2, 2, 1, 16384, 256, 2, 38}, - {2, 3, 1, 16384, 256, 2, 38}, - {2, 4, 1, 16384, 256, 2, 32}, - {2, 5, 1, 16384, 256, 2, 38}, - {2, 6, 1, 16384, 256, 2, 38}, - {2, 7, 1, 16384, 256, 2, 38}, - {2, 8, 1, 16384, 256, 2, 38}, - {2, 1, 1, 16384, 512, 2, 64}, - {2, 2, 1, 16384, 512, 2, 64}, - {2, 3, 1, 16384, 512, 2, 76}, - {2, 4, 1, 16384, 512, 2, 64}, - {2, 5, 1, 16384, 512, 2, 64}, - {2, 6, 1, 16384, 512, 2, 76}, - {2, 7, 1, 16384, 512, 2, 76}, - {2, 8, 1, 16384, 512, 2, 72}, - {2, 1, 1, 16384, 1024, 2, 84}, - {2, 2, 1, 16384, 1024, 2, 84}, - {2, 3, 1, 16384, 1024, 2, 84}, - {2, 4, 1, 16384, 1024, 2, 84}, - {2, 5, 1, 16384, 1024, 2, 84}, - {2, 6, 1, 16384, 1024, 2, 84}, - {2, 7, 1, 16384, 1024, 2, 84}, - {2, 8, 1, 16384, 1024, 2, 84}, - {2, 1, 1, 16384, 2048, 2, 84}, - {2, 2, 1, 16384, 2048, 2, 84}, - {2, 3, 1, 16384, 2048, 2, 84}, - {2, 4, 1, 16384, 2048, 2, 84}, - {2, 5, 1, 16384, 2048, 2, 84}, - {2, 6, 1, 16384, 2048, 2, 84}, - {2, 7, 1, 16384, 2048, 2, 84}, - {2, 8, 1, 16384, 2048, 2, 84}, - {2, 1, 1, 16384, 3072, 2, 84}, - {2, 2, 1, 16384, 3072, 2, 84}, - {2, 3, 1, 16384, 3072, 2, 84}, - {2, 4, 1, 16384, 3072, 2, 84}, - {2, 5, 1, 16384, 3072, 2, 84}, - {2, 6, 1, 16384, 3072, 2, 84}, - {2, 7, 1, 16384, 3072, 2, 84}, - {2, 8, 1, 16384, 3072, 2, 84}, - {2, 1, 1, 16384, 4096, 2, 84}, - {2, 2, 1, 16384, 4096, 2, 84}, - {2, 3, 1, 16384, 4096, 2, 84}, - {2, 4, 1, 16384, 4096, 2, 84}, - {2, 5, 1, 16384, 4096, 2, 84}, - {2, 6, 1, 16384, 4096, 2, 84}, - {2, 7, 1, 16384, 4096, 2, 84}, - {2, 8, 1, 16384, 4096, 2, 84}, - {2, 1, 1, 16384, 5120, 2, 84}, - {2, 2, 1, 16384, 5120, 2, 84}, - {2, 3, 1, 16384, 5120, 2, 84}, - {2, 4, 1, 16384, 5120, 2, 84}, - {2, 5, 1, 16384, 5120, 2, 84}, - {2, 6, 1, 16384, 5120, 2, 84}, - {2, 7, 1, 16384, 5120, 2, 84}, - {2, 8, 1, 16384, 5120, 2, 84}, - {2, 1, 1, 16384, 8192, 2, 84}, - {2, 2, 1, 16384, 8192, 2, 84}, - {2, 3, 1, 16384, 8192, 2, 84}, - {2, 4, 1, 16384, 8192, 2, 84}, - {2, 5, 1, 16384, 8192, 2, 84}, - {2, 6, 1, 16384, 8192, 2, 84}, - {2, 7, 1, 16384, 8192, 2, 84}, - {2, 8, 1, 16384, 8192, 2, 84}, - {2, 1, 1, 16384, 12288, 2, 84}, - {2, 2, 1, 16384, 12288, 2, 84}, - {2, 3, 1, 16384, 12288, 2, 84}, - {2, 4, 1, 16384, 12288, 2, 84}, - {2, 5, 1, 16384, 12288, 2, 84}, - {2, 6, 1, 16384, 12288, 2, 84}, - {2, 7, 1, 16384, 12288, 2, 84}, - {2, 8, 1, 16384, 12288, 2, 84}, - {2, 1, 1, 16384, 14336, 2, 84}, - {2, 2, 1, 16384, 14336, 2, 84}, - {2, 3, 1, 16384, 14336, 2, 84}, - {2, 4, 1, 16384, 14336, 2, 84}, - {2, 5, 1, 16384, 14336, 2, 84}, - {2, 6, 1, 16384, 14336, 2, 84}, - {2, 7, 1, 16384, 14336, 2, 84}, - {2, 8, 1, 16384, 14336, 2, 84}, - {2, 1, 1, 16384, 16384, 2, 84}, - {2, 2, 1, 16384, 16384, 2, 84}, - {2, 3, 1, 16384, 16384, 2, 84}, - {2, 4, 1, 16384, 16384, 2, 84}, - {2, 5, 1, 16384, 16384, 2, 84}, - {2, 6, 1, 16384, 16384, 2, 84}, - {2, 7, 1, 16384, 16384, 2, 84}, - {2, 8, 1, 16384, 16384, 2, 84}, - {2, 1, 1, 16384, 24576, 2, 84}, - {2, 2, 1, 16384, 24576, 2, 84}, - {2, 3, 1, 16384, 24576, 2, 84}, - {2, 4, 1, 16384, 24576, 2, 84}, - {2, 5, 1, 16384, 24576, 2, 84}, - {2, 6, 1, 16384, 24576, 2, 84}, - {2, 7, 1, 16384, 24576, 2, 84}, - {2, 8, 1, 16384, 24576, 2, 84}, - {2, 1, 1, 16384, 51200, 2, 84}, - {2, 2, 1, 16384, 51200, 2, 84}, - {2, 3, 1, 16384, 51200, 2, 84}, - {2, 4, 1, 16384, 51200, 2, 84}, - {2, 5, 1, 16384, 51200, 2, 84}, - {2, 6, 1, 16384, 51200, 2, 84}, - {2, 7, 1, 16384, 51200, 2, 84}, - {2, 8, 1, 16384, 51200, 2, 84}, - {2, 1, 1, 16384, 128000, 2, 84}, - {2, 2, 1, 16384, 128000, 2, 84}, - {2, 3, 1, 16384, 128000, 2, 84}, - {2, 4, 1, 16384, 128000, 2, 84}, - {2, 5, 1, 16384, 128000, 2, 84}, - {2, 6, 1, 16384, 128000, 2, 84}, - {2, 7, 1, 16384, 128000, 2, 84}, - {2, 8, 1, 16384, 128000, 2, 84}, - {2, 1, 1, 24576, 128, 2, 20}, - {2, 2, 1, 24576, 128, 2, 20}, - {2, 3, 1, 24576, 128, 2, 24}, - {2, 4, 1, 24576, 128, 2, 20}, - {2, 5, 1, 24576, 128, 2, 22}, - {2, 6, 1, 24576, 128, 2, 22}, - {2, 7, 1, 24576, 128, 2, 24}, - {2, 8, 1, 24576, 128, 2, 22}, - {2, 1, 1, 24576, 256, 2, 42}, - {2, 2, 1, 24576, 256, 2, 42}, - {2, 3, 1, 24576, 256, 2, 42}, - {2, 4, 1, 24576, 256, 2, 36}, - {2, 5, 1, 24576, 256, 2, 44}, - {2, 6, 1, 24576, 256, 2, 44}, - {2, 7, 1, 24576, 256, 2, 48}, - {2, 8, 1, 24576, 256, 2, 48}, - {2, 1, 1, 24576, 512, 2, 80}, - {2, 2, 1, 24576, 512, 2, 72}, - {2, 3, 1, 24576, 512, 2, 84}, - {2, 4, 1, 24576, 512, 2, 72}, - {2, 5, 1, 24576, 512, 2, 84}, - {2, 6, 1, 24576, 512, 2, 84}, - {2, 7, 1, 24576, 512, 2, 84}, - {2, 8, 1, 24576, 512, 2, 84}, - {2, 1, 1, 24576, 1024, 2, 84}, - {2, 2, 1, 24576, 1024, 2, 84}, - {2, 3, 1, 24576, 1024, 2, 84}, - {2, 4, 1, 24576, 1024, 2, 84}, - {2, 5, 1, 24576, 1024, 2, 84}, - {2, 6, 1, 24576, 1024, 2, 84}, - {2, 7, 1, 24576, 1024, 2, 84}, - {2, 8, 1, 24576, 1024, 2, 84}, - {2, 1, 1, 24576, 2048, 2, 84}, - {2, 2, 1, 24576, 2048, 2, 84}, - {2, 3, 1, 24576, 2048, 2, 84}, - {2, 4, 1, 24576, 2048, 2, 84}, - {2, 5, 1, 24576, 2048, 2, 84}, - {2, 6, 1, 24576, 2048, 2, 84}, - {2, 7, 1, 24576, 2048, 2, 84}, - {2, 8, 1, 24576, 2048, 2, 84}, - {2, 1, 1, 24576, 3072, 2, 84}, - {2, 2, 1, 24576, 3072, 2, 84}, - {2, 3, 1, 24576, 3072, 2, 84}, - {2, 4, 1, 24576, 3072, 2, 84}, - {2, 5, 1, 24576, 3072, 2, 84}, - {2, 6, 1, 24576, 3072, 2, 84}, - {2, 7, 1, 24576, 3072, 2, 84}, - {2, 8, 1, 24576, 3072, 2, 84}, - {2, 1, 1, 24576, 4096, 2, 84}, - {2, 2, 1, 24576, 4096, 2, 84}, - {2, 3, 1, 24576, 4096, 2, 84}, - {2, 4, 1, 24576, 4096, 2, 84}, - {2, 5, 1, 24576, 4096, 2, 84}, - {2, 6, 1, 24576, 4096, 2, 84}, - {2, 7, 1, 24576, 4096, 2, 84}, - {2, 8, 1, 24576, 4096, 2, 84}, - {2, 1, 1, 24576, 5120, 2, 84}, - {2, 2, 1, 24576, 5120, 2, 84}, - {2, 3, 1, 24576, 5120, 2, 84}, - {2, 4, 1, 24576, 5120, 2, 84}, - {2, 5, 1, 24576, 5120, 2, 84}, - {2, 6, 1, 24576, 5120, 2, 84}, - {2, 7, 1, 24576, 5120, 2, 84}, - {2, 8, 1, 24576, 5120, 2, 84}, - {2, 1, 1, 24576, 8192, 2, 84}, - {2, 2, 1, 24576, 8192, 2, 84}, - {2, 3, 1, 24576, 8192, 2, 84}, - {2, 4, 1, 24576, 8192, 2, 84}, - {2, 5, 1, 24576, 8192, 2, 84}, - {2, 6, 1, 24576, 8192, 2, 84}, - {2, 7, 1, 24576, 8192, 2, 84}, - {2, 8, 1, 24576, 8192, 2, 84}, - {2, 1, 1, 24576, 12288, 2, 84}, - {2, 2, 1, 24576, 12288, 2, 84}, - {2, 3, 1, 24576, 12288, 2, 84}, - {2, 4, 1, 24576, 12288, 2, 84}, - {2, 5, 1, 24576, 12288, 2, 84}, - {2, 6, 1, 24576, 12288, 2, 84}, - {2, 7, 1, 24576, 12288, 2, 84}, - {2, 8, 1, 24576, 12288, 2, 84}, - {2, 1, 1, 24576, 14336, 2, 84}, - {2, 2, 1, 24576, 14336, 2, 84}, - {2, 3, 1, 24576, 14336, 2, 84}, - {2, 4, 1, 24576, 14336, 2, 84}, - {2, 5, 1, 24576, 14336, 2, 84}, - {2, 6, 1, 24576, 14336, 2, 84}, - {2, 7, 1, 24576, 14336, 2, 84}, - {2, 8, 1, 24576, 14336, 2, 84}, - {2, 1, 1, 24576, 16384, 2, 84}, - {2, 2, 1, 24576, 16384, 2, 84}, - {2, 3, 1, 24576, 16384, 2, 84}, - {2, 4, 1, 24576, 16384, 2, 84}, - {2, 5, 1, 24576, 16384, 2, 84}, - {2, 6, 1, 24576, 16384, 2, 84}, - {2, 7, 1, 24576, 16384, 2, 84}, - {2, 8, 1, 24576, 16384, 2, 84}, - {2, 1, 1, 24576, 24576, 2, 84}, - {2, 2, 1, 24576, 24576, 2, 84}, - {2, 3, 1, 24576, 24576, 2, 84}, - {2, 4, 1, 24576, 24576, 2, 84}, - {2, 5, 1, 24576, 24576, 2, 84}, - {2, 6, 1, 24576, 24576, 2, 84}, - {2, 7, 1, 24576, 24576, 2, 84}, - {2, 8, 1, 24576, 24576, 2, 84}, - {2, 1, 1, 24576, 51200, 2, 84}, - {2, 2, 1, 24576, 51200, 2, 84}, - {2, 3, 1, 24576, 51200, 2, 84}, - {2, 4, 1, 24576, 51200, 2, 84}, - {2, 5, 1, 24576, 51200, 2, 84}, - {2, 6, 1, 24576, 51200, 2, 84}, - {2, 7, 1, 24576, 51200, 2, 84}, - {2, 8, 1, 24576, 51200, 2, 84}, - {2, 1, 1, 24576, 128000, 2, 84}, - {2, 2, 1, 24576, 128000, 2, 84}, - {2, 3, 1, 24576, 128000, 2, 84}, - {2, 4, 1, 24576, 128000, 2, 84}, - {2, 5, 1, 24576, 128000, 2, 84}, - {2, 6, 1, 24576, 128000, 2, 84}, - {2, 7, 1, 24576, 128000, 2, 84}, - {2, 8, 1, 24576, 128000, 2, 84}, - {0, 0, 0, 0, 0, 0, 0}}; - -struct TSample samples_256[] = {{4, 1, 1, 128, 256, 1, 4}, - {4, 2, 1, 128, 256, 1, 4}, - {4, 3, 1, 128, 256, 1, 4}, - {4, 4, 1, 128, 256, 2, 2}, - {4, 5, 1, 128, 256, 1, 2}, - {4, 6, 1, 128, 256, 1, 4}, - {4, 7, 1, 128, 256, 1, 4}, - {4, 8, 1, 128, 256, 1, 4}, - {4, 1, 1, 128, 512, 1, 4}, - {4, 2, 1, 128, 512, 1, 8}, - {4, 3, 1, 128, 512, 2, 4}, - {4, 4, 1, 128, 512, 2, 4}, - {4, 5, 1, 128, 512, 2, 8}, - {4, 6, 1, 128, 512, 1, 8}, - {4, 7, 1, 128, 512, 1, 8}, - {4, 8, 1, 128, 512, 2, 4}, - {4, 1, 1, 128, 1024, 1, 16}, - {4, 2, 1, 128, 1024, 1, 16}, - {4, 3, 1, 128, 1024, 2, 8}, - {4, 4, 1, 128, 1024, 2, 8}, - {4, 5, 1, 128, 1024, 1, 16}, - {4, 6, 1, 128, 1024, 2, 8}, - {4, 7, 1, 128, 1024, 1, 8}, - {4, 8, 1, 128, 1024, 1, 16}, - {4, 1, 1, 128, 2048, 2, 16}, - {4, 2, 1, 128, 2048, 1, 16}, - {4, 3, 1, 128, 2048, 1, 16}, - {4, 4, 1, 128, 2048, 2, 16}, - {4, 5, 1, 128, 2048, 1, 32}, - {4, 6, 1, 128, 2048, 1, 32}, - {4, 7, 1, 128, 2048, 2, 128}, - {4, 8, 1, 128, 2048, 1, 32}, - {4, 1, 1, 128, 3072, 1, 32}, - {4, 2, 1, 128, 3072, 1, 48}, - {4, 3, 1, 128, 3072, 1, 24}, - {4, 4, 1, 128, 3072, 1, 24}, - {4, 5, 1, 128, 3072, 1, 48}, - {4, 6, 1, 128, 3072, 1, 48}, - {4, 7, 1, 128, 3072, 1, 50}, - {4, 8, 1, 128, 3072, 1, 48}, - {4, 1, 1, 128, 4096, 1, 64}, - {4, 2, 1, 128, 4096, 2, 32}, - {4, 3, 1, 128, 4096, 2, 32}, - {4, 4, 1, 128, 4096, 1, 64}, - {4, 5, 1, 128, 4096, 1, 64}, - {4, 6, 1, 128, 4096, 1, 64}, - {4, 7, 1, 128, 4096, 2, 92}, - {4, 8, 1, 128, 4096, 1, 64}, - {4, 1, 1, 128, 5120, 1, 80}, - {4, 2, 1, 128, 5120, 1, 40}, - {4, 3, 1, 128, 5120, 1, 40}, - {4, 4, 1, 128, 5120, 2, 40}, - {4, 5, 1, 128, 5120, 1, 80}, - {4, 6, 1, 128, 5120, 1, 60}, - {4, 7, 1, 128, 5120, 2, 48}, - {4, 8, 1, 128, 5120, 1, 80}, - {4, 1, 1, 128, 8192, 1, 64}, - {4, 2, 1, 128, 8192, 2, 64}, - {4, 3, 1, 128, 8192, 1, 64}, - {4, 4, 1, 128, 8192, 2, 64}, - {4, 5, 1, 128, 8192, 2, 152}, - {4, 6, 1, 128, 8192, 1, 64}, - {4, 7, 1, 128, 8192, 1, 116}, - {4, 8, 1, 128, 8192, 1, 64}, - {4, 1, 1, 128, 12288, 2, 96}, - {4, 2, 1, 128, 12288, 1, 96}, - {4, 3, 1, 128, 12288, 2, 162}, - {4, 4, 1, 128, 12288, 1, 96}, - {4, 5, 1, 128, 12288, 2, 146}, - {4, 6, 1, 128, 12288, 1, 152}, - {4, 7, 1, 128, 12288, 1, 164}, - {4, 8, 1, 128, 12288, 1, 96}, - {4, 1, 1, 128, 14336, 2, 112}, - {4, 2, 1, 128, 14336, 1, 112}, - {4, 3, 1, 128, 14336, 2, 112}, - {4, 4, 1, 128, 14336, 1, 112}, - {4, 5, 1, 128, 14336, 1, 134}, - {4, 6, 1, 128, 14336, 1, 144}, - {4, 7, 1, 128, 14336, 1, 166}, - {4, 8, 1, 128, 14336, 1, 112}, - {4, 1, 1, 128, 16384, 1, 128}, - {4, 2, 1, 128, 16384, 1, 128}, - {4, 3, 1, 128, 16384, 2, 128}, - {4, 4, 1, 128, 16384, 2, 128}, - {4, 5, 1, 128, 16384, 2, 108}, - {4, 6, 1, 128, 16384, 1, 118}, - {4, 7, 1, 128, 16384, 1, 158}, - {4, 8, 1, 128, 16384, 1, 128}, - {4, 1, 1, 128, 24576, 2, 146}, - {4, 2, 1, 128, 24576, 2, 96}, - {4, 3, 1, 128, 24576, 2, 144}, - {4, 4, 1, 128, 24576, 1, 164}, - {4, 5, 1, 128, 24576, 1, 170}, - {4, 6, 1, 128, 24576, 2, 152}, - {4, 7, 1, 128, 24576, 1, 158}, - {4, 8, 1, 128, 24576, 1, 156}, - {4, 1, 1, 128, 51200, 2, 156}, - {4, 2, 1, 128, 51200, 2, 152}, - {4, 3, 1, 128, 51200, 2, 160}, - {4, 4, 1, 128, 51200, 2, 152}, - {4, 5, 1, 128, 51200, 2, 152}, - {4, 6, 1, 128, 51200, 2, 152}, - {4, 7, 1, 128, 51200, 1, 160}, - {4, 8, 1, 128, 51200, 1, 160}, - {4, 1, 1, 128, 128000, 3, 170}, - {4, 2, 1, 128, 128000, 2, 160}, - {4, 3, 1, 128, 128000, 2, 170}, - {4, 4, 1, 128, 128000, 2, 166}, - {4, 5, 1, 128, 128000, 3, 168}, - {4, 6, 1, 128, 128000, 2, 166}, - {4, 7, 1, 128, 128000, 3, 168}, - {4, 8, 1, 128, 128000, 2, 144}, - {4, 1, 1, 256, 256, 2, 8}, - {4, 2, 1, 256, 256, 2, 2}, - {4, 3, 1, 256, 256, 2, 4}, - {4, 4, 1, 256, 256, 1, 8}, - {4, 5, 1, 256, 256, 1, 4}, - {4, 6, 1, 256, 256, 1, 8}, - {4, 7, 1, 256, 256, 1, 4}, - {4, 8, 1, 256, 256, 2, 4}, - {4, 1, 1, 256, 512, 2, 14}, - {4, 2, 1, 256, 512, 1, 6}, - {4, 3, 1, 256, 512, 2, 16}, - {4, 4, 1, 256, 512, 2, 4}, - {4, 5, 1, 256, 512, 1, 12}, - {4, 6, 1, 256, 512, 1, 8}, - {4, 7, 1, 256, 512, 2, 12}, - {4, 8, 1, 256, 512, 1, 16}, - {4, 1, 1, 256, 1024, 2, 10}, - {4, 2, 1, 256, 1024, 1, 18}, - {4, 3, 1, 256, 1024, 2, 8}, - {4, 4, 1, 256, 1024, 2, 16}, - {4, 5, 1, 256, 1024, 2, 12}, - {4, 6, 1, 256, 1024, 2, 18}, - {4, 7, 1, 256, 1024, 2, 16}, - {4, 8, 1, 256, 1024, 2, 8}, - {4, 1, 1, 256, 2048, 1, 20}, - {4, 2, 1, 256, 2048, 1, 26}, - {4, 3, 1, 256, 2048, 2, 24}, - {4, 4, 1, 256, 2048, 1, 32}, - {4, 5, 1, 256, 2048, 2, 42}, - {4, 6, 1, 256, 2048, 1, 42}, - {4, 7, 1, 256, 2048, 2, 32}, - {4, 8, 1, 256, 2048, 1, 30}, - {4, 1, 1, 256, 3072, 1, 76}, - {4, 2, 1, 256, 3072, 2, 32}, - {4, 3, 1, 256, 3072, 2, 42}, - {4, 4, 1, 256, 3072, 1, 66}, - {4, 5, 1, 256, 3072, 2, 48}, - {4, 6, 1, 256, 3072, 2, 42}, - {4, 7, 1, 256, 3072, 2, 54}, - {4, 8, 1, 256, 3072, 2, 48}, - {4, 1, 1, 256, 4096, 2, 80}, - {4, 2, 1, 256, 4096, 1, 82}, - {4, 3, 1, 256, 4096, 1, 96}, - {4, 4, 1, 256, 4096, 2, 64}, - {4, 5, 1, 256, 4096, 2, 64}, - {4, 6, 1, 256, 4096, 2, 70}, - {4, 7, 1, 256, 4096, 1, 64}, - {4, 8, 1, 256, 4096, 1, 64}, - {4, 1, 1, 256, 5120, 2, 98}, - {4, 2, 1, 256, 5120, 2, 92}, - {4, 3, 1, 256, 5120, 2, 62}, - {4, 4, 1, 256, 5120, 2, 112}, - {4, 5, 1, 256, 5120, 1, 114}, - {4, 6, 1, 256, 5120, 2, 84}, - {4, 7, 1, 256, 5120, 1, 80}, - {4, 8, 1, 256, 5120, 1, 130}, - {4, 1, 1, 256, 8192, 2, 112}, - {4, 2, 1, 256, 8192, 2, 96}, - {4, 3, 1, 256, 8192, 2, 152}, - {4, 4, 1, 256, 8192, 2, 160}, - {4, 5, 1, 256, 8192, 2, 152}, - {4, 6, 1, 256, 8192, 1, 144}, - {4, 7, 1, 256, 8192, 2, 128}, - {4, 8, 1, 256, 8192, 1, 126}, - {4, 1, 1, 256, 12288, 2, 152}, - {4, 2, 1, 256, 12288, 2, 160}, - {4, 3, 1, 256, 12288, 2, 138}, - {4, 4, 1, 256, 12288, 1, 146}, - {4, 5, 1, 256, 12288, 2, 156}, - {4, 6, 1, 256, 12288, 1, 158}, - {4, 7, 1, 256, 12288, 1, 170}, - {4, 8, 1, 256, 12288, 1, 144}, - {4, 1, 1, 256, 14336, 2, 156}, - {4, 2, 1, 256, 14336, 2, 132}, - {4, 3, 1, 256, 14336, 2, 160}, - {4, 4, 1, 256, 14336, 2, 158}, - {4, 5, 1, 256, 14336, 1, 168}, - {4, 6, 1, 256, 14336, 1, 168}, - {4, 7, 1, 256, 14336, 2, 112}, - {4, 8, 1, 256, 14336, 1, 156}, - {4, 1, 1, 256, 16384, 2, 154}, - {4, 2, 1, 256, 16384, 2, 158}, - {4, 3, 1, 256, 16384, 2, 150}, - {4, 4, 1, 256, 16384, 1, 170}, - {4, 5, 1, 256, 16384, 1, 164}, - {4, 6, 1, 256, 16384, 1, 166}, - {4, 7, 1, 256, 16384, 1, 170}, - {4, 8, 1, 256, 16384, 1, 128}, - {4, 1, 1, 256, 24576, 2, 168}, - {4, 2, 1, 256, 24576, 2, 168}, - {4, 3, 1, 256, 24576, 2, 168}, - {4, 4, 1, 256, 24576, 2, 168}, - {4, 5, 1, 256, 24576, 2, 144}, - {4, 6, 1, 256, 24576, 2, 136}, - {4, 7, 1, 256, 24576, 2, 168}, - {4, 8, 1, 256, 24576, 1, 164}, - {4, 1, 1, 256, 51200, 2, 156}, - {4, 2, 1, 256, 51200, 2, 152}, - {4, 3, 1, 256, 51200, 2, 156}, - {4, 4, 1, 256, 51200, 2, 152}, - {4, 5, 1, 256, 51200, 2, 160}, - {4, 6, 1, 256, 51200, 2, 160}, - {4, 7, 1, 256, 51200, 2, 168}, - {4, 8, 1, 256, 51200, 2, 168}, - {4, 1, 1, 256, 128000, 3, 168}, - {4, 2, 1, 256, 128000, 2, 168}, - {4, 3, 1, 256, 128000, 3, 170}, - {4, 4, 1, 256, 128000, 2, 170}, - {4, 5, 1, 256, 128000, 3, 168}, - {4, 6, 1, 256, 128000, 3, 164}, - {4, 7, 1, 256, 128000, 3, 162}, - {4, 8, 1, 256, 128000, 2, 168}, - {4, 1, 1, 512, 256, 2, 6}, - {4, 2, 1, 512, 256, 2, 6}, - {4, 3, 1, 512, 256, 2, 4}, - {4, 4, 1, 512, 256, 2, 6}, - {4, 5, 1, 512, 256, 2, 4}, - {4, 6, 1, 512, 256, 2, 4}, - {4, 7, 1, 512, 256, 2, 10}, - {4, 8, 1, 512, 256, 2, 4}, - {4, 1, 1, 512, 512, 2, 12}, - {4, 2, 1, 512, 512, 2, 12}, - {4, 3, 1, 512, 512, 2, 8}, - {4, 4, 1, 512, 512, 2, 12}, - {4, 5, 1, 512, 512, 2, 12}, - {4, 6, 1, 512, 512, 1, 16}, - {4, 7, 1, 512, 512, 2, 14}, - {4, 8, 1, 512, 512, 2, 8}, - {4, 1, 1, 512, 1024, 1, 24}, - {4, 2, 1, 512, 1024, 1, 24}, - {4, 3, 1, 512, 1024, 2, 24}, - {4, 4, 1, 512, 1024, 2, 24}, - {4, 5, 1, 512, 1024, 2, 24}, - {4, 6, 1, 512, 1024, 1, 32}, - {4, 7, 1, 512, 1024, 2, 42}, - {4, 8, 1, 512, 1024, 1, 24}, - {4, 1, 1, 512, 2048, 1, 48}, - {4, 2, 1, 512, 2048, 2, 32}, - {4, 3, 1, 512, 2048, 2, 32}, - {4, 4, 1, 512, 2048, 2, 32}, - {4, 5, 1, 512, 2048, 2, 32}, - {4, 6, 1, 512, 2048, 2, 48}, - {4, 7, 1, 512, 2048, 1, 46}, - {4, 8, 1, 512, 2048, 2, 48}, - {4, 1, 1, 512, 3072, 2, 48}, - {4, 2, 1, 512, 3072, 2, 48}, - {4, 3, 1, 512, 3072, 2, 48}, - {4, 4, 1, 512, 3072, 2, 48}, - {4, 5, 1, 512, 3072, 2, 48}, - {4, 6, 1, 512, 3072, 2, 48}, - {4, 7, 1, 512, 3072, 2, 96}, - {4, 8, 1, 512, 3072, 2, 72}, - {4, 1, 1, 512, 4096, 2, 64}, - {4, 2, 1, 512, 4096, 2, 64}, - {4, 3, 1, 512, 4096, 2, 64}, - {4, 4, 1, 512, 4096, 2, 64}, - {4, 5, 1, 512, 4096, 2, 64}, - {4, 6, 1, 512, 4096, 2, 64}, - {4, 7, 1, 512, 4096, 1, 126}, - {4, 8, 1, 512, 4096, 2, 64}, - {4, 1, 1, 512, 5120, 1, 120}, - {4, 2, 1, 512, 5120, 1, 120}, - {4, 3, 1, 512, 5120, 2, 80}, - {4, 4, 1, 512, 5120, 2, 80}, - {4, 5, 1, 512, 5120, 2, 80}, - {4, 6, 1, 512, 5120, 1, 120}, - {4, 7, 1, 512, 5120, 1, 124}, - {4, 8, 1, 512, 5120, 1, 120}, - {4, 1, 1, 512, 8192, 2, 128}, - {4, 2, 1, 512, 8192, 2, 128}, - {4, 3, 1, 512, 8192, 2, 128}, - {4, 4, 1, 512, 8192, 2, 128}, - {4, 5, 1, 512, 8192, 2, 152}, - {4, 6, 1, 512, 8192, 1, 128}, - {4, 7, 1, 512, 8192, 1, 156}, - {4, 8, 1, 512, 8192, 1, 144}, - {4, 1, 1, 512, 12288, 2, 170}, - {4, 2, 1, 512, 12288, 2, 160}, - {4, 3, 1, 512, 12288, 2, 132}, - {4, 4, 1, 512, 12288, 2, 152}, - {4, 5, 1, 512, 12288, 2, 152}, - {4, 6, 1, 512, 12288, 2, 128}, - {4, 7, 1, 512, 12288, 2, 156}, - {4, 8, 1, 512, 12288, 2, 152}, - {4, 1, 1, 512, 14336, 2, 112}, - {4, 2, 1, 512, 14336, 1, 152}, - {4, 3, 1, 512, 14336, 2, 120}, - {4, 4, 1, 512, 14336, 2, 112}, - {4, 5, 1, 512, 14336, 2, 156}, - {4, 6, 1, 512, 14336, 2, 156}, - {4, 7, 1, 512, 14336, 2, 168}, - {4, 8, 1, 512, 14336, 1, 170}, - {4, 1, 1, 512, 16384, 2, 166}, - {4, 2, 1, 512, 16384, 2, 160}, - {4, 3, 1, 512, 16384, 1, 156}, - {4, 4, 1, 512, 16384, 2, 136}, - {4, 5, 1, 512, 16384, 2, 160}, - {4, 6, 1, 512, 16384, 2, 156}, - {4, 7, 1, 512, 16384, 2, 162}, - {4, 8, 1, 512, 16384, 1, 164}, - {4, 1, 1, 512, 24576, 3, 166}, - {4, 2, 1, 512, 24576, 2, 168}, - {4, 3, 1, 512, 24576, 3, 144}, - {4, 4, 1, 512, 24576, 2, 168}, - {4, 5, 1, 512, 24576, 2, 168}, - {4, 6, 1, 512, 24576, 2, 168}, - {4, 7, 1, 512, 24576, 2, 168}, - {4, 8, 1, 512, 24576, 1, 168}, - {4, 1, 1, 512, 51200, 3, 170}, - {4, 2, 1, 512, 51200, 2, 164}, - {4, 3, 1, 512, 51200, 2, 160}, - {4, 4, 1, 512, 51200, 2, 170}, - {4, 5, 1, 512, 51200, 3, 168}, - {4, 6, 1, 512, 51200, 3, 160}, - {4, 7, 1, 512, 51200, 3, 170}, - {4, 8, 1, 512, 51200, 1, 168}, - {4, 1, 1, 512, 128000, 3, 170}, - {4, 2, 1, 512, 128000, 2, 170}, - {4, 3, 1, 512, 128000, 3, 170}, - {4, 4, 1, 512, 128000, 3, 170}, - {4, 5, 1, 512, 128000, 3, 166}, - {4, 6, 1, 512, 128000, 3, 164}, - {4, 7, 1, 512, 128000, 3, 170}, - {4, 8, 1, 512, 128000, 2, 156}, - {4, 1, 1, 1024, 256, 2, 8}, - {4, 2, 1, 1024, 256, 2, 4}, - {4, 3, 1, 1024, 256, 2, 8}, - {4, 4, 1, 1024, 256, 2, 6}, - {4, 5, 1, 1024, 256, 2, 8}, - {4, 6, 1, 1024, 256, 2, 10}, - {4, 7, 1, 1024, 256, 2, 8}, - {4, 8, 1, 1024, 256, 1, 10}, - {4, 1, 1, 1024, 512, 1, 16}, - {4, 2, 1, 1024, 512, 2, 16}, - {4, 3, 1, 1024, 512, 2, 14}, - {4, 4, 1, 1024, 512, 2, 12}, - {4, 5, 1, 1024, 512, 2, 16}, - {4, 6, 1, 1024, 512, 2, 16}, - {4, 7, 1, 1024, 512, 2, 16}, - {4, 8, 1, 1024, 512, 2, 12}, - {4, 1, 1, 1024, 1024, 2, 24}, - {4, 2, 1, 1024, 1024, 2, 28}, - {4, 3, 1, 1024, 1024, 2, 38}, - {4, 4, 1, 1024, 1024, 2, 24}, - {4, 5, 1, 1024, 1024, 2, 32}, - {4, 6, 1, 1024, 1024, 2, 30}, - {4, 7, 1, 1024, 1024, 2, 32}, - {4, 8, 1, 1024, 1024, 2, 32}, - {4, 1, 1, 1024, 2048, 2, 46}, - {4, 2, 1, 1024, 2048, 2, 64}, - {4, 3, 1, 1024, 2048, 2, 76}, - {4, 4, 1, 1024, 2048, 2, 74}, - {4, 5, 1, 1024, 2048, 2, 64}, - {4, 6, 1, 1024, 2048, 2, 64}, - {4, 7, 1, 1024, 2048, 1, 104}, - {4, 8, 1, 1024, 2048, 2, 64}, - {4, 1, 1, 1024, 3072, 2, 94}, - {4, 2, 1, 1024, 3072, 2, 78}, - {4, 3, 1, 1024, 3072, 2, 96}, - {4, 4, 1, 1024, 3072, 2, 70}, - {4, 5, 1, 1024, 3072, 2, 96}, - {4, 6, 1, 1024, 3072, 2, 96}, - {4, 7, 1, 1024, 3072, 1, 120}, - {4, 8, 1, 1024, 3072, 1, 88}, - {4, 1, 1, 1024, 4096, 2, 96}, - {4, 2, 1, 1024, 4096, 2, 118}, - {4, 3, 1, 1024, 4096, 2, 128}, - {4, 4, 1, 1024, 4096, 2, 96}, - {4, 5, 1, 1024, 4096, 1, 120}, - {4, 6, 1, 1024, 4096, 1, 124}, - {4, 7, 1, 1024, 4096, 1, 128}, - {4, 8, 1, 1024, 4096, 1, 162}, - {4, 1, 1, 1024, 5120, 2, 128}, - {4, 2, 1, 1024, 5120, 1, 160}, - {4, 3, 1, 1024, 5120, 2, 120}, - {4, 4, 1, 1024, 5120, 2, 144}, - {4, 5, 1, 1024, 5120, 2, 112}, - {4, 6, 1, 1024, 5120, 2, 122}, - {4, 7, 1, 1024, 5120, 2, 160}, - {4, 8, 1, 1024, 5120, 1, 160}, - {4, 1, 1, 1024, 8192, 2, 158}, - {4, 2, 1, 1024, 8192, 2, 168}, - {4, 3, 1, 1024, 8192, 2, 166}, - {4, 4, 1, 1024, 8192, 2, 154}, - {4, 5, 1, 1024, 8192, 2, 136}, - {4, 6, 1, 1024, 8192, 2, 168}, - {4, 7, 1, 1024, 8192, 2, 158}, - {4, 8, 1, 1024, 8192, 2, 156}, - {4, 1, 1, 1024, 12288, 2, 162}, - {4, 2, 1, 1024, 12288, 2, 156}, - {4, 3, 1, 1024, 12288, 2, 170}, - {4, 4, 1, 1024, 12288, 2, 168}, - {4, 5, 1, 1024, 12288, 2, 162}, - {4, 6, 1, 1024, 12288, 2, 170}, - {4, 7, 1, 1024, 12288, 2, 170}, - {4, 8, 1, 1024, 12288, 2, 136}, - {4, 1, 1, 1024, 14336, 2, 164}, - {4, 2, 1, 1024, 14336, 2, 156}, - {4, 3, 1, 1024, 14336, 2, 168}, - {4, 4, 1, 1024, 14336, 2, 168}, - {4, 5, 1, 1024, 14336, 2, 170}, - {4, 6, 1, 1024, 14336, 2, 152}, - {4, 7, 1, 1024, 14336, 3, 168}, - {4, 8, 1, 1024, 14336, 1, 168}, - {4, 1, 1, 1024, 16384, 2, 170}, - {4, 2, 1, 1024, 16384, 2, 156}, - {4, 3, 1, 1024, 16384, 2, 166}, - {4, 4, 1, 1024, 16384, 2, 168}, - {4, 5, 1, 1024, 16384, 2, 160}, - {4, 6, 1, 1024, 16384, 2, 170}, - {4, 7, 1, 1024, 16384, 2, 170}, - {4, 8, 1, 1024, 16384, 1, 168}, - {4, 1, 1, 1024, 24576, 3, 160}, - {4, 2, 1, 1024, 24576, 2, 168}, - {4, 3, 1, 1024, 24576, 2, 158}, - {4, 4, 1, 1024, 24576, 2, 160}, - {4, 5, 1, 1024, 24576, 3, 158}, - {4, 6, 1, 1024, 24576, 2, 170}, - {4, 7, 1, 1024, 24576, 2, 170}, - {4, 8, 1, 1024, 24576, 1, 168}, - {4, 1, 1, 1024, 51200, 3, 160}, - {4, 2, 1, 1024, 51200, 2, 170}, - {4, 3, 1, 1024, 51200, 3, 168}, - {4, 4, 1, 1024, 51200, 3, 170}, - {4, 5, 1, 1024, 51200, 3, 160}, - {4, 6, 1, 1024, 51200, 3, 160}, - {4, 7, 1, 1024, 51200, 3, 162}, - {4, 8, 1, 1024, 51200, 1, 166}, - {4, 1, 1, 1024, 128000, 3, 170}, - {4, 2, 1, 1024, 128000, 2, 170}, - {4, 3, 1, 1024, 128000, 3, 170}, - {4, 4, 1, 1024, 128000, 3, 170}, - {4, 5, 1, 1024, 128000, 3, 166}, - {4, 6, 1, 1024, 128000, 3, 164}, - {4, 7, 1, 1024, 128000, 3, 168}, - {4, 8, 1, 1024, 128000, 2, 156}, - {4, 1, 1, 2048, 256, 1, 10}, - {4, 2, 1, 2048, 256, 1, 16}, - {4, 3, 1, 2048, 256, 2, 8}, - {4, 4, 1, 2048, 256, 2, 10}, - {4, 5, 1, 2048, 256, 2, 10}, - {4, 6, 1, 2048, 256, 2, 10}, - {4, 7, 1, 2048, 256, 2, 8}, - {4, 8, 1, 2048, 256, 2, 10}, - {4, 1, 1, 2048, 512, 2, 16}, - {4, 2, 1, 2048, 512, 1, 24}, - {4, 3, 1, 2048, 512, 2, 26}, - {4, 4, 1, 2048, 512, 1, 26}, - {4, 5, 1, 2048, 512, 2, 24}, - {4, 6, 1, 2048, 512, 2, 24}, - {4, 7, 1, 2048, 512, 2, 24}, - {4, 8, 1, 2048, 512, 2, 24}, - {4, 1, 1, 2048, 1024, 2, 30}, - {4, 2, 1, 2048, 1024, 2, 36}, - {4, 3, 1, 2048, 1024, 2, 48}, - {4, 4, 1, 2048, 1024, 2, 54}, - {4, 5, 1, 2048, 1024, 2, 40}, - {4, 6, 1, 2048, 1024, 2, 48}, - {4, 7, 1, 2048, 1024, 2, 48}, - {4, 8, 1, 2048, 1024, 2, 48}, - {4, 1, 1, 2048, 2048, 2, 76}, - {4, 2, 1, 2048, 2048, 2, 96}, - {4, 3, 1, 2048, 2048, 2, 74}, - {4, 4, 1, 2048, 2048, 2, 62}, - {4, 5, 1, 2048, 2048, 2, 76}, - {4, 6, 1, 2048, 2048, 1, 80}, - {4, 7, 1, 2048, 2048, 2, 80}, - {4, 8, 1, 2048, 2048, 2, 72}, - {4, 1, 1, 2048, 3072, 2, 114}, - {4, 2, 1, 2048, 3072, 2, 140}, - {4, 3, 1, 2048, 3072, 2, 120}, - {4, 4, 1, 2048, 3072, 2, 112}, - {4, 5, 1, 2048, 3072, 1, 144}, - {4, 6, 1, 2048, 3072, 2, 136}, - {4, 7, 1, 2048, 3072, 2, 112}, - {4, 8, 1, 2048, 3072, 2, 104}, - {4, 1, 1, 2048, 4096, 2, 124}, - {4, 2, 1, 2048, 4096, 2, 158}, - {4, 3, 1, 2048, 4096, 2, 120}, - {4, 4, 1, 2048, 4096, 1, 160}, - {4, 5, 1, 2048, 4096, 2, 160}, - {4, 6, 1, 2048, 4096, 2, 148}, - {4, 7, 1, 2048, 4096, 2, 126}, - {4, 8, 1, 2048, 4096, 1, 160}, - {4, 1, 1, 2048, 5120, 2, 160}, - {4, 2, 1, 2048, 5120, 2, 160}, - {4, 3, 1, 2048, 5120, 2, 158}, - {4, 4, 1, 2048, 5120, 2, 152}, - {4, 5, 1, 2048, 5120, 2, 160}, - {4, 6, 1, 2048, 5120, 2, 160}, - {4, 7, 1, 2048, 5120, 2, 160}, - {4, 8, 1, 2048, 5120, 1, 160}, - {4, 1, 1, 2048, 8192, 2, 160}, - {4, 2, 1, 2048, 8192, 2, 170}, - {4, 3, 1, 2048, 8192, 2, 170}, - {4, 4, 1, 2048, 8192, 2, 170}, - {4, 5, 1, 2048, 8192, 2, 168}, - {4, 6, 1, 2048, 8192, 2, 170}, - {4, 7, 1, 2048, 8192, 2, 170}, - {4, 8, 1, 2048, 8192, 1, 160}, - {4, 1, 1, 2048, 12288, 2, 168}, - {4, 2, 1, 2048, 12288, 2, 170}, - {4, 3, 1, 2048, 12288, 2, 168}, - {4, 4, 1, 2048, 12288, 2, 164}, - {4, 5, 1, 2048, 12288, 2, 170}, - {4, 6, 1, 2048, 12288, 2, 164}, - {4, 7, 1, 2048, 12288, 3, 144}, - {4, 8, 1, 2048, 12288, 1, 162}, - {4, 1, 1, 2048, 14336, 3, 168}, - {4, 2, 1, 2048, 14336, 2, 170}, - {4, 3, 1, 2048, 14336, 2, 168}, - {4, 4, 1, 2048, 14336, 2, 168}, - {4, 5, 1, 2048, 14336, 3, 164}, - {4, 6, 1, 2048, 14336, 2, 168}, - {4, 7, 1, 2048, 14336, 2, 164}, - {4, 8, 1, 2048, 14336, 1, 168}, - {4, 1, 1, 2048, 16384, 2, 166}, - {4, 2, 1, 2048, 16384, 2, 170}, - {4, 3, 1, 2048, 16384, 2, 168}, - {4, 4, 1, 2048, 16384, 2, 168}, - {4, 5, 1, 2048, 16384, 3, 160}, - {4, 6, 1, 2048, 16384, 2, 170}, - {4, 7, 1, 2048, 16384, 3, 128}, - {4, 8, 1, 2048, 16384, 1, 168}, - {4, 1, 1, 2048, 24576, 3, 168}, - {4, 2, 1, 2048, 24576, 2, 170}, - {4, 3, 1, 2048, 24576, 3, 170}, - {4, 4, 1, 2048, 24576, 2, 168}, - {4, 5, 1, 2048, 24576, 3, 162}, - {4, 6, 1, 2048, 24576, 2, 160}, - {4, 7, 1, 2048, 24576, 3, 166}, - {4, 8, 1, 2048, 24576, 1, 168}, - {4, 1, 1, 2048, 51200, 3, 170}, - {4, 2, 1, 2048, 51200, 2, 170}, - {4, 3, 1, 2048, 51200, 3, 170}, - {4, 4, 1, 2048, 51200, 3, 170}, - {4, 5, 1, 2048, 51200, 3, 168}, - {4, 6, 1, 2048, 51200, 3, 160}, - {4, 7, 1, 2048, 51200, 3, 162}, - {4, 8, 1, 2048, 51200, 2, 150}, - {4, 1, 1, 2048, 128000, 3, 170}, - {4, 2, 1, 2048, 128000, 2, 170}, - {4, 3, 1, 2048, 128000, 3, 170}, - {4, 4, 1, 2048, 128000, 3, 170}, - {4, 5, 1, 2048, 128000, 3, 164}, - {4, 6, 1, 2048, 128000, 3, 170}, - {4, 7, 1, 2048, 128000, 3, 166}, - {4, 8, 1, 2048, 128000, 3, 156}, - {4, 1, 1, 3072, 256, 2, 12}, - {4, 2, 1, 3072, 256, 1, 12}, - {4, 3, 1, 3072, 256, 2, 16}, - {4, 4, 1, 3072, 256, 2, 12}, - {4, 5, 1, 3072, 256, 2, 14}, - {4, 6, 1, 3072, 256, 2, 12}, - {4, 7, 1, 3072, 256, 2, 18}, - {4, 8, 1, 3072, 256, 2, 12}, - {4, 1, 1, 3072, 512, 1, 24}, - {4, 2, 1, 3072, 512, 2, 24}, - {4, 3, 1, 3072, 512, 2, 24}, - {4, 4, 1, 3072, 512, 2, 24}, - {4, 5, 1, 3072, 512, 2, 28}, - {4, 6, 1, 3072, 512, 2, 24}, - {4, 7, 1, 3072, 512, 2, 38}, - {4, 8, 1, 3072, 512, 2, 24}, - {4, 1, 1, 3072, 1024, 2, 68}, - {4, 2, 1, 3072, 1024, 1, 56}, - {4, 3, 1, 3072, 1024, 1, 56}, - {4, 4, 1, 3072, 1024, 2, 66}, - {4, 5, 1, 3072, 1024, 2, 48}, - {4, 6, 1, 3072, 1024, 2, 56}, - {4, 7, 1, 3072, 1024, 2, 64}, - {4, 8, 1, 3072, 1024, 2, 56}, - {4, 1, 1, 3072, 2048, 2, 86}, - {4, 2, 1, 3072, 2048, 2, 96}, - {4, 3, 1, 3072, 2048, 2, 90}, - {4, 4, 1, 3072, 2048, 2, 128}, - {4, 5, 1, 3072, 2048, 2, 124}, - {4, 6, 1, 3072, 2048, 2, 98}, - {4, 7, 1, 3072, 2048, 2, 112}, - {4, 8, 1, 3072, 2048, 1, 126}, - {4, 1, 1, 3072, 3072, 1, 162}, - {4, 2, 1, 3072, 3072, 2, 96}, - {4, 3, 1, 3072, 3072, 2, 112}, - {4, 4, 1, 3072, 3072, 2, 136}, - {4, 5, 1, 3072, 3072, 1, 136}, - {4, 6, 1, 3072, 3072, 1, 156}, - {4, 7, 1, 3072, 3072, 1, 158}, - {4, 8, 1, 3072, 3072, 1, 156}, - {4, 1, 1, 3072, 4096, 2, 136}, - {4, 2, 1, 3072, 4096, 2, 160}, - {4, 3, 1, 3072, 4096, 2, 160}, - {4, 4, 1, 3072, 4096, 2, 152}, - {4, 5, 1, 3072, 4096, 2, 160}, - {4, 6, 1, 3072, 4096, 2, 160}, - {4, 7, 1, 3072, 4096, 2, 160}, - {4, 8, 1, 3072, 4096, 1, 160}, - {4, 1, 1, 3072, 5120, 2, 160}, - {4, 2, 1, 3072, 5120, 2, 152}, - {4, 3, 1, 3072, 5120, 2, 152}, - {4, 4, 1, 3072, 5120, 2, 160}, - {4, 5, 1, 3072, 5120, 2, 160}, - {4, 6, 1, 3072, 5120, 2, 160}, - {4, 7, 1, 3072, 5120, 2, 162}, - {4, 8, 1, 3072, 5120, 1, 160}, - {4, 1, 1, 3072, 8192, 2, 164}, - {4, 2, 1, 3072, 8192, 2, 158}, - {4, 3, 1, 3072, 8192, 2, 164}, - {4, 4, 1, 3072, 8192, 2, 164}, - {4, 5, 1, 3072, 8192, 2, 170}, - {4, 6, 1, 3072, 8192, 2, 160}, - {4, 7, 1, 3072, 8192, 2, 166}, - {4, 8, 1, 3072, 8192, 1, 160}, - {4, 1, 1, 3072, 12288, 2, 170}, - {4, 2, 1, 3072, 12288, 2, 168}, - {4, 3, 1, 3072, 12288, 2, 168}, - {4, 4, 1, 3072, 12288, 2, 168}, - {4, 5, 1, 3072, 12288, 2, 168}, - {4, 6, 1, 3072, 12288, 3, 144}, - {4, 7, 1, 3072, 12288, 3, 144}, - {4, 8, 1, 3072, 12288, 1, 168}, - {4, 1, 1, 3072, 14336, 3, 168}, - {4, 2, 1, 3072, 14336, 2, 170}, - {4, 3, 1, 3072, 14336, 2, 170}, - {4, 4, 1, 3072, 14336, 2, 168}, - {4, 5, 1, 3072, 14336, 3, 168}, - {4, 6, 1, 3072, 14336, 2, 168}, - {4, 7, 1, 3072, 14336, 3, 168}, - {4, 8, 1, 3072, 14336, 1, 168}, - {4, 1, 1, 3072, 16384, 3, 168}, - {4, 2, 1, 3072, 16384, 2, 164}, - {4, 3, 1, 3072, 16384, 3, 170}, - {4, 4, 1, 3072, 16384, 2, 170}, - {4, 5, 1, 3072, 16384, 3, 162}, - {4, 6, 1, 3072, 16384, 3, 128}, - {4, 7, 1, 3072, 16384, 3, 128}, - {4, 8, 1, 3072, 16384, 1, 164}, - {4, 1, 1, 3072, 24576, 3, 170}, - {4, 2, 1, 3072, 24576, 2, 168}, - {4, 3, 1, 3072, 24576, 3, 170}, - {4, 4, 1, 3072, 24576, 3, 168}, - {4, 5, 1, 3072, 24576, 3, 166}, - {4, 6, 1, 3072, 24576, 2, 170}, - {4, 7, 1, 3072, 24576, 3, 160}, - {4, 8, 1, 3072, 24576, 1, 168}, - {4, 1, 1, 3072, 51200, 3, 170}, - {4, 2, 1, 3072, 51200, 2, 170}, - {4, 3, 1, 3072, 51200, 3, 170}, - {4, 4, 1, 3072, 51200, 3, 170}, - {4, 5, 1, 3072, 51200, 3, 168}, - {4, 6, 1, 3072, 51200, 3, 160}, - {4, 7, 1, 3072, 51200, 3, 166}, - {4, 8, 1, 3072, 51200, 3, 150}, - {4, 1, 1, 3072, 128000, 3, 170}, - {4, 2, 1, 3072, 128000, 2, 170}, - {4, 3, 1, 3072, 128000, 3, 170}, - {4, 4, 1, 3072, 128000, 3, 170}, - {4, 5, 1, 3072, 128000, 3, 160}, - {4, 6, 1, 3072, 128000, 3, 166}, - {4, 7, 1, 3072, 128000, 3, 168}, - {4, 8, 1, 3072, 128000, 3, 170}, - {4, 1, 1, 4096, 256, 2, 16}, - {4, 2, 1, 4096, 256, 2, 14}, - {4, 3, 1, 4096, 256, 2, 14}, - {4, 4, 1, 4096, 256, 2, 16}, - {4, 5, 1, 4096, 256, 2, 18}, - {4, 6, 1, 4096, 256, 2, 24}, - {4, 7, 1, 4096, 256, 2, 16}, - {4, 8, 1, 4096, 256, 2, 16}, - {4, 1, 1, 4096, 512, 2, 32}, - {4, 2, 1, 4096, 512, 2, 32}, - {4, 3, 1, 4096, 512, 2, 32}, - {4, 4, 1, 4096, 512, 2, 32}, - {4, 5, 1, 4096, 512, 2, 26}, - {4, 6, 1, 4096, 512, 2, 38}, - {4, 7, 1, 4096, 512, 2, 32}, - {4, 8, 1, 4096, 512, 2, 32}, - {4, 1, 1, 4096, 1024, 2, 56}, - {4, 2, 1, 4096, 1024, 2, 64}, - {4, 3, 1, 4096, 1024, 2, 64}, - {4, 4, 1, 4096, 1024, 2, 64}, - {4, 5, 1, 4096, 1024, 2, 48}, - {4, 6, 1, 4096, 1024, 2, 64}, - {4, 7, 1, 4096, 1024, 2, 62}, - {4, 8, 1, 4096, 1024, 2, 48}, - {4, 1, 1, 4096, 2048, 2, 128}, - {4, 2, 1, 4096, 2048, 2, 108}, - {4, 3, 1, 4096, 2048, 2, 108}, - {4, 4, 1, 4096, 2048, 2, 120}, - {4, 5, 1, 4096, 2048, 2, 128}, - {4, 6, 1, 4096, 2048, 2, 108}, - {4, 7, 1, 4096, 2048, 2, 128}, - {4, 8, 1, 4096, 2048, 2, 104}, - {4, 1, 1, 4096, 3072, 2, 160}, - {4, 2, 1, 4096, 3072, 2, 140}, - {4, 3, 1, 4096, 3072, 2, 162}, - {4, 4, 1, 4096, 3072, 2, 136}, - {4, 5, 1, 4096, 3072, 2, 170}, - {4, 6, 1, 4096, 3072, 2, 156}, - {4, 7, 1, 4096, 3072, 2, 168}, - {4, 8, 1, 4096, 3072, 2, 120}, - {4, 1, 1, 4096, 4096, 2, 128}, - {4, 2, 1, 4096, 4096, 2, 152}, - {4, 3, 1, 4096, 4096, 2, 156}, - {4, 4, 1, 4096, 4096, 2, 160}, - {4, 5, 1, 4096, 4096, 2, 154}, - {4, 6, 1, 4096, 4096, 2, 160}, - {4, 7, 1, 4096, 4096, 2, 160}, - {4, 8, 1, 4096, 4096, 2, 126}, - {4, 1, 1, 4096, 5120, 2, 160}, - {4, 2, 1, 4096, 5120, 2, 160}, - {4, 3, 1, 4096, 5120, 2, 158}, - {4, 4, 1, 4096, 5120, 2, 162}, - {4, 5, 1, 4096, 5120, 2, 160}, - {4, 6, 1, 4096, 5120, 2, 158}, - {4, 7, 1, 4096, 5120, 2, 160}, - {4, 8, 1, 4096, 5120, 1, 160}, - {4, 1, 1, 4096, 8192, 2, 168}, - {4, 2, 1, 4096, 8192, 2, 170}, - {4, 3, 1, 4096, 8192, 2, 170}, - {4, 4, 1, 4096, 8192, 2, 164}, - {4, 5, 1, 4096, 8192, 2, 168}, - {4, 6, 1, 4096, 8192, 2, 170}, - {4, 7, 1, 4096, 8192, 3, 128}, - {4, 8, 1, 4096, 8192, 1, 160}, - {4, 1, 1, 4096, 12288, 3, 170}, - {4, 2, 1, 4096, 12288, 2, 170}, - {4, 3, 1, 4096, 12288, 3, 170}, - {4, 4, 1, 4096, 12288, 2, 168}, - {4, 5, 1, 4096, 12288, 3, 170}, - {4, 6, 1, 4096, 12288, 3, 144}, - {4, 7, 1, 4096, 12288, 3, 144}, - {4, 8, 1, 4096, 12288, 1, 162}, - {4, 1, 1, 4096, 14336, 3, 168}, - {4, 2, 1, 4096, 14336, 2, 170}, - {4, 3, 1, 4096, 14336, 3, 168}, - {4, 4, 1, 4096, 14336, 2, 168}, - {4, 5, 1, 4096, 14336, 3, 168}, - {4, 6, 1, 4096, 14336, 2, 168}, - {4, 7, 1, 4096, 14336, 3, 168}, - {4, 8, 1, 4096, 14336, 1, 168}, - {4, 1, 1, 4096, 16384, 3, 170}, - {4, 2, 1, 4096, 16384, 2, 166}, - {4, 3, 1, 4096, 16384, 3, 170}, - {4, 4, 1, 4096, 16384, 3, 170}, - {4, 5, 1, 4096, 16384, 3, 168}, - {4, 6, 1, 4096, 16384, 3, 128}, - {4, 7, 1, 4096, 16384, 3, 128}, - {4, 8, 1, 4096, 16384, 1, 168}, - {4, 1, 1, 4096, 24576, 3, 170}, - {4, 2, 1, 4096, 24576, 2, 170}, - {4, 3, 1, 4096, 24576, 3, 170}, - {4, 4, 1, 4096, 24576, 3, 170}, - {4, 5, 1, 4096, 24576, 3, 160}, - {4, 6, 1, 4096, 24576, 3, 144}, - {4, 7, 1, 4096, 24576, 3, 160}, - {4, 8, 1, 4096, 24576, 1, 168}, - {4, 1, 1, 4096, 51200, 3, 170}, - {4, 2, 1, 4096, 51200, 2, 170}, - {4, 3, 1, 4096, 51200, 3, 170}, - {4, 4, 1, 4096, 51200, 3, 170}, - {4, 5, 1, 4096, 51200, 3, 168}, - {4, 6, 1, 4096, 51200, 3, 160}, - {4, 7, 1, 4096, 51200, 3, 166}, - {4, 8, 1, 4096, 51200, 3, 150}, - {4, 1, 1, 4096, 128000, 3, 170}, - {4, 2, 1, 4096, 128000, 2, 170}, - {4, 3, 1, 4096, 128000, 3, 170}, - {4, 4, 1, 4096, 128000, 3, 170}, - {4, 5, 1, 4096, 128000, 3, 170}, - {4, 6, 1, 4096, 128000, 3, 166}, - {4, 7, 1, 4096, 128000, 3, 166}, - {4, 8, 1, 4096, 128000, 3, 156}, - {4, 1, 1, 5120, 256, 2, 16}, - {4, 2, 1, 5120, 256, 2, 16}, - {4, 3, 1, 5120, 256, 2, 22}, - {4, 4, 1, 5120, 256, 2, 18}, - {4, 5, 1, 5120, 256, 2, 16}, - {4, 6, 1, 5120, 256, 2, 16}, - {4, 7, 1, 5120, 256, 2, 20}, - {4, 8, 1, 5120, 256, 2, 16}, - {4, 1, 1, 5120, 512, 2, 30}, - {4, 2, 1, 5120, 512, 2, 34}, - {4, 3, 1, 5120, 512, 2, 40}, - {4, 4, 1, 5120, 512, 2, 34}, - {4, 5, 1, 5120, 512, 2, 32}, - {4, 6, 1, 5120, 512, 2, 32}, - {4, 7, 1, 5120, 512, 2, 40}, - {4, 8, 1, 5120, 512, 2, 36}, - {4, 1, 1, 5120, 1024, 2, 48}, - {4, 2, 1, 5120, 1024, 2, 88}, - {4, 3, 1, 5120, 1024, 2, 72}, - {4, 4, 1, 5120, 1024, 2, 72}, - {4, 5, 1, 5120, 1024, 2, 76}, - {4, 6, 1, 5120, 1024, 2, 56}, - {4, 7, 1, 5120, 1024, 2, 72}, - {4, 8, 1, 5120, 1024, 2, 56}, - {4, 1, 1, 5120, 2048, 2, 138}, - {4, 2, 1, 5120, 2048, 2, 112}, - {4, 3, 1, 5120, 2048, 2, 128}, - {4, 4, 1, 5120, 2048, 2, 104}, - {4, 5, 1, 5120, 2048, 2, 112}, - {4, 6, 1, 5120, 2048, 2, 120}, - {4, 7, 1, 5120, 2048, 2, 142}, - {4, 8, 1, 5120, 2048, 2, 112}, - {4, 1, 1, 5120, 3072, 2, 168}, - {4, 2, 1, 5120, 3072, 2, 168}, - {4, 3, 1, 5120, 3072, 2, 168}, - {4, 4, 1, 5120, 3072, 2, 168}, - {4, 5, 1, 5120, 3072, 2, 168}, - {4, 6, 1, 5120, 3072, 2, 168}, - {4, 7, 1, 5120, 3072, 2, 168}, - {4, 8, 1, 5120, 3072, 1, 168}, - {4, 1, 1, 5120, 4096, 2, 162}, - {4, 2, 1, 5120, 4096, 2, 160}, - {4, 3, 1, 5120, 4096, 2, 166}, - {4, 4, 1, 5120, 4096, 2, 168}, - {4, 5, 1, 5120, 4096, 2, 156}, - {4, 6, 1, 5120, 4096, 2, 160}, - {4, 7, 1, 5120, 4096, 2, 160}, - {4, 8, 1, 5120, 4096, 1, 160}, - {4, 1, 1, 5120, 5120, 2, 160}, - {4, 2, 1, 5120, 5120, 2, 160}, - {4, 3, 1, 5120, 5120, 2, 146}, - {4, 4, 1, 5120, 5120, 2, 152}, - {4, 5, 1, 5120, 5120, 2, 160}, - {4, 6, 1, 5120, 5120, 2, 160}, - {4, 7, 1, 5120, 5120, 2, 160}, - {4, 8, 1, 5120, 5120, 1, 160}, - {4, 1, 1, 5120, 8192, 2, 170}, - {4, 2, 1, 5120, 8192, 2, 168}, - {4, 3, 1, 5120, 8192, 2, 168}, - {4, 4, 1, 5120, 8192, 2, 164}, - {4, 5, 1, 5120, 8192, 3, 160}, - {4, 6, 1, 5120, 8192, 2, 160}, - {4, 7, 1, 5120, 8192, 3, 160}, - {4, 8, 1, 5120, 8192, 1, 160}, - {4, 1, 1, 5120, 12288, 3, 168}, - {4, 2, 1, 5120, 12288, 2, 170}, - {4, 3, 1, 5120, 12288, 3, 168}, - {4, 4, 1, 5120, 12288, 2, 168}, - {4, 5, 1, 5120, 12288, 3, 158}, - {4, 6, 1, 5120, 12288, 3, 144}, - {4, 7, 1, 5120, 12288, 3, 144}, - {4, 8, 1, 5120, 12288, 1, 168}, - {4, 1, 1, 5120, 14336, 3, 168}, - {4, 2, 1, 5120, 14336, 2, 168}, - {4, 3, 1, 5120, 14336, 3, 170}, - {4, 4, 1, 5120, 14336, 2, 168}, - {4, 5, 1, 5120, 14336, 3, 166}, - {4, 6, 1, 5120, 14336, 3, 168}, - {4, 7, 1, 5120, 14336, 3, 168}, - {4, 8, 1, 5120, 14336, 1, 168}, - {4, 1, 1, 5120, 16384, 3, 170}, - {4, 2, 1, 5120, 16384, 2, 170}, - {4, 3, 1, 5120, 16384, 3, 170}, - {4, 4, 1, 5120, 16384, 3, 170}, - {4, 5, 1, 5120, 16384, 3, 160}, - {4, 6, 1, 5120, 16384, 3, 128}, - {4, 7, 1, 5120, 16384, 3, 128}, - {4, 8, 1, 5120, 16384, 1, 168}, - {4, 1, 1, 5120, 24576, 3, 168}, - {4, 2, 1, 5120, 24576, 2, 170}, - {4, 3, 1, 5120, 24576, 3, 168}, - {4, 4, 1, 5120, 24576, 3, 168}, - {4, 5, 1, 5120, 24576, 3, 160}, - {4, 6, 1, 5120, 24576, 3, 160}, - {4, 7, 1, 5120, 24576, 3, 160}, - {4, 8, 1, 5120, 24576, 1, 168}, - {4, 1, 1, 5120, 51200, 3, 170}, - {4, 2, 1, 5120, 51200, 2, 170}, - {4, 3, 1, 5120, 51200, 3, 170}, - {4, 4, 1, 5120, 51200, 3, 170}, - {4, 5, 1, 5120, 51200, 3, 164}, - {4, 6, 1, 5120, 51200, 3, 160}, - {4, 7, 1, 5120, 51200, 3, 158}, - {4, 8, 1, 5120, 51200, 3, 150}, - {4, 1, 1, 5120, 128000, 3, 170}, - {4, 2, 1, 5120, 128000, 2, 170}, - {4, 3, 1, 5120, 128000, 3, 168}, - {4, 4, 1, 5120, 128000, 3, 170}, - {4, 5, 1, 5120, 128000, 3, 166}, - {4, 6, 1, 5120, 128000, 3, 166}, - {4, 7, 1, 5120, 128000, 3, 166}, - {4, 8, 1, 5120, 128000, 3, 166}, - {4, 1, 1, 8192, 256, 2, 22}, - {4, 2, 1, 8192, 256, 2, 22}, - {4, 3, 1, 8192, 256, 2, 20}, - {4, 4, 1, 8192, 256, 2, 16}, - {4, 5, 1, 8192, 256, 2, 24}, - {4, 6, 1, 8192, 256, 2, 22}, - {4, 7, 1, 8192, 256, 2, 20}, - {4, 8, 1, 8192, 256, 2, 20}, - {4, 1, 1, 8192, 512, 2, 32}, - {4, 2, 1, 8192, 512, 2, 36}, - {4, 3, 1, 8192, 512, 2, 40}, - {4, 4, 1, 8192, 512, 2, 38}, - {4, 5, 1, 8192, 512, 2, 40}, - {4, 6, 1, 8192, 512, 2, 44}, - {4, 7, 1, 8192, 512, 2, 48}, - {4, 8, 1, 8192, 512, 2, 32}, - {4, 1, 1, 8192, 1024, 2, 64}, - {4, 2, 1, 8192, 1024, 2, 72}, - {4, 3, 1, 8192, 1024, 2, 80}, - {4, 4, 1, 8192, 1024, 2, 64}, - {4, 5, 1, 8192, 1024, 2, 88}, - {4, 6, 1, 8192, 1024, 2, 72}, - {4, 7, 1, 8192, 1024, 2, 80}, - {4, 8, 1, 8192, 1024, 2, 80}, - {4, 1, 1, 8192, 2048, 2, 144}, - {4, 2, 1, 8192, 2048, 2, 152}, - {4, 3, 1, 8192, 2048, 2, 156}, - {4, 4, 1, 8192, 2048, 2, 112}, - {4, 5, 1, 8192, 2048, 2, 152}, - {4, 6, 1, 8192, 2048, 2, 160}, - {4, 7, 1, 8192, 2048, 2, 156}, - {4, 8, 1, 8192, 2048, 2, 128}, - {4, 1, 1, 8192, 3072, 2, 156}, - {4, 2, 1, 8192, 3072, 2, 168}, - {4, 3, 1, 8192, 3072, 2, 168}, - {4, 4, 1, 8192, 3072, 2, 168}, - {4, 5, 1, 8192, 3072, 2, 168}, - {4, 6, 1, 8192, 3072, 2, 168}, - {4, 7, 1, 8192, 3072, 2, 168}, - {4, 8, 1, 8192, 3072, 1, 164}, - {4, 1, 1, 8192, 4096, 2, 156}, - {4, 2, 1, 8192, 4096, 2, 170}, - {4, 3, 1, 8192, 4096, 2, 170}, - {4, 4, 1, 8192, 4096, 2, 160}, - {4, 5, 1, 8192, 4096, 2, 162}, - {4, 6, 1, 8192, 4096, 2, 160}, - {4, 7, 1, 8192, 4096, 2, 160}, - {4, 8, 1, 8192, 4096, 1, 160}, - {4, 1, 1, 8192, 5120, 2, 168}, - {4, 2, 1, 8192, 5120, 2, 166}, - {4, 3, 1, 8192, 5120, 2, 168}, - {4, 4, 1, 8192, 5120, 2, 160}, - {4, 5, 1, 8192, 5120, 2, 166}, - {4, 6, 1, 8192, 5120, 2, 160}, - {4, 7, 1, 8192, 5120, 2, 160}, - {4, 8, 1, 8192, 5120, 1, 160}, - {4, 1, 1, 8192, 8192, 3, 170}, - {4, 2, 1, 8192, 8192, 2, 170}, - {4, 3, 1, 8192, 8192, 2, 170}, - {4, 4, 1, 8192, 8192, 2, 170}, - {4, 5, 1, 8192, 8192, 3, 160}, - {4, 6, 1, 8192, 8192, 2, 170}, - {4, 7, 1, 8192, 8192, 3, 128}, - {4, 8, 1, 8192, 8192, 2, 128}, - {4, 1, 1, 8192, 12288, 3, 170}, - {4, 2, 1, 8192, 12288, 2, 170}, - {4, 3, 1, 8192, 12288, 3, 170}, - {4, 4, 1, 8192, 12288, 3, 170}, - {4, 5, 1, 8192, 12288, 3, 168}, - {4, 6, 1, 8192, 12288, 3, 144}, - {4, 7, 1, 8192, 12288, 3, 144}, - {4, 8, 1, 8192, 12288, 2, 144}, - {4, 1, 1, 8192, 14336, 3, 168}, - {4, 2, 1, 8192, 14336, 2, 170}, - {4, 3, 1, 8192, 14336, 3, 170}, - {4, 4, 1, 8192, 14336, 3, 168}, - {4, 5, 1, 8192, 14336, 3, 168}, - {4, 6, 1, 8192, 14336, 3, 168}, - {4, 7, 1, 8192, 14336, 3, 168}, - {4, 8, 1, 8192, 14336, 1, 168}, - {4, 1, 1, 8192, 16384, 3, 170}, - {4, 2, 1, 8192, 16384, 2, 170}, - {4, 3, 1, 8192, 16384, 3, 170}, - {4, 4, 1, 8192, 16384, 3, 170}, - {4, 5, 1, 8192, 16384, 3, 160}, - {4, 6, 1, 8192, 16384, 3, 128}, - {4, 7, 1, 8192, 16384, 3, 128}, - {4, 8, 1, 8192, 16384, 1, 168}, - {4, 1, 1, 8192, 24576, 3, 170}, - {4, 2, 1, 8192, 24576, 2, 170}, - {4, 3, 1, 8192, 24576, 3, 170}, - {4, 4, 1, 8192, 24576, 3, 168}, - {4, 5, 1, 8192, 24576, 3, 160}, - {4, 6, 1, 8192, 24576, 3, 160}, - {4, 7, 1, 8192, 24576, 3, 128}, - {4, 8, 1, 8192, 24576, 1, 168}, - {4, 1, 1, 8192, 51200, 3, 170}, - {4, 2, 1, 8192, 51200, 2, 170}, - {4, 3, 1, 8192, 51200, 3, 170}, - {4, 4, 1, 8192, 51200, 3, 170}, - {4, 5, 1, 8192, 51200, 3, 156}, - {4, 6, 1, 8192, 51200, 3, 160}, - {4, 7, 1, 8192, 51200, 3, 156}, - {4, 8, 1, 8192, 51200, 3, 150}, - {4, 1, 1, 8192, 128000, 3, 170}, - {4, 2, 1, 8192, 128000, 2, 170}, - {4, 3, 1, 8192, 128000, 3, 170}, - {4, 4, 1, 8192, 128000, 3, 170}, - {4, 5, 1, 8192, 128000, 3, 168}, - {4, 6, 1, 8192, 128000, 3, 168}, - {4, 7, 1, 8192, 128000, 3, 166}, - {4, 8, 1, 8192, 128000, 3, 156}, - {4, 1, 1, 12288, 256, 2, 24}, - {4, 2, 1, 12288, 256, 2, 24}, - {4, 3, 1, 12288, 256, 2, 24}, - {4, 4, 1, 12288, 256, 2, 24}, - {4, 5, 1, 12288, 256, 2, 26}, - {4, 6, 1, 12288, 256, 2, 24}, - {4, 7, 1, 12288, 256, 2, 26}, - {4, 8, 1, 12288, 256, 2, 24}, - {4, 1, 1, 12288, 512, 2, 48}, - {4, 2, 1, 12288, 512, 2, 48}, - {4, 3, 1, 12288, 512, 2, 44}, - {4, 4, 1, 12288, 512, 2, 48}, - {4, 5, 1, 12288, 512, 2, 42}, - {4, 6, 1, 12288, 512, 2, 48}, - {4, 7, 1, 12288, 512, 2, 56}, - {4, 8, 1, 12288, 512, 2, 48}, - {4, 1, 1, 12288, 1024, 2, 88}, - {4, 2, 1, 12288, 1024, 2, 94}, - {4, 3, 1, 12288, 1024, 2, 88}, - {4, 4, 1, 12288, 1024, 2, 100}, - {4, 5, 1, 12288, 1024, 2, 112}, - {4, 6, 1, 12288, 1024, 2, 110}, - {4, 7, 1, 12288, 1024, 2, 120}, - {4, 8, 1, 12288, 1024, 2, 98}, - {4, 1, 1, 12288, 2048, 2, 156}, - {4, 2, 1, 12288, 2048, 2, 152}, - {4, 3, 1, 12288, 2048, 2, 162}, - {4, 4, 1, 12288, 2048, 2, 160}, - {4, 5, 1, 12288, 2048, 2, 160}, - {4, 6, 1, 12288, 2048, 2, 168}, - {4, 7, 1, 12288, 2048, 2, 160}, - {4, 8, 1, 12288, 2048, 2, 128}, - {4, 1, 1, 12288, 3072, 2, 168}, - {4, 2, 1, 12288, 3072, 2, 168}, - {4, 3, 1, 12288, 3072, 2, 168}, - {4, 4, 1, 12288, 3072, 2, 168}, - {4, 5, 1, 12288, 3072, 2, 168}, - {4, 6, 1, 12288, 3072, 2, 168}, - {4, 7, 1, 12288, 3072, 2, 168}, - {4, 8, 1, 12288, 3072, 1, 168}, - {4, 1, 1, 12288, 4096, 2, 170}, - {4, 2, 1, 12288, 4096, 2, 168}, - {4, 3, 1, 12288, 4096, 2, 170}, - {4, 4, 1, 12288, 4096, 2, 160}, - {4, 5, 1, 12288, 4096, 2, 168}, - {4, 6, 1, 12288, 4096, 2, 160}, - {4, 7, 1, 12288, 4096, 2, 166}, - {4, 8, 1, 12288, 4096, 1, 160}, - {4, 1, 1, 12288, 5120, 3, 164}, - {4, 2, 1, 12288, 5120, 2, 164}, - {4, 3, 1, 12288, 5120, 2, 170}, - {4, 4, 1, 12288, 5120, 2, 160}, - {4, 5, 1, 12288, 5120, 3, 160}, - {4, 6, 1, 12288, 5120, 2, 160}, - {4, 7, 1, 12288, 5120, 2, 160}, - {4, 8, 1, 12288, 5120, 1, 160}, - {4, 1, 1, 12288, 8192, 3, 170}, - {4, 2, 1, 12288, 8192, 2, 170}, - {4, 3, 1, 12288, 8192, 3, 170}, - {4, 4, 1, 12288, 8192, 2, 170}, - {4, 5, 1, 12288, 8192, 3, 160}, - {4, 6, 1, 12288, 8192, 3, 128}, - {4, 7, 1, 12288, 8192, 3, 160}, - {4, 8, 1, 12288, 8192, 1, 160}, - {4, 1, 1, 12288, 12288, 3, 170}, - {4, 2, 1, 12288, 12288, 2, 170}, - {4, 3, 1, 12288, 12288, 3, 170}, - {4, 4, 1, 12288, 12288, 3, 168}, - {4, 5, 1, 12288, 12288, 3, 168}, - {4, 6, 1, 12288, 12288, 3, 144}, - {4, 7, 1, 12288, 12288, 3, 144}, - {4, 8, 1, 12288, 12288, 1, 162}, - {4, 1, 1, 12288, 14336, 3, 170}, - {4, 2, 1, 12288, 14336, 2, 170}, - {4, 3, 1, 12288, 14336, 3, 168}, - {4, 4, 1, 12288, 14336, 3, 168}, - {4, 5, 1, 12288, 14336, 3, 168}, - {4, 6, 1, 12288, 14336, 3, 168}, - {4, 7, 1, 12288, 14336, 3, 168}, - {4, 8, 1, 12288, 14336, 1, 168}, - {4, 1, 1, 12288, 16384, 3, 170}, - {4, 2, 1, 12288, 16384, 2, 170}, - {4, 3, 1, 12288, 16384, 3, 170}, - {4, 4, 1, 12288, 16384, 3, 168}, - {4, 5, 1, 12288, 16384, 3, 160}, - {4, 6, 1, 12288, 16384, 3, 128}, - {4, 7, 1, 12288, 16384, 3, 128}, - {4, 8, 1, 12288, 16384, 1, 168}, - {4, 1, 1, 12288, 24576, 3, 170}, - {4, 2, 1, 12288, 24576, 2, 170}, - {4, 3, 1, 12288, 24576, 3, 170}, - {4, 4, 1, 12288, 24576, 3, 168}, - {4, 5, 1, 12288, 24576, 3, 160}, - {4, 6, 1, 12288, 24576, 3, 160}, - {4, 7, 1, 12288, 24576, 3, 160}, - {4, 8, 1, 12288, 24576, 1, 168}, - {4, 1, 1, 12288, 51200, 3, 170}, - {4, 2, 1, 12288, 51200, 2, 170}, - {4, 3, 1, 12288, 51200, 3, 170}, - {4, 4, 1, 12288, 51200, 3, 170}, - {4, 5, 1, 12288, 51200, 3, 166}, - {4, 6, 1, 12288, 51200, 3, 160}, - {4, 7, 1, 12288, 51200, 3, 156}, - {4, 8, 1, 12288, 51200, 3, 150}, - {4, 1, 1, 12288, 128000, 3, 170}, - {4, 2, 1, 12288, 128000, 2, 170}, - {4, 3, 1, 12288, 128000, 3, 170}, - {4, 4, 1, 12288, 128000, 3, 170}, - {4, 5, 1, 12288, 128000, 3, 168}, - {4, 6, 1, 12288, 128000, 3, 166}, - {4, 7, 1, 12288, 128000, 3, 166}, - {4, 8, 1, 12288, 128000, 3, 156}, - {4, 1, 1, 14336, 256, 2, 32}, - {4, 2, 1, 14336, 256, 2, 28}, - {4, 3, 1, 14336, 256, 2, 26}, - {4, 4, 1, 14336, 256, 2, 28}, - {4, 5, 1, 14336, 256, 2, 26}, - {4, 6, 1, 14336, 256, 2, 30}, - {4, 7, 1, 14336, 256, 2, 32}, - {4, 8, 1, 14336, 256, 2, 26}, - {4, 1, 1, 14336, 512, 2, 48}, - {4, 2, 1, 14336, 512, 2, 56}, - {4, 3, 1, 14336, 512, 2, 48}, - {4, 4, 1, 14336, 512, 2, 48}, - {4, 5, 1, 14336, 512, 2, 56}, - {4, 6, 1, 14336, 512, 2, 56}, - {4, 7, 1, 14336, 512, 2, 64}, - {4, 8, 1, 14336, 512, 2, 56}, - {4, 1, 1, 14336, 1024, 2, 104}, - {4, 2, 1, 14336, 1024, 2, 104}, - {4, 3, 1, 14336, 1024, 2, 96}, - {4, 4, 1, 14336, 1024, 2, 104}, - {4, 5, 1, 14336, 1024, 2, 112}, - {4, 6, 1, 14336, 1024, 2, 106}, - {4, 7, 1, 14336, 1024, 2, 152}, - {4, 8, 1, 14336, 1024, 2, 112}, - {4, 1, 1, 14336, 2048, 2, 162}, - {4, 2, 1, 14336, 2048, 2, 164}, - {4, 3, 1, 14336, 2048, 2, 170}, - {4, 4, 1, 14336, 2048, 2, 160}, - {4, 5, 1, 14336, 2048, 2, 168}, - {4, 6, 1, 14336, 2048, 2, 160}, - {4, 7, 1, 14336, 2048, 2, 160}, - {4, 8, 1, 14336, 2048, 2, 128}, - {4, 1, 1, 14336, 3072, 2, 168}, - {4, 2, 1, 14336, 3072, 2, 168}, - {4, 3, 1, 14336, 3072, 2, 168}, - {4, 4, 1, 14336, 3072, 2, 168}, - {4, 5, 1, 14336, 3072, 2, 168}, - {4, 6, 1, 14336, 3072, 2, 168}, - {4, 7, 1, 14336, 3072, 2, 168}, - {4, 8, 1, 14336, 3072, 1, 168}, - {4, 1, 1, 14336, 4096, 2, 170}, - {4, 2, 1, 14336, 4096, 2, 170}, - {4, 3, 1, 14336, 4096, 2, 170}, - {4, 4, 1, 14336, 4096, 2, 168}, - {4, 5, 1, 14336, 4096, 2, 168}, - {4, 6, 1, 14336, 4096, 2, 160}, - {4, 7, 1, 14336, 4096, 2, 160}, - {4, 8, 1, 14336, 4096, 1, 160}, - {4, 1, 1, 14336, 5120, 3, 170}, - {4, 2, 1, 14336, 5120, 2, 170}, - {4, 3, 1, 14336, 5120, 2, 170}, - {4, 4, 1, 14336, 5120, 2, 160}, - {4, 5, 1, 14336, 5120, 3, 160}, - {4, 6, 1, 14336, 5120, 2, 160}, - {4, 7, 1, 14336, 5120, 2, 160}, - {4, 8, 1, 14336, 5120, 1, 160}, - {4, 1, 1, 14336, 8192, 3, 170}, - {4, 2, 1, 14336, 8192, 2, 170}, - {4, 3, 1, 14336, 8192, 3, 170}, - {4, 4, 1, 14336, 8192, 3, 170}, - {4, 5, 1, 14336, 8192, 3, 160}, - {4, 6, 1, 14336, 8192, 3, 128}, - {4, 7, 1, 14336, 8192, 3, 128}, - {4, 8, 1, 14336, 8192, 1, 160}, - {4, 1, 1, 14336, 12288, 3, 170}, - {4, 2, 1, 14336, 12288, 2, 170}, - {4, 3, 1, 14336, 12288, 3, 170}, - {4, 4, 1, 14336, 12288, 3, 170}, - {4, 5, 1, 14336, 12288, 3, 168}, - {4, 6, 1, 14336, 12288, 3, 144}, - {4, 7, 1, 14336, 12288, 3, 144}, - {4, 8, 1, 14336, 12288, 2, 144}, - {4, 1, 1, 14336, 14336, 3, 170}, - {4, 2, 1, 14336, 14336, 2, 170}, - {4, 3, 1, 14336, 14336, 3, 170}, - {4, 4, 1, 14336, 14336, 3, 168}, - {4, 5, 1, 14336, 14336, 3, 168}, - {4, 6, 1, 14336, 14336, 3, 168}, - {4, 7, 1, 14336, 14336, 3, 168}, - {4, 8, 1, 14336, 14336, 1, 168}, - {4, 1, 1, 14336, 16384, 3, 170}, - {4, 2, 1, 14336, 16384, 2, 170}, - {4, 3, 1, 14336, 16384, 3, 170}, - {4, 4, 1, 14336, 16384, 3, 170}, - {4, 5, 1, 14336, 16384, 3, 160}, - {4, 6, 1, 14336, 16384, 3, 128}, - {4, 7, 1, 14336, 16384, 3, 128}, - {4, 8, 1, 14336, 16384, 1, 168}, - {4, 1, 1, 14336, 24576, 3, 170}, - {4, 2, 1, 14336, 24576, 2, 170}, - {4, 3, 1, 14336, 24576, 3, 170}, - {4, 4, 1, 14336, 24576, 3, 168}, - {4, 5, 1, 14336, 24576, 3, 160}, - {4, 6, 1, 14336, 24576, 3, 160}, - {4, 7, 1, 14336, 24576, 3, 128}, - {4, 8, 1, 14336, 24576, 1, 168}, - {4, 1, 1, 14336, 51200, 3, 170}, - {4, 2, 1, 14336, 51200, 2, 170}, - {4, 3, 1, 14336, 51200, 3, 170}, - {4, 4, 1, 14336, 51200, 3, 170}, - {4, 5, 1, 14336, 51200, 3, 170}, - {4, 6, 1, 14336, 51200, 3, 160}, - {4, 7, 1, 14336, 51200, 3, 146}, - {4, 8, 1, 14336, 51200, 3, 150}, - {4, 1, 1, 14336, 128000, 3, 170}, - {4, 2, 1, 14336, 128000, 2, 170}, - {4, 3, 1, 14336, 128000, 3, 170}, - {4, 4, 1, 14336, 128000, 3, 170}, - {4, 5, 1, 14336, 128000, 3, 158}, - {4, 6, 1, 14336, 128000, 3, 166}, - {4, 7, 1, 14336, 128000, 3, 166}, - {4, 8, 1, 14336, 128000, 3, 166}, - {4, 1, 1, 16384, 256, 2, 26}, - {4, 2, 1, 16384, 256, 2, 28}, - {4, 3, 1, 16384, 256, 2, 28}, - {4, 4, 1, 16384, 256, 2, 26}, - {4, 5, 1, 16384, 256, 2, 24}, - {4, 6, 1, 16384, 256, 2, 30}, - {4, 7, 1, 16384, 256, 2, 32}, - {4, 8, 1, 16384, 256, 2, 30}, - {4, 1, 1, 16384, 512, 2, 56}, - {4, 2, 1, 16384, 512, 2, 56}, - {4, 3, 1, 16384, 512, 2, 48}, - {4, 4, 1, 16384, 512, 2, 52}, - {4, 5, 1, 16384, 512, 2, 62}, - {4, 6, 1, 16384, 512, 2, 56}, - {4, 7, 1, 16384, 512, 2, 64}, - {4, 8, 1, 16384, 512, 2, 72}, - {4, 1, 1, 16384, 1024, 2, 108}, - {4, 2, 1, 16384, 1024, 2, 104}, - {4, 3, 1, 16384, 1024, 2, 104}, - {4, 4, 1, 16384, 1024, 2, 100}, - {4, 5, 1, 16384, 1024, 2, 128}, - {4, 6, 1, 16384, 1024, 2, 128}, - {4, 7, 1, 16384, 1024, 2, 128}, - {4, 8, 1, 16384, 1024, 2, 100}, - {4, 1, 1, 16384, 2048, 2, 158}, - {4, 2, 1, 16384, 2048, 2, 164}, - {4, 3, 1, 16384, 2048, 2, 168}, - {4, 4, 1, 16384, 2048, 2, 144}, - {4, 5, 1, 16384, 2048, 2, 168}, - {4, 6, 1, 16384, 2048, 2, 152}, - {4, 7, 1, 16384, 2048, 2, 168}, - {4, 8, 1, 16384, 2048, 1, 160}, - {4, 1, 1, 16384, 3072, 2, 170}, - {4, 2, 1, 16384, 3072, 2, 170}, - {4, 3, 1, 16384, 3072, 2, 168}, - {4, 4, 1, 16384, 3072, 2, 170}, - {4, 5, 1, 16384, 3072, 2, 168}, - {4, 6, 1, 16384, 3072, 2, 168}, - {4, 7, 1, 16384, 3072, 2, 168}, - {4, 8, 1, 16384, 3072, 1, 168}, - {4, 1, 1, 16384, 4096, 2, 170}, - {4, 2, 1, 16384, 4096, 2, 168}, - {4, 3, 1, 16384, 4096, 2, 170}, - {4, 4, 1, 16384, 4096, 2, 170}, - {4, 5, 1, 16384, 4096, 2, 170}, - {4, 6, 1, 16384, 4096, 2, 160}, - {4, 7, 1, 16384, 4096, 2, 170}, - {4, 8, 1, 16384, 4096, 1, 160}, - {4, 1, 1, 16384, 5120, 3, 170}, - {4, 2, 1, 16384, 5120, 2, 170}, - {4, 3, 1, 16384, 5120, 2, 170}, - {4, 4, 1, 16384, 5120, 2, 170}, - {4, 5, 1, 16384, 5120, 3, 160}, - {4, 6, 1, 16384, 5120, 2, 160}, - {4, 7, 1, 16384, 5120, 3, 160}, - {4, 8, 1, 16384, 5120, 1, 160}, - {4, 1, 1, 16384, 8192, 3, 170}, - {4, 2, 1, 16384, 8192, 2, 170}, - {4, 3, 1, 16384, 8192, 3, 170}, - {4, 4, 1, 16384, 8192, 3, 170}, - {4, 5, 1, 16384, 8192, 3, 160}, - {4, 6, 1, 16384, 8192, 3, 128}, - {4, 7, 1, 16384, 8192, 3, 160}, - {4, 8, 1, 16384, 8192, 1, 160}, - {4, 1, 1, 16384, 12288, 3, 170}, - {4, 2, 1, 16384, 12288, 2, 170}, - {4, 3, 1, 16384, 12288, 3, 170}, - {4, 4, 1, 16384, 12288, 3, 168}, - {4, 5, 1, 16384, 12288, 3, 168}, - {4, 6, 1, 16384, 12288, 3, 144}, - {4, 7, 1, 16384, 12288, 3, 144}, - {4, 8, 1, 16384, 12288, 2, 150}, - {4, 1, 1, 16384, 14336, 3, 170}, - {4, 2, 1, 16384, 14336, 2, 170}, - {4, 3, 1, 16384, 14336, 3, 170}, - {4, 4, 1, 16384, 14336, 3, 168}, - {4, 5, 1, 16384, 14336, 3, 168}, - {4, 6, 1, 16384, 14336, 3, 168}, - {4, 7, 1, 16384, 14336, 3, 168}, - {4, 8, 1, 16384, 14336, 1, 168}, - {4, 1, 1, 16384, 16384, 3, 170}, - {4, 2, 1, 16384, 16384, 2, 170}, - {4, 3, 1, 16384, 16384, 3, 170}, - {4, 4, 1, 16384, 16384, 3, 170}, - {4, 5, 1, 16384, 16384, 3, 160}, - {4, 6, 1, 16384, 16384, 3, 128}, - {4, 7, 1, 16384, 16384, 3, 128}, - {4, 8, 1, 16384, 16384, 1, 168}, - {4, 1, 1, 16384, 24576, 3, 170}, - {4, 2, 1, 16384, 24576, 2, 170}, - {4, 3, 1, 16384, 24576, 3, 170}, - {4, 4, 1, 16384, 24576, 3, 170}, - {4, 5, 1, 16384, 24576, 3, 160}, - {4, 6, 1, 16384, 24576, 3, 160}, - {4, 7, 1, 16384, 24576, 3, 160}, - {4, 8, 1, 16384, 24576, 1, 168}, - {4, 1, 1, 16384, 51200, 3, 170}, - {4, 2, 1, 16384, 51200, 2, 170}, - {4, 3, 1, 16384, 51200, 3, 170}, - {4, 4, 1, 16384, 51200, 3, 170}, - {4, 5, 1, 16384, 51200, 3, 170}, - {4, 6, 1, 16384, 51200, 3, 160}, - {4, 7, 1, 16384, 51200, 3, 162}, - {4, 8, 1, 16384, 51200, 3, 150}, - {4, 1, 1, 16384, 128000, 3, 170}, - {4, 2, 1, 16384, 128000, 2, 170}, - {4, 3, 1, 16384, 128000, 3, 170}, - {4, 4, 1, 16384, 128000, 3, 170}, - {4, 5, 1, 16384, 128000, 3, 160}, - {4, 6, 1, 16384, 128000, 3, 166}, - {4, 7, 1, 16384, 128000, 3, 166}, - {4, 8, 1, 16384, 128000, 3, 136}, - {4, 1, 1, 24576, 256, 2, 32}, - {4, 2, 1, 24576, 256, 2, 32}, - {4, 3, 1, 24576, 256, 2, 32}, - {4, 4, 1, 24576, 256, 2, 24}, - {4, 5, 1, 24576, 256, 2, 34}, - {4, 6, 1, 24576, 256, 2, 44}, - {4, 7, 1, 24576, 256, 2, 44}, - {4, 8, 1, 24576, 256, 2, 36}, - {4, 1, 1, 24576, 512, 2, 64}, - {4, 2, 1, 24576, 512, 2, 70}, - {4, 3, 1, 24576, 512, 2, 70}, - {4, 4, 1, 24576, 512, 2, 56}, - {4, 5, 1, 24576, 512, 2, 74}, - {4, 6, 1, 24576, 512, 2, 72}, - {4, 7, 1, 24576, 512, 2, 88}, - {4, 8, 1, 24576, 512, 2, 72}, - {4, 1, 1, 24576, 1024, 2, 132}, - {4, 2, 1, 24576, 1024, 2, 144}, - {4, 3, 1, 24576, 1024, 2, 144}, - {4, 4, 1, 24576, 1024, 2, 120}, - {4, 5, 1, 24576, 1024, 2, 140}, - {4, 6, 1, 24576, 1024, 2, 144}, - {4, 7, 1, 24576, 1024, 2, 144}, - {4, 8, 1, 24576, 1024, 2, 120}, - {4, 1, 1, 24576, 2048, 2, 170}, - {4, 2, 1, 24576, 2048, 2, 170}, - {4, 3, 1, 24576, 2048, 2, 158}, - {4, 4, 1, 24576, 2048, 2, 162}, - {4, 5, 1, 24576, 2048, 2, 168}, - {4, 6, 1, 24576, 2048, 2, 160}, - {4, 7, 1, 24576, 2048, 2, 160}, - {4, 8, 1, 24576, 2048, 1, 160}, - {4, 1, 1, 24576, 3072, 2, 170}, - {4, 2, 1, 24576, 3072, 2, 170}, - {4, 3, 1, 24576, 3072, 2, 168}, - {4, 4, 1, 24576, 3072, 2, 168}, - {4, 5, 1, 24576, 3072, 2, 168}, - {4, 6, 1, 24576, 3072, 2, 168}, - {4, 7, 1, 24576, 3072, 2, 168}, - {4, 8, 1, 24576, 3072, 1, 168}, - {4, 1, 1, 24576, 4096, 2, 170}, - {4, 2, 1, 24576, 4096, 2, 170}, - {4, 3, 1, 24576, 4096, 3, 170}, - {4, 4, 1, 24576, 4096, 2, 170}, - {4, 5, 1, 24576, 4096, 3, 160}, - {4, 6, 1, 24576, 4096, 2, 160}, - {4, 7, 1, 24576, 4096, 3, 144}, - {4, 8, 1, 24576, 4096, 1, 160}, - {4, 1, 1, 24576, 5120, 3, 170}, - {4, 2, 1, 24576, 5120, 2, 170}, - {4, 3, 1, 24576, 5120, 3, 170}, - {4, 4, 1, 24576, 5120, 3, 170}, - {4, 5, 1, 24576, 5120, 3, 160}, - {4, 6, 1, 24576, 5120, 2, 160}, - {4, 7, 1, 24576, 5120, 3, 160}, - {4, 8, 1, 24576, 5120, 1, 160}, - {4, 1, 1, 24576, 8192, 3, 170}, - {4, 2, 1, 24576, 8192, 2, 170}, - {4, 3, 1, 24576, 8192, 3, 170}, - {4, 4, 1, 24576, 8192, 3, 170}, - {4, 5, 1, 24576, 8192, 3, 160}, - {4, 6, 1, 24576, 8192, 3, 128}, - {4, 7, 1, 24576, 8192, 3, 128}, - {4, 8, 1, 24576, 8192, 1, 160}, - {4, 1, 1, 24576, 12288, 3, 170}, - {4, 2, 1, 24576, 12288, 2, 170}, - {4, 3, 1, 24576, 12288, 3, 170}, - {4, 4, 1, 24576, 12288, 3, 168}, - {4, 5, 1, 24576, 12288, 3, 168}, - {4, 6, 1, 24576, 12288, 3, 144}, - {4, 7, 1, 24576, 12288, 3, 144}, - {4, 8, 1, 24576, 12288, 2, 156}, - {4, 1, 1, 24576, 14336, 3, 170}, - {4, 2, 1, 24576, 14336, 2, 170}, - {4, 3, 1, 24576, 14336, 3, 170}, - {4, 4, 1, 24576, 14336, 3, 168}, - {4, 5, 1, 24576, 14336, 3, 168}, - {4, 6, 1, 24576, 14336, 3, 168}, - {4, 7, 1, 24576, 14336, 3, 168}, - {4, 8, 1, 24576, 14336, 1, 168}, - {4, 1, 1, 24576, 16384, 3, 170}, - {4, 2, 1, 24576, 16384, 2, 170}, - {4, 3, 1, 24576, 16384, 3, 170}, - {4, 4, 1, 24576, 16384, 3, 170}, - {4, 5, 1, 24576, 16384, 3, 160}, - {4, 6, 1, 24576, 16384, 3, 128}, - {4, 7, 1, 24576, 16384, 3, 128}, - {4, 8, 1, 24576, 16384, 1, 168}, - {4, 1, 1, 24576, 24576, 3, 170}, - {4, 2, 1, 24576, 24576, 2, 170}, - {4, 3, 1, 24576, 24576, 3, 170}, - {4, 4, 1, 24576, 24576, 3, 170}, - {4, 5, 1, 24576, 24576, 3, 160}, - {4, 6, 1, 24576, 24576, 3, 160}, - {4, 7, 1, 24576, 24576, 3, 160}, - {4, 8, 1, 24576, 24576, 2, 168}, - {4, 1, 1, 24576, 51200, 3, 170}, - {4, 2, 1, 24576, 51200, 2, 170}, - {4, 3, 1, 24576, 51200, 3, 170}, - {4, 4, 1, 24576, 51200, 3, 170}, - {4, 5, 1, 24576, 51200, 3, 166}, - {4, 6, 1, 24576, 51200, 3, 160}, - {4, 7, 1, 24576, 51200, 3, 158}, - {4, 8, 1, 24576, 51200, 3, 156}, - {4, 1, 1, 24576, 128000, 3, 170}, - {4, 2, 1, 24576, 128000, 2, 170}, - {4, 3, 1, 24576, 128000, 3, 170}, - {4, 4, 1, 24576, 128000, 3, 170}, - {4, 5, 1, 24576, 128000, 3, 168}, - {4, 6, 1, 24576, 128000, 3, 166}, - {4, 7, 1, 24576, 128000, 3, 166}, - {4, 8, 1, 24576, 128000, 3, 166}, - {3, 1, 1, 128, 256, 1, 4}, - {3, 2, 1, 128, 256, 1, 4}, - {3, 3, 1, 128, 256, 1, 4}, - {3, 4, 1, 128, 256, 1, 4}, - {3, 5, 1, 128, 256, 1, 4}, - {3, 6, 1, 128, 256, 1, 4}, - {3, 7, 1, 128, 256, 1, 4}, - {3, 8, 1, 128, 256, 1, 4}, - {3, 1, 1, 128, 512, 1, 8}, - {3, 2, 1, 128, 512, 2, 4}, - {3, 3, 1, 128, 512, 1, 8}, - {3, 4, 1, 128, 512, 1, 8}, - {3, 5, 1, 128, 512, 1, 8}, - {3, 6, 1, 128, 512, 1, 8}, - {3, 7, 1, 128, 512, 1, 8}, - {3, 8, 1, 128, 512, 2, 8}, - {3, 1, 1, 128, 1024, 1, 16}, - {3, 2, 1, 128, 1024, 1, 16}, - {3, 3, 1, 128, 1024, 1, 16}, - {3, 4, 1, 128, 1024, 1, 16}, - {3, 5, 1, 128, 1024, 1, 16}, - {3, 6, 1, 128, 1024, 1, 16}, - {3, 7, 1, 128, 1024, 1, 16}, - {3, 8, 1, 128, 1024, 1, 16}, - {3, 1, 1, 128, 2048, 1, 32}, - {3, 2, 1, 128, 2048, 1, 32}, - {3, 3, 1, 128, 2048, 1, 32}, - {3, 4, 1, 128, 2048, 1, 32}, - {3, 5, 1, 128, 2048, 1, 32}, - {3, 6, 1, 128, 2048, 1, 32}, - {3, 7, 1, 128, 2048, 1, 32}, - {3, 8, 1, 128, 2048, 1, 32}, - {3, 1, 1, 128, 3072, 1, 48}, - {3, 2, 1, 128, 3072, 1, 48}, - {3, 3, 1, 128, 3072, 1, 48}, - {3, 4, 1, 128, 3072, 1, 48}, - {3, 5, 1, 128, 3072, 1, 48}, - {3, 6, 1, 128, 3072, 1, 48}, - {3, 7, 1, 128, 3072, 1, 48}, - {3, 8, 1, 128, 3072, 1, 48}, - {3, 1, 1, 128, 4096, 1, 64}, - {3, 2, 1, 128, 4096, 1, 64}, - {3, 3, 1, 128, 4096, 1, 64}, - {3, 4, 1, 128, 4096, 1, 64}, - {3, 5, 1, 128, 4096, 1, 64}, - {3, 6, 1, 128, 4096, 1, 64}, - {3, 7, 1, 128, 4096, 1, 64}, - {3, 8, 1, 128, 4096, 1, 64}, - {3, 1, 1, 128, 5120, 1, 40}, - {3, 2, 1, 128, 5120, 1, 80}, - {3, 3, 1, 128, 5120, 1, 80}, - {3, 4, 1, 128, 5120, 1, 80}, - {3, 5, 1, 128, 5120, 1, 80}, - {3, 6, 1, 128, 5120, 1, 80}, - {3, 7, 1, 128, 5120, 1, 80}, - {3, 8, 1, 128, 5120, 1, 80}, - {3, 1, 1, 128, 8192, 1, 128}, - {3, 2, 1, 128, 8192, 1, 128}, - {3, 3, 1, 128, 8192, 1, 128}, - {3, 4, 1, 128, 8192, 1, 128}, - {3, 5, 1, 128, 8192, 1, 128}, - {3, 6, 1, 128, 8192, 1, 128}, - {3, 7, 1, 128, 8192, 1, 128}, - {3, 8, 1, 128, 8192, 1, 128}, - {3, 1, 1, 128, 12288, 1, 96}, - {3, 2, 1, 128, 12288, 1, 96}, - {3, 3, 1, 128, 12288, 1, 96}, - {3, 4, 1, 128, 12288, 1, 96}, - {3, 5, 1, 128, 12288, 1, 96}, - {3, 6, 1, 128, 12288, 1, 96}, - {3, 7, 1, 128, 12288, 1, 96}, - {3, 8, 1, 128, 12288, 1, 96}, - {3, 1, 1, 128, 14336, 1, 112}, - {3, 2, 1, 128, 14336, 1, 112}, - {3, 3, 1, 128, 14336, 1, 112}, - {3, 4, 1, 128, 14336, 1, 112}, - {3, 5, 1, 128, 14336, 1, 112}, - {3, 6, 1, 128, 14336, 1, 112}, - {3, 7, 1, 128, 14336, 1, 112}, - {3, 8, 1, 128, 14336, 1, 112}, - {3, 1, 1, 128, 16384, 1, 128}, - {3, 2, 1, 128, 16384, 1, 128}, - {3, 3, 1, 128, 16384, 1, 128}, - {3, 4, 1, 128, 16384, 1, 128}, - {3, 5, 1, 128, 16384, 1, 128}, - {3, 6, 1, 128, 16384, 1, 128}, - {3, 7, 1, 128, 16384, 1, 128}, - {3, 8, 1, 128, 16384, 1, 128}, - {3, 1, 1, 128, 24576, 3, 96}, - {3, 2, 1, 128, 24576, 3, 96}, - {3, 3, 1, 128, 24576, 3, 96}, - {3, 4, 1, 128, 24576, 3, 96}, - {3, 5, 1, 128, 24576, 1, 128}, - {3, 6, 1, 128, 24576, 1, 128}, - {3, 7, 1, 128, 24576, 1, 128}, - {3, 8, 1, 128, 24576, 1, 116}, - {3, 1, 1, 128, 51200, 2, 128}, - {3, 2, 1, 128, 51200, 2, 128}, - {3, 3, 1, 128, 51200, 3, 112}, - {3, 4, 1, 128, 51200, 2, 128}, - {3, 5, 1, 128, 51200, 2, 126}, - {3, 6, 1, 128, 51200, 2, 126}, - {3, 7, 1, 128, 51200, 2, 124}, - {3, 8, 1, 128, 51200, 1, 128}, - {3, 1, 1, 128, 128000, 3, 128}, - {3, 2, 1, 128, 128000, 3, 128}, - {3, 3, 1, 128, 128000, 3, 128}, - {3, 4, 1, 128, 128000, 3, 118}, - {3, 5, 1, 128, 128000, 3, 126}, - {3, 6, 1, 128, 128000, 2, 126}, - {3, 7, 1, 128, 128000, 2, 122}, - {3, 8, 1, 128, 128000, 1, 128}, - {3, 1, 1, 256, 256, 2, 4}, - {3, 2, 1, 256, 256, 2, 4}, - {3, 3, 1, 256, 256, 2, 4}, - {3, 4, 1, 256, 256, 2, 4}, - {3, 5, 1, 256, 256, 2, 4}, - {3, 6, 1, 256, 256, 2, 4}, - {3, 7, 1, 256, 256, 2, 4}, - {3, 8, 1, 256, 256, 2, 4}, - {3, 1, 1, 256, 512, 2, 8}, - {3, 2, 1, 256, 512, 2, 8}, - {3, 3, 1, 256, 512, 2, 8}, - {3, 4, 1, 256, 512, 2, 8}, - {3, 5, 1, 256, 512, 2, 8}, - {3, 6, 1, 256, 512, 2, 8}, - {3, 7, 1, 256, 512, 2, 8}, - {3, 8, 1, 256, 512, 2, 8}, - {3, 1, 1, 256, 1024, 2, 16}, - {3, 2, 1, 256, 1024, 2, 16}, - {3, 3, 1, 256, 1024, 2, 16}, - {3, 4, 1, 256, 1024, 2, 16}, - {3, 5, 1, 256, 1024, 2, 16}, - {3, 6, 1, 256, 1024, 2, 16}, - {3, 7, 1, 256, 1024, 2, 16}, - {3, 8, 1, 256, 1024, 2, 16}, - {3, 1, 1, 256, 2048, 2, 32}, - {3, 2, 1, 256, 2048, 2, 32}, - {3, 3, 1, 256, 2048, 1, 32}, - {3, 4, 1, 256, 2048, 2, 32}, - {3, 5, 1, 256, 2048, 1, 32}, - {3, 6, 1, 256, 2048, 1, 32}, - {3, 7, 1, 256, 2048, 2, 32}, - {3, 8, 1, 256, 2048, 1, 32}, - {3, 1, 1, 256, 3072, 2, 48}, - {3, 2, 1, 256, 3072, 2, 48}, - {3, 3, 1, 256, 3072, 2, 48}, - {3, 4, 1, 256, 3072, 2, 48}, - {3, 5, 1, 256, 3072, 1, 48}, - {3, 6, 1, 256, 3072, 1, 48}, - {3, 7, 1, 256, 3072, 1, 48}, - {3, 8, 1, 256, 3072, 1, 48}, - {3, 1, 1, 256, 4096, 2, 64}, - {3, 2, 1, 256, 4096, 1, 64}, - {3, 3, 1, 256, 4096, 1, 64}, - {3, 4, 1, 256, 4096, 2, 64}, - {3, 5, 1, 256, 4096, 1, 64}, - {3, 6, 1, 256, 4096, 1, 64}, - {3, 7, 1, 256, 4096, 1, 64}, - {3, 8, 1, 256, 4096, 1, 64}, - {3, 1, 1, 256, 5120, 2, 80}, - {3, 2, 1, 256, 5120, 1, 80}, - {3, 3, 1, 256, 5120, 1, 80}, - {3, 4, 1, 256, 5120, 2, 80}, - {3, 5, 1, 256, 5120, 1, 80}, - {3, 6, 1, 256, 5120, 1, 80}, - {3, 7, 1, 256, 5120, 1, 80}, - {3, 8, 1, 256, 5120, 1, 80}, - {3, 1, 1, 256, 8192, 2, 128}, - {3, 2, 1, 256, 8192, 2, 128}, - {3, 3, 1, 256, 8192, 1, 128}, - {3, 4, 1, 256, 8192, 1, 128}, - {3, 5, 1, 256, 8192, 1, 128}, - {3, 6, 1, 256, 8192, 1, 128}, - {3, 7, 1, 256, 8192, 1, 128}, - {3, 8, 1, 256, 8192, 1, 128}, - {3, 1, 1, 256, 12288, 2, 96}, - {3, 2, 1, 256, 12288, 2, 128}, - {3, 3, 1, 256, 12288, 1, 128}, - {3, 4, 1, 256, 12288, 2, 96}, - {3, 5, 1, 256, 12288, 1, 128}, - {3, 6, 1, 256, 12288, 2, 116}, - {3, 7, 1, 256, 12288, 2, 116}, - {3, 8, 1, 256, 12288, 1, 116}, - {3, 1, 1, 256, 14336, 2, 112}, - {3, 2, 1, 256, 14336, 2, 112}, - {3, 3, 1, 256, 14336, 2, 112}, - {3, 4, 1, 256, 14336, 2, 112}, - {3, 5, 1, 256, 14336, 1, 112}, - {3, 6, 1, 256, 14336, 1, 112}, - {3, 7, 1, 256, 14336, 1, 112}, - {3, 8, 1, 256, 14336, 1, 112}, - {3, 1, 1, 256, 16384, 2, 128}, - {3, 2, 1, 256, 16384, 2, 128}, - {3, 3, 1, 256, 16384, 2, 128}, - {3, 4, 1, 256, 16384, 1, 128}, - {3, 5, 1, 256, 16384, 1, 128}, - {3, 6, 1, 256, 16384, 1, 128}, - {3, 7, 1, 256, 16384, 1, 128}, - {3, 8, 1, 256, 16384, 2, 116}, - {3, 1, 1, 256, 24576, 3, 96}, - {3, 2, 1, 256, 24576, 3, 96}, - {3, 3, 1, 256, 24576, 3, 96}, - {3, 4, 1, 256, 24576, 2, 128}, - {3, 5, 1, 256, 24576, 1, 128}, - {3, 6, 1, 256, 24576, 1, 128}, - {3, 7, 1, 256, 24576, 1, 128}, - {3, 8, 1, 256, 24576, 1, 128}, - {3, 1, 1, 256, 51200, 3, 126}, - {3, 2, 1, 256, 51200, 3, 120}, - {3, 3, 1, 256, 51200, 3, 120}, - {3, 4, 1, 256, 51200, 2, 128}, - {3, 5, 1, 256, 51200, 2, 128}, - {3, 6, 1, 256, 51200, 2, 128}, - {3, 7, 1, 256, 51200, 2, 120}, - {3, 8, 1, 256, 51200, 1, 120}, - {3, 1, 1, 256, 128000, 3, 128}, - {3, 2, 1, 256, 128000, 3, 128}, - {3, 3, 1, 256, 128000, 3, 128}, - {3, 4, 1, 256, 128000, 3, 122}, - {3, 5, 1, 256, 128000, 2, 128}, - {3, 6, 1, 256, 128000, 2, 120}, - {3, 7, 1, 256, 128000, 2, 122}, - {3, 8, 1, 256, 128000, 1, 126}, - {3, 1, 1, 512, 256, 2, 4}, - {3, 2, 1, 512, 256, 2, 4}, - {3, 3, 1, 512, 256, 2, 8}, - {3, 4, 1, 512, 256, 2, 4}, - {3, 5, 1, 512, 256, 2, 8}, - {3, 6, 1, 512, 256, 2, 8}, - {3, 7, 1, 512, 256, 2, 8}, - {3, 8, 1, 512, 256, 2, 8}, - {3, 1, 1, 512, 512, 2, 8}, - {3, 2, 1, 512, 512, 2, 8}, - {3, 3, 1, 512, 512, 2, 16}, - {3, 4, 1, 512, 512, 2, 8}, - {3, 5, 1, 512, 512, 2, 16}, - {3, 6, 1, 512, 512, 2, 16}, - {3, 7, 1, 512, 512, 2, 16}, - {3, 8, 1, 512, 512, 2, 16}, - {3, 1, 1, 512, 1024, 2, 16}, - {3, 2, 1, 512, 1024, 2, 16}, - {3, 3, 1, 512, 1024, 2, 32}, - {3, 4, 1, 512, 1024, 2, 16}, - {3, 5, 1, 512, 1024, 2, 32}, - {3, 6, 1, 512, 1024, 2, 32}, - {3, 7, 1, 512, 1024, 2, 32}, - {3, 8, 1, 512, 1024, 2, 32}, - {3, 1, 1, 512, 2048, 2, 32}, - {3, 2, 1, 512, 2048, 2, 32}, - {3, 3, 1, 512, 2048, 1, 64}, - {3, 4, 1, 512, 2048, 2, 32}, - {3, 5, 1, 512, 2048, 1, 64}, - {3, 6, 1, 512, 2048, 1, 64}, - {3, 7, 1, 512, 2048, 1, 64}, - {3, 8, 1, 512, 2048, 1, 64}, - {3, 1, 1, 512, 3072, 2, 48}, - {3, 2, 1, 512, 3072, 2, 48}, - {3, 3, 1, 512, 3072, 1, 72}, - {3, 4, 1, 512, 3072, 2, 48}, - {3, 5, 1, 512, 3072, 1, 96}, - {3, 6, 1, 512, 3072, 1, 72}, - {3, 7, 1, 512, 3072, 1, 96}, - {3, 8, 1, 512, 3072, 1, 96}, - {3, 1, 1, 512, 4096, 2, 64}, - {3, 2, 1, 512, 4096, 2, 64}, - {3, 3, 1, 512, 4096, 1, 96}, - {3, 4, 1, 512, 4096, 2, 64}, - {3, 5, 1, 512, 4096, 1, 128}, - {3, 6, 1, 512, 4096, 1, 128}, - {3, 7, 1, 512, 4096, 1, 128}, - {3, 8, 1, 512, 4096, 1, 94}, - {3, 1, 1, 512, 5120, 2, 80}, - {3, 2, 1, 512, 5120, 2, 80}, - {3, 3, 1, 512, 5120, 1, 120}, - {3, 4, 1, 512, 5120, 2, 80}, - {3, 5, 1, 512, 5120, 1, 120}, - {3, 6, 1, 512, 5120, 1, 120}, - {3, 7, 1, 512, 5120, 1, 120}, - {3, 8, 1, 512, 5120, 2, 112}, - {3, 1, 1, 512, 8192, 2, 128}, - {3, 2, 1, 512, 8192, 2, 128}, - {3, 3, 1, 512, 8192, 2, 128}, - {3, 4, 1, 512, 8192, 2, 116}, - {3, 5, 1, 512, 8192, 2, 116}, - {3, 6, 1, 512, 8192, 1, 128}, - {3, 7, 1, 512, 8192, 2, 116}, - {3, 8, 1, 512, 8192, 1, 116}, - {3, 1, 1, 512, 12288, 2, 128}, - {3, 2, 1, 512, 12288, 2, 128}, - {3, 3, 1, 512, 12288, 1, 128}, - {3, 4, 1, 512, 12288, 2, 116}, - {3, 5, 1, 512, 12288, 2, 116}, - {3, 6, 1, 512, 12288, 1, 128}, - {3, 7, 1, 512, 12288, 2, 96}, - {3, 8, 1, 512, 12288, 1, 96}, - {3, 1, 1, 512, 14336, 2, 112}, - {3, 2, 1, 512, 14336, 2, 112}, - {3, 3, 1, 512, 14336, 3, 112}, - {3, 4, 1, 512, 14336, 2, 112}, - {3, 5, 1, 512, 14336, 2, 112}, - {3, 6, 1, 512, 14336, 1, 112}, - {3, 7, 1, 512, 14336, 1, 112}, - {3, 8, 1, 512, 14336, 1, 112}, - {3, 1, 1, 512, 16384, 2, 128}, - {3, 2, 1, 512, 16384, 2, 128}, - {3, 3, 1, 512, 16384, 3, 128}, - {3, 4, 1, 512, 16384, 2, 128}, - {3, 5, 1, 512, 16384, 1, 128}, - {3, 6, 1, 512, 16384, 1, 128}, - {3, 7, 1, 512, 16384, 1, 128}, - {3, 8, 1, 512, 16384, 1, 128}, - {3, 1, 1, 512, 24576, 3, 128}, - {3, 2, 1, 512, 24576, 3, 128}, - {3, 3, 1, 512, 24576, 3, 128}, - {3, 4, 1, 512, 24576, 2, 128}, - {3, 5, 1, 512, 24576, 2, 128}, - {3, 6, 1, 512, 24576, 1, 128}, - {3, 7, 1, 512, 24576, 1, 128}, - {3, 8, 1, 512, 24576, 1, 128}, - {3, 1, 1, 512, 51200, 3, 128}, - {3, 2, 1, 512, 51200, 3, 128}, - {3, 3, 1, 512, 51200, 3, 128}, - {3, 4, 1, 512, 51200, 2, 128}, - {3, 5, 1, 512, 51200, 2, 128}, - {3, 6, 1, 512, 51200, 1, 128}, - {3, 7, 1, 512, 51200, 2, 120}, - {3, 8, 1, 512, 51200, 1, 120}, - {3, 1, 1, 512, 128000, 3, 128}, - {3, 2, 1, 512, 128000, 3, 128}, - {3, 3, 1, 512, 128000, 3, 128}, - {3, 4, 1, 512, 128000, 3, 120}, - {3, 5, 1, 512, 128000, 2, 124}, - {3, 6, 1, 512, 128000, 2, 116}, - {3, 7, 1, 512, 128000, 2, 122}, - {3, 8, 1, 512, 128000, 1, 126}, - {3, 1, 1, 1024, 256, 2, 8}, - {3, 2, 1, 1024, 256, 2, 8}, - {3, 3, 1, 1024, 256, 2, 8}, - {3, 4, 1, 1024, 256, 2, 8}, - {3, 5, 1, 1024, 256, 2, 8}, - {3, 6, 1, 1024, 256, 2, 8}, - {3, 7, 1, 1024, 256, 2, 8}, - {3, 8, 1, 1024, 256, 2, 8}, - {3, 1, 1, 1024, 512, 2, 16}, - {3, 2, 1, 1024, 512, 2, 16}, - {3, 3, 1, 1024, 512, 2, 16}, - {3, 4, 1, 1024, 512, 2, 16}, - {3, 5, 1, 1024, 512, 2, 16}, - {3, 6, 1, 1024, 512, 2, 16}, - {3, 7, 1, 1024, 512, 2, 16}, - {3, 8, 1, 1024, 512, 2, 16}, - {3, 1, 1, 1024, 1024, 2, 32}, - {3, 2, 1, 1024, 1024, 2, 32}, - {3, 3, 1, 1024, 1024, 2, 32}, - {3, 4, 1, 1024, 1024, 2, 32}, - {3, 5, 1, 1024, 1024, 2, 32}, - {3, 6, 1, 1024, 1024, 2, 32}, - {3, 7, 1, 1024, 1024, 2, 32}, - {3, 8, 1, 1024, 1024, 2, 32}, - {3, 1, 1, 1024, 2048, 2, 64}, - {3, 2, 1, 1024, 2048, 2, 64}, - {3, 3, 1, 1024, 2048, 2, 64}, - {3, 4, 1, 1024, 2048, 2, 64}, - {3, 5, 1, 1024, 2048, 2, 64}, - {3, 6, 1, 1024, 2048, 2, 64}, - {3, 7, 1, 1024, 2048, 2, 64}, - {3, 8, 1, 1024, 2048, 1, 78}, - {3, 1, 1, 1024, 3072, 2, 96}, - {3, 2, 1, 1024, 3072, 2, 96}, - {3, 3, 1, 1024, 3072, 2, 96}, - {3, 4, 1, 1024, 3072, 2, 96}, - {3, 5, 1, 1024, 3072, 2, 88}, - {3, 6, 1, 1024, 3072, 2, 88}, - {3, 7, 1, 1024, 3072, 2, 88}, - {3, 8, 1, 1024, 3072, 2, 88}, - {3, 1, 1, 1024, 4096, 2, 128}, - {3, 2, 1, 1024, 4096, 2, 128}, - {3, 3, 1, 1024, 4096, 2, 128}, - {3, 4, 1, 1024, 4096, 2, 120}, - {3, 5, 1, 1024, 4096, 2, 116}, - {3, 6, 1, 1024, 4096, 1, 124}, - {3, 7, 1, 1024, 4096, 2, 116}, - {3, 8, 1, 1024, 4096, 1, 116}, - {3, 1, 1, 1024, 5120, 2, 120}, - {3, 2, 1, 1024, 5120, 2, 120}, - {3, 3, 1, 1024, 5120, 2, 112}, - {3, 4, 1, 1024, 5120, 2, 112}, - {3, 5, 1, 1024, 5120, 2, 112}, - {3, 6, 1, 1024, 5120, 2, 112}, - {3, 7, 1, 1024, 5120, 2, 112}, - {3, 8, 1, 1024, 5120, 1, 104}, - {3, 1, 1, 1024, 8192, 2, 128}, - {3, 2, 1, 1024, 8192, 2, 128}, - {3, 3, 1, 1024, 8192, 2, 128}, - {3, 4, 1, 1024, 8192, 2, 116}, - {3, 5, 1, 1024, 8192, 2, 124}, - {3, 6, 1, 1024, 8192, 1, 128}, - {3, 7, 1, 1024, 8192, 1, 128}, - {3, 8, 1, 1024, 8192, 1, 124}, - {3, 1, 1, 1024, 12288, 3, 128}, - {3, 2, 1, 1024, 12288, 3, 128}, - {3, 3, 1, 1024, 12288, 3, 128}, - {3, 4, 1, 1024, 12288, 2, 128}, - {3, 5, 1, 1024, 12288, 2, 128}, - {3, 6, 1, 1024, 12288, 1, 128}, - {3, 7, 1, 1024, 12288, 2, 96}, - {3, 8, 1, 1024, 12288, 1, 96}, - {3, 1, 1, 1024, 14336, 3, 128}, - {3, 2, 1, 1024, 14336, 3, 128}, - {3, 3, 1, 1024, 14336, 3, 128}, - {3, 4, 1, 1024, 14336, 2, 128}, - {3, 5, 1, 1024, 14336, 2, 112}, - {3, 6, 1, 1024, 14336, 1, 128}, - {3, 7, 1, 1024, 14336, 1, 128}, - {3, 8, 1, 1024, 14336, 1, 110}, - {3, 1, 1, 1024, 16384, 3, 128}, - {3, 2, 1, 1024, 16384, 3, 128}, - {3, 3, 1, 1024, 16384, 3, 128}, - {3, 4, 1, 1024, 16384, 2, 128}, - {3, 5, 1, 1024, 16384, 2, 128}, - {3, 6, 1, 1024, 16384, 1, 128}, - {3, 7, 1, 1024, 16384, 1, 128}, - {3, 8, 1, 1024, 16384, 1, 126}, - {3, 1, 1, 1024, 24576, 3, 128}, - {3, 2, 1, 1024, 24576, 3, 128}, - {3, 3, 1, 1024, 24576, 3, 128}, - {3, 4, 1, 1024, 24576, 2, 128}, - {3, 5, 1, 1024, 24576, 2, 124}, - {3, 6, 1, 1024, 24576, 1, 128}, - {3, 7, 1, 1024, 24576, 1, 128}, - {3, 8, 1, 1024, 24576, 1, 128}, - {3, 1, 1, 1024, 51200, 3, 128}, - {3, 2, 1, 1024, 51200, 3, 128}, - {3, 3, 1, 1024, 51200, 3, 126}, - {3, 4, 1, 1024, 51200, 3, 120}, - {3, 5, 1, 1024, 51200, 3, 120}, - {3, 6, 1, 1024, 51200, 1, 128}, - {3, 7, 1, 1024, 51200, 2, 110}, - {3, 8, 1, 1024, 51200, 1, 120}, - {3, 1, 1, 1024, 128000, 3, 128}, - {3, 2, 1, 1024, 128000, 3, 128}, - {3, 3, 1, 1024, 128000, 3, 128}, - {3, 4, 1, 1024, 128000, 3, 120}, - {3, 5, 1, 1024, 128000, 3, 120}, - {3, 6, 1, 1024, 128000, 2, 116}, - {3, 7, 1, 1024, 128000, 2, 104}, - {3, 8, 1, 1024, 128000, 3, 88}, - {3, 1, 1, 2048, 256, 2, 10}, - {3, 2, 1, 2048, 256, 2, 10}, - {3, 3, 1, 2048, 256, 2, 12}, - {3, 4, 1, 2048, 256, 2, 10}, - {3, 5, 1, 2048, 256, 2, 12}, - {3, 6, 1, 2048, 256, 2, 12}, - {3, 7, 1, 2048, 256, 2, 12}, - {3, 8, 1, 2048, 256, 2, 12}, - {3, 1, 1, 2048, 512, 2, 20}, - {3, 2, 1, 2048, 512, 2, 20}, - {3, 3, 1, 2048, 512, 2, 24}, - {3, 4, 1, 2048, 512, 2, 20}, - {3, 5, 1, 2048, 512, 2, 24}, - {3, 6, 1, 2048, 512, 2, 24}, - {3, 7, 1, 2048, 512, 2, 24}, - {3, 8, 1, 2048, 512, 2, 24}, - {3, 1, 1, 2048, 1024, 2, 40}, - {3, 2, 1, 2048, 1024, 2, 40}, - {3, 3, 1, 2048, 1024, 2, 48}, - {3, 4, 1, 2048, 1024, 2, 40}, - {3, 5, 1, 2048, 1024, 2, 48}, - {3, 6, 1, 2048, 1024, 2, 40}, - {3, 7, 1, 2048, 1024, 2, 48}, - {3, 8, 1, 2048, 1024, 2, 40}, - {3, 1, 1, 2048, 2048, 2, 80}, - {3, 2, 1, 2048, 2048, 2, 80}, - {3, 3, 1, 2048, 2048, 2, 96}, - {3, 4, 1, 2048, 2048, 2, 80}, - {3, 5, 1, 2048, 2048, 2, 80}, - {3, 6, 1, 2048, 2048, 2, 88}, - {3, 7, 1, 2048, 2048, 2, 88}, - {3, 8, 1, 2048, 2048, 2, 88}, - {3, 1, 1, 2048, 3072, 2, 120}, - {3, 2, 1, 2048, 3072, 2, 120}, - {3, 3, 1, 2048, 3072, 2, 112}, - {3, 4, 1, 2048, 3072, 2, 112}, - {3, 5, 1, 2048, 3072, 2, 112}, - {3, 6, 1, 2048, 3072, 1, 112}, - {3, 7, 1, 2048, 3072, 2, 96}, - {3, 8, 1, 2048, 3072, 1, 94}, - {3, 1, 1, 2048, 4096, 2, 128}, - {3, 2, 1, 2048, 4096, 2, 128}, - {3, 3, 1, 2048, 4096, 2, 128}, - {3, 4, 1, 2048, 4096, 2, 116}, - {3, 5, 1, 2048, 4096, 2, 124}, - {3, 6, 1, 2048, 4096, 1, 126}, - {3, 7, 1, 2048, 4096, 1, 126}, - {3, 8, 1, 2048, 4096, 1, 98}, - {3, 1, 1, 2048, 5120, 2, 120}, - {3, 2, 1, 2048, 5120, 2, 128}, - {3, 3, 1, 2048, 5120, 2, 128}, - {3, 4, 1, 2048, 5120, 2, 116}, - {3, 5, 1, 2048, 5120, 2, 118}, - {3, 6, 1, 2048, 5120, 1, 126}, - {3, 7, 1, 2048, 5120, 1, 126}, - {3, 8, 1, 2048, 5120, 1, 112}, - {3, 1, 1, 2048, 8192, 2, 128}, - {3, 2, 1, 2048, 8192, 3, 128}, - {3, 3, 1, 2048, 8192, 3, 128}, - {3, 4, 1, 2048, 8192, 2, 126}, - {3, 5, 1, 2048, 8192, 2, 124}, - {3, 6, 1, 2048, 8192, 1, 126}, - {3, 7, 1, 2048, 8192, 1, 128}, - {3, 8, 1, 2048, 8192, 1, 116}, - {3, 1, 1, 2048, 12288, 3, 128}, - {3, 2, 1, 2048, 12288, 3, 128}, - {3, 3, 1, 2048, 12288, 3, 128}, - {3, 4, 1, 2048, 12288, 2, 124}, - {3, 5, 1, 2048, 12288, 2, 122}, - {3, 6, 1, 2048, 12288, 1, 128}, - {3, 7, 1, 2048, 12288, 1, 126}, - {3, 8, 1, 2048, 12288, 1, 96}, - {3, 1, 1, 2048, 14336, 3, 128}, - {3, 2, 1, 2048, 14336, 3, 128}, - {3, 3, 1, 2048, 14336, 3, 128}, - {3, 4, 1, 2048, 14336, 2, 112}, - {3, 5, 1, 2048, 14336, 2, 112}, - {3, 6, 1, 2048, 14336, 1, 126}, - {3, 7, 1, 2048, 14336, 1, 128}, - {3, 8, 1, 2048, 14336, 1, 110}, - {3, 1, 1, 2048, 16384, 3, 128}, - {3, 2, 1, 2048, 16384, 3, 128}, - {3, 3, 1, 2048, 16384, 3, 128}, - {3, 4, 1, 2048, 16384, 2, 126}, - {3, 5, 1, 2048, 16384, 2, 128}, - {3, 6, 1, 2048, 16384, 1, 128}, - {3, 7, 1, 2048, 16384, 1, 128}, - {3, 8, 1, 2048, 16384, 1, 124}, - {3, 1, 1, 2048, 24576, 3, 128}, - {3, 2, 1, 2048, 24576, 3, 128}, - {3, 3, 1, 2048, 24576, 3, 128}, - {3, 4, 1, 2048, 24576, 2, 128}, - {3, 5, 1, 2048, 24576, 2, 120}, - {3, 6, 1, 2048, 24576, 1, 128}, - {3, 7, 1, 2048, 24576, 1, 126}, - {3, 8, 1, 2048, 24576, 1, 96}, - {3, 1, 1, 2048, 51200, 3, 128}, - {3, 2, 1, 2048, 51200, 3, 128}, - {3, 3, 1, 2048, 51200, 3, 126}, - {3, 4, 1, 2048, 51200, 3, 112}, - {3, 5, 1, 2048, 51200, 3, 122}, - {3, 6, 1, 2048, 51200, 1, 128}, - {3, 7, 1, 2048, 51200, 2, 110}, - {3, 8, 1, 2048, 51200, 1, 124}, - {3, 1, 1, 2048, 128000, 3, 128}, - {3, 2, 1, 2048, 128000, 3, 128}, - {3, 3, 1, 2048, 128000, 3, 126}, - {3, 4, 1, 2048, 128000, 3, 126}, - {3, 5, 1, 2048, 128000, 3, 124}, - {3, 6, 1, 2048, 128000, 3, 116}, - {3, 7, 1, 2048, 128000, 1, 128}, - {3, 8, 1, 2048, 128000, 3, 100}, - {3, 1, 1, 3072, 256, 2, 12}, - {3, 2, 1, 3072, 256, 2, 12}, - {3, 3, 1, 3072, 256, 2, 16}, - {3, 4, 1, 3072, 256, 2, 12}, - {3, 5, 1, 3072, 256, 2, 16}, - {3, 6, 1, 3072, 256, 2, 16}, - {3, 7, 1, 3072, 256, 2, 16}, - {3, 8, 1, 3072, 256, 2, 16}, - {3, 1, 1, 3072, 512, 2, 24}, - {3, 2, 1, 3072, 512, 2, 24}, - {3, 3, 1, 3072, 512, 2, 32}, - {3, 4, 1, 3072, 512, 2, 24}, - {3, 5, 1, 3072, 512, 2, 32}, - {3, 6, 1, 3072, 512, 2, 32}, - {3, 7, 1, 3072, 512, 2, 32}, - {3, 8, 1, 3072, 512, 2, 32}, - {3, 1, 1, 3072, 1024, 2, 48}, - {3, 2, 1, 3072, 1024, 2, 48}, - {3, 3, 1, 3072, 1024, 2, 64}, - {3, 4, 1, 3072, 1024, 2, 48}, - {3, 5, 1, 3072, 1024, 2, 56}, - {3, 6, 1, 3072, 1024, 2, 48}, - {3, 7, 1, 3072, 1024, 2, 56}, - {3, 8, 1, 3072, 1024, 2, 56}, - {3, 1, 1, 3072, 2048, 2, 96}, - {3, 2, 1, 3072, 2048, 2, 96}, - {3, 3, 1, 3072, 2048, 2, 128}, - {3, 4, 1, 3072, 2048, 2, 88}, - {3, 5, 1, 3072, 2048, 2, 96}, - {3, 6, 1, 3072, 2048, 2, 96}, - {3, 7, 1, 3072, 2048, 2, 96}, - {3, 8, 1, 3072, 2048, 1, 88}, - {3, 1, 1, 3072, 3072, 2, 128}, - {3, 2, 1, 3072, 3072, 2, 116}, - {3, 3, 1, 3072, 3072, 2, 116}, - {3, 4, 1, 3072, 3072, 2, 116}, - {3, 5, 1, 3072, 3072, 2, 118}, - {3, 6, 1, 3072, 3072, 1, 118}, - {3, 7, 1, 3072, 3072, 2, 94}, - {3, 8, 1, 3072, 3072, 1, 96}, - {3, 1, 1, 3072, 4096, 2, 128}, - {3, 2, 1, 3072, 4096, 2, 128}, - {3, 3, 1, 3072, 4096, 2, 128}, - {3, 4, 1, 3072, 4096, 2, 128}, - {3, 5, 1, 3072, 4096, 2, 128}, - {3, 6, 1, 3072, 4096, 1, 124}, - {3, 7, 1, 3072, 4096, 1, 128}, - {3, 8, 1, 3072, 4096, 1, 98}, - {3, 1, 1, 3072, 5120, 2, 128}, - {3, 2, 1, 3072, 5120, 2, 128}, - {3, 3, 1, 3072, 5120, 3, 128}, - {3, 4, 1, 3072, 5120, 2, 124}, - {3, 5, 1, 3072, 5120, 2, 120}, - {3, 6, 1, 3072, 5120, 1, 126}, - {3, 7, 1, 3072, 5120, 1, 128}, - {3, 8, 1, 3072, 5120, 1, 98}, - {3, 1, 1, 3072, 8192, 3, 128}, - {3, 2, 1, 3072, 8192, 3, 128}, - {3, 3, 1, 3072, 8192, 3, 128}, - {3, 4, 1, 3072, 8192, 2, 122}, - {3, 5, 1, 3072, 8192, 2, 126}, - {3, 6, 1, 3072, 8192, 1, 128}, - {3, 7, 1, 3072, 8192, 1, 128}, - {3, 8, 1, 3072, 8192, 1, 116}, - {3, 1, 1, 3072, 12288, 3, 128}, - {3, 2, 1, 3072, 12288, 3, 128}, - {3, 3, 1, 3072, 12288, 3, 128}, - {3, 4, 1, 3072, 12288, 2, 128}, - {3, 5, 1, 3072, 12288, 2, 128}, - {3, 6, 1, 3072, 12288, 1, 128}, - {3, 7, 1, 3072, 12288, 1, 126}, - {3, 8, 1, 3072, 12288, 1, 96}, - {3, 1, 1, 3072, 14336, 3, 128}, - {3, 2, 1, 3072, 14336, 3, 128}, - {3, 3, 1, 3072, 14336, 3, 128}, - {3, 4, 1, 3072, 14336, 2, 112}, - {3, 5, 1, 3072, 14336, 2, 112}, - {3, 6, 1, 3072, 14336, 1, 128}, - {3, 7, 1, 3072, 14336, 1, 128}, - {3, 8, 1, 3072, 14336, 1, 110}, - {3, 1, 1, 3072, 16384, 3, 128}, - {3, 2, 1, 3072, 16384, 3, 128}, - {3, 3, 1, 3072, 16384, 3, 128}, - {3, 4, 1, 3072, 16384, 2, 128}, - {3, 5, 1, 3072, 16384, 2, 128}, - {3, 6, 1, 3072, 16384, 1, 128}, - {3, 7, 1, 3072, 16384, 1, 128}, - {3, 8, 1, 3072, 16384, 1, 126}, - {3, 1, 1, 3072, 24576, 3, 128}, - {3, 2, 1, 3072, 24576, 3, 128}, - {3, 3, 1, 3072, 24576, 3, 128}, - {3, 4, 1, 3072, 24576, 2, 126}, - {3, 5, 1, 3072, 24576, 3, 120}, - {3, 6, 1, 3072, 24576, 1, 128}, - {3, 7, 1, 3072, 24576, 1, 126}, - {3, 8, 1, 3072, 24576, 1, 96}, - {3, 1, 1, 3072, 51200, 3, 128}, - {3, 2, 1, 3072, 51200, 3, 128}, - {3, 3, 1, 3072, 51200, 3, 128}, - {3, 4, 1, 3072, 51200, 3, 102}, - {3, 5, 1, 3072, 51200, 3, 120}, - {3, 6, 1, 3072, 51200, 2, 128}, - {3, 7, 1, 3072, 51200, 2, 102}, - {3, 8, 1, 3072, 51200, 1, 124}, - {3, 1, 1, 3072, 128000, 3, 128}, - {3, 2, 1, 3072, 128000, 3, 128}, - {3, 3, 1, 3072, 128000, 3, 126}, - {3, 4, 1, 3072, 128000, 3, 124}, - {3, 5, 1, 3072, 128000, 3, 128}, - {3, 6, 1, 3072, 128000, 3, 116}, - {3, 7, 1, 3072, 128000, 2, 122}, - {3, 8, 1, 3072, 128000, 3, 86}, - {3, 1, 1, 4096, 256, 2, 16}, - {3, 2, 1, 4096, 256, 2, 16}, - {3, 3, 1, 4096, 256, 2, 16}, - {3, 4, 1, 4096, 256, 2, 16}, - {3, 5, 1, 4096, 256, 2, 16}, - {3, 6, 1, 4096, 256, 2, 16}, - {3, 7, 1, 4096, 256, 2, 16}, - {3, 8, 1, 4096, 256, 2, 16}, - {3, 1, 1, 4096, 512, 2, 32}, - {3, 2, 1, 4096, 512, 2, 32}, - {3, 3, 1, 4096, 512, 2, 32}, - {3, 4, 1, 4096, 512, 2, 32}, - {3, 5, 1, 4096, 512, 2, 32}, - {3, 6, 1, 4096, 512, 2, 32}, - {3, 7, 1, 4096, 512, 2, 32}, - {3, 8, 1, 4096, 512, 2, 32}, - {3, 1, 1, 4096, 1024, 2, 64}, - {3, 2, 1, 4096, 1024, 2, 64}, - {3, 3, 1, 4096, 1024, 2, 64}, - {3, 4, 1, 4096, 1024, 2, 56}, - {3, 5, 1, 4096, 1024, 2, 64}, - {3, 6, 1, 4096, 1024, 2, 62}, - {3, 7, 1, 4096, 1024, 2, 62}, - {3, 8, 1, 4096, 1024, 2, 62}, - {3, 1, 1, 4096, 2048, 2, 128}, - {3, 2, 1, 4096, 2048, 2, 128}, - {3, 3, 1, 4096, 2048, 2, 128}, - {3, 4, 1, 4096, 2048, 2, 116}, - {3, 5, 1, 4096, 2048, 2, 116}, - {3, 6, 1, 4096, 2048, 2, 92}, - {3, 7, 1, 4096, 2048, 2, 94}, - {3, 8, 1, 4096, 2048, 1, 96}, - {3, 1, 1, 4096, 3072, 2, 128}, - {3, 2, 1, 4096, 3072, 2, 128}, - {3, 3, 1, 4096, 3072, 2, 128}, - {3, 4, 1, 4096, 3072, 2, 110}, - {3, 5, 1, 4096, 3072, 2, 110}, - {3, 6, 1, 4096, 3072, 1, 128}, - {3, 7, 1, 4096, 3072, 2, 96}, - {3, 8, 1, 4096, 3072, 1, 96}, - {3, 1, 1, 4096, 4096, 2, 128}, - {3, 2, 1, 4096, 4096, 2, 128}, - {3, 3, 1, 4096, 4096, 2, 126}, - {3, 4, 1, 4096, 4096, 2, 128}, - {3, 5, 1, 4096, 4096, 2, 126}, - {3, 6, 1, 4096, 4096, 1, 124}, - {3, 7, 1, 4096, 4096, 1, 126}, - {3, 8, 1, 4096, 4096, 1, 102}, - {3, 1, 1, 4096, 5120, 2, 128}, - {3, 2, 1, 4096, 5120, 2, 128}, - {3, 3, 1, 4096, 5120, 3, 128}, - {3, 4, 1, 4096, 5120, 2, 118}, - {3, 5, 1, 4096, 5120, 2, 128}, - {3, 6, 1, 4096, 5120, 1, 122}, - {3, 7, 1, 4096, 5120, 1, 128}, - {3, 8, 1, 4096, 5120, 1, 96}, - {3, 1, 1, 4096, 8192, 3, 128}, - {3, 2, 1, 4096, 8192, 3, 128}, - {3, 3, 1, 4096, 8192, 3, 128}, - {3, 4, 1, 4096, 8192, 2, 128}, - {3, 5, 1, 4096, 8192, 2, 128}, - {3, 6, 1, 4096, 8192, 1, 128}, - {3, 7, 1, 4096, 8192, 1, 128}, - {3, 8, 1, 4096, 8192, 1, 126}, - {3, 1, 1, 4096, 12288, 3, 128}, - {3, 2, 1, 4096, 12288, 3, 128}, - {3, 3, 1, 4096, 12288, 3, 128}, - {3, 4, 1, 4096, 12288, 2, 128}, - {3, 5, 1, 4096, 12288, 2, 128}, - {3, 6, 1, 4096, 12288, 1, 128}, - {3, 7, 1, 4096, 12288, 1, 126}, - {3, 8, 1, 4096, 12288, 1, 96}, - {3, 1, 1, 4096, 14336, 3, 128}, - {3, 2, 1, 4096, 14336, 3, 128}, - {3, 3, 1, 4096, 14336, 3, 128}, - {3, 4, 1, 4096, 14336, 2, 122}, - {3, 5, 1, 4096, 14336, 2, 112}, - {3, 6, 1, 4096, 14336, 1, 128}, - {3, 7, 1, 4096, 14336, 1, 128}, - {3, 8, 1, 4096, 14336, 1, 110}, - {3, 1, 1, 4096, 16384, 3, 128}, - {3, 2, 1, 4096, 16384, 3, 128}, - {3, 3, 1, 4096, 16384, 3, 128}, - {3, 4, 1, 4096, 16384, 2, 126}, - {3, 5, 1, 4096, 16384, 2, 128}, - {3, 6, 1, 4096, 16384, 1, 128}, - {3, 7, 1, 4096, 16384, 1, 128}, - {3, 8, 1, 4096, 16384, 2, 128}, - {3, 1, 1, 4096, 24576, 3, 128}, - {3, 2, 1, 4096, 24576, 3, 128}, - {3, 3, 1, 4096, 24576, 3, 128}, - {3, 4, 1, 4096, 24576, 3, 96}, - {3, 5, 1, 4096, 24576, 3, 104}, - {3, 6, 1, 4096, 24576, 1, 128}, - {3, 7, 1, 4096, 24576, 1, 126}, - {3, 8, 1, 4096, 24576, 1, 96}, - {3, 1, 1, 4096, 51200, 3, 128}, - {3, 2, 1, 4096, 51200, 3, 128}, - {3, 3, 1, 4096, 51200, 3, 128}, - {3, 4, 1, 4096, 51200, 3, 120}, - {3, 5, 1, 4096, 51200, 3, 120}, - {3, 6, 1, 4096, 51200, 3, 102}, - {3, 7, 1, 4096, 51200, 2, 126}, - {3, 8, 1, 4096, 51200, 1, 124}, - {3, 1, 1, 4096, 128000, 3, 128}, - {3, 2, 1, 4096, 128000, 3, 128}, - {3, 3, 1, 4096, 128000, 3, 128}, - {3, 4, 1, 4096, 128000, 3, 124}, - {3, 5, 1, 4096, 128000, 3, 128}, - {3, 6, 1, 4096, 128000, 3, 126}, - {3, 7, 1, 4096, 128000, 3, 104}, - {3, 8, 1, 4096, 128000, 3, 86}, - {3, 1, 1, 5120, 256, 2, 18}, - {3, 2, 1, 5120, 256, 2, 18}, - {3, 3, 1, 5120, 256, 2, 20}, - {3, 4, 1, 5120, 256, 2, 18}, - {3, 5, 1, 5120, 256, 2, 20}, - {3, 6, 1, 5120, 256, 2, 20}, - {3, 7, 1, 5120, 256, 2, 20}, - {3, 8, 1, 5120, 256, 2, 20}, - {3, 1, 1, 5120, 512, 2, 32}, - {3, 2, 1, 5120, 512, 2, 36}, - {3, 3, 1, 5120, 512, 2, 40}, - {3, 4, 1, 5120, 512, 2, 32}, - {3, 5, 1, 5120, 512, 2, 40}, - {3, 6, 1, 5120, 512, 2, 32}, - {3, 7, 1, 5120, 512, 2, 32}, - {3, 8, 1, 5120, 512, 2, 32}, - {3, 1, 1, 5120, 1024, 2, 72}, - {3, 2, 1, 5120, 1024, 2, 72}, - {3, 3, 1, 5120, 1024, 2, 72}, - {3, 4, 1, 5120, 1024, 2, 64}, - {3, 5, 1, 5120, 1024, 2, 72}, - {3, 6, 1, 5120, 1024, 2, 72}, - {3, 7, 1, 5120, 1024, 2, 72}, - {3, 8, 1, 5120, 1024, 2, 72}, - {3, 1, 1, 5120, 2048, 2, 128}, - {3, 2, 1, 5120, 2048, 2, 128}, - {3, 3, 1, 5120, 2048, 2, 124}, - {3, 4, 1, 5120, 2048, 2, 112}, - {3, 5, 1, 5120, 2048, 2, 110}, - {3, 6, 1, 5120, 2048, 2, 90}, - {3, 7, 1, 5120, 2048, 2, 90}, - {3, 8, 1, 5120, 2048, 2, 80}, - {3, 1, 1, 5120, 3072, 2, 128}, - {3, 2, 1, 5120, 3072, 2, 128}, - {3, 3, 1, 5120, 3072, 2, 128}, - {3, 4, 1, 5120, 3072, 2, 116}, - {3, 5, 1, 5120, 3072, 2, 120}, - {3, 6, 1, 5120, 3072, 1, 128}, - {3, 7, 1, 5120, 3072, 2, 94}, - {3, 8, 1, 5120, 3072, 1, 96}, - {3, 1, 1, 5120, 4096, 2, 128}, - {3, 2, 1, 5120, 4096, 2, 128}, - {3, 3, 1, 5120, 4096, 3, 128}, - {3, 4, 1, 5120, 4096, 2, 128}, - {3, 5, 1, 5120, 4096, 2, 126}, - {3, 6, 1, 5120, 4096, 1, 126}, - {3, 7, 1, 5120, 4096, 1, 128}, - {3, 8, 1, 5120, 4096, 1, 94}, - {3, 1, 1, 5120, 5120, 3, 128}, - {3, 2, 1, 5120, 5120, 3, 128}, - {3, 3, 1, 5120, 5120, 3, 128}, - {3, 4, 1, 5120, 5120, 2, 118}, - {3, 5, 1, 5120, 5120, 2, 116}, - {3, 6, 1, 5120, 5120, 1, 122}, - {3, 7, 1, 5120, 5120, 1, 128}, - {3, 8, 1, 5120, 5120, 1, 102}, - {3, 1, 1, 5120, 8192, 3, 128}, - {3, 2, 1, 5120, 8192, 3, 128}, - {3, 3, 1, 5120, 8192, 3, 128}, - {3, 4, 1, 5120, 8192, 2, 128}, - {3, 5, 1, 5120, 8192, 2, 128}, - {3, 6, 1, 5120, 8192, 1, 128}, - {3, 7, 1, 5120, 8192, 1, 128}, - {3, 8, 1, 5120, 8192, 1, 126}, - {3, 1, 1, 5120, 12288, 3, 128}, - {3, 2, 1, 5120, 12288, 3, 128}, - {3, 3, 1, 5120, 12288, 3, 128}, - {3, 4, 1, 5120, 12288, 2, 128}, - {3, 5, 1, 5120, 12288, 2, 122}, - {3, 6, 1, 5120, 12288, 1, 128}, - {3, 7, 1, 5120, 12288, 1, 126}, - {3, 8, 1, 5120, 12288, 1, 96}, - {3, 1, 1, 5120, 14336, 3, 128}, - {3, 2, 1, 5120, 14336, 3, 128}, - {3, 3, 1, 5120, 14336, 3, 128}, - {3, 4, 1, 5120, 14336, 3, 112}, - {3, 5, 1, 5120, 14336, 2, 112}, - {3, 6, 1, 5120, 14336, 1, 128}, - {3, 7, 1, 5120, 14336, 1, 128}, - {3, 8, 1, 5120, 14336, 1, 110}, - {3, 1, 1, 5120, 16384, 3, 128}, - {3, 2, 1, 5120, 16384, 3, 128}, - {3, 3, 1, 5120, 16384, 3, 128}, - {3, 4, 1, 5120, 16384, 2, 128}, - {3, 5, 1, 5120, 16384, 2, 128}, - {3, 6, 1, 5120, 16384, 1, 128}, - {3, 7, 1, 5120, 16384, 1, 128}, - {3, 8, 1, 5120, 16384, 1, 126}, - {3, 1, 1, 5120, 24576, 3, 128}, - {3, 2, 1, 5120, 24576, 3, 128}, - {3, 3, 1, 5120, 24576, 3, 128}, - {3, 4, 1, 5120, 24576, 3, 96}, - {3, 5, 1, 5120, 24576, 3, 102}, - {3, 6, 1, 5120, 24576, 1, 128}, - {3, 7, 1, 5120, 24576, 1, 126}, - {3, 8, 1, 5120, 24576, 3, 96}, - {3, 1, 1, 5120, 51200, 3, 128}, - {3, 2, 1, 5120, 51200, 3, 128}, - {3, 3, 1, 5120, 51200, 3, 126}, - {3, 4, 1, 5120, 51200, 3, 116}, - {3, 5, 1, 5120, 51200, 3, 128}, - {3, 6, 1, 5120, 51200, 3, 108}, - {3, 7, 1, 5120, 51200, 2, 102}, - {3, 8, 1, 5120, 51200, 1, 124}, - {3, 1, 1, 5120, 128000, 3, 128}, - {3, 2, 1, 5120, 128000, 3, 128}, - {3, 3, 1, 5120, 128000, 3, 128}, - {3, 4, 1, 5120, 128000, 3, 126}, - {3, 5, 1, 5120, 128000, 3, 126}, - {3, 6, 1, 5120, 128000, 3, 116}, - {3, 7, 1, 5120, 128000, 3, 104}, - {3, 8, 1, 5120, 128000, 3, 96}, - {3, 1, 1, 8192, 256, 2, 20}, - {3, 2, 1, 8192, 256, 2, 20}, - {3, 3, 1, 8192, 256, 2, 24}, - {3, 4, 1, 8192, 256, 2, 20}, - {3, 5, 1, 8192, 256, 2, 26}, - {3, 6, 1, 8192, 256, 2, 26}, - {3, 7, 1, 8192, 256, 2, 26}, - {3, 8, 1, 8192, 256, 2, 26}, - {3, 1, 1, 8192, 512, 2, 48}, - {3, 2, 1, 8192, 512, 2, 40}, - {3, 3, 1, 8192, 512, 2, 54}, - {3, 4, 1, 8192, 512, 2, 32}, - {3, 5, 1, 8192, 512, 2, 40}, - {3, 6, 1, 8192, 512, 2, 40}, - {3, 7, 1, 8192, 512, 2, 54}, - {3, 8, 1, 8192, 512, 2, 54}, - {3, 1, 1, 8192, 1024, 2, 86}, - {3, 2, 1, 8192, 1024, 2, 72}, - {3, 3, 1, 8192, 1024, 2, 88}, - {3, 4, 1, 8192, 1024, 2, 72}, - {3, 5, 1, 8192, 1024, 2, 86}, - {3, 6, 1, 8192, 1024, 2, 86}, - {3, 7, 1, 8192, 1024, 2, 86}, - {3, 8, 1, 8192, 1024, 2, 76}, - {3, 1, 1, 8192, 2048, 2, 128}, - {3, 2, 1, 8192, 2048, 2, 128}, - {3, 3, 1, 8192, 2048, 2, 128}, - {3, 4, 1, 8192, 2048, 2, 112}, - {3, 5, 1, 8192, 2048, 2, 114}, - {3, 6, 1, 8192, 2048, 1, 126}, - {3, 7, 1, 8192, 2048, 2, 96}, - {3, 8, 1, 8192, 2048, 1, 96}, - {3, 1, 1, 8192, 3072, 2, 128}, - {3, 2, 1, 8192, 3072, 2, 128}, - {3, 3, 1, 8192, 3072, 3, 128}, - {3, 4, 1, 8192, 3072, 2, 118}, - {3, 5, 1, 8192, 3072, 2, 122}, - {3, 6, 1, 8192, 3072, 1, 126}, - {3, 7, 1, 8192, 3072, 2, 96}, - {3, 8, 1, 8192, 3072, 1, 96}, - {3, 1, 1, 8192, 4096, 3, 128}, - {3, 2, 1, 8192, 4096, 3, 128}, - {3, 3, 1, 8192, 4096, 3, 126}, - {3, 4, 1, 8192, 4096, 2, 128}, - {3, 5, 1, 8192, 4096, 2, 126}, - {3, 6, 1, 8192, 4096, 1, 128}, - {3, 7, 1, 8192, 4096, 1, 126}, - {3, 8, 1, 8192, 4096, 1, 98}, - {3, 1, 1, 8192, 5120, 3, 128}, - {3, 2, 1, 8192, 5120, 3, 128}, - {3, 3, 1, 8192, 5120, 3, 128}, - {3, 4, 1, 8192, 5120, 2, 118}, - {3, 5, 1, 8192, 5120, 2, 120}, - {3, 6, 1, 8192, 5120, 1, 126}, - {3, 7, 1, 8192, 5120, 1, 126}, - {3, 8, 1, 8192, 5120, 1, 96}, - {3, 1, 1, 8192, 8192, 3, 128}, - {3, 2, 1, 8192, 8192, 3, 128}, - {3, 3, 1, 8192, 8192, 3, 128}, - {3, 4, 1, 8192, 8192, 2, 128}, - {3, 5, 1, 8192, 8192, 2, 128}, - {3, 6, 1, 8192, 8192, 1, 128}, - {3, 7, 1, 8192, 8192, 1, 128}, - {3, 8, 1, 8192, 8192, 1, 126}, - {3, 1, 1, 8192, 12288, 3, 128}, - {3, 2, 1, 8192, 12288, 3, 128}, - {3, 3, 1, 8192, 12288, 3, 128}, - {3, 4, 1, 8192, 12288, 3, 96}, - {3, 5, 1, 8192, 12288, 3, 126}, - {3, 6, 1, 8192, 12288, 1, 128}, - {3, 7, 1, 8192, 12288, 1, 126}, - {3, 8, 1, 8192, 12288, 1, 96}, - {3, 1, 1, 8192, 14336, 3, 128}, - {3, 2, 1, 8192, 14336, 3, 128}, - {3, 3, 1, 8192, 14336, 3, 128}, - {3, 4, 1, 8192, 14336, 3, 112}, - {3, 5, 1, 8192, 14336, 2, 112}, - {3, 6, 1, 8192, 14336, 1, 128}, - {3, 7, 1, 8192, 14336, 1, 128}, - {3, 8, 1, 8192, 14336, 1, 114}, - {3, 1, 1, 8192, 16384, 3, 128}, - {3, 2, 1, 8192, 16384, 3, 128}, - {3, 3, 1, 8192, 16384, 3, 128}, - {3, 4, 1, 8192, 16384, 3, 126}, - {3, 5, 1, 8192, 16384, 3, 128}, - {3, 6, 1, 8192, 16384, 1, 128}, - {3, 7, 1, 8192, 16384, 1, 128}, - {3, 8, 1, 8192, 16384, 2, 128}, - {3, 1, 1, 8192, 24576, 3, 128}, - {3, 2, 1, 8192, 24576, 3, 128}, - {3, 3, 1, 8192, 24576, 3, 128}, - {3, 4, 1, 8192, 24576, 3, 96}, - {3, 5, 1, 8192, 24576, 3, 120}, - {3, 6, 1, 8192, 24576, 1, 128}, - {3, 7, 1, 8192, 24576, 2, 96}, - {3, 8, 1, 8192, 24576, 3, 96}, - {3, 1, 1, 8192, 51200, 3, 128}, - {3, 2, 1, 8192, 51200, 3, 128}, - {3, 3, 1, 8192, 51200, 3, 128}, - {3, 4, 1, 8192, 51200, 3, 120}, - {3, 5, 1, 8192, 51200, 3, 116}, - {3, 6, 1, 8192, 51200, 3, 128}, - {3, 7, 1, 8192, 51200, 2, 122}, - {3, 8, 1, 8192, 51200, 3, 86}, - {3, 1, 1, 8192, 128000, 3, 128}, - {3, 2, 1, 8192, 128000, 3, 128}, - {3, 3, 1, 8192, 128000, 3, 128}, - {3, 4, 1, 8192, 128000, 3, 126}, - {3, 5, 1, 8192, 128000, 3, 124}, - {3, 6, 1, 8192, 128000, 3, 116}, - {3, 7, 1, 8192, 128000, 3, 104}, - {3, 8, 1, 8192, 128000, 3, 88}, - {3, 1, 1, 12288, 256, 2, 26}, - {3, 2, 1, 12288, 256, 2, 26}, - {3, 3, 1, 12288, 256, 2, 32}, - {3, 4, 1, 12288, 256, 2, 24}, - {3, 5, 1, 12288, 256, 2, 24}, - {3, 6, 1, 12288, 256, 2, 32}, - {3, 7, 1, 12288, 256, 2, 32}, - {3, 8, 1, 12288, 256, 2, 32}, - {3, 1, 1, 12288, 512, 2, 48}, - {3, 2, 1, 12288, 512, 2, 52}, - {3, 3, 1, 12288, 512, 2, 62}, - {3, 4, 1, 12288, 512, 2, 52}, - {3, 5, 1, 12288, 512, 2, 56}, - {3, 6, 1, 12288, 512, 2, 56}, - {3, 7, 1, 12288, 512, 2, 64}, - {3, 8, 1, 12288, 512, 2, 62}, - {3, 1, 1, 12288, 1024, 2, 102}, - {3, 2, 1, 12288, 1024, 2, 104}, - {3, 3, 1, 12288, 1024, 2, 124}, - {3, 4, 1, 12288, 1024, 2, 96}, - {3, 5, 1, 12288, 1024, 2, 96}, - {3, 6, 1, 12288, 1024, 2, 96}, - {3, 7, 1, 12288, 1024, 2, 88}, - {3, 8, 1, 12288, 1024, 2, 76}, - {3, 1, 1, 12288, 2048, 2, 128}, - {3, 2, 1, 12288, 2048, 2, 128}, - {3, 3, 1, 12288, 2048, 2, 128}, - {3, 4, 1, 12288, 2048, 2, 112}, - {3, 5, 1, 12288, 2048, 2, 114}, - {3, 6, 1, 12288, 2048, 2, 94}, - {3, 7, 1, 12288, 2048, 2, 96}, - {3, 8, 1, 12288, 2048, 1, 96}, - {3, 1, 1, 12288, 3072, 3, 128}, - {3, 2, 1, 12288, 3072, 3, 128}, - {3, 3, 1, 12288, 3072, 3, 128}, - {3, 4, 1, 12288, 3072, 2, 118}, - {3, 5, 1, 12288, 3072, 2, 120}, - {3, 6, 1, 12288, 3072, 1, 128}, - {3, 7, 1, 12288, 3072, 2, 96}, - {3, 8, 1, 12288, 3072, 1, 96}, - {3, 1, 1, 12288, 4096, 3, 128}, - {3, 2, 1, 12288, 4096, 3, 128}, - {3, 3, 1, 12288, 4096, 3, 128}, - {3, 4, 1, 12288, 4096, 2, 128}, - {3, 5, 1, 12288, 4096, 2, 128}, - {3, 6, 1, 12288, 4096, 1, 128}, - {3, 7, 1, 12288, 4096, 1, 128}, - {3, 8, 1, 12288, 4096, 1, 98}, - {3, 1, 1, 12288, 5120, 3, 128}, - {3, 2, 1, 12288, 5120, 3, 128}, - {3, 3, 1, 12288, 5120, 3, 126}, - {3, 4, 1, 12288, 5120, 2, 120}, - {3, 5, 1, 12288, 5120, 2, 120}, - {3, 6, 1, 12288, 5120, 1, 120}, - {3, 7, 1, 12288, 5120, 1, 126}, - {3, 8, 1, 12288, 5120, 1, 120}, - {3, 1, 1, 12288, 8192, 3, 128}, - {3, 2, 1, 12288, 8192, 3, 128}, - {3, 3, 1, 12288, 8192, 3, 128}, - {3, 4, 1, 12288, 8192, 2, 128}, - {3, 5, 1, 12288, 8192, 2, 128}, - {3, 6, 1, 12288, 8192, 1, 128}, - {3, 7, 1, 12288, 8192, 1, 128}, - {3, 8, 1, 12288, 8192, 1, 116}, - {3, 1, 1, 12288, 12288, 3, 128}, - {3, 2, 1, 12288, 12288, 3, 128}, - {3, 3, 1, 12288, 12288, 3, 128}, - {3, 4, 1, 12288, 12288, 3, 96}, - {3, 5, 1, 12288, 12288, 3, 114}, - {3, 6, 1, 12288, 12288, 1, 128}, - {3, 7, 1, 12288, 12288, 1, 126}, - {3, 8, 1, 12288, 12288, 1, 96}, - {3, 1, 1, 12288, 14336, 3, 128}, - {3, 2, 1, 12288, 14336, 3, 128}, - {3, 3, 1, 12288, 14336, 3, 126}, - {3, 4, 1, 12288, 14336, 3, 112}, - {3, 5, 1, 12288, 14336, 3, 112}, - {3, 6, 1, 12288, 14336, 3, 112}, - {3, 7, 1, 12288, 14336, 1, 128}, - {3, 8, 1, 12288, 14336, 2, 112}, - {3, 1, 1, 12288, 16384, 3, 128}, - {3, 2, 1, 12288, 16384, 3, 128}, - {3, 3, 1, 12288, 16384, 3, 128}, - {3, 4, 1, 12288, 16384, 3, 128}, - {3, 5, 1, 12288, 16384, 3, 128}, - {3, 6, 1, 12288, 16384, 3, 128}, - {3, 7, 1, 12288, 16384, 1, 128}, - {3, 8, 1, 12288, 16384, 2, 128}, - {3, 1, 1, 12288, 24576, 3, 128}, - {3, 2, 1, 12288, 24576, 3, 128}, - {3, 3, 1, 12288, 24576, 3, 128}, - {3, 4, 1, 12288, 24576, 3, 96}, - {3, 5, 1, 12288, 24576, 3, 120}, - {3, 6, 1, 12288, 24576, 1, 128}, - {3, 7, 1, 12288, 24576, 2, 96}, - {3, 8, 1, 12288, 24576, 3, 96}, - {3, 1, 1, 12288, 51200, 3, 128}, - {3, 2, 1, 12288, 51200, 3, 128}, - {3, 3, 1, 12288, 51200, 3, 128}, - {3, 4, 1, 12288, 51200, 3, 112}, - {3, 5, 1, 12288, 51200, 3, 110}, - {3, 6, 1, 12288, 51200, 3, 108}, - {3, 7, 1, 12288, 51200, 3, 80}, - {3, 8, 1, 12288, 51200, 3, 76}, - {3, 1, 1, 12288, 128000, 3, 128}, - {3, 2, 1, 12288, 128000, 3, 128}, - {3, 3, 1, 12288, 128000, 3, 128}, - {3, 4, 1, 12288, 128000, 3, 126}, - {3, 5, 1, 12288, 128000, 3, 126}, - {3, 6, 1, 12288, 128000, 3, 116}, - {3, 7, 1, 12288, 128000, 3, 100}, - {3, 8, 1, 12288, 128000, 3, 94}, - {3, 1, 1, 14336, 256, 2, 30}, - {3, 2, 1, 14336, 256, 2, 30}, - {3, 3, 1, 14336, 256, 2, 32}, - {3, 4, 1, 14336, 256, 2, 30}, - {3, 5, 1, 14336, 256, 2, 32}, - {3, 6, 1, 14336, 256, 2, 32}, - {3, 7, 1, 14336, 256, 2, 32}, - {3, 8, 1, 14336, 256, 2, 32}, - {3, 1, 1, 14336, 512, 2, 60}, - {3, 2, 1, 14336, 512, 2, 56}, - {3, 3, 1, 14336, 512, 2, 64}, - {3, 4, 1, 14336, 512, 2, 56}, - {3, 5, 1, 14336, 512, 2, 56}, - {3, 6, 1, 14336, 512, 2, 58}, - {3, 7, 1, 14336, 512, 2, 62}, - {3, 8, 1, 14336, 512, 2, 62}, - {3, 1, 1, 14336, 1024, 2, 112}, - {3, 2, 1, 14336, 1024, 2, 112}, - {3, 3, 1, 14336, 1024, 2, 128}, - {3, 4, 1, 14336, 1024, 2, 96}, - {3, 5, 1, 14336, 1024, 2, 106}, - {3, 6, 1, 14336, 1024, 2, 92}, - {3, 7, 1, 14336, 1024, 2, 92}, - {3, 8, 1, 14336, 1024, 2, 72}, - {3, 1, 1, 14336, 2048, 2, 128}, - {3, 2, 1, 14336, 2048, 2, 128}, - {3, 3, 1, 14336, 2048, 2, 128}, - {3, 4, 1, 14336, 2048, 2, 112}, - {3, 5, 1, 14336, 2048, 2, 114}, - {3, 6, 1, 14336, 2048, 2, 96}, - {3, 7, 1, 14336, 2048, 2, 96}, - {3, 8, 1, 14336, 2048, 1, 96}, - {3, 1, 1, 14336, 3072, 3, 128}, - {3, 2, 1, 14336, 3072, 3, 128}, - {3, 3, 1, 14336, 3072, 3, 128}, - {3, 4, 1, 14336, 3072, 2, 120}, - {3, 5, 1, 14336, 3072, 2, 120}, - {3, 6, 1, 14336, 3072, 1, 126}, - {3, 7, 1, 14336, 3072, 2, 96}, - {3, 8, 1, 14336, 3072, 1, 96}, - {3, 1, 1, 14336, 4096, 3, 128}, - {3, 2, 1, 14336, 4096, 3, 128}, - {3, 3, 1, 14336, 4096, 3, 128}, - {3, 4, 1, 14336, 4096, 2, 128}, - {3, 5, 1, 14336, 4096, 2, 128}, - {3, 6, 1, 14336, 4096, 1, 128}, - {3, 7, 1, 14336, 4096, 1, 128}, - {3, 8, 1, 14336, 4096, 1, 96}, - {3, 1, 1, 14336, 5120, 3, 128}, - {3, 2, 1, 14336, 5120, 3, 128}, - {3, 3, 1, 14336, 5120, 3, 128}, - {3, 4, 1, 14336, 5120, 2, 120}, - {3, 5, 1, 14336, 5120, 2, 120}, - {3, 6, 1, 14336, 5120, 1, 126}, - {3, 7, 1, 14336, 5120, 1, 128}, - {3, 8, 1, 14336, 5120, 1, 96}, - {3, 1, 1, 14336, 8192, 3, 128}, - {3, 2, 1, 14336, 8192, 3, 128}, - {3, 3, 1, 14336, 8192, 3, 128}, - {3, 4, 1, 14336, 8192, 2, 128}, - {3, 5, 1, 14336, 8192, 2, 128}, - {3, 6, 1, 14336, 8192, 1, 128}, - {3, 7, 1, 14336, 8192, 1, 128}, - {3, 8, 1, 14336, 8192, 2, 128}, - {3, 1, 1, 14336, 12288, 3, 128}, - {3, 2, 1, 14336, 12288, 3, 128}, - {3, 3, 1, 14336, 12288, 3, 128}, - {3, 4, 1, 14336, 12288, 3, 96}, - {3, 5, 1, 14336, 12288, 3, 114}, - {3, 6, 1, 14336, 12288, 1, 128}, - {3, 7, 1, 14336, 12288, 1, 126}, - {3, 8, 1, 14336, 12288, 1, 96}, - {3, 1, 1, 14336, 14336, 3, 128}, - {3, 2, 1, 14336, 14336, 3, 128}, - {3, 3, 1, 14336, 14336, 3, 128}, - {3, 4, 1, 14336, 14336, 3, 112}, - {3, 5, 1, 14336, 14336, 3, 112}, - {3, 6, 1, 14336, 14336, 3, 112}, - {3, 7, 1, 14336, 14336, 1, 128}, - {3, 8, 1, 14336, 14336, 3, 112}, - {3, 1, 1, 14336, 16384, 3, 128}, - {3, 2, 1, 14336, 16384, 3, 128}, - {3, 3, 1, 14336, 16384, 3, 128}, - {3, 4, 1, 14336, 16384, 3, 128}, - {3, 5, 1, 14336, 16384, 3, 128}, - {3, 6, 1, 14336, 16384, 3, 128}, - {3, 7, 1, 14336, 16384, 1, 128}, - {3, 8, 1, 14336, 16384, 3, 96}, - {3, 1, 1, 14336, 24576, 3, 128}, - {3, 2, 1, 14336, 24576, 3, 128}, - {3, 3, 1, 14336, 24576, 3, 128}, - {3, 4, 1, 14336, 24576, 3, 96}, - {3, 5, 1, 14336, 24576, 3, 120}, - {3, 6, 1, 14336, 24576, 1, 128}, - {3, 7, 1, 14336, 24576, 2, 96}, - {3, 8, 1, 14336, 24576, 3, 96}, - {3, 1, 1, 14336, 51200, 3, 128}, - {3, 2, 1, 14336, 51200, 3, 128}, - {3, 3, 1, 14336, 51200, 3, 128}, - {3, 4, 1, 14336, 51200, 3, 100}, - {3, 5, 1, 14336, 51200, 3, 116}, - {3, 6, 1, 14336, 51200, 3, 128}, - {3, 7, 1, 14336, 51200, 3, 86}, - {3, 8, 1, 14336, 51200, 3, 82}, - {3, 1, 1, 14336, 128000, 3, 128}, - {3, 2, 1, 14336, 128000, 3, 128}, - {3, 3, 1, 14336, 128000, 3, 128}, - {3, 4, 1, 14336, 128000, 3, 116}, - {3, 5, 1, 14336, 128000, 3, 126}, - {3, 6, 1, 14336, 128000, 3, 126}, - {3, 7, 1, 14336, 128000, 3, 100}, - {3, 8, 1, 14336, 128000, 3, 94}, - {3, 1, 1, 16384, 256, 2, 32}, - {3, 2, 1, 16384, 256, 2, 32}, - {3, 3, 1, 16384, 256, 2, 38}, - {3, 4, 1, 16384, 256, 2, 32}, - {3, 5, 1, 16384, 256, 2, 32}, - {3, 6, 1, 16384, 256, 2, 32}, - {3, 7, 1, 16384, 256, 2, 38}, - {3, 8, 1, 16384, 256, 2, 32}, - {3, 1, 1, 16384, 512, 2, 62}, - {3, 2, 1, 16384, 512, 2, 62}, - {3, 3, 1, 16384, 512, 2, 64}, - {3, 4, 1, 16384, 512, 2, 56}, - {3, 5, 1, 16384, 512, 2, 64}, - {3, 6, 1, 16384, 512, 2, 64}, - {3, 7, 1, 16384, 512, 2, 64}, - {3, 8, 1, 16384, 512, 2, 66}, - {3, 1, 1, 16384, 1024, 2, 128}, - {3, 2, 1, 16384, 1024, 2, 104}, - {3, 3, 1, 16384, 1024, 2, 126}, - {3, 4, 1, 16384, 1024, 2, 96}, - {3, 5, 1, 16384, 1024, 2, 108}, - {3, 6, 1, 16384, 1024, 2, 96}, - {3, 7, 1, 16384, 1024, 2, 88}, - {3, 8, 1, 16384, 1024, 2, 80}, - {3, 1, 1, 16384, 2048, 2, 128}, - {3, 2, 1, 16384, 2048, 2, 128}, - {3, 3, 1, 16384, 2048, 3, 126}, - {3, 4, 1, 16384, 2048, 2, 128}, - {3, 5, 1, 16384, 2048, 2, 126}, - {3, 6, 1, 16384, 2048, 2, 96}, - {3, 7, 1, 16384, 2048, 1, 128}, - {3, 8, 1, 16384, 2048, 1, 96}, - {3, 1, 1, 16384, 3072, 3, 128}, - {3, 2, 1, 16384, 3072, 3, 128}, - {3, 3, 1, 16384, 3072, 3, 128}, - {3, 4, 1, 16384, 3072, 2, 128}, - {3, 5, 1, 16384, 3072, 2, 120}, - {3, 6, 1, 16384, 3072, 1, 128}, - {3, 7, 1, 16384, 3072, 2, 96}, - {3, 8, 1, 16384, 3072, 1, 96}, - {3, 1, 1, 16384, 4096, 3, 128}, - {3, 2, 1, 16384, 4096, 3, 128}, - {3, 3, 1, 16384, 4096, 3, 128}, - {3, 4, 1, 16384, 4096, 2, 128}, - {3, 5, 1, 16384, 4096, 2, 128}, - {3, 6, 1, 16384, 4096, 1, 124}, - {3, 7, 1, 16384, 4096, 1, 128}, - {3, 8, 1, 16384, 4096, 1, 96}, - {3, 1, 1, 16384, 5120, 3, 128}, - {3, 2, 1, 16384, 5120, 3, 128}, - {3, 3, 1, 16384, 5120, 3, 128}, - {3, 4, 1, 16384, 5120, 2, 120}, - {3, 5, 1, 16384, 5120, 2, 120}, - {3, 6, 1, 16384, 5120, 1, 120}, - {3, 7, 1, 16384, 5120, 1, 128}, - {3, 8, 1, 16384, 5120, 1, 96}, - {3, 1, 1, 16384, 8192, 3, 128}, - {3, 2, 1, 16384, 8192, 3, 128}, - {3, 3, 1, 16384, 8192, 3, 128}, - {3, 4, 1, 16384, 8192, 2, 128}, - {3, 5, 1, 16384, 8192, 2, 128}, - {3, 6, 1, 16384, 8192, 1, 128}, - {3, 7, 1, 16384, 8192, 1, 128}, - {3, 8, 1, 16384, 8192, 2, 128}, - {3, 1, 1, 16384, 12288, 3, 128}, - {3, 2, 1, 16384, 12288, 3, 128}, - {3, 3, 1, 16384, 12288, 3, 128}, - {3, 4, 1, 16384, 12288, 3, 96}, - {3, 5, 1, 16384, 12288, 3, 120}, - {3, 6, 1, 16384, 12288, 1, 128}, - {3, 7, 1, 16384, 12288, 2, 96}, - {3, 8, 1, 16384, 12288, 1, 96}, - {3, 1, 1, 16384, 14336, 3, 128}, - {3, 2, 1, 16384, 14336, 3, 128}, - {3, 3, 1, 16384, 14336, 3, 126}, - {3, 4, 1, 16384, 14336, 3, 112}, - {3, 5, 1, 16384, 14336, 3, 112}, - {3, 6, 1, 16384, 14336, 3, 112}, - {3, 7, 1, 16384, 14336, 1, 128}, - {3, 8, 1, 16384, 14336, 2, 112}, - {3, 1, 1, 16384, 16384, 3, 128}, - {3, 2, 1, 16384, 16384, 3, 128}, - {3, 3, 1, 16384, 16384, 3, 128}, - {3, 4, 1, 16384, 16384, 3, 128}, - {3, 5, 1, 16384, 16384, 3, 128}, - {3, 6, 1, 16384, 16384, 3, 128}, - {3, 7, 1, 16384, 16384, 1, 128}, - {3, 8, 1, 16384, 16384, 3, 96}, - {3, 1, 1, 16384, 24576, 3, 128}, - {3, 2, 1, 16384, 24576, 3, 128}, - {3, 3, 1, 16384, 24576, 3, 128}, - {3, 4, 1, 16384, 24576, 3, 96}, - {3, 5, 1, 16384, 24576, 3, 120}, - {3, 6, 1, 16384, 24576, 3, 96}, - {3, 7, 1, 16384, 24576, 3, 96}, - {3, 8, 1, 16384, 24576, 3, 96}, - {3, 1, 1, 16384, 51200, 3, 128}, - {3, 2, 1, 16384, 51200, 3, 128}, - {3, 3, 1, 16384, 51200, 3, 128}, - {3, 4, 1, 16384, 51200, 3, 120}, - {3, 5, 1, 16384, 51200, 3, 112}, - {3, 6, 1, 16384, 51200, 3, 128}, - {3, 7, 1, 16384, 51200, 3, 110}, - {3, 8, 1, 16384, 51200, 3, 80}, - {3, 1, 1, 16384, 128000, 3, 128}, - {3, 2, 1, 16384, 128000, 3, 128}, - {3, 3, 1, 16384, 128000, 3, 128}, - {3, 4, 1, 16384, 128000, 3, 126}, - {3, 5, 1, 16384, 128000, 3, 126}, - {3, 6, 1, 16384, 128000, 3, 126}, - {3, 7, 1, 16384, 128000, 3, 100}, - {3, 8, 1, 16384, 128000, 3, 118}, - {3, 1, 1, 24576, 256, 2, 36}, - {3, 2, 1, 24576, 256, 2, 36}, - {3, 3, 1, 24576, 256, 2, 44}, - {3, 4, 1, 24576, 256, 2, 36}, - {3, 5, 1, 24576, 256, 2, 42}, - {3, 6, 1, 24576, 256, 2, 40}, - {3, 7, 1, 24576, 256, 2, 44}, - {3, 8, 1, 24576, 256, 2, 44}, - {3, 1, 1, 24576, 512, 2, 72}, - {3, 2, 1, 24576, 512, 2, 72}, - {3, 3, 1, 24576, 512, 2, 84}, - {3, 4, 1, 24576, 512, 2, 72}, - {3, 5, 1, 24576, 512, 2, 84}, - {3, 6, 1, 24576, 512, 2, 80}, - {3, 7, 1, 24576, 512, 2, 84}, - {3, 8, 1, 24576, 512, 2, 72}, - {3, 1, 1, 24576, 1024, 2, 128}, - {3, 2, 1, 24576, 1024, 2, 126}, - {3, 3, 1, 24576, 1024, 2, 128}, - {3, 4, 1, 24576, 1024, 2, 112}, - {3, 5, 1, 24576, 1024, 2, 108}, - {3, 6, 1, 24576, 1024, 2, 96}, - {3, 7, 1, 24576, 1024, 2, 96}, - {3, 8, 1, 24576, 1024, 2, 80}, - {3, 1, 1, 24576, 2048, 2, 128}, - {3, 2, 1, 24576, 2048, 2, 128}, - {3, 3, 1, 24576, 2048, 3, 128}, - {3, 4, 1, 24576, 2048, 2, 128}, - {3, 5, 1, 24576, 2048, 2, 126}, - {3, 6, 1, 24576, 2048, 2, 96}, - {3, 7, 1, 24576, 2048, 2, 96}, - {3, 8, 1, 24576, 2048, 1, 96}, - {3, 1, 1, 24576, 3072, 3, 128}, - {3, 2, 1, 24576, 3072, 3, 128}, - {3, 3, 1, 24576, 3072, 3, 128}, - {3, 4, 1, 24576, 3072, 2, 128}, - {3, 5, 1, 24576, 3072, 2, 120}, - {3, 6, 1, 24576, 3072, 1, 128}, - {3, 7, 1, 24576, 3072, 2, 96}, - {3, 8, 1, 24576, 3072, 1, 96}, - {3, 1, 1, 24576, 4096, 3, 128}, - {3, 2, 1, 24576, 4096, 3, 128}, - {3, 3, 1, 24576, 4096, 3, 128}, - {3, 4, 1, 24576, 4096, 2, 128}, - {3, 5, 1, 24576, 4096, 2, 128}, - {3, 6, 1, 24576, 4096, 1, 128}, - {3, 7, 1, 24576, 4096, 1, 128}, - {3, 8, 1, 24576, 4096, 1, 96}, - {3, 1, 1, 24576, 5120, 3, 128}, - {3, 2, 1, 24576, 5120, 3, 128}, - {3, 3, 1, 24576, 5120, 3, 128}, - {3, 4, 1, 24576, 5120, 2, 120}, - {3, 5, 1, 24576, 5120, 2, 120}, - {3, 6, 1, 24576, 5120, 2, 120}, - {3, 7, 1, 24576, 5120, 2, 120}, - {3, 8, 1, 24576, 5120, 1, 96}, - {3, 1, 1, 24576, 8192, 3, 128}, - {3, 2, 1, 24576, 8192, 3, 128}, - {3, 3, 1, 24576, 8192, 3, 128}, - {3, 4, 1, 24576, 8192, 2, 128}, - {3, 5, 1, 24576, 8192, 2, 128}, - {3, 6, 1, 24576, 8192, 1, 128}, - {3, 7, 1, 24576, 8192, 1, 128}, - {3, 8, 1, 24576, 8192, 2, 128}, - {3, 1, 1, 24576, 12288, 3, 128}, - {3, 2, 1, 24576, 12288, 3, 128}, - {3, 3, 1, 24576, 12288, 3, 128}, - {3, 4, 1, 24576, 12288, 3, 96}, - {3, 5, 1, 24576, 12288, 3, 114}, - {3, 6, 1, 24576, 12288, 1, 128}, - {3, 7, 1, 24576, 12288, 2, 96}, - {3, 8, 1, 24576, 12288, 1, 96}, - {3, 1, 1, 24576, 14336, 3, 128}, - {3, 2, 1, 24576, 14336, 3, 128}, - {3, 3, 1, 24576, 14336, 3, 126}, - {3, 4, 1, 24576, 14336, 3, 112}, - {3, 5, 1, 24576, 14336, 3, 112}, - {3, 6, 1, 24576, 14336, 3, 112}, - {3, 7, 1, 24576, 14336, 1, 128}, - {3, 8, 1, 24576, 14336, 3, 112}, - {3, 1, 1, 24576, 16384, 3, 128}, - {3, 2, 1, 24576, 16384, 3, 128}, - {3, 3, 1, 24576, 16384, 3, 128}, - {3, 4, 1, 24576, 16384, 3, 128}, - {3, 5, 1, 24576, 16384, 3, 128}, - {3, 6, 1, 24576, 16384, 3, 128}, - {3, 7, 1, 24576, 16384, 1, 128}, - {3, 8, 1, 24576, 16384, 3, 96}, - {3, 1, 1, 24576, 24576, 3, 128}, - {3, 2, 1, 24576, 24576, 3, 128}, - {3, 3, 1, 24576, 24576, 3, 128}, - {3, 4, 1, 24576, 24576, 3, 96}, - {3, 5, 1, 24576, 24576, 3, 120}, - {3, 6, 1, 24576, 24576, 3, 96}, - {3, 7, 1, 24576, 24576, 3, 96}, - {3, 8, 1, 24576, 24576, 3, 96}, - {3, 1, 1, 24576, 51200, 3, 128}, - {3, 2, 1, 24576, 51200, 3, 128}, - {3, 3, 1, 24576, 51200, 3, 126}, - {3, 4, 1, 24576, 51200, 3, 120}, - {3, 5, 1, 24576, 51200, 3, 120}, - {3, 6, 1, 24576, 51200, 3, 108}, - {3, 7, 1, 24576, 51200, 3, 80}, - {3, 8, 1, 24576, 51200, 3, 118}, - {3, 1, 1, 24576, 128000, 3, 128}, - {3, 2, 1, 24576, 128000, 3, 128}, - {3, 3, 1, 24576, 128000, 3, 128}, - {3, 4, 1, 24576, 128000, 3, 124}, - {3, 5, 1, 24576, 128000, 3, 126}, - {3, 6, 1, 24576, 128000, 3, 128}, - {3, 7, 1, 24576, 128000, 3, 100}, - {3, 8, 1, 24576, 128000, 3, 126}, - {2, 1, 1, 128, 256, 1, 4}, - {2, 2, 1, 128, 256, 1, 4}, - {2, 3, 1, 128, 256, 1, 4}, - {2, 4, 1, 128, 256, 1, 4}, - {2, 5, 1, 128, 256, 1, 4}, - {2, 6, 1, 128, 256, 1, 4}, - {2, 7, 1, 128, 256, 1, 4}, - {2, 8, 1, 128, 256, 1, 4}, - {2, 1, 1, 128, 512, 1, 8}, - {2, 2, 1, 128, 512, 1, 8}, - {2, 3, 1, 128, 512, 1, 8}, - {2, 4, 1, 128, 512, 1, 8}, - {2, 5, 1, 128, 512, 1, 8}, - {2, 6, 1, 128, 512, 1, 8}, - {2, 7, 1, 128, 512, 1, 8}, - {2, 8, 1, 128, 512, 1, 8}, - {2, 1, 1, 128, 1024, 1, 16}, - {2, 2, 1, 128, 1024, 1, 16}, - {2, 3, 1, 128, 1024, 1, 16}, - {2, 4, 1, 128, 1024, 1, 16}, - {2, 5, 1, 128, 1024, 1, 16}, - {2, 6, 1, 128, 1024, 1, 16}, - {2, 7, 1, 128, 1024, 1, 16}, - {2, 8, 1, 128, 1024, 1, 16}, - {2, 1, 1, 128, 2048, 1, 32}, - {2, 2, 1, 128, 2048, 1, 32}, - {2, 3, 1, 128, 2048, 1, 32}, - {2, 4, 1, 128, 2048, 1, 32}, - {2, 5, 1, 128, 2048, 1, 32}, - {2, 6, 1, 128, 2048, 1, 32}, - {2, 7, 1, 128, 2048, 1, 32}, - {2, 8, 1, 128, 2048, 1, 32}, - {2, 1, 1, 128, 3072, 1, 48}, - {2, 2, 1, 128, 3072, 1, 48}, - {2, 3, 1, 128, 3072, 1, 48}, - {2, 4, 1, 128, 3072, 1, 48}, - {2, 5, 1, 128, 3072, 1, 48}, - {2, 6, 1, 128, 3072, 1, 48}, - {2, 7, 1, 128, 3072, 1, 48}, - {2, 8, 1, 128, 3072, 1, 48}, - {2, 1, 1, 128, 4096, 1, 64}, - {2, 2, 1, 128, 4096, 1, 64}, - {2, 3, 1, 128, 4096, 1, 64}, - {2, 4, 1, 128, 4096, 1, 64}, - {2, 5, 1, 128, 4096, 1, 64}, - {2, 6, 1, 128, 4096, 1, 64}, - {2, 7, 1, 128, 4096, 1, 64}, - {2, 8, 1, 128, 4096, 1, 64}, - {2, 1, 1, 128, 5120, 1, 80}, - {2, 2, 1, 128, 5120, 1, 80}, - {2, 3, 1, 128, 5120, 1, 80}, - {2, 4, 1, 128, 5120, 1, 80}, - {2, 5, 1, 128, 5120, 1, 80}, - {2, 6, 1, 128, 5120, 1, 80}, - {2, 7, 1, 128, 5120, 1, 64}, - {2, 8, 1, 128, 5120, 1, 80}, - {2, 1, 1, 128, 8192, 1, 64}, - {2, 2, 1, 128, 8192, 1, 64}, - {2, 3, 1, 128, 8192, 1, 64}, - {2, 4, 1, 128, 8192, 1, 64}, - {2, 5, 1, 128, 8192, 1, 64}, - {2, 6, 1, 128, 8192, 1, 64}, - {2, 7, 1, 128, 8192, 1, 64}, - {2, 8, 1, 128, 8192, 1, 64}, - {2, 1, 1, 128, 12288, 1, 84}, - {2, 2, 1, 128, 12288, 1, 84}, - {2, 3, 1, 128, 12288, 1, 84}, - {2, 4, 1, 128, 12288, 1, 84}, - {2, 5, 1, 128, 12288, 1, 84}, - {2, 6, 1, 128, 12288, 1, 84}, - {2, 7, 1, 128, 12288, 1, 84}, - {2, 8, 1, 128, 12288, 1, 80}, - {2, 1, 1, 128, 14336, 2, 84}, - {2, 2, 1, 128, 14336, 1, 84}, - {2, 3, 1, 128, 14336, 1, 84}, - {2, 4, 1, 128, 14336, 1, 84}, - {2, 5, 1, 128, 14336, 1, 84}, - {2, 6, 1, 128, 14336, 1, 84}, - {2, 7, 1, 128, 14336, 1, 84}, - {2, 8, 1, 128, 14336, 1, 84}, - {2, 1, 1, 128, 16384, 3, 64}, - {2, 2, 1, 128, 16384, 3, 64}, - {2, 3, 1, 128, 16384, 3, 64}, - {2, 4, 1, 128, 16384, 3, 64}, - {2, 5, 1, 128, 16384, 1, 82}, - {2, 6, 1, 128, 16384, 1, 84}, - {2, 7, 1, 128, 16384, 1, 84}, - {2, 8, 1, 128, 16384, 3, 64}, - {2, 1, 1, 128, 24576, 3, 84}, - {2, 2, 1, 128, 24576, 3, 82}, - {2, 3, 1, 128, 24576, 3, 84}, - {2, 4, 1, 128, 24576, 2, 84}, - {2, 5, 1, 128, 24576, 2, 84}, - {2, 6, 1, 128, 24576, 2, 84}, - {2, 7, 1, 128, 24576, 2, 84}, - {2, 8, 1, 128, 24576, 2, 84}, - {2, 1, 1, 128, 51200, 3, 80}, - {2, 2, 1, 128, 51200, 3, 80}, - {2, 3, 1, 128, 51200, 3, 80}, - {2, 4, 1, 128, 51200, 3, 80}, - {2, 5, 1, 128, 51200, 3, 80}, - {2, 6, 1, 128, 51200, 2, 80}, - {2, 7, 1, 128, 51200, 2, 80}, - {2, 8, 1, 128, 51200, 3, 80}, - {2, 1, 1, 128, 128000, 3, 84}, - {2, 2, 1, 128, 128000, 3, 84}, - {2, 3, 1, 128, 128000, 3, 84}, - {2, 4, 1, 128, 128000, 3, 84}, - {2, 5, 1, 128, 128000, 3, 84}, - {2, 6, 1, 128, 128000, 3, 84}, - {2, 7, 1, 128, 128000, 3, 84}, - {2, 8, 1, 128, 128000, 3, 84}, - {2, 1, 1, 256, 256, 2, 4}, - {2, 2, 1, 256, 256, 2, 4}, - {2, 3, 1, 256, 256, 2, 4}, - {2, 4, 1, 256, 256, 2, 4}, - {2, 5, 1, 256, 256, 2, 4}, - {2, 6, 1, 256, 256, 2, 4}, - {2, 7, 1, 256, 256, 2, 4}, - {2, 8, 1, 256, 256, 2, 4}, - {2, 1, 1, 256, 512, 2, 8}, - {2, 2, 1, 256, 512, 2, 8}, - {2, 3, 1, 256, 512, 2, 8}, - {2, 4, 1, 256, 512, 2, 8}, - {2, 5, 1, 256, 512, 2, 8}, - {2, 6, 1, 256, 512, 2, 8}, - {2, 7, 1, 256, 512, 2, 8}, - {2, 8, 1, 256, 512, 2, 8}, - {2, 1, 1, 256, 1024, 2, 16}, - {2, 2, 1, 256, 1024, 2, 16}, - {2, 3, 1, 256, 1024, 2, 16}, - {2, 4, 1, 256, 1024, 2, 16}, - {2, 5, 1, 256, 1024, 1, 16}, - {2, 6, 1, 256, 1024, 2, 16}, - {2, 7, 1, 256, 1024, 1, 16}, - {2, 8, 1, 256, 1024, 1, 16}, - {2, 1, 1, 256, 2048, 2, 32}, - {2, 2, 1, 256, 2048, 2, 32}, - {2, 3, 1, 256, 2048, 1, 32}, - {2, 4, 1, 256, 2048, 1, 32}, - {2, 5, 1, 256, 2048, 1, 32}, - {2, 6, 1, 256, 2048, 1, 32}, - {2, 7, 1, 256, 2048, 1, 32}, - {2, 8, 1, 256, 2048, 1, 32}, - {2, 1, 1, 256, 3072, 2, 48}, - {2, 2, 1, 256, 3072, 1, 48}, - {2, 3, 1, 256, 3072, 1, 48}, - {2, 4, 1, 256, 3072, 1, 48}, - {2, 5, 1, 256, 3072, 1, 48}, - {2, 6, 1, 256, 3072, 1, 48}, - {2, 7, 1, 256, 3072, 1, 48}, - {2, 8, 1, 256, 3072, 1, 48}, - {2, 1, 1, 256, 4096, 2, 64}, - {2, 2, 1, 256, 4096, 1, 64}, - {2, 3, 1, 256, 4096, 1, 64}, - {2, 4, 1, 256, 4096, 1, 64}, - {2, 5, 1, 256, 4096, 1, 64}, - {2, 6, 1, 256, 4096, 1, 64}, - {2, 7, 1, 256, 4096, 1, 64}, - {2, 8, 1, 256, 4096, 1, 64}, - {2, 1, 1, 256, 5120, 1, 80}, - {2, 2, 1, 256, 5120, 1, 80}, - {2, 3, 1, 256, 5120, 1, 80}, - {2, 4, 1, 256, 5120, 1, 80}, - {2, 5, 1, 256, 5120, 1, 80}, - {2, 6, 1, 256, 5120, 1, 80}, - {2, 7, 1, 256, 5120, 1, 80}, - {2, 8, 1, 256, 5120, 1, 80}, - {2, 1, 1, 256, 8192, 2, 64}, - {2, 2, 1, 256, 8192, 2, 64}, - {2, 3, 1, 256, 8192, 1, 84}, - {2, 4, 1, 256, 8192, 2, 64}, - {2, 5, 1, 256, 8192, 1, 84}, - {2, 6, 1, 256, 8192, 1, 84}, - {2, 7, 1, 256, 8192, 1, 84}, - {2, 8, 1, 256, 8192, 1, 84}, - {2, 1, 1, 256, 12288, 2, 84}, - {2, 2, 1, 256, 12288, 2, 84}, - {2, 3, 1, 256, 12288, 1, 84}, - {2, 4, 1, 256, 12288, 2, 84}, - {2, 5, 1, 256, 12288, 1, 84}, - {2, 6, 1, 256, 12288, 1, 84}, - {2, 7, 1, 256, 12288, 2, 84}, - {2, 8, 1, 256, 12288, 1, 84}, - {2, 1, 1, 256, 14336, 2, 84}, - {2, 2, 1, 256, 14336, 2, 84}, - {2, 3, 1, 256, 14336, 1, 84}, - {2, 4, 1, 256, 14336, 2, 84}, - {2, 5, 1, 256, 14336, 2, 84}, - {2, 6, 1, 256, 14336, 2, 84}, - {2, 7, 1, 256, 14336, 2, 84}, - {2, 8, 1, 256, 14336, 1, 84}, - {2, 1, 1, 256, 16384, 3, 64}, - {2, 2, 1, 256, 16384, 3, 64}, - {2, 3, 1, 256, 16384, 3, 64}, - {2, 4, 1, 256, 16384, 3, 64}, - {2, 5, 1, 256, 16384, 2, 84}, - {2, 6, 1, 256, 16384, 2, 84}, - {2, 7, 1, 256, 16384, 2, 84}, - {2, 8, 1, 256, 16384, 3, 64}, - {2, 1, 1, 256, 24576, 3, 84}, - {2, 2, 1, 256, 24576, 3, 84}, - {2, 3, 1, 256, 24576, 3, 84}, - {2, 4, 1, 256, 24576, 3, 84}, - {2, 5, 1, 256, 24576, 3, 84}, - {2, 6, 1, 256, 24576, 3, 84}, - {2, 7, 1, 256, 24576, 3, 84}, - {2, 8, 1, 256, 24576, 3, 84}, - {2, 1, 1, 256, 51200, 3, 80}, - {2, 2, 1, 256, 51200, 3, 80}, - {2, 3, 1, 256, 51200, 3, 80}, - {2, 4, 1, 256, 51200, 3, 80}, - {2, 5, 1, 256, 51200, 3, 80}, - {2, 6, 1, 256, 51200, 3, 80}, - {2, 7, 1, 256, 51200, 3, 80}, - {2, 8, 1, 256, 51200, 3, 80}, - {2, 1, 1, 256, 128000, 3, 84}, - {2, 2, 1, 256, 128000, 3, 84}, - {2, 3, 1, 256, 128000, 3, 84}, - {2, 4, 1, 256, 128000, 3, 84}, - {2, 5, 1, 256, 128000, 3, 84}, - {2, 6, 1, 256, 128000, 3, 84}, - {2, 7, 1, 256, 128000, 3, 84}, - {2, 8, 1, 256, 128000, 3, 80}, - {2, 1, 1, 512, 256, 2, 4}, - {2, 2, 1, 512, 256, 2, 4}, - {2, 3, 1, 512, 256, 2, 8}, - {2, 4, 1, 512, 256, 2, 4}, - {2, 5, 1, 512, 256, 2, 8}, - {2, 6, 1, 512, 256, 2, 8}, - {2, 7, 1, 512, 256, 2, 8}, - {2, 8, 1, 512, 256, 2, 8}, - {2, 1, 1, 512, 512, 2, 8}, - {2, 2, 1, 512, 512, 2, 16}, - {2, 3, 1, 512, 512, 2, 16}, - {2, 4, 1, 512, 512, 2, 8}, - {2, 5, 1, 512, 512, 2, 16}, - {2, 6, 1, 512, 512, 1, 16}, - {2, 7, 1, 512, 512, 1, 16}, - {2, 8, 1, 512, 512, 1, 16}, - {2, 1, 1, 512, 1024, 2, 24}, - {2, 2, 1, 512, 1024, 2, 16}, - {2, 3, 1, 512, 1024, 1, 24}, - {2, 4, 1, 512, 1024, 1, 24}, - {2, 5, 1, 512, 1024, 1, 24}, - {2, 6, 1, 512, 1024, 1, 32}, - {2, 7, 1, 512, 1024, 1, 32}, - {2, 8, 1, 512, 1024, 1, 32}, - {2, 1, 1, 512, 2048, 2, 32}, - {2, 2, 1, 512, 2048, 1, 48}, - {2, 3, 1, 512, 2048, 1, 64}, - {2, 4, 1, 512, 2048, 1, 48}, - {2, 5, 1, 512, 2048, 1, 64}, - {2, 6, 1, 512, 2048, 1, 64}, - {2, 7, 1, 512, 2048, 1, 64}, - {2, 8, 1, 512, 2048, 1, 64}, - {2, 1, 1, 512, 3072, 2, 48}, - {2, 2, 1, 512, 3072, 1, 72}, - {2, 3, 1, 512, 3072, 1, 72}, - {2, 4, 1, 512, 3072, 1, 72}, - {2, 5, 1, 512, 3072, 1, 72}, - {2, 6, 1, 512, 3072, 1, 72}, - {2, 7, 1, 512, 3072, 1, 72}, - {2, 8, 1, 512, 3072, 1, 72}, - {2, 1, 1, 512, 4096, 2, 64}, - {2, 2, 1, 512, 4096, 2, 64}, - {2, 3, 1, 512, 4096, 1, 84}, - {2, 4, 1, 512, 4096, 2, 64}, - {2, 5, 1, 512, 4096, 1, 84}, - {2, 6, 1, 512, 4096, 1, 84}, - {2, 7, 1, 512, 4096, 1, 84}, - {2, 8, 1, 512, 4096, 1, 84}, - {2, 1, 1, 512, 5120, 2, 80}, - {2, 2, 1, 512, 5120, 2, 80}, - {2, 3, 1, 512, 5120, 1, 80}, - {2, 4, 1, 512, 5120, 2, 80}, - {2, 5, 1, 512, 5120, 1, 80}, - {2, 6, 1, 512, 5120, 1, 80}, - {2, 7, 1, 512, 5120, 2, 80}, - {2, 8, 1, 512, 5120, 1, 80}, - {2, 1, 1, 512, 8192, 2, 84}, - {2, 2, 1, 512, 8192, 2, 84}, - {2, 3, 1, 512, 8192, 3, 64}, - {2, 4, 1, 512, 8192, 2, 84}, - {2, 5, 1, 512, 8192, 2, 84}, - {2, 6, 1, 512, 8192, 2, 84}, - {2, 7, 1, 512, 8192, 2, 84}, - {2, 8, 1, 512, 8192, 2, 84}, - {2, 1, 1, 512, 12288, 3, 84}, - {2, 2, 1, 512, 12288, 3, 84}, - {2, 3, 1, 512, 12288, 3, 84}, - {2, 4, 1, 512, 12288, 3, 84}, - {2, 5, 1, 512, 12288, 2, 84}, - {2, 6, 1, 512, 12288, 2, 84}, - {2, 7, 1, 512, 12288, 2, 84}, - {2, 8, 1, 512, 12288, 3, 78}, - {2, 1, 1, 512, 14336, 3, 84}, - {2, 2, 1, 512, 14336, 3, 82}, - {2, 3, 1, 512, 14336, 3, 84}, - {2, 4, 1, 512, 14336, 3, 84}, - {2, 5, 1, 512, 14336, 2, 84}, - {2, 6, 1, 512, 14336, 2, 84}, - {2, 7, 1, 512, 14336, 2, 84}, - {2, 8, 1, 512, 14336, 3, 82}, - {2, 1, 1, 512, 16384, 3, 84}, - {2, 2, 1, 512, 16384, 3, 82}, - {2, 3, 1, 512, 16384, 3, 84}, - {2, 4, 1, 512, 16384, 3, 84}, - {2, 5, 1, 512, 16384, 2, 84}, - {2, 6, 1, 512, 16384, 3, 84}, - {2, 7, 1, 512, 16384, 3, 84}, - {2, 8, 1, 512, 16384, 3, 64}, - {2, 1, 1, 512, 24576, 3, 84}, - {2, 2, 1, 512, 24576, 3, 84}, - {2, 3, 1, 512, 24576, 3, 84}, - {2, 4, 1, 512, 24576, 3, 84}, - {2, 5, 1, 512, 24576, 3, 84}, - {2, 6, 1, 512, 24576, 3, 84}, - {2, 7, 1, 512, 24576, 3, 84}, - {2, 8, 1, 512, 24576, 3, 80}, - {2, 1, 1, 512, 51200, 3, 80}, - {2, 2, 1, 512, 51200, 3, 80}, - {2, 3, 1, 512, 51200, 3, 80}, - {2, 4, 1, 512, 51200, 3, 80}, - {2, 5, 1, 512, 51200, 3, 84}, - {2, 6, 1, 512, 51200, 3, 84}, - {2, 7, 1, 512, 51200, 3, 80}, - {2, 8, 1, 512, 51200, 3, 80}, - {2, 1, 1, 512, 128000, 3, 84}, - {2, 2, 1, 512, 128000, 3, 84}, - {2, 3, 1, 512, 128000, 3, 84}, - {2, 4, 1, 512, 128000, 3, 84}, - {2, 5, 1, 512, 128000, 3, 84}, - {2, 6, 1, 512, 128000, 3, 84}, - {2, 7, 1, 512, 128000, 3, 84}, - {2, 8, 1, 512, 128000, 3, 80}, - {2, 1, 1, 1024, 256, 2, 8}, - {2, 2, 1, 1024, 256, 2, 8}, - {2, 3, 1, 1024, 256, 2, 8}, - {2, 4, 1, 1024, 256, 2, 8}, - {2, 5, 1, 1024, 256, 2, 8}, - {2, 6, 1, 1024, 256, 2, 8}, - {2, 7, 1, 1024, 256, 2, 8}, - {2, 8, 1, 1024, 256, 2, 8}, - {2, 1, 1, 1024, 512, 2, 16}, - {2, 2, 1, 1024, 512, 2, 16}, - {2, 3, 1, 1024, 512, 2, 16}, - {2, 4, 1, 1024, 512, 2, 16}, - {2, 5, 1, 1024, 512, 2, 16}, - {2, 6, 1, 1024, 512, 2, 16}, - {2, 7, 1, 1024, 512, 2, 16}, - {2, 8, 1, 1024, 512, 2, 16}, - {2, 1, 1, 1024, 1024, 2, 32}, - {2, 2, 1, 1024, 1024, 2, 32}, - {2, 3, 1, 1024, 1024, 2, 32}, - {2, 4, 1, 1024, 1024, 2, 32}, - {2, 5, 1, 1024, 1024, 2, 32}, - {2, 6, 1, 1024, 1024, 2, 32}, - {2, 7, 1, 1024, 1024, 2, 32}, - {2, 8, 1, 1024, 1024, 2, 32}, - {2, 1, 1, 1024, 2048, 2, 64}, - {2, 2, 1, 1024, 2048, 2, 64}, - {2, 3, 1, 1024, 2048, 1, 64}, - {2, 4, 1, 1024, 2048, 2, 64}, - {2, 5, 1, 1024, 2048, 2, 64}, - {2, 6, 1, 1024, 2048, 2, 64}, - {2, 7, 1, 1024, 2048, 2, 64}, - {2, 8, 1, 1024, 2048, 1, 80}, - {2, 1, 1, 1024, 3072, 2, 72}, - {2, 2, 1, 1024, 3072, 2, 72}, - {2, 3, 1, 1024, 3072, 2, 72}, - {2, 4, 1, 1024, 3072, 2, 72}, - {2, 5, 1, 1024, 3072, 2, 72}, - {2, 6, 1, 1024, 3072, 2, 72}, - {2, 7, 1, 1024, 3072, 2, 72}, - {2, 8, 1, 1024, 3072, 2, 82}, - {2, 1, 1, 1024, 4096, 2, 84}, - {2, 2, 1, 1024, 4096, 2, 84}, - {2, 3, 1, 1024, 4096, 2, 84}, - {2, 4, 1, 1024, 4096, 2, 84}, - {2, 5, 1, 1024, 4096, 2, 84}, - {2, 6, 1, 1024, 4096, 2, 84}, - {2, 7, 1, 1024, 4096, 2, 84}, - {2, 8, 1, 1024, 4096, 2, 84}, - {2, 1, 1, 1024, 5120, 2, 80}, - {2, 2, 1, 1024, 5120, 2, 80}, - {2, 3, 1, 1024, 5120, 2, 80}, - {2, 4, 1, 1024, 5120, 2, 80}, - {2, 5, 1, 1024, 5120, 2, 80}, - {2, 6, 1, 1024, 5120, 2, 80}, - {2, 7, 1, 1024, 5120, 2, 80}, - {2, 8, 1, 1024, 5120, 2, 80}, - {2, 1, 1, 1024, 8192, 3, 84}, - {2, 2, 1, 1024, 8192, 3, 84}, - {2, 3, 1, 1024, 8192, 3, 84}, - {2, 4, 1, 1024, 8192, 3, 84}, - {2, 5, 1, 1024, 8192, 2, 84}, - {2, 6, 1, 1024, 8192, 2, 84}, - {2, 7, 1, 1024, 8192, 2, 84}, - {2, 8, 1, 1024, 8192, 3, 64}, - {2, 1, 1, 1024, 12288, 3, 82}, - {2, 2, 1, 1024, 12288, 3, 84}, - {2, 3, 1, 1024, 12288, 3, 84}, - {2, 4, 1, 1024, 12288, 3, 84}, - {2, 5, 1, 1024, 12288, 2, 84}, - {2, 6, 1, 1024, 12288, 2, 84}, - {2, 7, 1, 1024, 12288, 3, 84}, - {2, 8, 1, 1024, 12288, 3, 80}, - {2, 1, 1, 1024, 14336, 3, 84}, - {2, 2, 1, 1024, 14336, 3, 84}, - {2, 3, 1, 1024, 14336, 3, 84}, - {2, 4, 1, 1024, 14336, 3, 84}, - {2, 5, 1, 1024, 14336, 3, 84}, - {2, 6, 1, 1024, 14336, 3, 84}, - {2, 7, 1, 1024, 14336, 3, 84}, - {2, 8, 1, 1024, 14336, 3, 78}, - {2, 1, 1, 1024, 16384, 3, 82}, - {2, 2, 1, 1024, 16384, 3, 82}, - {2, 3, 1, 1024, 16384, 3, 84}, - {2, 4, 1, 1024, 16384, 3, 84}, - {2, 5, 1, 1024, 16384, 3, 84}, - {2, 6, 1, 1024, 16384, 3, 84}, - {2, 7, 1, 1024, 16384, 3, 82}, - {2, 8, 1, 1024, 16384, 3, 64}, - {2, 1, 1, 1024, 24576, 3, 84}, - {2, 2, 1, 1024, 24576, 3, 84}, - {2, 3, 1, 1024, 24576, 3, 84}, - {2, 4, 1, 1024, 24576, 3, 84}, - {2, 5, 1, 1024, 24576, 3, 84}, - {2, 6, 1, 1024, 24576, 3, 84}, - {2, 7, 1, 1024, 24576, 3, 84}, - {2, 8, 1, 1024, 24576, 3, 84}, - {2, 1, 1, 1024, 51200, 3, 84}, - {2, 2, 1, 1024, 51200, 3, 84}, - {2, 3, 1, 1024, 51200, 3, 84}, - {2, 4, 1, 1024, 51200, 3, 84}, - {2, 5, 1, 1024, 51200, 3, 84}, - {2, 6, 1, 1024, 51200, 3, 84}, - {2, 7, 1, 1024, 51200, 3, 84}, - {2, 8, 1, 1024, 51200, 3, 80}, - {2, 1, 1, 1024, 128000, 3, 84}, - {2, 2, 1, 1024, 128000, 3, 84}, - {2, 3, 1, 1024, 128000, 3, 84}, - {2, 4, 1, 1024, 128000, 3, 84}, - {2, 5, 1, 1024, 128000, 3, 84}, - {2, 6, 1, 1024, 128000, 3, 84}, - {2, 7, 1, 1024, 128000, 3, 84}, - {2, 8, 1, 1024, 128000, 3, 70}, - {2, 1, 1, 2048, 256, 2, 10}, - {2, 2, 1, 2048, 256, 2, 10}, - {2, 3, 1, 2048, 256, 2, 12}, - {2, 4, 1, 2048, 256, 2, 10}, - {2, 5, 1, 2048, 256, 2, 12}, - {2, 6, 1, 2048, 256, 2, 12}, - {2, 7, 1, 2048, 256, 2, 12}, - {2, 8, 1, 2048, 256, 2, 12}, - {2, 1, 1, 2048, 512, 2, 20}, - {2, 2, 1, 2048, 512, 2, 20}, - {2, 3, 1, 2048, 512, 2, 26}, - {2, 4, 1, 2048, 512, 2, 20}, - {2, 5, 1, 2048, 512, 2, 24}, - {2, 6, 1, 2048, 512, 2, 24}, - {2, 7, 1, 2048, 512, 2, 24}, - {2, 8, 1, 2048, 512, 2, 26}, - {2, 1, 1, 2048, 1024, 2, 40}, - {2, 2, 1, 2048, 1024, 2, 40}, - {2, 3, 1, 2048, 1024, 2, 52}, - {2, 4, 1, 2048, 1024, 2, 40}, - {2, 5, 1, 2048, 1024, 2, 40}, - {2, 6, 1, 2048, 1024, 2, 40}, - {2, 7, 1, 2048, 1024, 2, 48}, - {2, 8, 1, 2048, 1024, 2, 48}, - {2, 1, 1, 2048, 2048, 2, 80}, - {2, 2, 1, 2048, 2048, 2, 80}, - {2, 3, 1, 2048, 2048, 2, 80}, - {2, 4, 1, 2048, 2048, 2, 80}, - {2, 5, 1, 2048, 2048, 2, 80}, - {2, 6, 1, 2048, 2048, 2, 80}, - {2, 7, 1, 2048, 2048, 2, 84}, - {2, 8, 1, 2048, 2048, 2, 80}, - {2, 1, 1, 2048, 3072, 2, 78}, - {2, 2, 1, 2048, 3072, 2, 84}, - {2, 3, 1, 2048, 3072, 2, 84}, - {2, 4, 1, 2048, 3072, 2, 82}, - {2, 5, 1, 2048, 3072, 2, 84}, - {2, 6, 1, 2048, 3072, 2, 82}, - {2, 7, 1, 2048, 3072, 2, 82}, - {2, 8, 1, 2048, 3072, 2, 82}, - {2, 1, 1, 2048, 4096, 2, 84}, - {2, 2, 1, 2048, 4096, 2, 84}, - {2, 3, 1, 2048, 4096, 3, 80}, - {2, 4, 1, 2048, 4096, 2, 84}, - {2, 5, 1, 2048, 4096, 2, 84}, - {2, 6, 1, 2048, 4096, 2, 84}, - {2, 7, 1, 2048, 4096, 2, 84}, - {2, 8, 1, 2048, 4096, 2, 84}, - {2, 1, 1, 2048, 5120, 3, 80}, - {2, 2, 1, 2048, 5120, 3, 80}, - {2, 3, 1, 2048, 5120, 3, 80}, - {2, 4, 1, 2048, 5120, 3, 80}, - {2, 5, 1, 2048, 5120, 2, 84}, - {2, 6, 1, 2048, 5120, 2, 84}, - {2, 7, 1, 2048, 5120, 2, 84}, - {2, 8, 1, 2048, 5120, 3, 76}, - {2, 1, 1, 2048, 8192, 3, 84}, - {2, 2, 1, 2048, 8192, 3, 84}, - {2, 3, 1, 2048, 8192, 3, 84}, - {2, 4, 1, 2048, 8192, 3, 84}, - {2, 5, 1, 2048, 8192, 3, 84}, - {2, 6, 1, 2048, 8192, 3, 84}, - {2, 7, 1, 2048, 8192, 3, 84}, - {2, 8, 1, 2048, 8192, 3, 64}, - {2, 1, 1, 2048, 12288, 3, 84}, - {2, 2, 1, 2048, 12288, 3, 84}, - {2, 3, 1, 2048, 12288, 3, 84}, - {2, 4, 1, 2048, 12288, 3, 84}, - {2, 5, 1, 2048, 12288, 3, 84}, - {2, 6, 1, 2048, 12288, 3, 84}, - {2, 7, 1, 2048, 12288, 3, 84}, - {2, 8, 1, 2048, 12288, 3, 78}, - {2, 1, 1, 2048, 14336, 3, 84}, - {2, 2, 1, 2048, 14336, 3, 84}, - {2, 3, 1, 2048, 14336, 3, 84}, - {2, 4, 1, 2048, 14336, 3, 84}, - {2, 5, 1, 2048, 14336, 3, 84}, - {2, 6, 1, 2048, 14336, 3, 84}, - {2, 7, 1, 2048, 14336, 3, 84}, - {2, 8, 1, 2048, 14336, 3, 78}, - {2, 1, 1, 2048, 16384, 3, 84}, - {2, 2, 1, 2048, 16384, 3, 84}, - {2, 3, 1, 2048, 16384, 3, 84}, - {2, 4, 1, 2048, 16384, 3, 84}, - {2, 5, 1, 2048, 16384, 3, 84}, - {2, 6, 1, 2048, 16384, 3, 84}, - {2, 7, 1, 2048, 16384, 3, 84}, - {2, 8, 1, 2048, 16384, 3, 64}, - {2, 1, 1, 2048, 24576, 3, 84}, - {2, 2, 1, 2048, 24576, 3, 84}, - {2, 3, 1, 2048, 24576, 3, 84}, - {2, 4, 1, 2048, 24576, 3, 84}, - {2, 5, 1, 2048, 24576, 3, 84}, - {2, 6, 1, 2048, 24576, 3, 84}, - {2, 7, 1, 2048, 24576, 3, 84}, - {2, 8, 1, 2048, 24576, 3, 78}, - {2, 1, 1, 2048, 51200, 3, 84}, - {2, 2, 1, 2048, 51200, 3, 84}, - {2, 3, 1, 2048, 51200, 3, 84}, - {2, 4, 1, 2048, 51200, 3, 84}, - {2, 5, 1, 2048, 51200, 3, 84}, - {2, 6, 1, 2048, 51200, 3, 84}, - {2, 7, 1, 2048, 51200, 3, 84}, - {2, 8, 1, 2048, 51200, 3, 80}, - {2, 1, 1, 2048, 128000, 3, 84}, - {2, 2, 1, 2048, 128000, 3, 84}, - {2, 3, 1, 2048, 128000, 3, 84}, - {2, 4, 1, 2048, 128000, 3, 84}, - {2, 5, 1, 2048, 128000, 3, 84}, - {2, 6, 1, 2048, 128000, 3, 84}, - {2, 7, 1, 2048, 128000, 3, 84}, - {2, 8, 1, 2048, 128000, 3, 70}, - {2, 1, 1, 3072, 256, 2, 16}, - {2, 2, 1, 3072, 256, 2, 16}, - {2, 3, 1, 3072, 256, 2, 16}, - {2, 4, 1, 3072, 256, 2, 16}, - {2, 5, 1, 3072, 256, 2, 16}, - {2, 6, 1, 3072, 256, 2, 16}, - {2, 7, 1, 3072, 256, 2, 16}, - {2, 8, 1, 3072, 256, 2, 16}, - {2, 1, 1, 3072, 512, 2, 24}, - {2, 2, 1, 3072, 512, 2, 32}, - {2, 3, 1, 3072, 512, 2, 32}, - {2, 4, 1, 3072, 512, 2, 24}, - {2, 5, 1, 3072, 512, 2, 32}, - {2, 6, 1, 3072, 512, 2, 32}, - {2, 7, 1, 3072, 512, 2, 32}, - {2, 8, 1, 3072, 512, 2, 32}, - {2, 1, 1, 3072, 1024, 2, 56}, - {2, 2, 1, 3072, 1024, 2, 48}, - {2, 3, 1, 3072, 1024, 2, 64}, - {2, 4, 1, 3072, 1024, 2, 48}, - {2, 5, 1, 3072, 1024, 2, 64}, - {2, 6, 1, 3072, 1024, 2, 64}, - {2, 7, 1, 3072, 1024, 2, 64}, - {2, 8, 1, 3072, 1024, 2, 64}, - {2, 1, 1, 3072, 2048, 2, 82}, - {2, 2, 1, 3072, 2048, 2, 84}, - {2, 3, 1, 3072, 2048, 2, 82}, - {2, 4, 1, 3072, 2048, 2, 82}, - {2, 5, 1, 3072, 2048, 2, 82}, - {2, 6, 1, 3072, 2048, 2, 84}, - {2, 7, 1, 3072, 2048, 2, 82}, - {2, 8, 1, 3072, 2048, 2, 82}, - {2, 1, 1, 3072, 3072, 2, 84}, - {2, 2, 1, 3072, 3072, 2, 84}, - {2, 3, 1, 3072, 3072, 3, 78}, - {2, 4, 1, 3072, 3072, 2, 82}, - {2, 5, 1, 3072, 3072, 2, 84}, - {2, 6, 1, 3072, 3072, 2, 82}, - {2, 7, 1, 3072, 3072, 2, 84}, - {2, 8, 1, 3072, 3072, 2, 84}, - {2, 1, 1, 3072, 4096, 2, 84}, - {2, 2, 1, 3072, 4096, 3, 82}, - {2, 3, 1, 3072, 4096, 3, 84}, - {2, 4, 1, 3072, 4096, 2, 84}, - {2, 5, 1, 3072, 4096, 2, 84}, - {2, 6, 1, 3072, 4096, 2, 84}, - {2, 7, 1, 3072, 4096, 2, 84}, - {2, 8, 1, 3072, 4096, 3, 64}, - {2, 1, 1, 3072, 5120, 3, 84}, - {2, 2, 1, 3072, 5120, 3, 84}, - {2, 3, 1, 3072, 5120, 3, 84}, - {2, 4, 1, 3072, 5120, 3, 84}, - {2, 5, 1, 3072, 5120, 2, 84}, - {2, 6, 1, 3072, 5120, 2, 84}, - {2, 7, 1, 3072, 5120, 3, 84}, - {2, 8, 1, 3072, 5120, 3, 76}, - {2, 1, 1, 3072, 8192, 3, 84}, - {2, 2, 1, 3072, 8192, 3, 84}, - {2, 3, 1, 3072, 8192, 3, 84}, - {2, 4, 1, 3072, 8192, 3, 84}, - {2, 5, 1, 3072, 8192, 3, 84}, - {2, 6, 1, 3072, 8192, 3, 84}, - {2, 7, 1, 3072, 8192, 3, 84}, - {2, 8, 1, 3072, 8192, 3, 64}, - {2, 1, 1, 3072, 12288, 3, 84}, - {2, 2, 1, 3072, 12288, 3, 84}, - {2, 3, 1, 3072, 12288, 3, 84}, - {2, 4, 1, 3072, 12288, 3, 84}, - {2, 5, 1, 3072, 12288, 3, 84}, - {2, 6, 1, 3072, 12288, 3, 84}, - {2, 7, 1, 3072, 12288, 3, 84}, - {2, 8, 1, 3072, 12288, 3, 68}, - {2, 1, 1, 3072, 14336, 3, 84}, - {2, 2, 1, 3072, 14336, 3, 84}, - {2, 3, 1, 3072, 14336, 3, 84}, - {2, 4, 1, 3072, 14336, 3, 84}, - {2, 5, 1, 3072, 14336, 3, 84}, - {2, 6, 1, 3072, 14336, 3, 84}, - {2, 7, 1, 3072, 14336, 3, 84}, - {2, 8, 1, 3072, 14336, 3, 82}, - {2, 1, 1, 3072, 16384, 3, 84}, - {2, 2, 1, 3072, 16384, 3, 84}, - {2, 3, 1, 3072, 16384, 3, 84}, - {2, 4, 1, 3072, 16384, 3, 84}, - {2, 5, 1, 3072, 16384, 3, 84}, - {2, 6, 1, 3072, 16384, 3, 84}, - {2, 7, 1, 3072, 16384, 3, 84}, - {2, 8, 1, 3072, 16384, 3, 64}, - {2, 1, 1, 3072, 24576, 3, 84}, - {2, 2, 1, 3072, 24576, 3, 84}, - {2, 3, 1, 3072, 24576, 3, 84}, - {2, 4, 1, 3072, 24576, 3, 84}, - {2, 5, 1, 3072, 24576, 3, 84}, - {2, 6, 1, 3072, 24576, 3, 84}, - {2, 7, 1, 3072, 24576, 3, 84}, - {2, 8, 1, 3072, 24576, 3, 66}, - {2, 1, 1, 3072, 51200, 3, 84}, - {2, 2, 1, 3072, 51200, 3, 84}, - {2, 3, 1, 3072, 51200, 3, 84}, - {2, 4, 1, 3072, 51200, 3, 84}, - {2, 5, 1, 3072, 51200, 3, 84}, - {2, 6, 1, 3072, 51200, 3, 84}, - {2, 7, 1, 3072, 51200, 3, 84}, - {2, 8, 1, 3072, 51200, 3, 80}, - {2, 1, 1, 3072, 128000, 3, 84}, - {2, 2, 1, 3072, 128000, 3, 84}, - {2, 3, 1, 3072, 128000, 3, 84}, - {2, 4, 1, 3072, 128000, 3, 84}, - {2, 5, 1, 3072, 128000, 3, 84}, - {2, 6, 1, 3072, 128000, 3, 84}, - {2, 7, 1, 3072, 128000, 3, 84}, - {2, 8, 1, 3072, 128000, 3, 80}, - {2, 1, 1, 4096, 256, 2, 16}, - {2, 2, 1, 4096, 256, 2, 16}, - {2, 3, 1, 4096, 256, 2, 16}, - {2, 4, 1, 4096, 256, 2, 16}, - {2, 5, 1, 4096, 256, 2, 16}, - {2, 6, 1, 4096, 256, 2, 16}, - {2, 7, 1, 4096, 256, 2, 20}, - {2, 8, 1, 4096, 256, 2, 20}, - {2, 1, 1, 4096, 512, 2, 32}, - {2, 2, 1, 4096, 512, 2, 32}, - {2, 3, 1, 4096, 512, 2, 32}, - {2, 4, 1, 4096, 512, 2, 32}, - {2, 5, 1, 4096, 512, 2, 32}, - {2, 6, 1, 4096, 512, 2, 32}, - {2, 7, 1, 4096, 512, 2, 32}, - {2, 8, 1, 4096, 512, 2, 32}, - {2, 1, 1, 4096, 1024, 2, 64}, - {2, 2, 1, 4096, 1024, 2, 64}, - {2, 3, 1, 4096, 1024, 2, 64}, - {2, 4, 1, 4096, 1024, 2, 64}, - {2, 5, 1, 4096, 1024, 2, 64}, - {2, 6, 1, 4096, 1024, 2, 64}, - {2, 7, 1, 4096, 1024, 2, 70}, - {2, 8, 1, 4096, 1024, 2, 64}, - {2, 1, 1, 4096, 2048, 2, 82}, - {2, 2, 1, 4096, 2048, 2, 82}, - {2, 3, 1, 4096, 2048, 2, 82}, - {2, 4, 1, 4096, 2048, 2, 82}, - {2, 5, 1, 4096, 2048, 2, 82}, - {2, 6, 1, 4096, 2048, 2, 82}, - {2, 7, 1, 4096, 2048, 2, 82}, - {2, 8, 1, 4096, 2048, 2, 82}, - {2, 1, 1, 4096, 3072, 2, 84}, - {2, 2, 1, 4096, 3072, 2, 84}, - {2, 3, 1, 4096, 3072, 3, 82}, - {2, 4, 1, 4096, 3072, 2, 82}, - {2, 5, 1, 4096, 3072, 2, 84}, - {2, 6, 1, 4096, 3072, 2, 84}, - {2, 7, 1, 4096, 3072, 2, 84}, - {2, 8, 1, 4096, 3072, 3, 68}, - {2, 1, 1, 4096, 4096, 3, 82}, - {2, 2, 1, 4096, 4096, 3, 82}, - {2, 3, 1, 4096, 4096, 3, 84}, - {2, 4, 1, 4096, 4096, 3, 82}, - {2, 5, 1, 4096, 4096, 2, 84}, - {2, 6, 1, 4096, 4096, 2, 84}, - {2, 7, 1, 4096, 4096, 3, 84}, - {2, 8, 1, 4096, 4096, 3, 64}, - {2, 1, 1, 4096, 5120, 3, 84}, - {2, 2, 1, 4096, 5120, 3, 84}, - {2, 3, 1, 4096, 5120, 3, 84}, - {2, 4, 1, 4096, 5120, 3, 84}, - {2, 5, 1, 4096, 5120, 2, 84}, - {2, 6, 1, 4096, 5120, 2, 84}, - {2, 7, 1, 4096, 5120, 3, 84}, - {2, 8, 1, 4096, 5120, 3, 72}, - {2, 1, 1, 4096, 8192, 3, 84}, - {2, 2, 1, 4096, 8192, 3, 84}, - {2, 3, 1, 4096, 8192, 3, 84}, - {2, 4, 1, 4096, 8192, 3, 84}, - {2, 5, 1, 4096, 8192, 3, 84}, - {2, 6, 1, 4096, 8192, 3, 84}, - {2, 7, 1, 4096, 8192, 3, 84}, - {2, 8, 1, 4096, 8192, 3, 64}, - {2, 1, 1, 4096, 12288, 3, 84}, - {2, 2, 1, 4096, 12288, 3, 84}, - {2, 3, 1, 4096, 12288, 3, 84}, - {2, 4, 1, 4096, 12288, 3, 84}, - {2, 5, 1, 4096, 12288, 3, 84}, - {2, 6, 1, 4096, 12288, 3, 84}, - {2, 7, 1, 4096, 12288, 3, 84}, - {2, 8, 1, 4096, 12288, 3, 74}, - {2, 1, 1, 4096, 14336, 3, 84}, - {2, 2, 1, 4096, 14336, 3, 84}, - {2, 3, 1, 4096, 14336, 3, 84}, - {2, 4, 1, 4096, 14336, 3, 84}, - {2, 5, 1, 4096, 14336, 3, 84}, - {2, 6, 1, 4096, 14336, 3, 84}, - {2, 7, 1, 4096, 14336, 3, 84}, - {2, 8, 1, 4096, 14336, 3, 84}, - {2, 1, 1, 4096, 16384, 3, 84}, - {2, 2, 1, 4096, 16384, 3, 84}, - {2, 3, 1, 4096, 16384, 3, 84}, - {2, 4, 1, 4096, 16384, 3, 84}, - {2, 5, 1, 4096, 16384, 3, 84}, - {2, 6, 1, 4096, 16384, 3, 84}, - {2, 7, 1, 4096, 16384, 3, 84}, - {2, 8, 1, 4096, 16384, 3, 64}, - {2, 1, 1, 4096, 24576, 3, 84}, - {2, 2, 1, 4096, 24576, 3, 84}, - {2, 3, 1, 4096, 24576, 3, 84}, - {2, 4, 1, 4096, 24576, 3, 84}, - {2, 5, 1, 4096, 24576, 3, 84}, - {2, 6, 1, 4096, 24576, 3, 84}, - {2, 7, 1, 4096, 24576, 3, 84}, - {2, 8, 1, 4096, 24576, 3, 66}, - {2, 1, 1, 4096, 51200, 3, 84}, - {2, 2, 1, 4096, 51200, 3, 84}, - {2, 3, 1, 4096, 51200, 3, 84}, - {2, 4, 1, 4096, 51200, 3, 84}, - {2, 5, 1, 4096, 51200, 3, 84}, - {2, 6, 1, 4096, 51200, 3, 84}, - {2, 7, 1, 4096, 51200, 3, 84}, - {2, 8, 1, 4096, 51200, 3, 80}, - {2, 1, 1, 4096, 128000, 3, 84}, - {2, 2, 1, 4096, 128000, 3, 84}, - {2, 3, 1, 4096, 128000, 3, 84}, - {2, 4, 1, 4096, 128000, 3, 84}, - {2, 5, 1, 4096, 128000, 3, 84}, - {2, 6, 1, 4096, 128000, 3, 84}, - {2, 7, 1, 4096, 128000, 3, 84}, - {2, 8, 1, 4096, 128000, 3, 80}, - {2, 1, 1, 5120, 256, 2, 18}, - {2, 2, 1, 5120, 256, 2, 18}, - {2, 3, 1, 5120, 256, 2, 20}, - {2, 4, 1, 5120, 256, 2, 18}, - {2, 5, 1, 5120, 256, 2, 20}, - {2, 6, 1, 5120, 256, 2, 20}, - {2, 7, 1, 5120, 256, 2, 20}, - {2, 8, 1, 5120, 256, 2, 20}, - {2, 1, 1, 5120, 512, 2, 32}, - {2, 2, 1, 5120, 512, 2, 36}, - {2, 3, 1, 5120, 512, 2, 40}, - {2, 4, 1, 5120, 512, 2, 36}, - {2, 5, 1, 5120, 512, 2, 40}, - {2, 6, 1, 5120, 512, 2, 40}, - {2, 7, 1, 5120, 512, 2, 40}, - {2, 8, 1, 5120, 512, 2, 40}, - {2, 1, 1, 5120, 1024, 2, 64}, - {2, 2, 1, 5120, 1024, 2, 64}, - {2, 3, 1, 5120, 1024, 2, 80}, - {2, 4, 1, 5120, 1024, 2, 72}, - {2, 5, 1, 5120, 1024, 2, 78}, - {2, 6, 1, 5120, 1024, 2, 78}, - {2, 7, 1, 5120, 1024, 2, 78}, - {2, 8, 1, 5120, 1024, 2, 78}, - {2, 1, 1, 5120, 2048, 2, 84}, - {2, 2, 1, 5120, 2048, 2, 84}, - {2, 3, 1, 5120, 2048, 2, 84}, - {2, 4, 1, 5120, 2048, 2, 84}, - {2, 5, 1, 5120, 2048, 2, 84}, - {2, 6, 1, 5120, 2048, 2, 84}, - {2, 7, 1, 5120, 2048, 2, 84}, - {2, 8, 1, 5120, 2048, 2, 84}, - {2, 1, 1, 5120, 3072, 3, 84}, - {2, 2, 1, 5120, 3072, 3, 84}, - {2, 3, 1, 5120, 3072, 3, 84}, - {2, 4, 1, 5120, 3072, 3, 84}, - {2, 5, 1, 5120, 3072, 2, 84}, - {2, 6, 1, 5120, 3072, 2, 84}, - {2, 7, 1, 5120, 3072, 2, 84}, - {2, 8, 1, 5120, 3072, 3, 68}, - {2, 1, 1, 5120, 4096, 3, 84}, - {2, 2, 1, 5120, 4096, 3, 84}, - {2, 3, 1, 5120, 4096, 3, 84}, - {2, 4, 1, 5120, 4096, 3, 84}, - {2, 5, 1, 5120, 4096, 2, 84}, - {2, 6, 1, 5120, 4096, 2, 84}, - {2, 7, 1, 5120, 4096, 3, 84}, - {2, 8, 1, 5120, 4096, 3, 64}, - {2, 1, 1, 5120, 5120, 3, 84}, - {2, 2, 1, 5120, 5120, 3, 84}, - {2, 3, 1, 5120, 5120, 3, 84}, - {2, 4, 1, 5120, 5120, 3, 84}, - {2, 5, 1, 5120, 5120, 3, 84}, - {2, 6, 1, 5120, 5120, 3, 84}, - {2, 7, 1, 5120, 5120, 3, 84}, - {2, 8, 1, 5120, 5120, 3, 68}, - {2, 1, 1, 5120, 8192, 3, 84}, - {2, 2, 1, 5120, 8192, 3, 84}, - {2, 3, 1, 5120, 8192, 3, 84}, - {2, 4, 1, 5120, 8192, 3, 84}, - {2, 5, 1, 5120, 8192, 3, 84}, - {2, 6, 1, 5120, 8192, 3, 84}, - {2, 7, 1, 5120, 8192, 3, 84}, - {2, 8, 1, 5120, 8192, 3, 64}, - {2, 1, 1, 5120, 12288, 3, 84}, - {2, 2, 1, 5120, 12288, 3, 84}, - {2, 3, 1, 5120, 12288, 3, 84}, - {2, 4, 1, 5120, 12288, 3, 84}, - {2, 5, 1, 5120, 12288, 3, 84}, - {2, 6, 1, 5120, 12288, 3, 84}, - {2, 7, 1, 5120, 12288, 3, 84}, - {2, 8, 1, 5120, 12288, 3, 72}, - {2, 1, 1, 5120, 14336, 3, 84}, - {2, 2, 1, 5120, 14336, 3, 84}, - {2, 3, 1, 5120, 14336, 3, 84}, - {2, 4, 1, 5120, 14336, 3, 84}, - {2, 5, 1, 5120, 14336, 3, 84}, - {2, 6, 1, 5120, 14336, 3, 84}, - {2, 7, 1, 5120, 14336, 3, 84}, - {2, 8, 1, 5120, 14336, 3, 84}, - {2, 1, 1, 5120, 16384, 3, 84}, - {2, 2, 1, 5120, 16384, 3, 84}, - {2, 3, 1, 5120, 16384, 3, 84}, - {2, 4, 1, 5120, 16384, 3, 84}, - {2, 5, 1, 5120, 16384, 3, 84}, - {2, 6, 1, 5120, 16384, 3, 84}, - {2, 7, 1, 5120, 16384, 3, 84}, - {2, 8, 1, 5120, 16384, 3, 64}, - {2, 1, 1, 5120, 24576, 3, 84}, - {2, 2, 1, 5120, 24576, 3, 84}, - {2, 3, 1, 5120, 24576, 3, 84}, - {2, 4, 1, 5120, 24576, 3, 84}, - {2, 5, 1, 5120, 24576, 3, 84}, - {2, 6, 1, 5120, 24576, 3, 84}, - {2, 7, 1, 5120, 24576, 3, 84}, - {2, 8, 1, 5120, 24576, 3, 66}, - {2, 1, 1, 5120, 51200, 3, 84}, - {2, 2, 1, 5120, 51200, 3, 84}, - {2, 3, 1, 5120, 51200, 3, 84}, - {2, 4, 1, 5120, 51200, 3, 84}, - {2, 5, 1, 5120, 51200, 3, 84}, - {2, 6, 1, 5120, 51200, 3, 84}, - {2, 7, 1, 5120, 51200, 3, 84}, - {2, 8, 1, 5120, 51200, 3, 80}, - {2, 1, 1, 5120, 128000, 3, 84}, - {2, 2, 1, 5120, 128000, 3, 84}, - {2, 3, 1, 5120, 128000, 3, 84}, - {2, 4, 1, 5120, 128000, 3, 84}, - {2, 5, 1, 5120, 128000, 3, 84}, - {2, 6, 1, 5120, 128000, 3, 84}, - {2, 7, 1, 5120, 128000, 3, 84}, - {2, 8, 1, 5120, 128000, 3, 80}, - {2, 1, 1, 8192, 256, 2, 24}, - {2, 2, 1, 8192, 256, 2, 24}, - {2, 3, 1, 8192, 256, 2, 26}, - {2, 4, 1, 8192, 256, 2, 24}, - {2, 5, 1, 8192, 256, 2, 26}, - {2, 6, 1, 8192, 256, 2, 26}, - {2, 7, 1, 8192, 256, 2, 26}, - {2, 8, 1, 8192, 256, 2, 26}, - {2, 1, 1, 8192, 512, 2, 48}, - {2, 2, 1, 8192, 512, 2, 42}, - {2, 3, 1, 8192, 512, 2, 52}, - {2, 4, 1, 8192, 512, 2, 42}, - {2, 5, 1, 8192, 512, 2, 52}, - {2, 6, 1, 8192, 512, 2, 52}, - {2, 7, 1, 8192, 512, 2, 52}, - {2, 8, 1, 8192, 512, 2, 52}, - {2, 1, 1, 8192, 1024, 2, 82}, - {2, 2, 1, 8192, 1024, 2, 82}, - {2, 3, 1, 8192, 1024, 2, 82}, - {2, 4, 1, 8192, 1024, 2, 82}, - {2, 5, 1, 8192, 1024, 2, 82}, - {2, 6, 1, 8192, 1024, 2, 82}, - {2, 7, 1, 8192, 1024, 2, 82}, - {2, 8, 1, 8192, 1024, 2, 82}, - {2, 1, 1, 8192, 2048, 2, 84}, - {2, 2, 1, 8192, 2048, 2, 84}, - {2, 3, 1, 8192, 2048, 3, 84}, - {2, 4, 1, 8192, 2048, 2, 84}, - {2, 5, 1, 8192, 2048, 2, 84}, - {2, 6, 1, 8192, 2048, 2, 84}, - {2, 7, 1, 8192, 2048, 2, 84}, - {2, 8, 1, 8192, 2048, 3, 64}, - {2, 1, 1, 8192, 3072, 3, 84}, - {2, 2, 1, 8192, 3072, 3, 84}, - {2, 3, 1, 8192, 3072, 3, 84}, - {2, 4, 1, 8192, 3072, 3, 84}, - {2, 5, 1, 8192, 3072, 2, 84}, - {2, 6, 1, 8192, 3072, 2, 84}, - {2, 7, 1, 8192, 3072, 3, 84}, - {2, 8, 1, 8192, 3072, 3, 68}, - {2, 1, 1, 8192, 4096, 3, 84}, - {2, 2, 1, 8192, 4096, 3, 84}, - {2, 3, 1, 8192, 4096, 3, 84}, - {2, 4, 1, 8192, 4096, 3, 84}, - {2, 5, 1, 8192, 4096, 3, 84}, - {2, 6, 1, 8192, 4096, 3, 84}, - {2, 7, 1, 8192, 4096, 3, 84}, - {2, 8, 1, 8192, 4096, 3, 64}, - {2, 1, 1, 8192, 5120, 3, 84}, - {2, 2, 1, 8192, 5120, 3, 84}, - {2, 3, 1, 8192, 5120, 3, 84}, - {2, 4, 1, 8192, 5120, 3, 84}, - {2, 5, 1, 8192, 5120, 3, 84}, - {2, 6, 1, 8192, 5120, 3, 84}, - {2, 7, 1, 8192, 5120, 3, 84}, - {2, 8, 1, 8192, 5120, 3, 68}, - {2, 1, 1, 8192, 8192, 3, 84}, - {2, 2, 1, 8192, 8192, 3, 84}, - {2, 3, 1, 8192, 8192, 3, 84}, - {2, 4, 1, 8192, 8192, 3, 84}, - {2, 5, 1, 8192, 8192, 3, 84}, - {2, 6, 1, 8192, 8192, 3, 84}, - {2, 7, 1, 8192, 8192, 3, 84}, - {2, 8, 1, 8192, 8192, 3, 64}, - {2, 1, 1, 8192, 12288, 3, 84}, - {2, 2, 1, 8192, 12288, 3, 84}, - {2, 3, 1, 8192, 12288, 3, 84}, - {2, 4, 1, 8192, 12288, 3, 84}, - {2, 5, 1, 8192, 12288, 3, 84}, - {2, 6, 1, 8192, 12288, 3, 84}, - {2, 7, 1, 8192, 12288, 3, 84}, - {2, 8, 1, 8192, 12288, 3, 72}, - {2, 1, 1, 8192, 14336, 3, 84}, - {2, 2, 1, 8192, 14336, 3, 84}, - {2, 3, 1, 8192, 14336, 3, 84}, - {2, 4, 1, 8192, 14336, 3, 84}, - {2, 5, 1, 8192, 14336, 3, 84}, - {2, 6, 1, 8192, 14336, 3, 84}, - {2, 7, 1, 8192, 14336, 3, 84}, - {2, 8, 1, 8192, 14336, 3, 84}, - {2, 1, 1, 8192, 16384, 3, 84}, - {2, 2, 1, 8192, 16384, 3, 84}, - {2, 3, 1, 8192, 16384, 3, 84}, - {2, 4, 1, 8192, 16384, 3, 84}, - {2, 5, 1, 8192, 16384, 3, 84}, - {2, 6, 1, 8192, 16384, 3, 84}, - {2, 7, 1, 8192, 16384, 3, 84}, - {2, 8, 1, 8192, 16384, 3, 64}, - {2, 1, 1, 8192, 24576, 3, 84}, - {2, 2, 1, 8192, 24576, 3, 84}, - {2, 3, 1, 8192, 24576, 3, 84}, - {2, 4, 1, 8192, 24576, 3, 84}, - {2, 5, 1, 8192, 24576, 3, 84}, - {2, 6, 1, 8192, 24576, 3, 84}, - {2, 7, 1, 8192, 24576, 3, 84}, - {2, 8, 1, 8192, 24576, 3, 78}, - {2, 1, 1, 8192, 51200, 3, 84}, - {2, 2, 1, 8192, 51200, 3, 84}, - {2, 3, 1, 8192, 51200, 3, 84}, - {2, 4, 1, 8192, 51200, 3, 84}, - {2, 5, 1, 8192, 51200, 3, 84}, - {2, 6, 1, 8192, 51200, 3, 84}, - {2, 7, 1, 8192, 51200, 3, 84}, - {2, 8, 1, 8192, 51200, 3, 80}, - {2, 1, 1, 8192, 128000, 3, 84}, - {2, 2, 1, 8192, 128000, 3, 84}, - {2, 3, 1, 8192, 128000, 3, 84}, - {2, 4, 1, 8192, 128000, 3, 84}, - {2, 5, 1, 8192, 128000, 3, 84}, - {2, 6, 1, 8192, 128000, 3, 84}, - {2, 7, 1, 8192, 128000, 3, 84}, - {2, 8, 1, 8192, 128000, 3, 80}, - {2, 1, 1, 12288, 256, 2, 32}, - {2, 2, 1, 12288, 256, 2, 32}, - {2, 3, 1, 12288, 256, 2, 32}, - {2, 4, 1, 12288, 256, 2, 24}, - {2, 5, 1, 12288, 256, 2, 32}, - {2, 6, 1, 12288, 256, 2, 32}, - {2, 7, 1, 12288, 256, 2, 34}, - {2, 8, 1, 12288, 256, 2, 32}, - {2, 1, 1, 12288, 512, 2, 64}, - {2, 2, 1, 12288, 512, 2, 64}, - {2, 3, 1, 12288, 512, 2, 64}, - {2, 4, 1, 12288, 512, 2, 52}, - {2, 5, 1, 12288, 512, 2, 64}, - {2, 6, 1, 12288, 512, 2, 64}, - {2, 7, 1, 12288, 512, 2, 64}, - {2, 8, 1, 12288, 512, 2, 64}, - {2, 1, 1, 12288, 1024, 2, 84}, - {2, 2, 1, 12288, 1024, 2, 84}, - {2, 3, 1, 12288, 1024, 2, 84}, - {2, 4, 1, 12288, 1024, 2, 84}, - {2, 5, 1, 12288, 1024, 2, 84}, - {2, 6, 1, 12288, 1024, 2, 84}, - {2, 7, 1, 12288, 1024, 2, 84}, - {2, 8, 1, 12288, 1024, 2, 84}, - {2, 1, 1, 12288, 2048, 3, 84}, - {2, 2, 1, 12288, 2048, 3, 84}, - {2, 3, 1, 12288, 2048, 3, 84}, - {2, 4, 1, 12288, 2048, 3, 84}, - {2, 5, 1, 12288, 2048, 2, 84}, - {2, 6, 1, 12288, 2048, 2, 84}, - {2, 7, 1, 12288, 2048, 3, 84}, - {2, 8, 1, 12288, 2048, 3, 64}, - {2, 1, 1, 12288, 3072, 3, 84}, - {2, 2, 1, 12288, 3072, 3, 84}, - {2, 3, 1, 12288, 3072, 3, 84}, - {2, 4, 1, 12288, 3072, 3, 84}, - {2, 5, 1, 12288, 3072, 3, 84}, - {2, 6, 1, 12288, 3072, 3, 84}, - {2, 7, 1, 12288, 3072, 3, 84}, - {2, 8, 1, 12288, 3072, 3, 72}, - {2, 1, 1, 12288, 4096, 3, 84}, - {2, 2, 1, 12288, 4096, 3, 84}, - {2, 3, 1, 12288, 4096, 3, 84}, - {2, 4, 1, 12288, 4096, 3, 84}, - {2, 5, 1, 12288, 4096, 3, 84}, - {2, 6, 1, 12288, 4096, 3, 84}, - {2, 7, 1, 12288, 4096, 3, 84}, - {2, 8, 1, 12288, 4096, 3, 64}, - {2, 1, 1, 12288, 5120, 3, 84}, - {2, 2, 1, 12288, 5120, 3, 84}, - {2, 3, 1, 12288, 5120, 3, 84}, - {2, 4, 1, 12288, 5120, 3, 84}, - {2, 5, 1, 12288, 5120, 3, 84}, - {2, 6, 1, 12288, 5120, 3, 84}, - {2, 7, 1, 12288, 5120, 3, 84}, - {2, 8, 1, 12288, 5120, 3, 80}, - {2, 1, 1, 12288, 8192, 3, 84}, - {2, 2, 1, 12288, 8192, 3, 84}, - {2, 3, 1, 12288, 8192, 3, 84}, - {2, 4, 1, 12288, 8192, 3, 84}, - {2, 5, 1, 12288, 8192, 3, 84}, - {2, 6, 1, 12288, 8192, 3, 84}, - {2, 7, 1, 12288, 8192, 3, 84}, - {2, 8, 1, 12288, 8192, 3, 64}, - {2, 1, 1, 12288, 12288, 3, 84}, - {2, 2, 1, 12288, 12288, 3, 84}, - {2, 3, 1, 12288, 12288, 3, 84}, - {2, 4, 1, 12288, 12288, 3, 84}, - {2, 5, 1, 12288, 12288, 3, 84}, - {2, 6, 1, 12288, 12288, 3, 84}, - {2, 7, 1, 12288, 12288, 3, 84}, - {2, 8, 1, 12288, 12288, 3, 72}, - {2, 1, 1, 12288, 14336, 3, 84}, - {2, 2, 1, 12288, 14336, 3, 84}, - {2, 3, 1, 12288, 14336, 3, 84}, - {2, 4, 1, 12288, 14336, 3, 84}, - {2, 5, 1, 12288, 14336, 3, 84}, - {2, 6, 1, 12288, 14336, 3, 84}, - {2, 7, 1, 12288, 14336, 3, 84}, - {2, 8, 1, 12288, 14336, 3, 84}, - {2, 1, 1, 12288, 16384, 3, 84}, - {2, 2, 1, 12288, 16384, 3, 84}, - {2, 3, 1, 12288, 16384, 3, 84}, - {2, 4, 1, 12288, 16384, 3, 84}, - {2, 5, 1, 12288, 16384, 3, 84}, - {2, 6, 1, 12288, 16384, 3, 84}, - {2, 7, 1, 12288, 16384, 3, 84}, - {2, 8, 1, 12288, 16384, 3, 64}, - {2, 1, 1, 12288, 24576, 3, 84}, - {2, 2, 1, 12288, 24576, 3, 84}, - {2, 3, 1, 12288, 24576, 3, 84}, - {2, 4, 1, 12288, 24576, 3, 84}, - {2, 5, 1, 12288, 24576, 3, 84}, - {2, 6, 1, 12288, 24576, 3, 84}, - {2, 7, 1, 12288, 24576, 3, 84}, - {2, 8, 1, 12288, 24576, 3, 84}, - {2, 1, 1, 12288, 51200, 3, 84}, - {2, 2, 1, 12288, 51200, 3, 84}, - {2, 3, 1, 12288, 51200, 3, 84}, - {2, 4, 1, 12288, 51200, 3, 84}, - {2, 5, 1, 12288, 51200, 3, 84}, - {2, 6, 1, 12288, 51200, 3, 84}, - {2, 7, 1, 12288, 51200, 3, 84}, - {2, 8, 1, 12288, 51200, 3, 80}, - {2, 1, 1, 12288, 128000, 3, 84}, - {2, 2, 1, 12288, 128000, 3, 84}, - {2, 3, 1, 12288, 128000, 3, 84}, - {2, 4, 1, 12288, 128000, 3, 84}, - {2, 5, 1, 12288, 128000, 3, 84}, - {2, 6, 1, 12288, 128000, 3, 84}, - {2, 7, 1, 12288, 128000, 3, 84}, - {2, 8, 1, 12288, 128000, 3, 82}, - {2, 1, 1, 14336, 256, 2, 32}, - {2, 2, 1, 14336, 256, 2, 30}, - {2, 3, 1, 14336, 256, 2, 32}, - {2, 4, 1, 14336, 256, 2, 30}, - {2, 5, 1, 14336, 256, 2, 32}, - {2, 6, 1, 14336, 256, 2, 36}, - {2, 7, 1, 14336, 256, 2, 36}, - {2, 8, 1, 14336, 256, 2, 36}, - {2, 1, 1, 14336, 512, 2, 60}, - {2, 2, 1, 14336, 512, 2, 64}, - {2, 3, 1, 14336, 512, 2, 64}, - {2, 4, 1, 14336, 512, 2, 60}, - {2, 5, 1, 14336, 512, 2, 64}, - {2, 6, 1, 14336, 512, 2, 64}, - {2, 7, 1, 14336, 512, 2, 72}, - {2, 8, 1, 14336, 512, 2, 64}, - {2, 1, 1, 14336, 1024, 2, 84}, - {2, 2, 1, 14336, 1024, 2, 84}, - {2, 3, 1, 14336, 1024, 2, 84}, - {2, 4, 1, 14336, 1024, 2, 84}, - {2, 5, 1, 14336, 1024, 2, 84}, - {2, 6, 1, 14336, 1024, 2, 84}, - {2, 7, 1, 14336, 1024, 2, 84}, - {2, 8, 1, 14336, 1024, 2, 84}, - {2, 1, 1, 14336, 2048, 3, 84}, - {2, 2, 1, 14336, 2048, 3, 84}, - {2, 3, 1, 14336, 2048, 3, 84}, - {2, 4, 1, 14336, 2048, 3, 84}, - {2, 5, 1, 14336, 2048, 2, 84}, - {2, 6, 1, 14336, 2048, 2, 84}, - {2, 7, 1, 14336, 2048, 3, 84}, - {2, 8, 1, 14336, 2048, 3, 64}, - {2, 1, 1, 14336, 3072, 3, 84}, - {2, 2, 1, 14336, 3072, 3, 84}, - {2, 3, 1, 14336, 3072, 3, 84}, - {2, 4, 1, 14336, 3072, 3, 84}, - {2, 5, 1, 14336, 3072, 3, 84}, - {2, 6, 1, 14336, 3072, 3, 84}, - {2, 7, 1, 14336, 3072, 3, 84}, - {2, 8, 1, 14336, 3072, 3, 72}, - {2, 1, 1, 14336, 4096, 3, 84}, - {2, 2, 1, 14336, 4096, 3, 84}, - {2, 3, 1, 14336, 4096, 3, 84}, - {2, 4, 1, 14336, 4096, 3, 84}, - {2, 5, 1, 14336, 4096, 3, 84}, - {2, 6, 1, 14336, 4096, 3, 84}, - {2, 7, 1, 14336, 4096, 3, 84}, - {2, 8, 1, 14336, 4096, 3, 64}, - {2, 1, 1, 14336, 5120, 3, 84}, - {2, 2, 1, 14336, 5120, 3, 84}, - {2, 3, 1, 14336, 5120, 3, 84}, - {2, 4, 1, 14336, 5120, 3, 84}, - {2, 5, 1, 14336, 5120, 3, 84}, - {2, 6, 1, 14336, 5120, 3, 84}, - {2, 7, 1, 14336, 5120, 3, 84}, - {2, 8, 1, 14336, 5120, 3, 68}, - {2, 1, 1, 14336, 8192, 3, 84}, - {2, 2, 1, 14336, 8192, 3, 84}, - {2, 3, 1, 14336, 8192, 3, 84}, - {2, 4, 1, 14336, 8192, 3, 84}, - {2, 5, 1, 14336, 8192, 3, 84}, - {2, 6, 1, 14336, 8192, 3, 84}, - {2, 7, 1, 14336, 8192, 3, 84}, - {2, 8, 1, 14336, 8192, 3, 64}, - {2, 1, 1, 14336, 12288, 3, 84}, - {2, 2, 1, 14336, 12288, 3, 84}, - {2, 3, 1, 14336, 12288, 3, 84}, - {2, 4, 1, 14336, 12288, 3, 84}, - {2, 5, 1, 14336, 12288, 3, 84}, - {2, 6, 1, 14336, 12288, 3, 84}, - {2, 7, 1, 14336, 12288, 3, 84}, - {2, 8, 1, 14336, 12288, 3, 72}, - {2, 1, 1, 14336, 14336, 3, 84}, - {2, 2, 1, 14336, 14336, 3, 84}, - {2, 3, 1, 14336, 14336, 3, 84}, - {2, 4, 1, 14336, 14336, 3, 84}, - {2, 5, 1, 14336, 14336, 3, 84}, - {2, 6, 1, 14336, 14336, 3, 84}, - {2, 7, 1, 14336, 14336, 3, 84}, - {2, 8, 1, 14336, 14336, 3, 84}, - {2, 1, 1, 14336, 16384, 3, 84}, - {2, 2, 1, 14336, 16384, 3, 84}, - {2, 3, 1, 14336, 16384, 3, 84}, - {2, 4, 1, 14336, 16384, 3, 84}, - {2, 5, 1, 14336, 16384, 3, 84}, - {2, 6, 1, 14336, 16384, 3, 84}, - {2, 7, 1, 14336, 16384, 3, 84}, - {2, 8, 1, 14336, 16384, 3, 64}, - {2, 1, 1, 14336, 24576, 3, 84}, - {2, 2, 1, 14336, 24576, 3, 84}, - {2, 3, 1, 14336, 24576, 3, 84}, - {2, 4, 1, 14336, 24576, 3, 84}, - {2, 5, 1, 14336, 24576, 3, 84}, - {2, 6, 1, 14336, 24576, 3, 84}, - {2, 7, 1, 14336, 24576, 3, 84}, - {2, 8, 1, 14336, 24576, 3, 66}, - {2, 1, 1, 14336, 51200, 3, 84}, - {2, 2, 1, 14336, 51200, 3, 84}, - {2, 3, 1, 14336, 51200, 3, 84}, - {2, 4, 1, 14336, 51200, 3, 84}, - {2, 5, 1, 14336, 51200, 3, 84}, - {2, 6, 1, 14336, 51200, 3, 84}, - {2, 7, 1, 14336, 51200, 3, 84}, - {2, 8, 1, 14336, 51200, 3, 80}, - {2, 1, 1, 14336, 128000, 3, 84}, - {2, 2, 1, 14336, 128000, 3, 84}, - {2, 3, 1, 14336, 128000, 3, 84}, - {2, 4, 1, 14336, 128000, 3, 84}, - {2, 5, 1, 14336, 128000, 3, 84}, - {2, 6, 1, 14336, 128000, 3, 84}, - {2, 7, 1, 14336, 128000, 3, 84}, - {2, 8, 1, 14336, 128000, 3, 84}, - {2, 1, 1, 16384, 256, 2, 38}, - {2, 2, 1, 16384, 256, 2, 38}, - {2, 3, 1, 16384, 256, 2, 38}, - {2, 4, 1, 16384, 256, 2, 32}, - {2, 5, 1, 16384, 256, 2, 38}, - {2, 6, 1, 16384, 256, 2, 38}, - {2, 7, 1, 16384, 256, 2, 38}, - {2, 8, 1, 16384, 256, 2, 38}, - {2, 1, 1, 16384, 512, 2, 64}, - {2, 2, 1, 16384, 512, 2, 64}, - {2, 3, 1, 16384, 512, 2, 76}, - {2, 4, 1, 16384, 512, 2, 64}, - {2, 5, 1, 16384, 512, 2, 64}, - {2, 6, 1, 16384, 512, 2, 76}, - {2, 7, 1, 16384, 512, 2, 76}, - {2, 8, 1, 16384, 512, 2, 72}, - {2, 1, 1, 16384, 1024, 2, 84}, - {2, 2, 1, 16384, 1024, 2, 84}, - {2, 3, 1, 16384, 1024, 2, 84}, - {2, 4, 1, 16384, 1024, 2, 84}, - {2, 5, 1, 16384, 1024, 2, 84}, - {2, 6, 1, 16384, 1024, 2, 84}, - {2, 7, 1, 16384, 1024, 2, 84}, - {2, 8, 1, 16384, 1024, 2, 84}, - {2, 1, 1, 16384, 2048, 3, 84}, - {2, 2, 1, 16384, 2048, 3, 84}, - {2, 3, 1, 16384, 2048, 3, 84}, - {2, 4, 1, 16384, 2048, 3, 84}, - {2, 5, 1, 16384, 2048, 2, 84}, - {2, 6, 1, 16384, 2048, 2, 84}, - {2, 7, 1, 16384, 2048, 3, 84}, - {2, 8, 1, 16384, 2048, 3, 64}, - {2, 1, 1, 16384, 3072, 3, 84}, - {2, 2, 1, 16384, 3072, 3, 84}, - {2, 3, 1, 16384, 3072, 3, 84}, - {2, 4, 1, 16384, 3072, 3, 84}, - {2, 5, 1, 16384, 3072, 3, 84}, - {2, 6, 1, 16384, 3072, 3, 84}, - {2, 7, 1, 16384, 3072, 3, 84}, - {2, 8, 1, 16384, 3072, 3, 68}, - {2, 1, 1, 16384, 4096, 3, 84}, - {2, 2, 1, 16384, 4096, 3, 84}, - {2, 3, 1, 16384, 4096, 3, 84}, - {2, 4, 1, 16384, 4096, 3, 84}, - {2, 5, 1, 16384, 4096, 3, 84}, - {2, 6, 1, 16384, 4096, 3, 84}, - {2, 7, 1, 16384, 4096, 3, 84}, - {2, 8, 1, 16384, 4096, 3, 66}, - {2, 1, 1, 16384, 5120, 3, 84}, - {2, 2, 1, 16384, 5120, 3, 84}, - {2, 3, 1, 16384, 5120, 3, 84}, - {2, 4, 1, 16384, 5120, 3, 84}, - {2, 5, 1, 16384, 5120, 3, 84}, - {2, 6, 1, 16384, 5120, 3, 84}, - {2, 7, 1, 16384, 5120, 3, 84}, - {2, 8, 1, 16384, 5120, 3, 68}, - {2, 1, 1, 16384, 8192, 3, 84}, - {2, 2, 1, 16384, 8192, 3, 84}, - {2, 3, 1, 16384, 8192, 3, 84}, - {2, 4, 1, 16384, 8192, 3, 84}, - {2, 5, 1, 16384, 8192, 3, 84}, - {2, 6, 1, 16384, 8192, 3, 84}, - {2, 7, 1, 16384, 8192, 3, 84}, - {2, 8, 1, 16384, 8192, 3, 64}, - {2, 1, 1, 16384, 12288, 3, 84}, - {2, 2, 1, 16384, 12288, 3, 84}, - {2, 3, 1, 16384, 12288, 3, 84}, - {2, 4, 1, 16384, 12288, 3, 84}, - {2, 5, 1, 16384, 12288, 3, 84}, - {2, 6, 1, 16384, 12288, 3, 84}, - {2, 7, 1, 16384, 12288, 3, 84}, - {2, 8, 1, 16384, 12288, 3, 72}, - {2, 1, 1, 16384, 14336, 3, 84}, - {2, 2, 1, 16384, 14336, 3, 84}, - {2, 3, 1, 16384, 14336, 3, 84}, - {2, 4, 1, 16384, 14336, 3, 84}, - {2, 5, 1, 16384, 14336, 3, 84}, - {2, 6, 1, 16384, 14336, 3, 84}, - {2, 7, 1, 16384, 14336, 3, 84}, - {2, 8, 1, 16384, 14336, 3, 72}, - {2, 1, 1, 16384, 16384, 3, 84}, - {2, 2, 1, 16384, 16384, 3, 84}, - {2, 3, 1, 16384, 16384, 3, 84}, - {2, 4, 1, 16384, 16384, 3, 84}, - {2, 5, 1, 16384, 16384, 3, 84}, - {2, 6, 1, 16384, 16384, 3, 84}, - {2, 7, 1, 16384, 16384, 3, 84}, - {2, 8, 1, 16384, 16384, 3, 64}, - {2, 1, 1, 16384, 24576, 3, 84}, - {2, 2, 1, 16384, 24576, 3, 84}, - {2, 3, 1, 16384, 24576, 3, 84}, - {2, 4, 1, 16384, 24576, 3, 84}, - {2, 5, 1, 16384, 24576, 3, 84}, - {2, 6, 1, 16384, 24576, 3, 84}, - {2, 7, 1, 16384, 24576, 3, 84}, - {2, 8, 1, 16384, 24576, 3, 78}, - {2, 1, 1, 16384, 51200, 3, 84}, - {2, 2, 1, 16384, 51200, 3, 84}, - {2, 3, 1, 16384, 51200, 3, 84}, - {2, 4, 1, 16384, 51200, 3, 84}, - {2, 5, 1, 16384, 51200, 3, 84}, - {2, 6, 1, 16384, 51200, 3, 84}, - {2, 7, 1, 16384, 51200, 3, 84}, - {2, 8, 1, 16384, 51200, 3, 80}, - {2, 1, 1, 16384, 128000, 3, 84}, - {2, 2, 1, 16384, 128000, 3, 84}, - {2, 3, 1, 16384, 128000, 3, 84}, - {2, 4, 1, 16384, 128000, 3, 84}, - {2, 5, 1, 16384, 128000, 3, 84}, - {2, 6, 1, 16384, 128000, 3, 84}, - {2, 7, 1, 16384, 128000, 3, 84}, - {2, 8, 1, 16384, 128000, 3, 84}, - {2, 1, 1, 24576, 256, 2, 42}, - {2, 2, 1, 24576, 256, 2, 42}, - {2, 3, 1, 24576, 256, 2, 42}, - {2, 4, 1, 24576, 256, 2, 36}, - {2, 5, 1, 24576, 256, 2, 44}, - {2, 6, 1, 24576, 256, 2, 44}, - {2, 7, 1, 24576, 256, 2, 48}, - {2, 8, 1, 24576, 256, 2, 48}, - {2, 1, 1, 24576, 512, 2, 80}, - {2, 2, 1, 24576, 512, 2, 72}, - {2, 3, 1, 24576, 512, 2, 84}, - {2, 4, 1, 24576, 512, 2, 72}, - {2, 5, 1, 24576, 512, 2, 84}, - {2, 6, 1, 24576, 512, 2, 84}, - {2, 7, 1, 24576, 512, 2, 84}, - {2, 8, 1, 24576, 512, 2, 84}, - {2, 1, 1, 24576, 1024, 2, 84}, - {2, 2, 1, 24576, 1024, 2, 84}, - {2, 3, 1, 24576, 1024, 3, 84}, - {2, 4, 1, 24576, 1024, 2, 84}, - {2, 5, 1, 24576, 1024, 2, 84}, - {2, 6, 1, 24576, 1024, 2, 84}, - {2, 7, 1, 24576, 1024, 2, 84}, - {2, 8, 1, 24576, 1024, 2, 84}, - {2, 1, 1, 24576, 2048, 3, 84}, - {2, 2, 1, 24576, 2048, 3, 84}, - {2, 3, 1, 24576, 2048, 3, 84}, - {2, 4, 1, 24576, 2048, 3, 84}, - {2, 5, 1, 24576, 2048, 3, 84}, - {2, 6, 1, 24576, 2048, 3, 84}, - {2, 7, 1, 24576, 2048, 3, 84}, - {2, 8, 1, 24576, 2048, 3, 64}, - {2, 1, 1, 24576, 3072, 3, 84}, - {2, 2, 1, 24576, 3072, 3, 84}, - {2, 3, 1, 24576, 3072, 3, 84}, - {2, 4, 1, 24576, 3072, 3, 84}, - {2, 5, 1, 24576, 3072, 3, 84}, - {2, 6, 1, 24576, 3072, 3, 84}, - {2, 7, 1, 24576, 3072, 3, 84}, - {2, 8, 1, 24576, 3072, 3, 72}, - {2, 1, 1, 24576, 4096, 3, 84}, - {2, 2, 1, 24576, 4096, 3, 84}, - {2, 3, 1, 24576, 4096, 3, 84}, - {2, 4, 1, 24576, 4096, 3, 84}, - {2, 5, 1, 24576, 4096, 3, 84}, - {2, 6, 1, 24576, 4096, 3, 84}, - {2, 7, 1, 24576, 4096, 3, 84}, - {2, 8, 1, 24576, 4096, 3, 64}, - {2, 1, 1, 24576, 5120, 3, 84}, - {2, 2, 1, 24576, 5120, 3, 84}, - {2, 3, 1, 24576, 5120, 3, 84}, - {2, 4, 1, 24576, 5120, 3, 84}, - {2, 5, 1, 24576, 5120, 3, 84}, - {2, 6, 1, 24576, 5120, 3, 84}, - {2, 7, 1, 24576, 5120, 3, 84}, - {2, 8, 1, 24576, 5120, 3, 80}, - {2, 1, 1, 24576, 8192, 3, 84}, - {2, 2, 1, 24576, 8192, 3, 84}, - {2, 3, 1, 24576, 8192, 3, 84}, - {2, 4, 1, 24576, 8192, 3, 84}, - {2, 5, 1, 24576, 8192, 3, 84}, - {2, 6, 1, 24576, 8192, 3, 84}, - {2, 7, 1, 24576, 8192, 3, 84}, - {2, 8, 1, 24576, 8192, 3, 64}, - {2, 1, 1, 24576, 12288, 3, 84}, - {2, 2, 1, 24576, 12288, 3, 84}, - {2, 3, 1, 24576, 12288, 3, 84}, - {2, 4, 1, 24576, 12288, 3, 84}, - {2, 5, 1, 24576, 12288, 3, 84}, - {2, 6, 1, 24576, 12288, 3, 84}, - {2, 7, 1, 24576, 12288, 3, 84}, - {2, 8, 1, 24576, 12288, 3, 72}, - {2, 1, 1, 24576, 14336, 3, 84}, - {2, 2, 1, 24576, 14336, 3, 84}, - {2, 3, 1, 24576, 14336, 3, 84}, - {2, 4, 1, 24576, 14336, 3, 84}, - {2, 5, 1, 24576, 14336, 3, 84}, - {2, 6, 1, 24576, 14336, 3, 84}, - {2, 7, 1, 24576, 14336, 3, 84}, - {2, 8, 1, 24576, 14336, 3, 84}, - {2, 1, 1, 24576, 16384, 3, 84}, - {2, 2, 1, 24576, 16384, 3, 84}, - {2, 3, 1, 24576, 16384, 3, 84}, - {2, 4, 1, 24576, 16384, 3, 84}, - {2, 5, 1, 24576, 16384, 3, 84}, - {2, 6, 1, 24576, 16384, 3, 84}, - {2, 7, 1, 24576, 16384, 3, 84}, - {2, 8, 1, 24576, 16384, 3, 64}, - {2, 1, 1, 24576, 24576, 3, 84}, - {2, 2, 1, 24576, 24576, 3, 84}, - {2, 3, 1, 24576, 24576, 3, 84}, - {2, 4, 1, 24576, 24576, 3, 84}, - {2, 5, 1, 24576, 24576, 3, 84}, - {2, 6, 1, 24576, 24576, 3, 84}, - {2, 7, 1, 24576, 24576, 3, 84}, - {2, 8, 1, 24576, 24576, 3, 66}, - {2, 1, 1, 24576, 51200, 3, 84}, - {2, 2, 1, 24576, 51200, 3, 84}, - {2, 3, 1, 24576, 51200, 3, 84}, - {2, 4, 1, 24576, 51200, 3, 84}, - {2, 5, 1, 24576, 51200, 3, 84}, - {2, 6, 1, 24576, 51200, 3, 84}, - {2, 7, 1, 24576, 51200, 3, 84}, - {2, 8, 1, 24576, 51200, 3, 80}, - {2, 1, 1, 24576, 128000, 3, 84}, - {2, 2, 1, 24576, 128000, 3, 84}, - {2, 3, 1, 24576, 128000, 3, 84}, - {2, 4, 1, 24576, 128000, 3, 84}, - {2, 5, 1, 24576, 128000, 3, 84}, - {2, 6, 1, 24576, 128000, 3, 84}, - {2, 7, 1, 24576, 128000, 3, 84}, - {2, 8, 1, 24576, 128000, 3, 84}, - {0, 0, 0, 0, 0, 0, 0}}; - -struct TSample samples_512[] = {{4, 1, 1, 128, 512, 1, 4}, - {4, 2, 1, 128, 512, 1, 8}, - {4, 3, 1, 128, 512, 2, 4}, - {4, 4, 1, 128, 512, 2, 4}, - {4, 5, 1, 128, 512, 2, 8}, - {4, 6, 1, 128, 512, 1, 8}, - {4, 7, 1, 128, 512, 1, 8}, - {4, 8, 1, 128, 512, 2, 4}, - {4, 1, 1, 128, 1024, 1, 16}, - {4, 2, 1, 128, 1024, 1, 16}, - {4, 3, 1, 128, 1024, 2, 8}, - {4, 4, 1, 128, 1024, 2, 8}, - {4, 5, 1, 128, 1024, 1, 16}, - {4, 6, 1, 128, 1024, 2, 8}, - {4, 7, 1, 128, 1024, 1, 8}, - {4, 8, 1, 128, 1024, 1, 16}, - {4, 1, 1, 128, 2048, 2, 16}, - {4, 2, 1, 128, 2048, 1, 16}, - {4, 3, 1, 128, 2048, 1, 16}, - {4, 4, 1, 128, 2048, 2, 16}, - {4, 5, 1, 128, 2048, 1, 32}, - {4, 6, 1, 128, 2048, 1, 32}, - {4, 7, 1, 128, 2048, 2, 128}, - {4, 8, 1, 128, 2048, 1, 32}, - {4, 1, 1, 128, 3072, 1, 32}, - {4, 2, 1, 128, 3072, 1, 48}, - {4, 3, 1, 128, 3072, 1, 24}, - {4, 4, 1, 128, 3072, 1, 24}, - {4, 5, 1, 128, 3072, 1, 48}, - {4, 6, 1, 128, 3072, 1, 48}, - {4, 7, 1, 128, 3072, 1, 50}, - {4, 8, 1, 128, 3072, 1, 48}, - {4, 1, 1, 128, 4096, 1, 64}, - {4, 2, 1, 128, 4096, 2, 32}, - {4, 3, 1, 128, 4096, 2, 32}, - {4, 4, 1, 128, 4096, 1, 64}, - {4, 5, 1, 128, 4096, 1, 64}, - {4, 6, 1, 128, 4096, 1, 64}, - {4, 7, 1, 128, 4096, 2, 92}, - {4, 8, 1, 128, 4096, 1, 64}, - {4, 1, 1, 128, 5120, 1, 80}, - {4, 2, 1, 128, 5120, 1, 40}, - {4, 3, 1, 128, 5120, 1, 40}, - {4, 4, 1, 128, 5120, 2, 40}, - {4, 5, 1, 128, 5120, 1, 80}, - {4, 6, 1, 128, 5120, 1, 60}, - {4, 7, 1, 128, 5120, 2, 48}, - {4, 8, 1, 128, 5120, 1, 80}, - {4, 1, 1, 128, 8192, 1, 64}, - {4, 2, 1, 128, 8192, 2, 64}, - {4, 3, 1, 128, 8192, 1, 64}, - {4, 4, 1, 128, 8192, 2, 64}, - {4, 5, 1, 128, 8192, 2, 152}, - {4, 6, 1, 128, 8192, 1, 64}, - {4, 7, 1, 128, 8192, 1, 116}, - {4, 8, 1, 128, 8192, 1, 64}, - {4, 1, 1, 128, 12288, 2, 96}, - {4, 2, 1, 128, 12288, 1, 96}, - {4, 3, 1, 128, 12288, 2, 162}, - {4, 4, 1, 128, 12288, 1, 96}, - {4, 5, 1, 128, 12288, 2, 146}, - {4, 6, 1, 128, 12288, 1, 152}, - {4, 7, 1, 128, 12288, 1, 164}, - {4, 8, 1, 128, 12288, 1, 96}, - {4, 1, 1, 128, 14336, 2, 112}, - {4, 2, 1, 128, 14336, 1, 112}, - {4, 3, 1, 128, 14336, 2, 112}, - {4, 4, 1, 128, 14336, 1, 112}, - {4, 5, 1, 128, 14336, 1, 134}, - {4, 6, 1, 128, 14336, 1, 144}, - {4, 7, 1, 128, 14336, 1, 166}, - {4, 8, 1, 128, 14336, 1, 112}, - {4, 1, 1, 128, 16384, 1, 128}, - {4, 2, 1, 128, 16384, 1, 128}, - {4, 3, 1, 128, 16384, 2, 128}, - {4, 4, 1, 128, 16384, 2, 128}, - {4, 5, 1, 128, 16384, 2, 108}, - {4, 6, 1, 128, 16384, 1, 118}, - {4, 7, 1, 128, 16384, 1, 158}, - {4, 8, 1, 128, 16384, 1, 128}, - {4, 1, 1, 128, 24576, 2, 146}, - {4, 2, 1, 128, 24576, 2, 96}, - {4, 3, 1, 128, 24576, 2, 144}, - {4, 4, 1, 128, 24576, 1, 164}, - {4, 5, 1, 128, 24576, 1, 170}, - {4, 6, 1, 128, 24576, 2, 152}, - {4, 7, 1, 128, 24576, 1, 158}, - {4, 8, 1, 128, 24576, 1, 156}, - {4, 1, 1, 128, 51200, 2, 156}, - {4, 2, 1, 128, 51200, 4, 100}, - {4, 3, 1, 128, 51200, 4, 156}, - {4, 4, 1, 128, 51200, 2, 152}, - {4, 5, 1, 128, 51200, 4, 120}, - {4, 6, 1, 128, 51200, 4, 136}, - {4, 7, 1, 128, 51200, 4, 152}, - {4, 8, 1, 128, 51200, 1, 160}, - {4, 1, 1, 128, 128000, 4, 156}, - {4, 2, 1, 128, 128000, 4, 156}, - {4, 3, 1, 128, 128000, 4, 170}, - {4, 4, 1, 128, 128000, 4, 156}, - {4, 5, 1, 128, 128000, 4, 170}, - {4, 6, 1, 128, 128000, 4, 160}, - {4, 7, 1, 128, 128000, 4, 128}, - {4, 8, 1, 128, 128000, 4, 156}, - {4, 1, 1, 256, 512, 2, 14}, - {4, 2, 1, 256, 512, 1, 6}, - {4, 3, 1, 256, 512, 2, 16}, - {4, 4, 1, 256, 512, 2, 4}, - {4, 5, 1, 256, 512, 1, 12}, - {4, 6, 1, 256, 512, 1, 8}, - {4, 7, 1, 256, 512, 2, 12}, - {4, 8, 1, 256, 512, 1, 16}, - {4, 1, 1, 256, 1024, 2, 10}, - {4, 2, 1, 256, 1024, 1, 18}, - {4, 3, 1, 256, 1024, 2, 8}, - {4, 4, 1, 256, 1024, 2, 16}, - {4, 5, 1, 256, 1024, 2, 12}, - {4, 6, 1, 256, 1024, 2, 18}, - {4, 7, 1, 256, 1024, 2, 16}, - {4, 8, 1, 256, 1024, 2, 8}, - {4, 1, 1, 256, 2048, 1, 20}, - {4, 2, 1, 256, 2048, 1, 26}, - {4, 3, 1, 256, 2048, 2, 24}, - {4, 4, 1, 256, 2048, 1, 32}, - {4, 5, 1, 256, 2048, 2, 42}, - {4, 6, 1, 256, 2048, 1, 42}, - {4, 7, 1, 256, 2048, 2, 32}, - {4, 8, 1, 256, 2048, 1, 30}, - {4, 1, 1, 256, 3072, 1, 76}, - {4, 2, 1, 256, 3072, 2, 32}, - {4, 3, 1, 256, 3072, 2, 42}, - {4, 4, 1, 256, 3072, 1, 66}, - {4, 5, 1, 256, 3072, 2, 48}, - {4, 6, 1, 256, 3072, 2, 42}, - {4, 7, 1, 256, 3072, 2, 54}, - {4, 8, 1, 256, 3072, 2, 48}, - {4, 1, 1, 256, 4096, 2, 80}, - {4, 2, 1, 256, 4096, 1, 82}, - {4, 3, 1, 256, 4096, 1, 96}, - {4, 4, 1, 256, 4096, 2, 64}, - {4, 5, 1, 256, 4096, 2, 64}, - {4, 6, 1, 256, 4096, 2, 70}, - {4, 7, 1, 256, 4096, 1, 64}, - {4, 8, 1, 256, 4096, 1, 64}, - {4, 1, 1, 256, 5120, 2, 98}, - {4, 2, 1, 256, 5120, 2, 92}, - {4, 3, 1, 256, 5120, 2, 62}, - {4, 4, 1, 256, 5120, 2, 112}, - {4, 5, 1, 256, 5120, 1, 114}, - {4, 6, 1, 256, 5120, 2, 84}, - {4, 7, 1, 256, 5120, 1, 80}, - {4, 8, 1, 256, 5120, 1, 130}, - {4, 1, 1, 256, 8192, 2, 112}, - {4, 2, 1, 256, 8192, 2, 96}, - {4, 3, 1, 256, 8192, 2, 152}, - {4, 4, 1, 256, 8192, 2, 160}, - {4, 5, 1, 256, 8192, 2, 152}, - {4, 6, 1, 256, 8192, 1, 144}, - {4, 7, 1, 256, 8192, 2, 128}, - {4, 8, 1, 256, 8192, 1, 126}, - {4, 1, 1, 256, 12288, 2, 152}, - {4, 2, 1, 256, 12288, 2, 160}, - {4, 3, 1, 256, 12288, 2, 138}, - {4, 4, 1, 256, 12288, 1, 146}, - {4, 5, 1, 256, 12288, 2, 156}, - {4, 6, 1, 256, 12288, 1, 158}, - {4, 7, 1, 256, 12288, 1, 170}, - {4, 8, 1, 256, 12288, 1, 144}, - {4, 1, 1, 256, 14336, 2, 156}, - {4, 2, 1, 256, 14336, 2, 132}, - {4, 3, 1, 256, 14336, 2, 160}, - {4, 4, 1, 256, 14336, 2, 158}, - {4, 5, 1, 256, 14336, 1, 168}, - {4, 6, 1, 256, 14336, 1, 168}, - {4, 7, 1, 256, 14336, 2, 112}, - {4, 8, 1, 256, 14336, 1, 156}, - {4, 1, 1, 256, 16384, 2, 154}, - {4, 2, 1, 256, 16384, 2, 158}, - {4, 3, 1, 256, 16384, 2, 150}, - {4, 4, 1, 256, 16384, 1, 170}, - {4, 5, 1, 256, 16384, 1, 164}, - {4, 6, 1, 256, 16384, 1, 166}, - {4, 7, 1, 256, 16384, 1, 170}, - {4, 8, 1, 256, 16384, 1, 128}, - {4, 1, 1, 256, 24576, 2, 168}, - {4, 2, 1, 256, 24576, 2, 168}, - {4, 3, 1, 256, 24576, 2, 168}, - {4, 4, 1, 256, 24576, 2, 168}, - {4, 5, 1, 256, 24576, 2, 144}, - {4, 6, 1, 256, 24576, 2, 136}, - {4, 7, 1, 256, 24576, 2, 168}, - {4, 8, 1, 256, 24576, 1, 164}, - {4, 1, 1, 256, 51200, 4, 168}, - {4, 2, 1, 256, 51200, 4, 150}, - {4, 3, 1, 256, 51200, 2, 156}, - {4, 4, 1, 256, 51200, 4, 166}, - {4, 5, 1, 256, 51200, 4, 152}, - {4, 6, 1, 256, 51200, 2, 160}, - {4, 7, 1, 256, 51200, 4, 144}, - {4, 8, 1, 256, 51200, 2, 168}, - {4, 1, 1, 256, 128000, 4, 170}, - {4, 2, 1, 256, 128000, 4, 170}, - {4, 3, 1, 256, 128000, 4, 170}, - {4, 4, 1, 256, 128000, 4, 170}, - {4, 5, 1, 256, 128000, 4, 170}, - {4, 6, 1, 256, 128000, 4, 166}, - {4, 7, 1, 256, 128000, 4, 148}, - {4, 8, 1, 256, 128000, 2, 168}, - {4, 1, 1, 512, 512, 2, 12}, - {4, 2, 1, 512, 512, 2, 12}, - {4, 3, 1, 512, 512, 2, 8}, - {4, 4, 1, 512, 512, 2, 12}, - {4, 5, 1, 512, 512, 2, 12}, - {4, 6, 1, 512, 512, 1, 16}, - {4, 7, 1, 512, 512, 2, 14}, - {4, 8, 1, 512, 512, 2, 8}, - {4, 1, 1, 512, 1024, 1, 24}, - {4, 2, 1, 512, 1024, 1, 24}, - {4, 3, 1, 512, 1024, 2, 24}, - {4, 4, 1, 512, 1024, 2, 24}, - {4, 5, 1, 512, 1024, 2, 24}, - {4, 6, 1, 512, 1024, 1, 32}, - {4, 7, 1, 512, 1024, 2, 42}, - {4, 8, 1, 512, 1024, 1, 24}, - {4, 1, 1, 512, 2048, 1, 48}, - {4, 2, 1, 512, 2048, 2, 32}, - {4, 3, 1, 512, 2048, 2, 32}, - {4, 4, 1, 512, 2048, 2, 32}, - {4, 5, 1, 512, 2048, 2, 32}, - {4, 6, 1, 512, 2048, 2, 48}, - {4, 7, 1, 512, 2048, 1, 46}, - {4, 8, 1, 512, 2048, 2, 48}, - {4, 1, 1, 512, 3072, 2, 48}, - {4, 2, 1, 512, 3072, 2, 48}, - {4, 3, 1, 512, 3072, 2, 48}, - {4, 4, 1, 512, 3072, 2, 48}, - {4, 5, 1, 512, 3072, 2, 48}, - {4, 6, 1, 512, 3072, 2, 48}, - {4, 7, 1, 512, 3072, 2, 96}, - {4, 8, 1, 512, 3072, 2, 72}, - {4, 1, 1, 512, 4096, 2, 64}, - {4, 2, 1, 512, 4096, 2, 64}, - {4, 3, 1, 512, 4096, 2, 64}, - {4, 4, 1, 512, 4096, 2, 64}, - {4, 5, 1, 512, 4096, 2, 64}, - {4, 6, 1, 512, 4096, 2, 64}, - {4, 7, 1, 512, 4096, 1, 126}, - {4, 8, 1, 512, 4096, 2, 64}, - {4, 1, 1, 512, 5120, 1, 120}, - {4, 2, 1, 512, 5120, 1, 120}, - {4, 3, 1, 512, 5120, 2, 80}, - {4, 4, 1, 512, 5120, 2, 80}, - {4, 5, 1, 512, 5120, 2, 80}, - {4, 6, 1, 512, 5120, 1, 120}, - {4, 7, 1, 512, 5120, 1, 124}, - {4, 8, 1, 512, 5120, 1, 120}, - {4, 1, 1, 512, 8192, 2, 128}, - {4, 2, 1, 512, 8192, 2, 128}, - {4, 3, 1, 512, 8192, 2, 128}, - {4, 4, 1, 512, 8192, 2, 128}, - {4, 5, 1, 512, 8192, 2, 152}, - {4, 6, 1, 512, 8192, 1, 128}, - {4, 7, 1, 512, 8192, 1, 156}, - {4, 8, 1, 512, 8192, 1, 144}, - {4, 1, 1, 512, 12288, 2, 170}, - {4, 2, 1, 512, 12288, 2, 160}, - {4, 3, 1, 512, 12288, 2, 132}, - {4, 4, 1, 512, 12288, 2, 152}, - {4, 5, 1, 512, 12288, 2, 152}, - {4, 6, 1, 512, 12288, 2, 128}, - {4, 7, 1, 512, 12288, 2, 156}, - {4, 8, 1, 512, 12288, 2, 152}, - {4, 1, 1, 512, 14336, 2, 112}, - {4, 2, 1, 512, 14336, 1, 152}, - {4, 3, 1, 512, 14336, 2, 120}, - {4, 4, 1, 512, 14336, 2, 112}, - {4, 5, 1, 512, 14336, 2, 156}, - {4, 6, 1, 512, 14336, 2, 156}, - {4, 7, 1, 512, 14336, 2, 168}, - {4, 8, 1, 512, 14336, 1, 170}, - {4, 1, 1, 512, 16384, 2, 166}, - {4, 2, 1, 512, 16384, 2, 160}, - {4, 3, 1, 512, 16384, 1, 156}, - {4, 4, 1, 512, 16384, 2, 136}, - {4, 5, 1, 512, 16384, 2, 160}, - {4, 6, 1, 512, 16384, 2, 156}, - {4, 7, 1, 512, 16384, 2, 162}, - {4, 8, 1, 512, 16384, 1, 164}, - {4, 1, 1, 512, 24576, 3, 166}, - {4, 2, 1, 512, 24576, 2, 168}, - {4, 3, 1, 512, 24576, 3, 144}, - {4, 4, 1, 512, 24576, 2, 168}, - {4, 5, 1, 512, 24576, 2, 168}, - {4, 6, 1, 512, 24576, 2, 168}, - {4, 7, 1, 512, 24576, 2, 168}, - {4, 8, 1, 512, 24576, 1, 168}, - {4, 1, 1, 512, 51200, 4, 170}, - {4, 2, 1, 512, 51200, 4, 170}, - {4, 3, 1, 512, 51200, 4, 170}, - {4, 4, 1, 512, 51200, 4, 168}, - {4, 5, 1, 512, 51200, 4, 168}, - {4, 6, 1, 512, 51200, 4, 160}, - {4, 7, 1, 512, 51200, 4, 148}, - {4, 8, 1, 512, 51200, 1, 168}, - {4, 1, 1, 512, 128000, 4, 168}, - {4, 2, 1, 512, 128000, 4, 170}, - {4, 3, 1, 512, 128000, 4, 170}, - {4, 4, 1, 512, 128000, 4, 170}, - {4, 5, 1, 512, 128000, 4, 152}, - {4, 6, 1, 512, 128000, 4, 164}, - {4, 7, 1, 512, 128000, 4, 152}, - {4, 8, 1, 512, 128000, 4, 166}, - {4, 1, 1, 1024, 512, 1, 16}, - {4, 2, 1, 1024, 512, 2, 16}, - {4, 3, 1, 1024, 512, 2, 14}, - {4, 4, 1, 1024, 512, 2, 12}, - {4, 5, 1, 1024, 512, 2, 16}, - {4, 6, 1, 1024, 512, 2, 16}, - {4, 7, 1, 1024, 512, 2, 16}, - {4, 8, 1, 1024, 512, 2, 12}, - {4, 1, 1, 1024, 1024, 2, 24}, - {4, 2, 1, 1024, 1024, 2, 28}, - {4, 3, 1, 1024, 1024, 2, 38}, - {4, 4, 1, 1024, 1024, 2, 24}, - {4, 5, 1, 1024, 1024, 2, 32}, - {4, 6, 1, 1024, 1024, 2, 30}, - {4, 7, 1, 1024, 1024, 2, 32}, - {4, 8, 1, 1024, 1024, 2, 32}, - {4, 1, 1, 1024, 2048, 2, 46}, - {4, 2, 1, 1024, 2048, 2, 64}, - {4, 3, 1, 1024, 2048, 2, 76}, - {4, 4, 1, 1024, 2048, 2, 74}, - {4, 5, 1, 1024, 2048, 2, 64}, - {4, 6, 1, 1024, 2048, 2, 64}, - {4, 7, 1, 1024, 2048, 1, 104}, - {4, 8, 1, 1024, 2048, 2, 64}, - {4, 1, 1, 1024, 3072, 2, 94}, - {4, 2, 1, 1024, 3072, 2, 78}, - {4, 3, 1, 1024, 3072, 2, 96}, - {4, 4, 1, 1024, 3072, 2, 70}, - {4, 5, 1, 1024, 3072, 2, 96}, - {4, 6, 1, 1024, 3072, 2, 96}, - {4, 7, 1, 1024, 3072, 1, 120}, - {4, 8, 1, 1024, 3072, 1, 88}, - {4, 1, 1, 1024, 4096, 2, 96}, - {4, 2, 1, 1024, 4096, 2, 118}, - {4, 3, 1, 1024, 4096, 2, 128}, - {4, 4, 1, 1024, 4096, 2, 96}, - {4, 5, 1, 1024, 4096, 1, 120}, - {4, 6, 1, 1024, 4096, 1, 124}, - {4, 7, 1, 1024, 4096, 1, 128}, - {4, 8, 1, 1024, 4096, 1, 162}, - {4, 1, 1, 1024, 5120, 2, 128}, - {4, 2, 1, 1024, 5120, 1, 160}, - {4, 3, 1, 1024, 5120, 2, 120}, - {4, 4, 1, 1024, 5120, 2, 144}, - {4, 5, 1, 1024, 5120, 2, 112}, - {4, 6, 1, 1024, 5120, 2, 122}, - {4, 7, 1, 1024, 5120, 2, 160}, - {4, 8, 1, 1024, 5120, 1, 160}, - {4, 1, 1, 1024, 8192, 2, 158}, - {4, 2, 1, 1024, 8192, 2, 168}, - {4, 3, 1, 1024, 8192, 2, 166}, - {4, 4, 1, 1024, 8192, 2, 154}, - {4, 5, 1, 1024, 8192, 2, 136}, - {4, 6, 1, 1024, 8192, 2, 168}, - {4, 7, 1, 1024, 8192, 2, 158}, - {4, 8, 1, 1024, 8192, 2, 156}, - {4, 1, 1, 1024, 12288, 2, 162}, - {4, 2, 1, 1024, 12288, 2, 156}, - {4, 3, 1, 1024, 12288, 2, 170}, - {4, 4, 1, 1024, 12288, 2, 168}, - {4, 5, 1, 1024, 12288, 2, 162}, - {4, 6, 1, 1024, 12288, 2, 170}, - {4, 7, 1, 1024, 12288, 2, 170}, - {4, 8, 1, 1024, 12288, 2, 136}, - {4, 1, 1, 1024, 14336, 2, 164}, - {4, 2, 1, 1024, 14336, 2, 156}, - {4, 3, 1, 1024, 14336, 2, 168}, - {4, 4, 1, 1024, 14336, 2, 168}, - {4, 5, 1, 1024, 14336, 2, 170}, - {4, 6, 1, 1024, 14336, 2, 152}, - {4, 7, 1, 1024, 14336, 3, 168}, - {4, 8, 1, 1024, 14336, 1, 168}, - {4, 1, 1, 1024, 16384, 2, 170}, - {4, 2, 1, 1024, 16384, 2, 156}, - {4, 3, 1, 1024, 16384, 2, 166}, - {4, 4, 1, 1024, 16384, 2, 168}, - {4, 5, 1, 1024, 16384, 2, 160}, - {4, 6, 1, 1024, 16384, 2, 170}, - {4, 7, 1, 1024, 16384, 2, 170}, - {4, 8, 1, 1024, 16384, 1, 168}, - {4, 1, 1, 1024, 24576, 3, 160}, - {4, 2, 1, 1024, 24576, 2, 168}, - {4, 3, 1, 1024, 24576, 2, 158}, - {4, 4, 1, 1024, 24576, 2, 160}, - {4, 5, 1, 1024, 24576, 3, 158}, - {4, 6, 1, 1024, 24576, 2, 170}, - {4, 7, 1, 1024, 24576, 2, 170}, - {4, 8, 1, 1024, 24576, 1, 168}, - {4, 1, 1, 1024, 51200, 4, 170}, - {4, 2, 1, 1024, 51200, 4, 168}, - {4, 3, 1, 1024, 51200, 4, 170}, - {4, 4, 1, 1024, 51200, 4, 150}, - {4, 5, 1, 1024, 51200, 4, 168}, - {4, 6, 1, 1024, 51200, 4, 160}, - {4, 7, 1, 1024, 51200, 4, 144}, - {4, 8, 1, 1024, 51200, 1, 166}, - {4, 1, 1, 1024, 128000, 4, 170}, - {4, 2, 1, 1024, 128000, 4, 170}, - {4, 3, 1, 1024, 128000, 4, 170}, - {4, 4, 1, 1024, 128000, 4, 168}, - {4, 5, 1, 1024, 128000, 4, 152}, - {4, 6, 1, 1024, 128000, 4, 164}, - {4, 7, 1, 1024, 128000, 4, 170}, - {4, 8, 1, 1024, 128000, 4, 140}, - {4, 1, 1, 2048, 512, 2, 16}, - {4, 2, 1, 2048, 512, 1, 24}, - {4, 3, 1, 2048, 512, 2, 26}, - {4, 4, 1, 2048, 512, 1, 26}, - {4, 5, 1, 2048, 512, 2, 24}, - {4, 6, 1, 2048, 512, 2, 24}, - {4, 7, 1, 2048, 512, 2, 24}, - {4, 8, 1, 2048, 512, 2, 24}, - {4, 1, 1, 2048, 1024, 2, 30}, - {4, 2, 1, 2048, 1024, 2, 36}, - {4, 3, 1, 2048, 1024, 2, 48}, - {4, 4, 1, 2048, 1024, 2, 54}, - {4, 5, 1, 2048, 1024, 2, 40}, - {4, 6, 1, 2048, 1024, 2, 48}, - {4, 7, 1, 2048, 1024, 2, 48}, - {4, 8, 1, 2048, 1024, 2, 48}, - {4, 1, 1, 2048, 2048, 2, 76}, - {4, 2, 1, 2048, 2048, 2, 96}, - {4, 3, 1, 2048, 2048, 2, 74}, - {4, 4, 1, 2048, 2048, 2, 62}, - {4, 5, 1, 2048, 2048, 2, 76}, - {4, 6, 1, 2048, 2048, 1, 80}, - {4, 7, 1, 2048, 2048, 2, 80}, - {4, 8, 1, 2048, 2048, 2, 72}, - {4, 1, 1, 2048, 3072, 2, 114}, - {4, 2, 1, 2048, 3072, 2, 140}, - {4, 3, 1, 2048, 3072, 2, 120}, - {4, 4, 1, 2048, 3072, 2, 112}, - {4, 5, 1, 2048, 3072, 1, 144}, - {4, 6, 1, 2048, 3072, 2, 136}, - {4, 7, 1, 2048, 3072, 2, 112}, - {4, 8, 1, 2048, 3072, 2, 104}, - {4, 1, 1, 2048, 4096, 2, 124}, - {4, 2, 1, 2048, 4096, 2, 158}, - {4, 3, 1, 2048, 4096, 2, 120}, - {4, 4, 1, 2048, 4096, 1, 160}, - {4, 5, 1, 2048, 4096, 2, 160}, - {4, 6, 1, 2048, 4096, 2, 148}, - {4, 7, 1, 2048, 4096, 2, 126}, - {4, 8, 1, 2048, 4096, 1, 160}, - {4, 1, 1, 2048, 5120, 2, 160}, - {4, 2, 1, 2048, 5120, 2, 160}, - {4, 3, 1, 2048, 5120, 2, 158}, - {4, 4, 1, 2048, 5120, 2, 152}, - {4, 5, 1, 2048, 5120, 2, 160}, - {4, 6, 1, 2048, 5120, 2, 160}, - {4, 7, 1, 2048, 5120, 2, 160}, - {4, 8, 1, 2048, 5120, 1, 160}, - {4, 1, 1, 2048, 8192, 2, 160}, - {4, 2, 1, 2048, 8192, 2, 170}, - {4, 3, 1, 2048, 8192, 2, 170}, - {4, 4, 1, 2048, 8192, 2, 170}, - {4, 5, 1, 2048, 8192, 2, 168}, - {4, 6, 1, 2048, 8192, 2, 170}, - {4, 7, 1, 2048, 8192, 2, 170}, - {4, 8, 1, 2048, 8192, 1, 160}, - {4, 1, 1, 2048, 12288, 2, 168}, - {4, 2, 1, 2048, 12288, 2, 170}, - {4, 3, 1, 2048, 12288, 2, 168}, - {4, 4, 1, 2048, 12288, 2, 164}, - {4, 5, 1, 2048, 12288, 2, 170}, - {4, 6, 1, 2048, 12288, 2, 164}, - {4, 7, 1, 2048, 12288, 3, 144}, - {4, 8, 1, 2048, 12288, 1, 162}, - {4, 1, 1, 2048, 14336, 3, 168}, - {4, 2, 1, 2048, 14336, 2, 170}, - {4, 3, 1, 2048, 14336, 2, 168}, - {4, 4, 1, 2048, 14336, 2, 168}, - {4, 5, 1, 2048, 14336, 3, 164}, - {4, 6, 1, 2048, 14336, 2, 168}, - {4, 7, 1, 2048, 14336, 2, 164}, - {4, 8, 1, 2048, 14336, 1, 168}, - {4, 1, 1, 2048, 16384, 2, 166}, - {4, 2, 1, 2048, 16384, 2, 170}, - {4, 3, 1, 2048, 16384, 2, 168}, - {4, 4, 1, 2048, 16384, 2, 168}, - {4, 5, 1, 2048, 16384, 3, 160}, - {4, 6, 1, 2048, 16384, 2, 170}, - {4, 7, 1, 2048, 16384, 3, 128}, - {4, 8, 1, 2048, 16384, 1, 168}, - {4, 1, 1, 2048, 24576, 3, 168}, - {4, 2, 1, 2048, 24576, 4, 170}, - {4, 3, 1, 2048, 24576, 3, 170}, - {4, 4, 1, 2048, 24576, 4, 144}, - {4, 5, 1, 2048, 24576, 4, 144}, - {4, 6, 1, 2048, 24576, 4, 144}, - {4, 7, 1, 2048, 24576, 4, 144}, - {4, 8, 1, 2048, 24576, 1, 168}, - {4, 1, 1, 2048, 51200, 4, 170}, - {4, 2, 1, 2048, 51200, 4, 170}, - {4, 3, 1, 2048, 51200, 4, 170}, - {4, 4, 1, 2048, 51200, 4, 166}, - {4, 5, 1, 2048, 51200, 4, 168}, - {4, 6, 1, 2048, 51200, 4, 160}, - {4, 7, 1, 2048, 51200, 4, 168}, - {4, 8, 1, 2048, 51200, 2, 150}, - {4, 1, 1, 2048, 128000, 4, 170}, - {4, 2, 1, 2048, 128000, 4, 170}, - {4, 3, 1, 2048, 128000, 4, 168}, - {4, 4, 1, 2048, 128000, 4, 162}, - {4, 5, 1, 2048, 128000, 4, 166}, - {4, 6, 1, 2048, 128000, 4, 164}, - {4, 7, 1, 2048, 128000, 4, 168}, - {4, 8, 1, 2048, 128000, 4, 156}, - {4, 1, 1, 3072, 512, 1, 24}, - {4, 2, 1, 3072, 512, 2, 24}, - {4, 3, 1, 3072, 512, 2, 24}, - {4, 4, 1, 3072, 512, 2, 24}, - {4, 5, 1, 3072, 512, 2, 28}, - {4, 6, 1, 3072, 512, 2, 24}, - {4, 7, 1, 3072, 512, 2, 38}, - {4, 8, 1, 3072, 512, 2, 24}, - {4, 1, 1, 3072, 1024, 2, 68}, - {4, 2, 1, 3072, 1024, 1, 56}, - {4, 3, 1, 3072, 1024, 1, 56}, - {4, 4, 1, 3072, 1024, 2, 66}, - {4, 5, 1, 3072, 1024, 2, 48}, - {4, 6, 1, 3072, 1024, 2, 56}, - {4, 7, 1, 3072, 1024, 2, 64}, - {4, 8, 1, 3072, 1024, 2, 56}, - {4, 1, 1, 3072, 2048, 2, 86}, - {4, 2, 1, 3072, 2048, 2, 96}, - {4, 3, 1, 3072, 2048, 2, 90}, - {4, 4, 1, 3072, 2048, 2, 128}, - {4, 5, 1, 3072, 2048, 2, 124}, - {4, 6, 1, 3072, 2048, 2, 98}, - {4, 7, 1, 3072, 2048, 2, 112}, - {4, 8, 1, 3072, 2048, 1, 126}, - {4, 1, 1, 3072, 3072, 1, 162}, - {4, 2, 1, 3072, 3072, 2, 96}, - {4, 3, 1, 3072, 3072, 2, 112}, - {4, 4, 1, 3072, 3072, 2, 136}, - {4, 5, 1, 3072, 3072, 1, 136}, - {4, 6, 1, 3072, 3072, 1, 156}, - {4, 7, 1, 3072, 3072, 1, 158}, - {4, 8, 1, 3072, 3072, 1, 156}, - {4, 1, 1, 3072, 4096, 2, 136}, - {4, 2, 1, 3072, 4096, 2, 160}, - {4, 3, 1, 3072, 4096, 2, 160}, - {4, 4, 1, 3072, 4096, 2, 152}, - {4, 5, 1, 3072, 4096, 2, 160}, - {4, 6, 1, 3072, 4096, 2, 160}, - {4, 7, 1, 3072, 4096, 2, 160}, - {4, 8, 1, 3072, 4096, 1, 160}, - {4, 1, 1, 3072, 5120, 2, 160}, - {4, 2, 1, 3072, 5120, 2, 152}, - {4, 3, 1, 3072, 5120, 2, 152}, - {4, 4, 1, 3072, 5120, 2, 160}, - {4, 5, 1, 3072, 5120, 2, 160}, - {4, 6, 1, 3072, 5120, 2, 160}, - {4, 7, 1, 3072, 5120, 2, 162}, - {4, 8, 1, 3072, 5120, 1, 160}, - {4, 1, 1, 3072, 8192, 2, 164}, - {4, 2, 1, 3072, 8192, 2, 158}, - {4, 3, 1, 3072, 8192, 2, 164}, - {4, 4, 1, 3072, 8192, 2, 164}, - {4, 5, 1, 3072, 8192, 2, 170}, - {4, 6, 1, 3072, 8192, 2, 160}, - {4, 7, 1, 3072, 8192, 2, 166}, - {4, 8, 1, 3072, 8192, 1, 160}, - {4, 1, 1, 3072, 12288, 2, 170}, - {4, 2, 1, 3072, 12288, 2, 168}, - {4, 3, 1, 3072, 12288, 2, 168}, - {4, 4, 1, 3072, 12288, 2, 168}, - {4, 5, 1, 3072, 12288, 2, 168}, - {4, 6, 1, 3072, 12288, 3, 144}, - {4, 7, 1, 3072, 12288, 3, 144}, - {4, 8, 1, 3072, 12288, 1, 168}, - {4, 1, 1, 3072, 14336, 3, 168}, - {4, 2, 1, 3072, 14336, 2, 170}, - {4, 3, 1, 3072, 14336, 2, 170}, - {4, 4, 1, 3072, 14336, 2, 168}, - {4, 5, 1, 3072, 14336, 3, 168}, - {4, 6, 1, 3072, 14336, 2, 168}, - {4, 7, 1, 3072, 14336, 3, 168}, - {4, 8, 1, 3072, 14336, 1, 168}, - {4, 1, 1, 3072, 16384, 3, 168}, - {4, 2, 1, 3072, 16384, 2, 164}, - {4, 3, 1, 3072, 16384, 3, 170}, - {4, 4, 1, 3072, 16384, 2, 170}, - {4, 5, 1, 3072, 16384, 3, 162}, - {4, 6, 1, 3072, 16384, 3, 128}, - {4, 7, 1, 3072, 16384, 3, 128}, - {4, 8, 1, 3072, 16384, 1, 164}, - {4, 1, 1, 3072, 24576, 3, 170}, - {4, 2, 1, 3072, 24576, 4, 168}, - {4, 3, 1, 3072, 24576, 3, 170}, - {4, 4, 1, 3072, 24576, 4, 168}, - {4, 5, 1, 3072, 24576, 4, 144}, - {4, 6, 1, 3072, 24576, 4, 144}, - {4, 7, 1, 3072, 24576, 4, 144}, - {4, 8, 1, 3072, 24576, 1, 168}, - {4, 1, 1, 3072, 51200, 4, 170}, - {4, 2, 1, 3072, 51200, 4, 170}, - {4, 3, 1, 3072, 51200, 4, 170}, - {4, 4, 1, 3072, 51200, 4, 166}, - {4, 5, 1, 3072, 51200, 4, 168}, - {4, 6, 1, 3072, 51200, 4, 160}, - {4, 7, 1, 3072, 51200, 4, 168}, - {4, 8, 1, 3072, 51200, 4, 150}, - {4, 1, 1, 3072, 128000, 4, 170}, - {4, 2, 1, 3072, 128000, 4, 170}, - {4, 3, 1, 3072, 128000, 4, 170}, - {4, 4, 1, 3072, 128000, 4, 168}, - {4, 5, 1, 3072, 128000, 4, 160}, - {4, 6, 1, 3072, 128000, 4, 164}, - {4, 7, 1, 3072, 128000, 4, 162}, - {4, 8, 1, 3072, 128000, 3, 170}, - {4, 1, 1, 4096, 512, 2, 32}, - {4, 2, 1, 4096, 512, 2, 32}, - {4, 3, 1, 4096, 512, 2, 32}, - {4, 4, 1, 4096, 512, 2, 32}, - {4, 5, 1, 4096, 512, 2, 26}, - {4, 6, 1, 4096, 512, 2, 38}, - {4, 7, 1, 4096, 512, 2, 32}, - {4, 8, 1, 4096, 512, 2, 32}, - {4, 1, 1, 4096, 1024, 2, 56}, - {4, 2, 1, 4096, 1024, 2, 64}, - {4, 3, 1, 4096, 1024, 2, 64}, - {4, 4, 1, 4096, 1024, 2, 64}, - {4, 5, 1, 4096, 1024, 2, 48}, - {4, 6, 1, 4096, 1024, 2, 64}, - {4, 7, 1, 4096, 1024, 2, 62}, - {4, 8, 1, 4096, 1024, 2, 48}, - {4, 1, 1, 4096, 2048, 2, 128}, - {4, 2, 1, 4096, 2048, 2, 108}, - {4, 3, 1, 4096, 2048, 2, 108}, - {4, 4, 1, 4096, 2048, 2, 120}, - {4, 5, 1, 4096, 2048, 2, 128}, - {4, 6, 1, 4096, 2048, 2, 108}, - {4, 7, 1, 4096, 2048, 2, 128}, - {4, 8, 1, 4096, 2048, 2, 104}, - {4, 1, 1, 4096, 3072, 2, 160}, - {4, 2, 1, 4096, 3072, 2, 140}, - {4, 3, 1, 4096, 3072, 2, 162}, - {4, 4, 1, 4096, 3072, 2, 136}, - {4, 5, 1, 4096, 3072, 2, 170}, - {4, 6, 1, 4096, 3072, 2, 156}, - {4, 7, 1, 4096, 3072, 2, 168}, - {4, 8, 1, 4096, 3072, 2, 120}, - {4, 1, 1, 4096, 4096, 2, 128}, - {4, 2, 1, 4096, 4096, 2, 152}, - {4, 3, 1, 4096, 4096, 2, 156}, - {4, 4, 1, 4096, 4096, 2, 160}, - {4, 5, 1, 4096, 4096, 2, 154}, - {4, 6, 1, 4096, 4096, 2, 160}, - {4, 7, 1, 4096, 4096, 2, 160}, - {4, 8, 1, 4096, 4096, 2, 126}, - {4, 1, 1, 4096, 5120, 2, 160}, - {4, 2, 1, 4096, 5120, 2, 160}, - {4, 3, 1, 4096, 5120, 2, 158}, - {4, 4, 1, 4096, 5120, 2, 162}, - {4, 5, 1, 4096, 5120, 2, 160}, - {4, 6, 1, 4096, 5120, 2, 158}, - {4, 7, 1, 4096, 5120, 2, 160}, - {4, 8, 1, 4096, 5120, 1, 160}, - {4, 1, 1, 4096, 8192, 2, 168}, - {4, 2, 1, 4096, 8192, 2, 170}, - {4, 3, 1, 4096, 8192, 2, 170}, - {4, 4, 1, 4096, 8192, 2, 164}, - {4, 5, 1, 4096, 8192, 2, 168}, - {4, 6, 1, 4096, 8192, 2, 170}, - {4, 7, 1, 4096, 8192, 3, 128}, - {4, 8, 1, 4096, 8192, 1, 160}, - {4, 1, 1, 4096, 12288, 3, 170}, - {4, 2, 1, 4096, 12288, 2, 170}, - {4, 3, 1, 4096, 12288, 3, 170}, - {4, 4, 1, 4096, 12288, 2, 168}, - {4, 5, 1, 4096, 12288, 3, 170}, - {4, 6, 1, 4096, 12288, 3, 144}, - {4, 7, 1, 4096, 12288, 3, 144}, - {4, 8, 1, 4096, 12288, 1, 162}, - {4, 1, 1, 4096, 14336, 3, 168}, - {4, 2, 1, 4096, 14336, 2, 170}, - {4, 3, 1, 4096, 14336, 3, 168}, - {4, 4, 1, 4096, 14336, 2, 168}, - {4, 5, 1, 4096, 14336, 3, 168}, - {4, 6, 1, 4096, 14336, 2, 168}, - {4, 7, 1, 4096, 14336, 3, 168}, - {4, 8, 1, 4096, 14336, 1, 168}, - {4, 1, 1, 4096, 16384, 3, 170}, - {4, 2, 1, 4096, 16384, 2, 166}, - {4, 3, 1, 4096, 16384, 3, 170}, - {4, 4, 1, 4096, 16384, 4, 160}, - {4, 5, 1, 4096, 16384, 3, 168}, - {4, 6, 1, 4096, 16384, 3, 128}, - {4, 7, 1, 4096, 16384, 3, 128}, - {4, 8, 1, 4096, 16384, 1, 168}, - {4, 1, 1, 4096, 24576, 3, 170}, - {4, 2, 1, 4096, 24576, 4, 170}, - {4, 3, 1, 4096, 24576, 3, 170}, - {4, 4, 1, 4096, 24576, 4, 168}, - {4, 5, 1, 4096, 24576, 4, 144}, - {4, 6, 1, 4096, 24576, 4, 144}, - {4, 7, 1, 4096, 24576, 4, 144}, - {4, 8, 1, 4096, 24576, 1, 168}, - {4, 1, 1, 4096, 51200, 4, 170}, - {4, 2, 1, 4096, 51200, 4, 170}, - {4, 3, 1, 4096, 51200, 4, 170}, - {4, 4, 1, 4096, 51200, 4, 166}, - {4, 5, 1, 4096, 51200, 4, 168}, - {4, 6, 1, 4096, 51200, 4, 120}, - {4, 7, 1, 4096, 51200, 4, 166}, - {4, 8, 1, 4096, 51200, 4, 156}, - {4, 1, 1, 4096, 128000, 3, 170}, - {4, 2, 1, 4096, 128000, 4, 170}, - {4, 3, 1, 4096, 128000, 4, 170}, - {4, 4, 1, 4096, 128000, 4, 162}, - {4, 5, 1, 4096, 128000, 4, 160}, - {4, 6, 1, 4096, 128000, 3, 166}, - {4, 7, 1, 4096, 128000, 4, 166}, - {4, 8, 1, 4096, 128000, 4, 156}, - {4, 1, 1, 5120, 512, 2, 30}, - {4, 2, 1, 5120, 512, 2, 34}, - {4, 3, 1, 5120, 512, 2, 40}, - {4, 4, 1, 5120, 512, 2, 34}, - {4, 5, 1, 5120, 512, 2, 32}, - {4, 6, 1, 5120, 512, 2, 32}, - {4, 7, 1, 5120, 512, 2, 40}, - {4, 8, 1, 5120, 512, 2, 36}, - {4, 1, 1, 5120, 1024, 2, 48}, - {4, 2, 1, 5120, 1024, 2, 88}, - {4, 3, 1, 5120, 1024, 2, 72}, - {4, 4, 1, 5120, 1024, 2, 72}, - {4, 5, 1, 5120, 1024, 2, 76}, - {4, 6, 1, 5120, 1024, 2, 56}, - {4, 7, 1, 5120, 1024, 2, 72}, - {4, 8, 1, 5120, 1024, 2, 56}, - {4, 1, 1, 5120, 2048, 2, 138}, - {4, 2, 1, 5120, 2048, 2, 112}, - {4, 3, 1, 5120, 2048, 2, 128}, - {4, 4, 1, 5120, 2048, 2, 104}, - {4, 5, 1, 5120, 2048, 2, 112}, - {4, 6, 1, 5120, 2048, 2, 120}, - {4, 7, 1, 5120, 2048, 2, 142}, - {4, 8, 1, 5120, 2048, 2, 112}, - {4, 1, 1, 5120, 3072, 2, 168}, - {4, 2, 1, 5120, 3072, 2, 168}, - {4, 3, 1, 5120, 3072, 2, 168}, - {4, 4, 1, 5120, 3072, 2, 168}, - {4, 5, 1, 5120, 3072, 2, 168}, - {4, 6, 1, 5120, 3072, 2, 168}, - {4, 7, 1, 5120, 3072, 2, 168}, - {4, 8, 1, 5120, 3072, 1, 168}, - {4, 1, 1, 5120, 4096, 2, 162}, - {4, 2, 1, 5120, 4096, 2, 160}, - {4, 3, 1, 5120, 4096, 2, 166}, - {4, 4, 1, 5120, 4096, 2, 168}, - {4, 5, 1, 5120, 4096, 2, 156}, - {4, 6, 1, 5120, 4096, 2, 160}, - {4, 7, 1, 5120, 4096, 2, 160}, - {4, 8, 1, 5120, 4096, 1, 160}, - {4, 1, 1, 5120, 5120, 2, 160}, - {4, 2, 1, 5120, 5120, 2, 160}, - {4, 3, 1, 5120, 5120, 2, 146}, - {4, 4, 1, 5120, 5120, 2, 152}, - {4, 5, 1, 5120, 5120, 2, 160}, - {4, 6, 1, 5120, 5120, 2, 160}, - {4, 7, 1, 5120, 5120, 2, 160}, - {4, 8, 1, 5120, 5120, 1, 160}, - {4, 1, 1, 5120, 8192, 2, 170}, - {4, 2, 1, 5120, 8192, 2, 168}, - {4, 3, 1, 5120, 8192, 2, 168}, - {4, 4, 1, 5120, 8192, 2, 164}, - {4, 5, 1, 5120, 8192, 3, 160}, - {4, 6, 1, 5120, 8192, 2, 160}, - {4, 7, 1, 5120, 8192, 3, 160}, - {4, 8, 1, 5120, 8192, 1, 160}, - {4, 1, 1, 5120, 12288, 3, 168}, - {4, 2, 1, 5120, 12288, 2, 170}, - {4, 3, 1, 5120, 12288, 3, 168}, - {4, 4, 1, 5120, 12288, 2, 168}, - {4, 5, 1, 5120, 12288, 3, 158}, - {4, 6, 1, 5120, 12288, 3, 144}, - {4, 7, 1, 5120, 12288, 3, 144}, - {4, 8, 1, 5120, 12288, 1, 168}, - {4, 1, 1, 5120, 14336, 3, 168}, - {4, 2, 1, 5120, 14336, 4, 170}, - {4, 3, 1, 5120, 14336, 3, 170}, - {4, 4, 1, 5120, 14336, 4, 168}, - {4, 5, 1, 5120, 14336, 3, 166}, - {4, 6, 1, 5120, 14336, 3, 168}, - {4, 7, 1, 5120, 14336, 3, 168}, - {4, 8, 1, 5120, 14336, 1, 168}, - {4, 1, 1, 5120, 16384, 3, 170}, - {4, 2, 1, 5120, 16384, 4, 168}, - {4, 3, 1, 5120, 16384, 3, 170}, - {4, 4, 1, 5120, 16384, 4, 160}, - {4, 5, 1, 5120, 16384, 4, 160}, - {4, 6, 1, 5120, 16384, 3, 128}, - {4, 7, 1, 5120, 16384, 4, 128}, - {4, 8, 1, 5120, 16384, 1, 168}, - {4, 1, 1, 5120, 24576, 3, 168}, - {4, 2, 1, 5120, 24576, 4, 170}, - {4, 3, 1, 5120, 24576, 3, 168}, - {4, 4, 1, 5120, 24576, 4, 162}, - {4, 5, 1, 5120, 24576, 4, 144}, - {4, 6, 1, 5120, 24576, 4, 144}, - {4, 7, 1, 5120, 24576, 4, 144}, - {4, 8, 1, 5120, 24576, 1, 168}, - {4, 1, 1, 5120, 51200, 4, 170}, - {4, 2, 1, 5120, 51200, 4, 170}, - {4, 3, 1, 5120, 51200, 4, 170}, - {4, 4, 1, 5120, 51200, 4, 162}, - {4, 5, 1, 5120, 51200, 4, 168}, - {4, 6, 1, 5120, 51200, 4, 160}, - {4, 7, 1, 5120, 51200, 4, 166}, - {4, 8, 1, 5120, 51200, 4, 168}, - {4, 1, 1, 5120, 128000, 4, 170}, - {4, 2, 1, 5120, 128000, 4, 170}, - {4, 3, 1, 5120, 128000, 3, 168}, - {4, 4, 1, 5120, 128000, 4, 162}, - {4, 5, 1, 5120, 128000, 4, 154}, - {4, 6, 1, 5120, 128000, 4, 150}, - {4, 7, 1, 5120, 128000, 3, 166}, - {4, 8, 1, 5120, 128000, 4, 156}, - {4, 1, 1, 8192, 512, 2, 32}, - {4, 2, 1, 8192, 512, 2, 36}, - {4, 3, 1, 8192, 512, 2, 40}, - {4, 4, 1, 8192, 512, 2, 38}, - {4, 5, 1, 8192, 512, 2, 40}, - {4, 6, 1, 8192, 512, 2, 44}, - {4, 7, 1, 8192, 512, 2, 48}, - {4, 8, 1, 8192, 512, 2, 32}, - {4, 1, 1, 8192, 1024, 2, 64}, - {4, 2, 1, 8192, 1024, 2, 72}, - {4, 3, 1, 8192, 1024, 2, 80}, - {4, 4, 1, 8192, 1024, 2, 64}, - {4, 5, 1, 8192, 1024, 2, 88}, - {4, 6, 1, 8192, 1024, 2, 72}, - {4, 7, 1, 8192, 1024, 2, 80}, - {4, 8, 1, 8192, 1024, 2, 80}, - {4, 1, 1, 8192, 2048, 2, 144}, - {4, 2, 1, 8192, 2048, 2, 152}, - {4, 3, 1, 8192, 2048, 2, 156}, - {4, 4, 1, 8192, 2048, 2, 112}, - {4, 5, 1, 8192, 2048, 2, 152}, - {4, 6, 1, 8192, 2048, 2, 160}, - {4, 7, 1, 8192, 2048, 2, 156}, - {4, 8, 1, 8192, 2048, 2, 128}, - {4, 1, 1, 8192, 3072, 2, 156}, - {4, 2, 1, 8192, 3072, 2, 168}, - {4, 3, 1, 8192, 3072, 2, 168}, - {4, 4, 1, 8192, 3072, 2, 168}, - {4, 5, 1, 8192, 3072, 2, 168}, - {4, 6, 1, 8192, 3072, 2, 168}, - {4, 7, 1, 8192, 3072, 2, 168}, - {4, 8, 1, 8192, 3072, 1, 164}, - {4, 1, 1, 8192, 4096, 2, 156}, - {4, 2, 1, 8192, 4096, 2, 170}, - {4, 3, 1, 8192, 4096, 2, 170}, - {4, 4, 1, 8192, 4096, 2, 160}, - {4, 5, 1, 8192, 4096, 2, 162}, - {4, 6, 1, 8192, 4096, 2, 160}, - {4, 7, 1, 8192, 4096, 2, 160}, - {4, 8, 1, 8192, 4096, 1, 160}, - {4, 1, 1, 8192, 5120, 2, 168}, - {4, 2, 1, 8192, 5120, 2, 166}, - {4, 3, 1, 8192, 5120, 2, 168}, - {4, 4, 1, 8192, 5120, 2, 160}, - {4, 5, 1, 8192, 5120, 2, 166}, - {4, 6, 1, 8192, 5120, 2, 160}, - {4, 7, 1, 8192, 5120, 2, 160}, - {4, 8, 1, 8192, 5120, 1, 160}, - {4, 1, 1, 8192, 8192, 3, 170}, - {4, 2, 1, 8192, 8192, 2, 170}, - {4, 3, 1, 8192, 8192, 2, 170}, - {4, 4, 1, 8192, 8192, 2, 170}, - {4, 5, 1, 8192, 8192, 3, 160}, - {4, 6, 1, 8192, 8192, 2, 170}, - {4, 7, 1, 8192, 8192, 3, 128}, - {4, 8, 1, 8192, 8192, 2, 128}, - {4, 1, 1, 8192, 12288, 3, 170}, - {4, 2, 1, 8192, 12288, 2, 170}, - {4, 3, 1, 8192, 12288, 3, 170}, - {4, 4, 1, 8192, 12288, 4, 168}, - {4, 5, 1, 8192, 12288, 3, 168}, - {4, 6, 1, 8192, 12288, 3, 144}, - {4, 7, 1, 8192, 12288, 3, 144}, - {4, 8, 1, 8192, 12288, 2, 144}, - {4, 1, 1, 8192, 14336, 3, 168}, - {4, 2, 1, 8192, 14336, 4, 168}, - {4, 3, 1, 8192, 14336, 3, 170}, - {4, 4, 1, 8192, 14336, 4, 168}, - {4, 5, 1, 8192, 14336, 3, 168}, - {4, 6, 1, 8192, 14336, 3, 168}, - {4, 7, 1, 8192, 14336, 3, 168}, - {4, 8, 1, 8192, 14336, 1, 168}, - {4, 1, 1, 8192, 16384, 3, 170}, - {4, 2, 1, 8192, 16384, 4, 170}, - {4, 3, 1, 8192, 16384, 3, 170}, - {4, 4, 1, 8192, 16384, 4, 160}, - {4, 5, 1, 8192, 16384, 4, 160}, - {4, 6, 1, 8192, 16384, 4, 128}, - {4, 7, 1, 8192, 16384, 4, 128}, - {4, 8, 1, 8192, 16384, 1, 168}, - {4, 1, 1, 8192, 24576, 3, 170}, - {4, 2, 1, 8192, 24576, 4, 170}, - {4, 3, 1, 8192, 24576, 3, 170}, - {4, 4, 1, 8192, 24576, 4, 162}, - {4, 5, 1, 8192, 24576, 4, 144}, - {4, 6, 1, 8192, 24576, 4, 144}, - {4, 7, 1, 8192, 24576, 4, 144}, - {4, 8, 1, 8192, 24576, 1, 168}, - {4, 1, 1, 8192, 51200, 4, 170}, - {4, 2, 1, 8192, 51200, 4, 170}, - {4, 3, 1, 8192, 51200, 4, 170}, - {4, 4, 1, 8192, 51200, 4, 168}, - {4, 5, 1, 8192, 51200, 4, 160}, - {4, 6, 1, 8192, 51200, 4, 160}, - {4, 7, 1, 8192, 51200, 4, 156}, - {4, 8, 1, 8192, 51200, 4, 150}, - {4, 1, 1, 8192, 128000, 3, 170}, - {4, 2, 1, 8192, 128000, 4, 170}, - {4, 3, 1, 8192, 128000, 3, 170}, - {4, 4, 1, 8192, 128000, 4, 170}, - {4, 5, 1, 8192, 128000, 4, 164}, - {4, 6, 1, 8192, 128000, 4, 164}, - {4, 7, 1, 8192, 128000, 4, 170}, - {4, 8, 1, 8192, 128000, 4, 164}, - {4, 1, 1, 12288, 512, 2, 48}, - {4, 2, 1, 12288, 512, 2, 48}, - {4, 3, 1, 12288, 512, 2, 44}, - {4, 4, 1, 12288, 512, 2, 48}, - {4, 5, 1, 12288, 512, 2, 42}, - {4, 6, 1, 12288, 512, 2, 48}, - {4, 7, 1, 12288, 512, 2, 56}, - {4, 8, 1, 12288, 512, 2, 48}, - {4, 1, 1, 12288, 1024, 2, 88}, - {4, 2, 1, 12288, 1024, 2, 94}, - {4, 3, 1, 12288, 1024, 2, 88}, - {4, 4, 1, 12288, 1024, 2, 100}, - {4, 5, 1, 12288, 1024, 2, 112}, - {4, 6, 1, 12288, 1024, 2, 110}, - {4, 7, 1, 12288, 1024, 2, 120}, - {4, 8, 1, 12288, 1024, 2, 98}, - {4, 1, 1, 12288, 2048, 2, 156}, - {4, 2, 1, 12288, 2048, 2, 152}, - {4, 3, 1, 12288, 2048, 2, 162}, - {4, 4, 1, 12288, 2048, 2, 160}, - {4, 5, 1, 12288, 2048, 2, 160}, - {4, 6, 1, 12288, 2048, 2, 168}, - {4, 7, 1, 12288, 2048, 2, 160}, - {4, 8, 1, 12288, 2048, 2, 128}, - {4, 1, 1, 12288, 3072, 2, 168}, - {4, 2, 1, 12288, 3072, 2, 168}, - {4, 3, 1, 12288, 3072, 2, 168}, - {4, 4, 1, 12288, 3072, 2, 168}, - {4, 5, 1, 12288, 3072, 2, 168}, - {4, 6, 1, 12288, 3072, 2, 168}, - {4, 7, 1, 12288, 3072, 2, 168}, - {4, 8, 1, 12288, 3072, 1, 168}, - {4, 1, 1, 12288, 4096, 2, 170}, - {4, 2, 1, 12288, 4096, 2, 168}, - {4, 3, 1, 12288, 4096, 2, 170}, - {4, 4, 1, 12288, 4096, 2, 160}, - {4, 5, 1, 12288, 4096, 2, 168}, - {4, 6, 1, 12288, 4096, 2, 160}, - {4, 7, 1, 12288, 4096, 2, 166}, - {4, 8, 1, 12288, 4096, 1, 160}, - {4, 1, 1, 12288, 5120, 3, 164}, - {4, 2, 1, 12288, 5120, 2, 164}, - {4, 3, 1, 12288, 5120, 2, 170}, - {4, 4, 1, 12288, 5120, 2, 160}, - {4, 5, 1, 12288, 5120, 3, 160}, - {4, 6, 1, 12288, 5120, 2, 160}, - {4, 7, 1, 12288, 5120, 2, 160}, - {4, 8, 1, 12288, 5120, 1, 160}, - {4, 1, 1, 12288, 8192, 3, 170}, - {4, 2, 1, 12288, 8192, 2, 170}, - {4, 3, 1, 12288, 8192, 3, 170}, - {4, 4, 1, 12288, 8192, 2, 170}, - {4, 5, 1, 12288, 8192, 3, 160}, - {4, 6, 1, 12288, 8192, 3, 128}, - {4, 7, 1, 12288, 8192, 3, 160}, - {4, 8, 1, 12288, 8192, 1, 160}, - {4, 1, 1, 12288, 12288, 3, 170}, - {4, 2, 1, 12288, 12288, 4, 170}, - {4, 3, 1, 12288, 12288, 3, 170}, - {4, 4, 1, 12288, 12288, 4, 168}, - {4, 5, 1, 12288, 12288, 3, 168}, - {4, 6, 1, 12288, 12288, 3, 144}, - {4, 7, 1, 12288, 12288, 3, 144}, - {4, 8, 1, 12288, 12288, 1, 162}, - {4, 1, 1, 12288, 14336, 3, 170}, - {4, 2, 1, 12288, 14336, 4, 170}, - {4, 3, 1, 12288, 14336, 3, 168}, - {4, 4, 1, 12288, 14336, 4, 168}, - {4, 5, 1, 12288, 14336, 3, 168}, - {4, 6, 1, 12288, 14336, 3, 168}, - {4, 7, 1, 12288, 14336, 4, 168}, - {4, 8, 1, 12288, 14336, 1, 168}, - {4, 1, 1, 12288, 16384, 3, 170}, - {4, 2, 1, 12288, 16384, 4, 170}, - {4, 3, 1, 12288, 16384, 3, 170}, - {4, 4, 1, 12288, 16384, 4, 160}, - {4, 5, 1, 12288, 16384, 4, 160}, - {4, 6, 1, 12288, 16384, 4, 128}, - {4, 7, 1, 12288, 16384, 4, 128}, - {4, 8, 1, 12288, 16384, 1, 168}, - {4, 1, 1, 12288, 24576, 3, 170}, - {4, 2, 1, 12288, 24576, 4, 170}, - {4, 3, 1, 12288, 24576, 3, 170}, - {4, 4, 1, 12288, 24576, 4, 162}, - {4, 5, 1, 12288, 24576, 4, 144}, - {4, 6, 1, 12288, 24576, 4, 144}, - {4, 7, 1, 12288, 24576, 4, 144}, - {4, 8, 1, 12288, 24576, 1, 168}, - {4, 1, 1, 12288, 51200, 3, 170}, - {4, 2, 1, 12288, 51200, 4, 170}, - {4, 3, 1, 12288, 51200, 3, 170}, - {4, 4, 1, 12288, 51200, 4, 164}, - {4, 5, 1, 12288, 51200, 4, 168}, - {4, 6, 1, 12288, 51200, 4, 160}, - {4, 7, 1, 12288, 51200, 4, 156}, - {4, 8, 1, 12288, 51200, 4, 150}, - {4, 1, 1, 12288, 128000, 3, 170}, - {4, 2, 1, 12288, 128000, 4, 170}, - {4, 3, 1, 12288, 128000, 3, 170}, - {4, 4, 1, 12288, 128000, 4, 160}, - {4, 5, 1, 12288, 128000, 4, 170}, - {4, 6, 1, 12288, 128000, 4, 158}, - {4, 7, 1, 12288, 128000, 4, 166}, - {4, 8, 1, 12288, 128000, 4, 156}, - {4, 1, 1, 14336, 512, 2, 48}, - {4, 2, 1, 14336, 512, 2, 56}, - {4, 3, 1, 14336, 512, 2, 48}, - {4, 4, 1, 14336, 512, 2, 48}, - {4, 5, 1, 14336, 512, 2, 56}, - {4, 6, 1, 14336, 512, 2, 56}, - {4, 7, 1, 14336, 512, 2, 64}, - {4, 8, 1, 14336, 512, 2, 56}, - {4, 1, 1, 14336, 1024, 2, 104}, - {4, 2, 1, 14336, 1024, 2, 104}, - {4, 3, 1, 14336, 1024, 2, 96}, - {4, 4, 1, 14336, 1024, 2, 104}, - {4, 5, 1, 14336, 1024, 2, 112}, - {4, 6, 1, 14336, 1024, 2, 106}, - {4, 7, 1, 14336, 1024, 2, 152}, - {4, 8, 1, 14336, 1024, 2, 112}, - {4, 1, 1, 14336, 2048, 2, 162}, - {4, 2, 1, 14336, 2048, 2, 164}, - {4, 3, 1, 14336, 2048, 2, 170}, - {4, 4, 1, 14336, 2048, 2, 160}, - {4, 5, 1, 14336, 2048, 2, 168}, - {4, 6, 1, 14336, 2048, 2, 160}, - {4, 7, 1, 14336, 2048, 2, 160}, - {4, 8, 1, 14336, 2048, 2, 128}, - {4, 1, 1, 14336, 3072, 2, 168}, - {4, 2, 1, 14336, 3072, 2, 168}, - {4, 3, 1, 14336, 3072, 2, 168}, - {4, 4, 1, 14336, 3072, 2, 168}, - {4, 5, 1, 14336, 3072, 2, 168}, - {4, 6, 1, 14336, 3072, 2, 168}, - {4, 7, 1, 14336, 3072, 2, 168}, - {4, 8, 1, 14336, 3072, 1, 168}, - {4, 1, 1, 14336, 4096, 2, 170}, - {4, 2, 1, 14336, 4096, 2, 170}, - {4, 3, 1, 14336, 4096, 2, 170}, - {4, 4, 1, 14336, 4096, 2, 168}, - {4, 5, 1, 14336, 4096, 2, 168}, - {4, 6, 1, 14336, 4096, 2, 160}, - {4, 7, 1, 14336, 4096, 2, 160}, - {4, 8, 1, 14336, 4096, 1, 160}, - {4, 1, 1, 14336, 5120, 3, 170}, - {4, 2, 1, 14336, 5120, 2, 170}, - {4, 3, 1, 14336, 5120, 2, 170}, - {4, 4, 1, 14336, 5120, 2, 160}, - {4, 5, 1, 14336, 5120, 3, 160}, - {4, 6, 1, 14336, 5120, 2, 160}, - {4, 7, 1, 14336, 5120, 2, 160}, - {4, 8, 1, 14336, 5120, 1, 160}, - {4, 1, 1, 14336, 8192, 3, 170}, - {4, 2, 1, 14336, 8192, 2, 170}, - {4, 3, 1, 14336, 8192, 3, 170}, - {4, 4, 1, 14336, 8192, 3, 170}, - {4, 5, 1, 14336, 8192, 3, 160}, - {4, 6, 1, 14336, 8192, 3, 128}, - {4, 7, 1, 14336, 8192, 3, 128}, - {4, 8, 1, 14336, 8192, 1, 160}, - {4, 1, 1, 14336, 12288, 3, 170}, - {4, 2, 1, 14336, 12288, 4, 170}, - {4, 3, 1, 14336, 12288, 3, 170}, - {4, 4, 1, 14336, 12288, 4, 168}, - {4, 5, 1, 14336, 12288, 4, 168}, - {4, 6, 1, 14336, 12288, 3, 144}, - {4, 7, 1, 14336, 12288, 4, 120}, - {4, 8, 1, 14336, 12288, 2, 144}, - {4, 1, 1, 14336, 14336, 3, 170}, - {4, 2, 1, 14336, 14336, 4, 170}, - {4, 3, 1, 14336, 14336, 3, 170}, - {4, 4, 1, 14336, 14336, 4, 168}, - {4, 5, 1, 14336, 14336, 3, 168}, - {4, 6, 1, 14336, 14336, 3, 168}, - {4, 7, 1, 14336, 14336, 4, 168}, - {4, 8, 1, 14336, 14336, 1, 168}, - {4, 1, 1, 14336, 16384, 3, 170}, - {4, 2, 1, 14336, 16384, 4, 170}, - {4, 3, 1, 14336, 16384, 3, 170}, - {4, 4, 1, 14336, 16384, 4, 160}, - {4, 5, 1, 14336, 16384, 4, 160}, - {4, 6, 1, 14336, 16384, 4, 128}, - {4, 7, 1, 14336, 16384, 4, 128}, - {4, 8, 1, 14336, 16384, 1, 168}, - {4, 1, 1, 14336, 24576, 3, 170}, - {4, 2, 1, 14336, 24576, 4, 170}, - {4, 3, 1, 14336, 24576, 3, 170}, - {4, 4, 1, 14336, 24576, 4, 168}, - {4, 5, 1, 14336, 24576, 4, 144}, - {4, 6, 1, 14336, 24576, 4, 144}, - {4, 7, 1, 14336, 24576, 4, 144}, - {4, 8, 1, 14336, 24576, 1, 168}, - {4, 1, 1, 14336, 51200, 3, 170}, - {4, 2, 1, 14336, 51200, 4, 170}, - {4, 3, 1, 14336, 51200, 3, 170}, - {4, 4, 1, 14336, 51200, 4, 162}, - {4, 5, 1, 14336, 51200, 4, 160}, - {4, 6, 1, 14336, 51200, 4, 160}, - {4, 7, 1, 14336, 51200, 4, 158}, - {4, 8, 1, 14336, 51200, 4, 150}, - {4, 1, 1, 14336, 128000, 3, 170}, - {4, 2, 1, 14336, 128000, 4, 170}, - {4, 3, 1, 14336, 128000, 3, 170}, - {4, 4, 1, 14336, 128000, 4, 168}, - {4, 5, 1, 14336, 128000, 4, 160}, - {4, 6, 1, 14336, 128000, 4, 164}, - {4, 7, 1, 14336, 128000, 3, 166}, - {4, 8, 1, 14336, 128000, 4, 156}, - {4, 1, 1, 16384, 512, 2, 56}, - {4, 2, 1, 16384, 512, 2, 56}, - {4, 3, 1, 16384, 512, 2, 48}, - {4, 4, 1, 16384, 512, 2, 52}, - {4, 5, 1, 16384, 512, 2, 62}, - {4, 6, 1, 16384, 512, 2, 56}, - {4, 7, 1, 16384, 512, 2, 64}, - {4, 8, 1, 16384, 512, 2, 72}, - {4, 1, 1, 16384, 1024, 2, 108}, - {4, 2, 1, 16384, 1024, 2, 104}, - {4, 3, 1, 16384, 1024, 2, 104}, - {4, 4, 1, 16384, 1024, 2, 100}, - {4, 5, 1, 16384, 1024, 2, 128}, - {4, 6, 1, 16384, 1024, 2, 128}, - {4, 7, 1, 16384, 1024, 2, 128}, - {4, 8, 1, 16384, 1024, 2, 100}, - {4, 1, 1, 16384, 2048, 2, 158}, - {4, 2, 1, 16384, 2048, 2, 164}, - {4, 3, 1, 16384, 2048, 2, 168}, - {4, 4, 1, 16384, 2048, 2, 144}, - {4, 5, 1, 16384, 2048, 2, 168}, - {4, 6, 1, 16384, 2048, 2, 152}, - {4, 7, 1, 16384, 2048, 2, 168}, - {4, 8, 1, 16384, 2048, 1, 160}, - {4, 1, 1, 16384, 3072, 2, 170}, - {4, 2, 1, 16384, 3072, 2, 170}, - {4, 3, 1, 16384, 3072, 2, 168}, - {4, 4, 1, 16384, 3072, 2, 170}, - {4, 5, 1, 16384, 3072, 2, 168}, - {4, 6, 1, 16384, 3072, 2, 168}, - {4, 7, 1, 16384, 3072, 2, 168}, - {4, 8, 1, 16384, 3072, 1, 168}, - {4, 1, 1, 16384, 4096, 2, 170}, - {4, 2, 1, 16384, 4096, 2, 168}, - {4, 3, 1, 16384, 4096, 2, 170}, - {4, 4, 1, 16384, 4096, 2, 170}, - {4, 5, 1, 16384, 4096, 2, 170}, - {4, 6, 1, 16384, 4096, 2, 160}, - {4, 7, 1, 16384, 4096, 2, 170}, - {4, 8, 1, 16384, 4096, 1, 160}, - {4, 1, 1, 16384, 5120, 3, 170}, - {4, 2, 1, 16384, 5120, 2, 170}, - {4, 3, 1, 16384, 5120, 2, 170}, - {4, 4, 1, 16384, 5120, 2, 170}, - {4, 5, 1, 16384, 5120, 3, 160}, - {4, 6, 1, 16384, 5120, 2, 160}, - {4, 7, 1, 16384, 5120, 3, 160}, - {4, 8, 1, 16384, 5120, 1, 160}, - {4, 1, 1, 16384, 8192, 3, 170}, - {4, 2, 1, 16384, 8192, 2, 170}, - {4, 3, 1, 16384, 8192, 3, 170}, - {4, 4, 1, 16384, 8192, 3, 170}, - {4, 5, 1, 16384, 8192, 3, 160}, - {4, 6, 1, 16384, 8192, 3, 128}, - {4, 7, 1, 16384, 8192, 3, 160}, - {4, 8, 1, 16384, 8192, 1, 160}, - {4, 1, 1, 16384, 12288, 3, 170}, - {4, 2, 1, 16384, 12288, 4, 170}, - {4, 3, 1, 16384, 12288, 3, 170}, - {4, 4, 1, 16384, 12288, 4, 168}, - {4, 5, 1, 16384, 12288, 4, 168}, - {4, 6, 1, 16384, 12288, 3, 144}, - {4, 7, 1, 16384, 12288, 4, 120}, - {4, 8, 1, 16384, 12288, 2, 150}, - {4, 1, 1, 16384, 14336, 3, 170}, - {4, 2, 1, 16384, 14336, 4, 170}, - {4, 3, 1, 16384, 14336, 3, 170}, - {4, 4, 1, 16384, 14336, 4, 168}, - {4, 5, 1, 16384, 14336, 3, 168}, - {4, 6, 1, 16384, 14336, 3, 168}, - {4, 7, 1, 16384, 14336, 4, 168}, - {4, 8, 1, 16384, 14336, 1, 168}, - {4, 1, 1, 16384, 16384, 3, 170}, - {4, 2, 1, 16384, 16384, 4, 170}, - {4, 3, 1, 16384, 16384, 3, 170}, - {4, 4, 1, 16384, 16384, 4, 160}, - {4, 5, 1, 16384, 16384, 4, 160}, - {4, 6, 1, 16384, 16384, 4, 128}, - {4, 7, 1, 16384, 16384, 4, 128}, - {4, 8, 1, 16384, 16384, 1, 168}, - {4, 1, 1, 16384, 24576, 3, 170}, - {4, 2, 1, 16384, 24576, 4, 170}, - {4, 3, 1, 16384, 24576, 3, 170}, - {4, 4, 1, 16384, 24576, 4, 168}, - {4, 5, 1, 16384, 24576, 4, 144}, - {4, 6, 1, 16384, 24576, 4, 144}, - {4, 7, 1, 16384, 24576, 4, 144}, - {4, 8, 1, 16384, 24576, 1, 168}, - {4, 1, 1, 16384, 51200, 3, 170}, - {4, 2, 1, 16384, 51200, 4, 170}, - {4, 3, 1, 16384, 51200, 3, 170}, - {4, 4, 1, 16384, 51200, 4, 166}, - {4, 5, 1, 16384, 51200, 4, 150}, - {4, 6, 1, 16384, 51200, 4, 160}, - {4, 7, 1, 16384, 51200, 4, 158}, - {4, 8, 1, 16384, 51200, 4, 150}, - {4, 1, 1, 16384, 128000, 3, 170}, - {4, 2, 1, 16384, 128000, 4, 170}, - {4, 3, 1, 16384, 128000, 3, 170}, - {4, 4, 1, 16384, 128000, 4, 170}, - {4, 5, 1, 16384, 128000, 4, 160}, - {4, 6, 1, 16384, 128000, 4, 164}, - {4, 7, 1, 16384, 128000, 4, 160}, - {4, 8, 1, 16384, 128000, 4, 156}, - {4, 1, 1, 24576, 512, 2, 64}, - {4, 2, 1, 24576, 512, 2, 70}, - {4, 3, 1, 24576, 512, 2, 70}, - {4, 4, 1, 24576, 512, 2, 56}, - {4, 5, 1, 24576, 512, 2, 74}, - {4, 6, 1, 24576, 512, 2, 72}, - {4, 7, 1, 24576, 512, 2, 88}, - {4, 8, 1, 24576, 512, 2, 72}, - {4, 1, 1, 24576, 1024, 2, 132}, - {4, 2, 1, 24576, 1024, 2, 144}, - {4, 3, 1, 24576, 1024, 2, 144}, - {4, 4, 1, 24576, 1024, 2, 120}, - {4, 5, 1, 24576, 1024, 2, 140}, - {4, 6, 1, 24576, 1024, 2, 144}, - {4, 7, 1, 24576, 1024, 2, 144}, - {4, 8, 1, 24576, 1024, 2, 120}, - {4, 1, 1, 24576, 2048, 2, 170}, - {4, 2, 1, 24576, 2048, 2, 170}, - {4, 3, 1, 24576, 2048, 2, 158}, - {4, 4, 1, 24576, 2048, 2, 162}, - {4, 5, 1, 24576, 2048, 2, 168}, - {4, 6, 1, 24576, 2048, 2, 160}, - {4, 7, 1, 24576, 2048, 2, 160}, - {4, 8, 1, 24576, 2048, 1, 160}, - {4, 1, 1, 24576, 3072, 2, 170}, - {4, 2, 1, 24576, 3072, 2, 170}, - {4, 3, 1, 24576, 3072, 2, 168}, - {4, 4, 1, 24576, 3072, 2, 168}, - {4, 5, 1, 24576, 3072, 2, 168}, - {4, 6, 1, 24576, 3072, 2, 168}, - {4, 7, 1, 24576, 3072, 2, 168}, - {4, 8, 1, 24576, 3072, 1, 168}, - {4, 1, 1, 24576, 4096, 2, 170}, - {4, 2, 1, 24576, 4096, 2, 170}, - {4, 3, 1, 24576, 4096, 3, 170}, - {4, 4, 1, 24576, 4096, 2, 170}, - {4, 5, 1, 24576, 4096, 3, 160}, - {4, 6, 1, 24576, 4096, 2, 160}, - {4, 7, 1, 24576, 4096, 3, 144}, - {4, 8, 1, 24576, 4096, 1, 160}, - {4, 1, 1, 24576, 5120, 3, 170}, - {4, 2, 1, 24576, 5120, 2, 170}, - {4, 3, 1, 24576, 5120, 3, 170}, - {4, 4, 1, 24576, 5120, 3, 170}, - {4, 5, 1, 24576, 5120, 3, 160}, - {4, 6, 1, 24576, 5120, 2, 160}, - {4, 7, 1, 24576, 5120, 3, 160}, - {4, 8, 1, 24576, 5120, 1, 160}, - {4, 1, 1, 24576, 8192, 3, 170}, - {4, 2, 1, 24576, 8192, 4, 170}, - {4, 3, 1, 24576, 8192, 3, 170}, - {4, 4, 1, 24576, 8192, 4, 160}, - {4, 5, 1, 24576, 8192, 3, 160}, - {4, 6, 1, 24576, 8192, 3, 128}, - {4, 7, 1, 24576, 8192, 3, 128}, - {4, 8, 1, 24576, 8192, 1, 160}, - {4, 1, 1, 24576, 12288, 3, 170}, - {4, 2, 1, 24576, 12288, 4, 170}, - {4, 3, 1, 24576, 12288, 3, 170}, - {4, 4, 1, 24576, 12288, 4, 168}, - {4, 5, 1, 24576, 12288, 4, 168}, - {4, 6, 1, 24576, 12288, 3, 144}, - {4, 7, 1, 24576, 12288, 4, 120}, - {4, 8, 1, 24576, 12288, 2, 156}, - {4, 1, 1, 24576, 14336, 3, 170}, - {4, 2, 1, 24576, 14336, 4, 170}, - {4, 3, 1, 24576, 14336, 3, 170}, - {4, 4, 1, 24576, 14336, 4, 168}, - {4, 5, 1, 24576, 14336, 3, 168}, - {4, 6, 1, 24576, 14336, 4, 168}, - {4, 7, 1, 24576, 14336, 4, 168}, - {4, 8, 1, 24576, 14336, 1, 168}, - {4, 1, 1, 24576, 16384, 3, 170}, - {4, 2, 1, 24576, 16384, 4, 170}, - {4, 3, 1, 24576, 16384, 3, 170}, - {4, 4, 1, 24576, 16384, 4, 166}, - {4, 5, 1, 24576, 16384, 4, 160}, - {4, 6, 1, 24576, 16384, 4, 128}, - {4, 7, 1, 24576, 16384, 4, 128}, - {4, 8, 1, 24576, 16384, 1, 168}, - {4, 1, 1, 24576, 24576, 3, 170}, - {4, 2, 1, 24576, 24576, 4, 170}, - {4, 3, 1, 24576, 24576, 3, 170}, - {4, 4, 1, 24576, 24576, 4, 168}, - {4, 5, 1, 24576, 24576, 4, 144}, - {4, 6, 1, 24576, 24576, 4, 144}, - {4, 7, 1, 24576, 24576, 4, 144}, - {4, 8, 1, 24576, 24576, 2, 168}, - {4, 1, 1, 24576, 51200, 3, 170}, - {4, 2, 1, 24576, 51200, 4, 170}, - {4, 3, 1, 24576, 51200, 3, 170}, - {4, 4, 1, 24576, 51200, 4, 166}, - {4, 5, 1, 24576, 51200, 4, 164}, - {4, 6, 1, 24576, 51200, 4, 160}, - {4, 7, 1, 24576, 51200, 4, 160}, - {4, 8, 1, 24576, 51200, 4, 150}, - {4, 1, 1, 24576, 128000, 3, 170}, - {4, 2, 1, 24576, 128000, 4, 170}, - {4, 3, 1, 24576, 128000, 3, 170}, - {4, 4, 1, 24576, 128000, 4, 170}, - {4, 5, 1, 24576, 128000, 4, 164}, - {4, 6, 1, 24576, 128000, 4, 170}, - {4, 7, 1, 24576, 128000, 4, 170}, - {4, 8, 1, 24576, 128000, 4, 156}, - {3, 1, 1, 128, 512, 1, 8}, - {3, 2, 1, 128, 512, 2, 4}, - {3, 3, 1, 128, 512, 1, 8}, - {3, 4, 1, 128, 512, 1, 8}, - {3, 5, 1, 128, 512, 1, 8}, - {3, 6, 1, 128, 512, 1, 8}, - {3, 7, 1, 128, 512, 1, 8}, - {3, 8, 1, 128, 512, 2, 8}, - {3, 1, 1, 128, 1024, 1, 16}, - {3, 2, 1, 128, 1024, 1, 16}, - {3, 3, 1, 128, 1024, 1, 16}, - {3, 4, 1, 128, 1024, 1, 16}, - {3, 5, 1, 128, 1024, 1, 16}, - {3, 6, 1, 128, 1024, 1, 16}, - {3, 7, 1, 128, 1024, 1, 16}, - {3, 8, 1, 128, 1024, 1, 16}, - {3, 1, 1, 128, 2048, 1, 32}, - {3, 2, 1, 128, 2048, 1, 32}, - {3, 3, 1, 128, 2048, 1, 32}, - {3, 4, 1, 128, 2048, 1, 32}, - {3, 5, 1, 128, 2048, 1, 32}, - {3, 6, 1, 128, 2048, 1, 32}, - {3, 7, 1, 128, 2048, 1, 32}, - {3, 8, 1, 128, 2048, 1, 32}, - {3, 1, 1, 128, 3072, 1, 48}, - {3, 2, 1, 128, 3072, 1, 48}, - {3, 3, 1, 128, 3072, 1, 48}, - {3, 4, 1, 128, 3072, 1, 48}, - {3, 5, 1, 128, 3072, 1, 48}, - {3, 6, 1, 128, 3072, 1, 48}, - {3, 7, 1, 128, 3072, 1, 48}, - {3, 8, 1, 128, 3072, 1, 48}, - {3, 1, 1, 128, 4096, 1, 64}, - {3, 2, 1, 128, 4096, 1, 64}, - {3, 3, 1, 128, 4096, 1, 64}, - {3, 4, 1, 128, 4096, 1, 64}, - {3, 5, 1, 128, 4096, 1, 64}, - {3, 6, 1, 128, 4096, 1, 64}, - {3, 7, 1, 128, 4096, 1, 64}, - {3, 8, 1, 128, 4096, 1, 64}, - {3, 1, 1, 128, 5120, 1, 40}, - {3, 2, 1, 128, 5120, 1, 80}, - {3, 3, 1, 128, 5120, 1, 80}, - {3, 4, 1, 128, 5120, 1, 80}, - {3, 5, 1, 128, 5120, 1, 80}, - {3, 6, 1, 128, 5120, 1, 80}, - {3, 7, 1, 128, 5120, 1, 80}, - {3, 8, 1, 128, 5120, 1, 80}, - {3, 1, 1, 128, 8192, 1, 128}, - {3, 2, 1, 128, 8192, 1, 128}, - {3, 3, 1, 128, 8192, 1, 128}, - {3, 4, 1, 128, 8192, 1, 128}, - {3, 5, 1, 128, 8192, 1, 128}, - {3, 6, 1, 128, 8192, 1, 128}, - {3, 7, 1, 128, 8192, 1, 128}, - {3, 8, 1, 128, 8192, 1, 128}, - {3, 1, 1, 128, 12288, 1, 96}, - {3, 2, 1, 128, 12288, 1, 96}, - {3, 3, 1, 128, 12288, 1, 96}, - {3, 4, 1, 128, 12288, 1, 96}, - {3, 5, 1, 128, 12288, 1, 96}, - {3, 6, 1, 128, 12288, 1, 96}, - {3, 7, 1, 128, 12288, 1, 96}, - {3, 8, 1, 128, 12288, 1, 96}, - {3, 1, 1, 128, 14336, 1, 112}, - {3, 2, 1, 128, 14336, 1, 112}, - {3, 3, 1, 128, 14336, 1, 112}, - {3, 4, 1, 128, 14336, 1, 112}, - {3, 5, 1, 128, 14336, 1, 112}, - {3, 6, 1, 128, 14336, 1, 112}, - {3, 7, 1, 128, 14336, 1, 112}, - {3, 8, 1, 128, 14336, 1, 112}, - {3, 1, 1, 128, 16384, 1, 128}, - {3, 2, 1, 128, 16384, 1, 128}, - {3, 3, 1, 128, 16384, 1, 128}, - {3, 4, 1, 128, 16384, 1, 128}, - {3, 5, 1, 128, 16384, 1, 128}, - {3, 6, 1, 128, 16384, 1, 128}, - {3, 7, 1, 128, 16384, 1, 128}, - {3, 8, 1, 128, 16384, 1, 128}, - {3, 1, 1, 128, 24576, 3, 96}, - {3, 2, 1, 128, 24576, 3, 96}, - {3, 3, 1, 128, 24576, 3, 96}, - {3, 4, 1, 128, 24576, 3, 96}, - {3, 5, 1, 128, 24576, 1, 128}, - {3, 6, 1, 128, 24576, 1, 128}, - {3, 7, 1, 128, 24576, 4, 88}, - {3, 8, 1, 128, 24576, 4, 88}, - {3, 1, 1, 128, 51200, 4, 128}, - {3, 2, 1, 128, 51200, 4, 116}, - {3, 3, 1, 128, 51200, 4, 116}, - {3, 4, 1, 128, 51200, 4, 116}, - {3, 5, 1, 128, 51200, 4, 112}, - {3, 6, 1, 128, 51200, 4, 100}, - {3, 7, 1, 128, 51200, 4, 80}, - {3, 8, 1, 128, 51200, 4, 80}, - {3, 1, 1, 128, 128000, 4, 128}, - {3, 2, 1, 128, 128000, 4, 128}, - {3, 3, 1, 128, 128000, 4, 128}, - {3, 4, 1, 128, 128000, 4, 128}, - {3, 5, 1, 128, 128000, 4, 126}, - {3, 6, 1, 128, 128000, 4, 126}, - {3, 7, 1, 128, 128000, 4, 128}, - {3, 8, 1, 128, 128000, 4, 128}, - {3, 1, 1, 256, 512, 2, 8}, - {3, 2, 1, 256, 512, 2, 8}, - {3, 3, 1, 256, 512, 2, 8}, - {3, 4, 1, 256, 512, 2, 8}, - {3, 5, 1, 256, 512, 2, 8}, - {3, 6, 1, 256, 512, 2, 8}, - {3, 7, 1, 256, 512, 2, 8}, - {3, 8, 1, 256, 512, 2, 8}, - {3, 1, 1, 256, 1024, 2, 16}, - {3, 2, 1, 256, 1024, 2, 16}, - {3, 3, 1, 256, 1024, 2, 16}, - {3, 4, 1, 256, 1024, 2, 16}, - {3, 5, 1, 256, 1024, 2, 16}, - {3, 6, 1, 256, 1024, 2, 16}, - {3, 7, 1, 256, 1024, 2, 16}, - {3, 8, 1, 256, 1024, 2, 16}, - {3, 1, 1, 256, 2048, 2, 32}, - {3, 2, 1, 256, 2048, 2, 32}, - {3, 3, 1, 256, 2048, 1, 32}, - {3, 4, 1, 256, 2048, 2, 32}, - {3, 5, 1, 256, 2048, 1, 32}, - {3, 6, 1, 256, 2048, 1, 32}, - {3, 7, 1, 256, 2048, 2, 32}, - {3, 8, 1, 256, 2048, 1, 32}, - {3, 1, 1, 256, 3072, 2, 48}, - {3, 2, 1, 256, 3072, 2, 48}, - {3, 3, 1, 256, 3072, 2, 48}, - {3, 4, 1, 256, 3072, 2, 48}, - {3, 5, 1, 256, 3072, 1, 48}, - {3, 6, 1, 256, 3072, 1, 48}, - {3, 7, 1, 256, 3072, 1, 48}, - {3, 8, 1, 256, 3072, 1, 48}, - {3, 1, 1, 256, 4096, 2, 64}, - {3, 2, 1, 256, 4096, 1, 64}, - {3, 3, 1, 256, 4096, 1, 64}, - {3, 4, 1, 256, 4096, 2, 64}, - {3, 5, 1, 256, 4096, 1, 64}, - {3, 6, 1, 256, 4096, 1, 64}, - {3, 7, 1, 256, 4096, 1, 64}, - {3, 8, 1, 256, 4096, 1, 64}, - {3, 1, 1, 256, 5120, 2, 80}, - {3, 2, 1, 256, 5120, 1, 80}, - {3, 3, 1, 256, 5120, 1, 80}, - {3, 4, 1, 256, 5120, 2, 80}, - {3, 5, 1, 256, 5120, 1, 80}, - {3, 6, 1, 256, 5120, 1, 80}, - {3, 7, 1, 256, 5120, 1, 80}, - {3, 8, 1, 256, 5120, 1, 80}, - {3, 1, 1, 256, 8192, 2, 128}, - {3, 2, 1, 256, 8192, 2, 128}, - {3, 3, 1, 256, 8192, 1, 128}, - {3, 4, 1, 256, 8192, 1, 128}, - {3, 5, 1, 256, 8192, 1, 128}, - {3, 6, 1, 256, 8192, 1, 128}, - {3, 7, 1, 256, 8192, 1, 128}, - {3, 8, 1, 256, 8192, 1, 128}, - {3, 1, 1, 256, 12288, 2, 96}, - {3, 2, 1, 256, 12288, 2, 128}, - {3, 3, 1, 256, 12288, 1, 128}, - {3, 4, 1, 256, 12288, 2, 96}, - {3, 5, 1, 256, 12288, 1, 128}, - {3, 6, 1, 256, 12288, 2, 116}, - {3, 7, 1, 256, 12288, 2, 116}, - {3, 8, 1, 256, 12288, 1, 116}, - {3, 1, 1, 256, 14336, 2, 112}, - {3, 2, 1, 256, 14336, 2, 112}, - {3, 3, 1, 256, 14336, 2, 112}, - {3, 4, 1, 256, 14336, 2, 112}, - {3, 5, 1, 256, 14336, 1, 112}, - {3, 6, 1, 256, 14336, 1, 112}, - {3, 7, 1, 256, 14336, 1, 112}, - {3, 8, 1, 256, 14336, 1, 112}, - {3, 1, 1, 256, 16384, 2, 128}, - {3, 2, 1, 256, 16384, 2, 128}, - {3, 3, 1, 256, 16384, 2, 128}, - {3, 4, 1, 256, 16384, 1, 128}, - {3, 5, 1, 256, 16384, 1, 128}, - {3, 6, 1, 256, 16384, 1, 128}, - {3, 7, 1, 256, 16384, 1, 128}, - {3, 8, 1, 256, 16384, 2, 116}, - {3, 1, 1, 256, 24576, 3, 96}, - {3, 2, 1, 256, 24576, 3, 96}, - {3, 3, 1, 256, 24576, 3, 96}, - {3, 4, 1, 256, 24576, 2, 128}, - {3, 5, 1, 256, 24576, 4, 88}, - {3, 6, 1, 256, 24576, 1, 128}, - {3, 7, 1, 256, 24576, 1, 128}, - {3, 8, 1, 256, 24576, 1, 128}, - {3, 1, 1, 256, 51200, 4, 128}, - {3, 2, 1, 256, 51200, 4, 128}, - {3, 3, 1, 256, 51200, 4, 128}, - {3, 4, 1, 256, 51200, 4, 112}, - {3, 5, 1, 256, 51200, 4, 100}, - {3, 6, 1, 256, 51200, 4, 80}, - {3, 7, 1, 256, 51200, 4, 80}, - {3, 8, 1, 256, 51200, 1, 120}, - {3, 1, 1, 256, 128000, 4, 128}, - {3, 2, 1, 256, 128000, 4, 128}, - {3, 3, 1, 256, 128000, 4, 128}, - {3, 4, 1, 256, 128000, 4, 128}, - {3, 5, 1, 256, 128000, 4, 126}, - {3, 6, 1, 256, 128000, 4, 126}, - {3, 7, 1, 256, 128000, 4, 80}, - {3, 8, 1, 256, 128000, 1, 126}, - {3, 1, 1, 512, 512, 2, 8}, - {3, 2, 1, 512, 512, 2, 8}, - {3, 3, 1, 512, 512, 2, 16}, - {3, 4, 1, 512, 512, 2, 8}, - {3, 5, 1, 512, 512, 2, 16}, - {3, 6, 1, 512, 512, 2, 16}, - {3, 7, 1, 512, 512, 2, 16}, - {3, 8, 1, 512, 512, 2, 16}, - {3, 1, 1, 512, 1024, 2, 16}, - {3, 2, 1, 512, 1024, 2, 16}, - {3, 3, 1, 512, 1024, 2, 32}, - {3, 4, 1, 512, 1024, 2, 16}, - {3, 5, 1, 512, 1024, 2, 32}, - {3, 6, 1, 512, 1024, 2, 32}, - {3, 7, 1, 512, 1024, 2, 32}, - {3, 8, 1, 512, 1024, 2, 32}, - {3, 1, 1, 512, 2048, 2, 32}, - {3, 2, 1, 512, 2048, 2, 32}, - {3, 3, 1, 512, 2048, 1, 64}, - {3, 4, 1, 512, 2048, 2, 32}, - {3, 5, 1, 512, 2048, 1, 64}, - {3, 6, 1, 512, 2048, 1, 64}, - {3, 7, 1, 512, 2048, 1, 64}, - {3, 8, 1, 512, 2048, 1, 64}, - {3, 1, 1, 512, 3072, 2, 48}, - {3, 2, 1, 512, 3072, 2, 48}, - {3, 3, 1, 512, 3072, 1, 72}, - {3, 4, 1, 512, 3072, 2, 48}, - {3, 5, 1, 512, 3072, 1, 96}, - {3, 6, 1, 512, 3072, 1, 72}, - {3, 7, 1, 512, 3072, 1, 96}, - {3, 8, 1, 512, 3072, 1, 96}, - {3, 1, 1, 512, 4096, 2, 64}, - {3, 2, 1, 512, 4096, 2, 64}, - {3, 3, 1, 512, 4096, 1, 96}, - {3, 4, 1, 512, 4096, 2, 64}, - {3, 5, 1, 512, 4096, 1, 128}, - {3, 6, 1, 512, 4096, 1, 128}, - {3, 7, 1, 512, 4096, 1, 128}, - {3, 8, 1, 512, 4096, 1, 94}, - {3, 1, 1, 512, 5120, 2, 80}, - {3, 2, 1, 512, 5120, 2, 80}, - {3, 3, 1, 512, 5120, 1, 120}, - {3, 4, 1, 512, 5120, 2, 80}, - {3, 5, 1, 512, 5120, 1, 120}, - {3, 6, 1, 512, 5120, 1, 120}, - {3, 7, 1, 512, 5120, 1, 120}, - {3, 8, 1, 512, 5120, 2, 112}, - {3, 1, 1, 512, 8192, 2, 128}, - {3, 2, 1, 512, 8192, 2, 128}, - {3, 3, 1, 512, 8192, 2, 128}, - {3, 4, 1, 512, 8192, 2, 116}, - {3, 5, 1, 512, 8192, 2, 116}, - {3, 6, 1, 512, 8192, 1, 128}, - {3, 7, 1, 512, 8192, 2, 116}, - {3, 8, 1, 512, 8192, 1, 116}, - {3, 1, 1, 512, 12288, 2, 128}, - {3, 2, 1, 512, 12288, 2, 128}, - {3, 3, 1, 512, 12288, 1, 128}, - {3, 4, 1, 512, 12288, 2, 116}, - {3, 5, 1, 512, 12288, 2, 116}, - {3, 6, 1, 512, 12288, 1, 128}, - {3, 7, 1, 512, 12288, 2, 96}, - {3, 8, 1, 512, 12288, 1, 96}, - {3, 1, 1, 512, 14336, 2, 112}, - {3, 2, 1, 512, 14336, 2, 112}, - {3, 3, 1, 512, 14336, 3, 112}, - {3, 4, 1, 512, 14336, 2, 112}, - {3, 5, 1, 512, 14336, 2, 112}, - {3, 6, 1, 512, 14336, 1, 112}, - {3, 7, 1, 512, 14336, 1, 112}, - {3, 8, 1, 512, 14336, 1, 112}, - {3, 1, 1, 512, 16384, 2, 128}, - {3, 2, 1, 512, 16384, 2, 128}, - {3, 3, 1, 512, 16384, 3, 128}, - {3, 4, 1, 512, 16384, 2, 128}, - {3, 5, 1, 512, 16384, 1, 128}, - {3, 6, 1, 512, 16384, 1, 128}, - {3, 7, 1, 512, 16384, 1, 128}, - {3, 8, 1, 512, 16384, 1, 128}, - {3, 1, 1, 512, 24576, 3, 128}, - {3, 2, 1, 512, 24576, 3, 128}, - {3, 3, 1, 512, 24576, 3, 128}, - {3, 4, 1, 512, 24576, 2, 128}, - {3, 5, 1, 512, 24576, 2, 128}, - {3, 6, 1, 512, 24576, 1, 128}, - {3, 7, 1, 512, 24576, 1, 128}, - {3, 8, 1, 512, 24576, 1, 128}, - {3, 1, 1, 512, 51200, 4, 128}, - {3, 2, 1, 512, 51200, 4, 128}, - {3, 3, 1, 512, 51200, 4, 128}, - {3, 4, 1, 512, 51200, 4, 100}, - {3, 5, 1, 512, 51200, 4, 104}, - {3, 6, 1, 512, 51200, 4, 80}, - {3, 7, 1, 512, 51200, 4, 100}, - {3, 8, 1, 512, 51200, 1, 120}, - {3, 1, 1, 512, 128000, 4, 128}, - {3, 2, 1, 512, 128000, 3, 128}, - {3, 3, 1, 512, 128000, 4, 128}, - {3, 4, 1, 512, 128000, 4, 128}, - {3, 5, 1, 512, 128000, 4, 128}, - {3, 6, 1, 512, 128000, 4, 128}, - {3, 7, 1, 512, 128000, 4, 80}, - {3, 8, 1, 512, 128000, 1, 126}, - {3, 1, 1, 1024, 512, 2, 16}, - {3, 2, 1, 1024, 512, 2, 16}, - {3, 3, 1, 1024, 512, 2, 16}, - {3, 4, 1, 1024, 512, 2, 16}, - {3, 5, 1, 1024, 512, 2, 16}, - {3, 6, 1, 1024, 512, 2, 16}, - {3, 7, 1, 1024, 512, 2, 16}, - {3, 8, 1, 1024, 512, 2, 16}, - {3, 1, 1, 1024, 1024, 2, 32}, - {3, 2, 1, 1024, 1024, 2, 32}, - {3, 3, 1, 1024, 1024, 2, 32}, - {3, 4, 1, 1024, 1024, 2, 32}, - {3, 5, 1, 1024, 1024, 2, 32}, - {3, 6, 1, 1024, 1024, 2, 32}, - {3, 7, 1, 1024, 1024, 2, 32}, - {3, 8, 1, 1024, 1024, 2, 32}, - {3, 1, 1, 1024, 2048, 2, 64}, - {3, 2, 1, 1024, 2048, 2, 64}, - {3, 3, 1, 1024, 2048, 2, 64}, - {3, 4, 1, 1024, 2048, 2, 64}, - {3, 5, 1, 1024, 2048, 2, 64}, - {3, 6, 1, 1024, 2048, 2, 64}, - {3, 7, 1, 1024, 2048, 2, 64}, - {3, 8, 1, 1024, 2048, 1, 78}, - {3, 1, 1, 1024, 3072, 2, 96}, - {3, 2, 1, 1024, 3072, 2, 96}, - {3, 3, 1, 1024, 3072, 2, 96}, - {3, 4, 1, 1024, 3072, 2, 96}, - {3, 5, 1, 1024, 3072, 2, 88}, - {3, 6, 1, 1024, 3072, 2, 88}, - {3, 7, 1, 1024, 3072, 2, 88}, - {3, 8, 1, 1024, 3072, 2, 88}, - {3, 1, 1, 1024, 4096, 2, 128}, - {3, 2, 1, 1024, 4096, 2, 128}, - {3, 3, 1, 1024, 4096, 2, 128}, - {3, 4, 1, 1024, 4096, 2, 120}, - {3, 5, 1, 1024, 4096, 2, 116}, - {3, 6, 1, 1024, 4096, 1, 124}, - {3, 7, 1, 1024, 4096, 2, 116}, - {3, 8, 1, 1024, 4096, 1, 116}, - {3, 1, 1, 1024, 5120, 2, 120}, - {3, 2, 1, 1024, 5120, 2, 120}, - {3, 3, 1, 1024, 5120, 2, 112}, - {3, 4, 1, 1024, 5120, 2, 112}, - {3, 5, 1, 1024, 5120, 2, 112}, - {3, 6, 1, 1024, 5120, 2, 112}, - {3, 7, 1, 1024, 5120, 2, 112}, - {3, 8, 1, 1024, 5120, 1, 104}, - {3, 1, 1, 1024, 8192, 2, 128}, - {3, 2, 1, 1024, 8192, 2, 128}, - {3, 3, 1, 1024, 8192, 2, 128}, - {3, 4, 1, 1024, 8192, 2, 116}, - {3, 5, 1, 1024, 8192, 2, 124}, - {3, 6, 1, 1024, 8192, 1, 128}, - {3, 7, 1, 1024, 8192, 1, 128}, - {3, 8, 1, 1024, 8192, 1, 124}, - {3, 1, 1, 1024, 12288, 3, 128}, - {3, 2, 1, 1024, 12288, 3, 128}, - {3, 3, 1, 1024, 12288, 3, 128}, - {3, 4, 1, 1024, 12288, 2, 128}, - {3, 5, 1, 1024, 12288, 2, 128}, - {3, 6, 1, 1024, 12288, 1, 128}, - {3, 7, 1, 1024, 12288, 2, 96}, - {3, 8, 1, 1024, 12288, 1, 96}, - {3, 1, 1, 1024, 14336, 3, 128}, - {3, 2, 1, 1024, 14336, 3, 128}, - {3, 3, 1, 1024, 14336, 3, 128}, - {3, 4, 1, 1024, 14336, 2, 128}, - {3, 5, 1, 1024, 14336, 2, 112}, - {3, 6, 1, 1024, 14336, 1, 128}, - {3, 7, 1, 1024, 14336, 1, 128}, - {3, 8, 1, 1024, 14336, 1, 110}, - {3, 1, 1, 1024, 16384, 3, 128}, - {3, 2, 1, 1024, 16384, 3, 128}, - {3, 3, 1, 1024, 16384, 3, 128}, - {3, 4, 1, 1024, 16384, 2, 128}, - {3, 5, 1, 1024, 16384, 2, 128}, - {3, 6, 1, 1024, 16384, 1, 128}, - {3, 7, 1, 1024, 16384, 1, 128}, - {3, 8, 1, 1024, 16384, 1, 126}, - {3, 1, 1, 1024, 24576, 3, 128}, - {3, 2, 1, 1024, 24576, 3, 128}, - {3, 3, 1, 1024, 24576, 3, 128}, - {3, 4, 1, 1024, 24576, 2, 128}, - {3, 5, 1, 1024, 24576, 4, 88}, - {3, 6, 1, 1024, 24576, 1, 128}, - {3, 7, 1, 1024, 24576, 4, 64}, - {3, 8, 1, 1024, 24576, 1, 128}, - {3, 1, 1, 1024, 51200, 3, 128}, - {3, 2, 1, 1024, 51200, 3, 128}, - {3, 3, 1, 1024, 51200, 4, 128}, - {3, 4, 1, 1024, 51200, 4, 100}, - {3, 5, 1, 1024, 51200, 4, 100}, - {3, 6, 1, 1024, 51200, 4, 100}, - {3, 7, 1, 1024, 51200, 4, 100}, - {3, 8, 1, 1024, 51200, 4, 100}, - {3, 1, 1, 1024, 128000, 3, 128}, - {3, 2, 1, 1024, 128000, 3, 128}, - {3, 3, 1, 1024, 128000, 3, 128}, - {3, 4, 1, 1024, 128000, 4, 128}, - {3, 5, 1, 1024, 128000, 4, 126}, - {3, 6, 1, 1024, 128000, 4, 126}, - {3, 7, 1, 1024, 128000, 4, 100}, - {3, 8, 1, 1024, 128000, 4, 88}, - {3, 1, 1, 2048, 512, 2, 20}, - {3, 2, 1, 2048, 512, 2, 20}, - {3, 3, 1, 2048, 512, 2, 24}, - {3, 4, 1, 2048, 512, 2, 20}, - {3, 5, 1, 2048, 512, 2, 24}, - {3, 6, 1, 2048, 512, 2, 24}, - {3, 7, 1, 2048, 512, 2, 24}, - {3, 8, 1, 2048, 512, 2, 24}, - {3, 1, 1, 2048, 1024, 2, 40}, - {3, 2, 1, 2048, 1024, 2, 40}, - {3, 3, 1, 2048, 1024, 2, 48}, - {3, 4, 1, 2048, 1024, 2, 40}, - {3, 5, 1, 2048, 1024, 2, 48}, - {3, 6, 1, 2048, 1024, 2, 40}, - {3, 7, 1, 2048, 1024, 2, 48}, - {3, 8, 1, 2048, 1024, 2, 40}, - {3, 1, 1, 2048, 2048, 2, 80}, - {3, 2, 1, 2048, 2048, 2, 80}, - {3, 3, 1, 2048, 2048, 2, 96}, - {3, 4, 1, 2048, 2048, 2, 80}, - {3, 5, 1, 2048, 2048, 2, 80}, - {3, 6, 1, 2048, 2048, 2, 88}, - {3, 7, 1, 2048, 2048, 2, 88}, - {3, 8, 1, 2048, 2048, 2, 88}, - {3, 1, 1, 2048, 3072, 2, 120}, - {3, 2, 1, 2048, 3072, 2, 120}, - {3, 3, 1, 2048, 3072, 2, 112}, - {3, 4, 1, 2048, 3072, 2, 112}, - {3, 5, 1, 2048, 3072, 2, 112}, - {3, 6, 1, 2048, 3072, 1, 112}, - {3, 7, 1, 2048, 3072, 2, 96}, - {3, 8, 1, 2048, 3072, 1, 94}, - {3, 1, 1, 2048, 4096, 2, 128}, - {3, 2, 1, 2048, 4096, 2, 128}, - {3, 3, 1, 2048, 4096, 2, 128}, - {3, 4, 1, 2048, 4096, 2, 116}, - {3, 5, 1, 2048, 4096, 2, 124}, - {3, 6, 1, 2048, 4096, 1, 126}, - {3, 7, 1, 2048, 4096, 1, 126}, - {3, 8, 1, 2048, 4096, 1, 98}, - {3, 1, 1, 2048, 5120, 2, 120}, - {3, 2, 1, 2048, 5120, 2, 128}, - {3, 3, 1, 2048, 5120, 2, 128}, - {3, 4, 1, 2048, 5120, 2, 116}, - {3, 5, 1, 2048, 5120, 2, 118}, - {3, 6, 1, 2048, 5120, 1, 126}, - {3, 7, 1, 2048, 5120, 1, 126}, - {3, 8, 1, 2048, 5120, 1, 112}, - {3, 1, 1, 2048, 8192, 2, 128}, - {3, 2, 1, 2048, 8192, 3, 128}, - {3, 3, 1, 2048, 8192, 3, 128}, - {3, 4, 1, 2048, 8192, 2, 126}, - {3, 5, 1, 2048, 8192, 2, 124}, - {3, 6, 1, 2048, 8192, 1, 126}, - {3, 7, 1, 2048, 8192, 1, 128}, - {3, 8, 1, 2048, 8192, 1, 116}, - {3, 1, 1, 2048, 12288, 3, 128}, - {3, 2, 1, 2048, 12288, 3, 128}, - {3, 3, 1, 2048, 12288, 3, 128}, - {3, 4, 1, 2048, 12288, 2, 124}, - {3, 5, 1, 2048, 12288, 2, 122}, - {3, 6, 1, 2048, 12288, 1, 128}, - {3, 7, 1, 2048, 12288, 1, 126}, - {3, 8, 1, 2048, 12288, 1, 96}, - {3, 1, 1, 2048, 14336, 3, 128}, - {3, 2, 1, 2048, 14336, 3, 128}, - {3, 3, 1, 2048, 14336, 3, 128}, - {3, 4, 1, 2048, 14336, 2, 112}, - {3, 5, 1, 2048, 14336, 2, 112}, - {3, 6, 1, 2048, 14336, 1, 126}, - {3, 7, 1, 2048, 14336, 1, 128}, - {3, 8, 1, 2048, 14336, 1, 110}, - {3, 1, 1, 2048, 16384, 3, 128}, - {3, 2, 1, 2048, 16384, 3, 128}, - {3, 3, 1, 2048, 16384, 3, 128}, - {3, 4, 1, 2048, 16384, 2, 126}, - {3, 5, 1, 2048, 16384, 2, 128}, - {3, 6, 1, 2048, 16384, 1, 128}, - {3, 7, 1, 2048, 16384, 1, 128}, - {3, 8, 1, 2048, 16384, 1, 124}, - {3, 1, 1, 2048, 24576, 3, 128}, - {3, 2, 1, 2048, 24576, 3, 128}, - {3, 3, 1, 2048, 24576, 3, 128}, - {3, 4, 1, 2048, 24576, 4, 96}, - {3, 5, 1, 2048, 24576, 4, 98}, - {3, 6, 1, 2048, 24576, 1, 128}, - {3, 7, 1, 2048, 24576, 4, 98}, - {3, 8, 1, 2048, 24576, 1, 96}, - {3, 1, 1, 2048, 51200, 3, 128}, - {3, 2, 1, 2048, 51200, 3, 128}, - {3, 3, 1, 2048, 51200, 3, 126}, - {3, 4, 1, 2048, 51200, 4, 126}, - {3, 5, 1, 2048, 51200, 4, 100}, - {3, 6, 1, 2048, 51200, 4, 104}, - {3, 7, 1, 2048, 51200, 4, 100}, - {3, 8, 1, 2048, 51200, 4, 100}, - {3, 1, 1, 2048, 128000, 3, 128}, - {3, 2, 1, 2048, 128000, 3, 128}, - {3, 3, 1, 2048, 128000, 3, 126}, - {3, 4, 1, 2048, 128000, 4, 126}, - {3, 5, 1, 2048, 128000, 4, 128}, - {3, 6, 1, 2048, 128000, 4, 126}, - {3, 7, 1, 2048, 128000, 4, 100}, - {3, 8, 1, 2048, 128000, 4, 128}, - {3, 1, 1, 3072, 512, 2, 24}, - {3, 2, 1, 3072, 512, 2, 24}, - {3, 3, 1, 3072, 512, 2, 32}, - {3, 4, 1, 3072, 512, 2, 24}, - {3, 5, 1, 3072, 512, 2, 32}, - {3, 6, 1, 3072, 512, 2, 32}, - {3, 7, 1, 3072, 512, 2, 32}, - {3, 8, 1, 3072, 512, 2, 32}, - {3, 1, 1, 3072, 1024, 2, 48}, - {3, 2, 1, 3072, 1024, 2, 48}, - {3, 3, 1, 3072, 1024, 2, 64}, - {3, 4, 1, 3072, 1024, 2, 48}, - {3, 5, 1, 3072, 1024, 2, 56}, - {3, 6, 1, 3072, 1024, 2, 48}, - {3, 7, 1, 3072, 1024, 2, 56}, - {3, 8, 1, 3072, 1024, 2, 56}, - {3, 1, 1, 3072, 2048, 2, 96}, - {3, 2, 1, 3072, 2048, 2, 96}, - {3, 3, 1, 3072, 2048, 2, 128}, - {3, 4, 1, 3072, 2048, 2, 88}, - {3, 5, 1, 3072, 2048, 2, 96}, - {3, 6, 1, 3072, 2048, 2, 96}, - {3, 7, 1, 3072, 2048, 2, 96}, - {3, 8, 1, 3072, 2048, 1, 88}, - {3, 1, 1, 3072, 3072, 2, 128}, - {3, 2, 1, 3072, 3072, 2, 116}, - {3, 3, 1, 3072, 3072, 2, 116}, - {3, 4, 1, 3072, 3072, 2, 116}, - {3, 5, 1, 3072, 3072, 2, 118}, - {3, 6, 1, 3072, 3072, 1, 118}, - {3, 7, 1, 3072, 3072, 2, 94}, - {3, 8, 1, 3072, 3072, 1, 96}, - {3, 1, 1, 3072, 4096, 2, 128}, - {3, 2, 1, 3072, 4096, 2, 128}, - {3, 3, 1, 3072, 4096, 2, 128}, - {3, 4, 1, 3072, 4096, 2, 128}, - {3, 5, 1, 3072, 4096, 2, 128}, - {3, 6, 1, 3072, 4096, 1, 124}, - {3, 7, 1, 3072, 4096, 1, 128}, - {3, 8, 1, 3072, 4096, 1, 98}, - {3, 1, 1, 3072, 5120, 2, 128}, - {3, 2, 1, 3072, 5120, 2, 128}, - {3, 3, 1, 3072, 5120, 3, 128}, - {3, 4, 1, 3072, 5120, 2, 124}, - {3, 5, 1, 3072, 5120, 2, 120}, - {3, 6, 1, 3072, 5120, 1, 126}, - {3, 7, 1, 3072, 5120, 1, 128}, - {3, 8, 1, 3072, 5120, 1, 98}, - {3, 1, 1, 3072, 8192, 3, 128}, - {3, 2, 1, 3072, 8192, 3, 128}, - {3, 3, 1, 3072, 8192, 3, 128}, - {3, 4, 1, 3072, 8192, 2, 122}, - {3, 5, 1, 3072, 8192, 2, 126}, - {3, 6, 1, 3072, 8192, 1, 128}, - {3, 7, 1, 3072, 8192, 1, 128}, - {3, 8, 1, 3072, 8192, 1, 116}, - {3, 1, 1, 3072, 12288, 3, 128}, - {3, 2, 1, 3072, 12288, 3, 128}, - {3, 3, 1, 3072, 12288, 3, 128}, - {3, 4, 1, 3072, 12288, 2, 128}, - {3, 5, 1, 3072, 12288, 2, 128}, - {3, 6, 1, 3072, 12288, 1, 128}, - {3, 7, 1, 3072, 12288, 1, 126}, - {3, 8, 1, 3072, 12288, 1, 96}, - {3, 1, 1, 3072, 14336, 3, 128}, - {3, 2, 1, 3072, 14336, 3, 128}, - {3, 3, 1, 3072, 14336, 3, 128}, - {3, 4, 1, 3072, 14336, 2, 112}, - {3, 5, 1, 3072, 14336, 2, 112}, - {3, 6, 1, 3072, 14336, 1, 128}, - {3, 7, 1, 3072, 14336, 1, 128}, - {3, 8, 1, 3072, 14336, 1, 110}, - {3, 1, 1, 3072, 16384, 3, 128}, - {3, 2, 1, 3072, 16384, 3, 128}, - {3, 3, 1, 3072, 16384, 3, 128}, - {3, 4, 1, 3072, 16384, 2, 128}, - {3, 5, 1, 3072, 16384, 2, 128}, - {3, 6, 1, 3072, 16384, 1, 128}, - {3, 7, 1, 3072, 16384, 1, 128}, - {3, 8, 1, 3072, 16384, 1, 126}, - {3, 1, 1, 3072, 24576, 3, 128}, - {3, 2, 1, 3072, 24576, 3, 128}, - {3, 3, 1, 3072, 24576, 3, 128}, - {3, 4, 1, 3072, 24576, 4, 96}, - {3, 5, 1, 3072, 24576, 4, 96}, - {3, 6, 1, 3072, 24576, 1, 128}, - {3, 7, 1, 3072, 24576, 4, 94}, - {3, 8, 1, 3072, 24576, 1, 96}, - {3, 1, 1, 3072, 51200, 3, 128}, - {3, 2, 1, 3072, 51200, 3, 128}, - {3, 3, 1, 3072, 51200, 3, 128}, - {3, 4, 1, 3072, 51200, 4, 98}, - {3, 5, 1, 3072, 51200, 4, 104}, - {3, 6, 1, 3072, 51200, 4, 100}, - {3, 7, 1, 3072, 51200, 4, 100}, - {3, 8, 1, 3072, 51200, 4, 78}, - {3, 1, 1, 3072, 128000, 3, 128}, - {3, 2, 1, 3072, 128000, 3, 128}, - {3, 3, 1, 3072, 128000, 3, 126}, - {3, 4, 1, 3072, 128000, 4, 126}, - {3, 5, 1, 3072, 128000, 4, 126}, - {3, 6, 1, 3072, 128000, 4, 126}, - {3, 7, 1, 3072, 128000, 4, 100}, - {3, 8, 1, 3072, 128000, 4, 92}, - {3, 1, 1, 4096, 512, 2, 32}, - {3, 2, 1, 4096, 512, 2, 32}, - {3, 3, 1, 4096, 512, 2, 32}, - {3, 4, 1, 4096, 512, 2, 32}, - {3, 5, 1, 4096, 512, 2, 32}, - {3, 6, 1, 4096, 512, 2, 32}, - {3, 7, 1, 4096, 512, 2, 32}, - {3, 8, 1, 4096, 512, 2, 32}, - {3, 1, 1, 4096, 1024, 2, 64}, - {3, 2, 1, 4096, 1024, 2, 64}, - {3, 3, 1, 4096, 1024, 2, 64}, - {3, 4, 1, 4096, 1024, 2, 56}, - {3, 5, 1, 4096, 1024, 2, 64}, - {3, 6, 1, 4096, 1024, 2, 62}, - {3, 7, 1, 4096, 1024, 2, 62}, - {3, 8, 1, 4096, 1024, 2, 62}, - {3, 1, 1, 4096, 2048, 2, 128}, - {3, 2, 1, 4096, 2048, 2, 128}, - {3, 3, 1, 4096, 2048, 2, 128}, - {3, 4, 1, 4096, 2048, 2, 116}, - {3, 5, 1, 4096, 2048, 2, 116}, - {3, 6, 1, 4096, 2048, 2, 92}, - {3, 7, 1, 4096, 2048, 2, 94}, - {3, 8, 1, 4096, 2048, 1, 96}, - {3, 1, 1, 4096, 3072, 2, 128}, - {3, 2, 1, 4096, 3072, 2, 128}, - {3, 3, 1, 4096, 3072, 2, 128}, - {3, 4, 1, 4096, 3072, 2, 110}, - {3, 5, 1, 4096, 3072, 2, 110}, - {3, 6, 1, 4096, 3072, 1, 128}, - {3, 7, 1, 4096, 3072, 2, 96}, - {3, 8, 1, 4096, 3072, 1, 96}, - {3, 1, 1, 4096, 4096, 2, 128}, - {3, 2, 1, 4096, 4096, 2, 128}, - {3, 3, 1, 4096, 4096, 2, 126}, - {3, 4, 1, 4096, 4096, 2, 128}, - {3, 5, 1, 4096, 4096, 2, 126}, - {3, 6, 1, 4096, 4096, 1, 124}, - {3, 7, 1, 4096, 4096, 1, 126}, - {3, 8, 1, 4096, 4096, 1, 102}, - {3, 1, 1, 4096, 5120, 2, 128}, - {3, 2, 1, 4096, 5120, 2, 128}, - {3, 3, 1, 4096, 5120, 3, 128}, - {3, 4, 1, 4096, 5120, 2, 118}, - {3, 5, 1, 4096, 5120, 2, 128}, - {3, 6, 1, 4096, 5120, 1, 122}, - {3, 7, 1, 4096, 5120, 1, 128}, - {3, 8, 1, 4096, 5120, 1, 96}, - {3, 1, 1, 4096, 8192, 3, 128}, - {3, 2, 1, 4096, 8192, 3, 128}, - {3, 3, 1, 4096, 8192, 3, 128}, - {3, 4, 1, 4096, 8192, 2, 128}, - {3, 5, 1, 4096, 8192, 2, 128}, - {3, 6, 1, 4096, 8192, 1, 128}, - {3, 7, 1, 4096, 8192, 1, 128}, - {3, 8, 1, 4096, 8192, 1, 126}, - {3, 1, 1, 4096, 12288, 3, 128}, - {3, 2, 1, 4096, 12288, 3, 128}, - {3, 3, 1, 4096, 12288, 3, 128}, - {3, 4, 1, 4096, 12288, 2, 128}, - {3, 5, 1, 4096, 12288, 2, 128}, - {3, 6, 1, 4096, 12288, 1, 128}, - {3, 7, 1, 4096, 12288, 1, 126}, - {3, 8, 1, 4096, 12288, 1, 96}, - {3, 1, 1, 4096, 14336, 3, 128}, - {3, 2, 1, 4096, 14336, 3, 128}, - {3, 3, 1, 4096, 14336, 3, 128}, - {3, 4, 1, 4096, 14336, 2, 122}, - {3, 5, 1, 4096, 14336, 2, 112}, - {3, 6, 1, 4096, 14336, 1, 128}, - {3, 7, 1, 4096, 14336, 1, 128}, - {3, 8, 1, 4096, 14336, 1, 110}, - {3, 1, 1, 4096, 16384, 3, 128}, - {3, 2, 1, 4096, 16384, 3, 128}, - {3, 3, 1, 4096, 16384, 3, 128}, - {3, 4, 1, 4096, 16384, 2, 126}, - {3, 5, 1, 4096, 16384, 2, 128}, - {3, 6, 1, 4096, 16384, 1, 128}, - {3, 7, 1, 4096, 16384, 1, 128}, - {3, 8, 1, 4096, 16384, 2, 128}, - {3, 1, 1, 4096, 24576, 3, 128}, - {3, 2, 1, 4096, 24576, 3, 128}, - {3, 3, 1, 4096, 24576, 3, 128}, - {3, 4, 1, 4096, 24576, 4, 96}, - {3, 5, 1, 4096, 24576, 4, 96}, - {3, 6, 1, 4096, 24576, 1, 128}, - {3, 7, 1, 4096, 24576, 4, 94}, - {3, 8, 1, 4096, 24576, 1, 96}, - {3, 1, 1, 4096, 51200, 3, 128}, - {3, 2, 1, 4096, 51200, 3, 128}, - {3, 3, 1, 4096, 51200, 3, 128}, - {3, 4, 1, 4096, 51200, 4, 98}, - {3, 5, 1, 4096, 51200, 4, 102}, - {3, 6, 1, 4096, 51200, 4, 100}, - {3, 7, 1, 4096, 51200, 4, 100}, - {3, 8, 1, 4096, 51200, 4, 96}, - {3, 1, 1, 4096, 128000, 3, 128}, - {3, 2, 1, 4096, 128000, 3, 128}, - {3, 3, 1, 4096, 128000, 3, 128}, - {3, 4, 1, 4096, 128000, 4, 126}, - {3, 5, 1, 4096, 128000, 4, 126}, - {3, 6, 1, 4096, 128000, 4, 110}, - {3, 7, 1, 4096, 128000, 4, 100}, - {3, 8, 1, 4096, 128000, 4, 86}, - {3, 1, 1, 5120, 512, 2, 32}, - {3, 2, 1, 5120, 512, 2, 36}, - {3, 3, 1, 5120, 512, 2, 40}, - {3, 4, 1, 5120, 512, 2, 32}, - {3, 5, 1, 5120, 512, 2, 40}, - {3, 6, 1, 5120, 512, 2, 32}, - {3, 7, 1, 5120, 512, 2, 32}, - {3, 8, 1, 5120, 512, 2, 32}, - {3, 1, 1, 5120, 1024, 2, 72}, - {3, 2, 1, 5120, 1024, 2, 72}, - {3, 3, 1, 5120, 1024, 2, 72}, - {3, 4, 1, 5120, 1024, 2, 64}, - {3, 5, 1, 5120, 1024, 2, 72}, - {3, 6, 1, 5120, 1024, 2, 72}, - {3, 7, 1, 5120, 1024, 2, 72}, - {3, 8, 1, 5120, 1024, 2, 72}, - {3, 1, 1, 5120, 2048, 2, 128}, - {3, 2, 1, 5120, 2048, 2, 128}, - {3, 3, 1, 5120, 2048, 2, 124}, - {3, 4, 1, 5120, 2048, 2, 112}, - {3, 5, 1, 5120, 2048, 2, 110}, - {3, 6, 1, 5120, 2048, 2, 90}, - {3, 7, 1, 5120, 2048, 2, 90}, - {3, 8, 1, 5120, 2048, 2, 80}, - {3, 1, 1, 5120, 3072, 2, 128}, - {3, 2, 1, 5120, 3072, 2, 128}, - {3, 3, 1, 5120, 3072, 2, 128}, - {3, 4, 1, 5120, 3072, 2, 116}, - {3, 5, 1, 5120, 3072, 2, 120}, - {3, 6, 1, 5120, 3072, 1, 128}, - {3, 7, 1, 5120, 3072, 2, 94}, - {3, 8, 1, 5120, 3072, 1, 96}, - {3, 1, 1, 5120, 4096, 2, 128}, - {3, 2, 1, 5120, 4096, 2, 128}, - {3, 3, 1, 5120, 4096, 3, 128}, - {3, 4, 1, 5120, 4096, 2, 128}, - {3, 5, 1, 5120, 4096, 2, 126}, - {3, 6, 1, 5120, 4096, 1, 126}, - {3, 7, 1, 5120, 4096, 1, 128}, - {3, 8, 1, 5120, 4096, 1, 94}, - {3, 1, 1, 5120, 5120, 3, 128}, - {3, 2, 1, 5120, 5120, 3, 128}, - {3, 3, 1, 5120, 5120, 3, 128}, - {3, 4, 1, 5120, 5120, 2, 118}, - {3, 5, 1, 5120, 5120, 2, 116}, - {3, 6, 1, 5120, 5120, 1, 122}, - {3, 7, 1, 5120, 5120, 1, 128}, - {3, 8, 1, 5120, 5120, 1, 102}, - {3, 1, 1, 5120, 8192, 3, 128}, - {3, 2, 1, 5120, 8192, 3, 128}, - {3, 3, 1, 5120, 8192, 3, 128}, - {3, 4, 1, 5120, 8192, 2, 128}, - {3, 5, 1, 5120, 8192, 2, 128}, - {3, 6, 1, 5120, 8192, 1, 128}, - {3, 7, 1, 5120, 8192, 1, 128}, - {3, 8, 1, 5120, 8192, 1, 126}, - {3, 1, 1, 5120, 12288, 3, 128}, - {3, 2, 1, 5120, 12288, 3, 128}, - {3, 3, 1, 5120, 12288, 3, 128}, - {3, 4, 1, 5120, 12288, 2, 128}, - {3, 5, 1, 5120, 12288, 2, 122}, - {3, 6, 1, 5120, 12288, 1, 128}, - {3, 7, 1, 5120, 12288, 1, 126}, - {3, 8, 1, 5120, 12288, 1, 96}, - {3, 1, 1, 5120, 14336, 3, 128}, - {3, 2, 1, 5120, 14336, 3, 128}, - {3, 3, 1, 5120, 14336, 3, 128}, - {3, 4, 1, 5120, 14336, 3, 112}, - {3, 5, 1, 5120, 14336, 2, 112}, - {3, 6, 1, 5120, 14336, 1, 128}, - {3, 7, 1, 5120, 14336, 1, 128}, - {3, 8, 1, 5120, 14336, 1, 110}, - {3, 1, 1, 5120, 16384, 3, 128}, - {3, 2, 1, 5120, 16384, 3, 128}, - {3, 3, 1, 5120, 16384, 3, 128}, - {3, 4, 1, 5120, 16384, 2, 128}, - {3, 5, 1, 5120, 16384, 2, 128}, - {3, 6, 1, 5120, 16384, 1, 128}, - {3, 7, 1, 5120, 16384, 1, 128}, - {3, 8, 1, 5120, 16384, 1, 126}, - {3, 1, 1, 5120, 24576, 3, 128}, - {3, 2, 1, 5120, 24576, 3, 128}, - {3, 3, 1, 5120, 24576, 3, 128}, - {3, 4, 1, 5120, 24576, 4, 96}, - {3, 5, 1, 5120, 24576, 4, 96}, - {3, 6, 1, 5120, 24576, 1, 128}, - {3, 7, 1, 5120, 24576, 4, 96}, - {3, 8, 1, 5120, 24576, 3, 96}, - {3, 1, 1, 5120, 51200, 3, 128}, - {3, 2, 1, 5120, 51200, 3, 128}, - {3, 3, 1, 5120, 51200, 3, 126}, - {3, 4, 1, 5120, 51200, 4, 112}, - {3, 5, 1, 5120, 51200, 4, 100}, - {3, 6, 1, 5120, 51200, 4, 100}, - {3, 7, 1, 5120, 51200, 4, 100}, - {3, 8, 1, 5120, 51200, 4, 100}, - {3, 1, 1, 5120, 128000, 3, 128}, - {3, 2, 1, 5120, 128000, 3, 128}, - {3, 3, 1, 5120, 128000, 3, 128}, - {3, 4, 1, 5120, 128000, 4, 126}, - {3, 5, 1, 5120, 128000, 4, 126}, - {3, 6, 1, 5120, 128000, 4, 128}, - {3, 7, 1, 5120, 128000, 4, 100}, - {3, 8, 1, 5120, 128000, 4, 80}, - {3, 1, 1, 8192, 512, 2, 48}, - {3, 2, 1, 8192, 512, 2, 40}, - {3, 3, 1, 8192, 512, 2, 54}, - {3, 4, 1, 8192, 512, 2, 32}, - {3, 5, 1, 8192, 512, 2, 40}, - {3, 6, 1, 8192, 512, 2, 40}, - {3, 7, 1, 8192, 512, 2, 54}, - {3, 8, 1, 8192, 512, 2, 54}, - {3, 1, 1, 8192, 1024, 2, 86}, - {3, 2, 1, 8192, 1024, 2, 72}, - {3, 3, 1, 8192, 1024, 2, 88}, - {3, 4, 1, 8192, 1024, 2, 72}, - {3, 5, 1, 8192, 1024, 2, 86}, - {3, 6, 1, 8192, 1024, 2, 86}, - {3, 7, 1, 8192, 1024, 2, 86}, - {3, 8, 1, 8192, 1024, 2, 76}, - {3, 1, 1, 8192, 2048, 2, 128}, - {3, 2, 1, 8192, 2048, 2, 128}, - {3, 3, 1, 8192, 2048, 2, 128}, - {3, 4, 1, 8192, 2048, 2, 112}, - {3, 5, 1, 8192, 2048, 2, 114}, - {3, 6, 1, 8192, 2048, 1, 126}, - {3, 7, 1, 8192, 2048, 2, 96}, - {3, 8, 1, 8192, 2048, 1, 96}, - {3, 1, 1, 8192, 3072, 2, 128}, - {3, 2, 1, 8192, 3072, 2, 128}, - {3, 3, 1, 8192, 3072, 3, 128}, - {3, 4, 1, 8192, 3072, 2, 118}, - {3, 5, 1, 8192, 3072, 2, 122}, - {3, 6, 1, 8192, 3072, 1, 126}, - {3, 7, 1, 8192, 3072, 2, 96}, - {3, 8, 1, 8192, 3072, 1, 96}, - {3, 1, 1, 8192, 4096, 3, 128}, - {3, 2, 1, 8192, 4096, 3, 128}, - {3, 3, 1, 8192, 4096, 3, 126}, - {3, 4, 1, 8192, 4096, 2, 128}, - {3, 5, 1, 8192, 4096, 2, 126}, - {3, 6, 1, 8192, 4096, 1, 128}, - {3, 7, 1, 8192, 4096, 1, 126}, - {3, 8, 1, 8192, 4096, 1, 98}, - {3, 1, 1, 8192, 5120, 3, 128}, - {3, 2, 1, 8192, 5120, 3, 128}, - {3, 3, 1, 8192, 5120, 3, 128}, - {3, 4, 1, 8192, 5120, 2, 118}, - {3, 5, 1, 8192, 5120, 2, 120}, - {3, 6, 1, 8192, 5120, 1, 126}, - {3, 7, 1, 8192, 5120, 1, 126}, - {3, 8, 1, 8192, 5120, 1, 96}, - {3, 1, 1, 8192, 8192, 3, 128}, - {3, 2, 1, 8192, 8192, 3, 128}, - {3, 3, 1, 8192, 8192, 3, 128}, - {3, 4, 1, 8192, 8192, 2, 128}, - {3, 5, 1, 8192, 8192, 2, 128}, - {3, 6, 1, 8192, 8192, 1, 128}, - {3, 7, 1, 8192, 8192, 1, 128}, - {3, 8, 1, 8192, 8192, 1, 126}, - {3, 1, 1, 8192, 12288, 3, 128}, - {3, 2, 1, 8192, 12288, 3, 128}, - {3, 3, 1, 8192, 12288, 3, 128}, - {3, 4, 1, 8192, 12288, 3, 96}, - {3, 5, 1, 8192, 12288, 4, 96}, - {3, 6, 1, 8192, 12288, 1, 128}, - {3, 7, 1, 8192, 12288, 1, 126}, - {3, 8, 1, 8192, 12288, 1, 96}, - {3, 1, 1, 8192, 14336, 3, 128}, - {3, 2, 1, 8192, 14336, 3, 128}, - {3, 3, 1, 8192, 14336, 3, 128}, - {3, 4, 1, 8192, 14336, 3, 112}, - {3, 5, 1, 8192, 14336, 2, 112}, - {3, 6, 1, 8192, 14336, 1, 128}, - {3, 7, 1, 8192, 14336, 1, 128}, - {3, 8, 1, 8192, 14336, 1, 114}, - {3, 1, 1, 8192, 16384, 3, 128}, - {3, 2, 1, 8192, 16384, 3, 128}, - {3, 3, 1, 8192, 16384, 3, 128}, - {3, 4, 1, 8192, 16384, 3, 126}, - {3, 5, 1, 8192, 16384, 3, 128}, - {3, 6, 1, 8192, 16384, 1, 128}, - {3, 7, 1, 8192, 16384, 1, 128}, - {3, 8, 1, 8192, 16384, 2, 128}, - {3, 1, 1, 8192, 24576, 3, 128}, - {3, 2, 1, 8192, 24576, 3, 128}, - {3, 3, 1, 8192, 24576, 3, 128}, - {3, 4, 1, 8192, 24576, 4, 96}, - {3, 5, 1, 8192, 24576, 4, 96}, - {3, 6, 1, 8192, 24576, 1, 128}, - {3, 7, 1, 8192, 24576, 4, 96}, - {3, 8, 1, 8192, 24576, 4, 96}, - {3, 1, 1, 8192, 51200, 3, 128}, - {3, 2, 1, 8192, 51200, 3, 128}, - {3, 3, 1, 8192, 51200, 3, 128}, - {3, 4, 1, 8192, 51200, 4, 98}, - {3, 5, 1, 8192, 51200, 4, 100}, - {3, 6, 1, 8192, 51200, 4, 114}, - {3, 7, 1, 8192, 51200, 4, 80}, - {3, 8, 1, 8192, 51200, 4, 100}, - {3, 1, 1, 8192, 128000, 3, 128}, - {3, 2, 1, 8192, 128000, 3, 128}, - {3, 3, 1, 8192, 128000, 3, 128}, - {3, 4, 1, 8192, 128000, 4, 126}, - {3, 5, 1, 8192, 128000, 4, 124}, - {3, 6, 1, 8192, 128000, 4, 100}, - {3, 7, 1, 8192, 128000, 4, 100}, - {3, 8, 1, 8192, 128000, 4, 86}, - {3, 1, 1, 12288, 512, 2, 48}, - {3, 2, 1, 12288, 512, 2, 52}, - {3, 3, 1, 12288, 512, 2, 62}, - {3, 4, 1, 12288, 512, 2, 52}, - {3, 5, 1, 12288, 512, 2, 56}, - {3, 6, 1, 12288, 512, 2, 56}, - {3, 7, 1, 12288, 512, 2, 64}, - {3, 8, 1, 12288, 512, 2, 62}, - {3, 1, 1, 12288, 1024, 2, 102}, - {3, 2, 1, 12288, 1024, 2, 104}, - {3, 3, 1, 12288, 1024, 2, 124}, - {3, 4, 1, 12288, 1024, 2, 96}, - {3, 5, 1, 12288, 1024, 2, 96}, - {3, 6, 1, 12288, 1024, 2, 96}, - {3, 7, 1, 12288, 1024, 2, 88}, - {3, 8, 1, 12288, 1024, 2, 76}, - {3, 1, 1, 12288, 2048, 2, 128}, - {3, 2, 1, 12288, 2048, 2, 128}, - {3, 3, 1, 12288, 2048, 2, 128}, - {3, 4, 1, 12288, 2048, 2, 112}, - {3, 5, 1, 12288, 2048, 2, 114}, - {3, 6, 1, 12288, 2048, 2, 94}, - {3, 7, 1, 12288, 2048, 2, 96}, - {3, 8, 1, 12288, 2048, 1, 96}, - {3, 1, 1, 12288, 3072, 3, 128}, - {3, 2, 1, 12288, 3072, 3, 128}, - {3, 3, 1, 12288, 3072, 3, 128}, - {3, 4, 1, 12288, 3072, 2, 118}, - {3, 5, 1, 12288, 3072, 2, 120}, - {3, 6, 1, 12288, 3072, 1, 128}, - {3, 7, 1, 12288, 3072, 2, 96}, - {3, 8, 1, 12288, 3072, 1, 96}, - {3, 1, 1, 12288, 4096, 3, 128}, - {3, 2, 1, 12288, 4096, 3, 128}, - {3, 3, 1, 12288, 4096, 3, 128}, - {3, 4, 1, 12288, 4096, 2, 128}, - {3, 5, 1, 12288, 4096, 2, 128}, - {3, 6, 1, 12288, 4096, 1, 128}, - {3, 7, 1, 12288, 4096, 1, 128}, - {3, 8, 1, 12288, 4096, 1, 98}, - {3, 1, 1, 12288, 5120, 3, 128}, - {3, 2, 1, 12288, 5120, 3, 128}, - {3, 3, 1, 12288, 5120, 3, 126}, - {3, 4, 1, 12288, 5120, 2, 120}, - {3, 5, 1, 12288, 5120, 2, 120}, - {3, 6, 1, 12288, 5120, 1, 120}, - {3, 7, 1, 12288, 5120, 1, 126}, - {3, 8, 1, 12288, 5120, 1, 120}, - {3, 1, 1, 12288, 8192, 3, 128}, - {3, 2, 1, 12288, 8192, 3, 128}, - {3, 3, 1, 12288, 8192, 3, 128}, - {3, 4, 1, 12288, 8192, 2, 128}, - {3, 5, 1, 12288, 8192, 2, 128}, - {3, 6, 1, 12288, 8192, 1, 128}, - {3, 7, 1, 12288, 8192, 1, 128}, - {3, 8, 1, 12288, 8192, 1, 116}, - {3, 1, 1, 12288, 12288, 3, 128}, - {3, 2, 1, 12288, 12288, 3, 128}, - {3, 3, 1, 12288, 12288, 3, 128}, - {3, 4, 1, 12288, 12288, 3, 96}, - {3, 5, 1, 12288, 12288, 4, 96}, - {3, 6, 1, 12288, 12288, 1, 128}, - {3, 7, 1, 12288, 12288, 1, 126}, - {3, 8, 1, 12288, 12288, 1, 96}, - {3, 1, 1, 12288, 14336, 3, 128}, - {3, 2, 1, 12288, 14336, 3, 128}, - {3, 3, 1, 12288, 14336, 3, 126}, - {3, 4, 1, 12288, 14336, 3, 112}, - {3, 5, 1, 12288, 14336, 3, 112}, - {3, 6, 1, 12288, 14336, 4, 112}, - {3, 7, 1, 12288, 14336, 4, 112}, - {3, 8, 1, 12288, 14336, 2, 112}, - {3, 1, 1, 12288, 16384, 3, 128}, - {3, 2, 1, 12288, 16384, 3, 128}, - {3, 3, 1, 12288, 16384, 3, 128}, - {3, 4, 1, 12288, 16384, 3, 128}, - {3, 5, 1, 12288, 16384, 3, 128}, - {3, 6, 1, 12288, 16384, 3, 128}, - {3, 7, 1, 12288, 16384, 1, 128}, - {3, 8, 1, 12288, 16384, 2, 128}, - {3, 1, 1, 12288, 24576, 3, 128}, - {3, 2, 1, 12288, 24576, 3, 128}, - {3, 3, 1, 12288, 24576, 3, 128}, - {3, 4, 1, 12288, 24576, 4, 96}, - {3, 5, 1, 12288, 24576, 4, 96}, - {3, 6, 1, 12288, 24576, 4, 96}, - {3, 7, 1, 12288, 24576, 4, 96}, - {3, 8, 1, 12288, 24576, 3, 96}, - {3, 1, 1, 12288, 51200, 3, 128}, - {3, 2, 1, 12288, 51200, 3, 128}, - {3, 3, 1, 12288, 51200, 3, 128}, - {3, 4, 1, 12288, 51200, 4, 112}, - {3, 5, 1, 12288, 51200, 4, 114}, - {3, 6, 1, 12288, 51200, 4, 128}, - {3, 7, 1, 12288, 51200, 4, 100}, - {3, 8, 1, 12288, 51200, 4, 100}, - {3, 1, 1, 12288, 128000, 3, 128}, - {3, 2, 1, 12288, 128000, 3, 128}, - {3, 3, 1, 12288, 128000, 3, 128}, - {3, 4, 1, 12288, 128000, 4, 124}, - {3, 5, 1, 12288, 128000, 4, 126}, - {3, 6, 1, 12288, 128000, 4, 124}, - {3, 7, 1, 12288, 128000, 4, 100}, - {3, 8, 1, 12288, 128000, 4, 118}, - {3, 1, 1, 14336, 512, 2, 60}, - {3, 2, 1, 14336, 512, 2, 56}, - {3, 3, 1, 14336, 512, 2, 64}, - {3, 4, 1, 14336, 512, 2, 56}, - {3, 5, 1, 14336, 512, 2, 56}, - {3, 6, 1, 14336, 512, 2, 58}, - {3, 7, 1, 14336, 512, 2, 62}, - {3, 8, 1, 14336, 512, 2, 62}, - {3, 1, 1, 14336, 1024, 2, 112}, - {3, 2, 1, 14336, 1024, 2, 112}, - {3, 3, 1, 14336, 1024, 2, 128}, - {3, 4, 1, 14336, 1024, 2, 96}, - {3, 5, 1, 14336, 1024, 2, 106}, - {3, 6, 1, 14336, 1024, 2, 92}, - {3, 7, 1, 14336, 1024, 2, 92}, - {3, 8, 1, 14336, 1024, 2, 72}, - {3, 1, 1, 14336, 2048, 2, 128}, - {3, 2, 1, 14336, 2048, 2, 128}, - {3, 3, 1, 14336, 2048, 2, 128}, - {3, 4, 1, 14336, 2048, 2, 112}, - {3, 5, 1, 14336, 2048, 2, 114}, - {3, 6, 1, 14336, 2048, 2, 96}, - {3, 7, 1, 14336, 2048, 2, 96}, - {3, 8, 1, 14336, 2048, 1, 96}, - {3, 1, 1, 14336, 3072, 3, 128}, - {3, 2, 1, 14336, 3072, 3, 128}, - {3, 3, 1, 14336, 3072, 3, 128}, - {3, 4, 1, 14336, 3072, 2, 120}, - {3, 5, 1, 14336, 3072, 2, 120}, - {3, 6, 1, 14336, 3072, 1, 126}, - {3, 7, 1, 14336, 3072, 2, 96}, - {3, 8, 1, 14336, 3072, 1, 96}, - {3, 1, 1, 14336, 4096, 3, 128}, - {3, 2, 1, 14336, 4096, 3, 128}, - {3, 3, 1, 14336, 4096, 3, 128}, - {3, 4, 1, 14336, 4096, 2, 128}, - {3, 5, 1, 14336, 4096, 2, 128}, - {3, 6, 1, 14336, 4096, 1, 128}, - {3, 7, 1, 14336, 4096, 1, 128}, - {3, 8, 1, 14336, 4096, 1, 96}, - {3, 1, 1, 14336, 5120, 3, 128}, - {3, 2, 1, 14336, 5120, 3, 128}, - {3, 3, 1, 14336, 5120, 3, 128}, - {3, 4, 1, 14336, 5120, 2, 120}, - {3, 5, 1, 14336, 5120, 2, 120}, - {3, 6, 1, 14336, 5120, 1, 126}, - {3, 7, 1, 14336, 5120, 1, 128}, - {3, 8, 1, 14336, 5120, 1, 96}, - {3, 1, 1, 14336, 8192, 3, 128}, - {3, 2, 1, 14336, 8192, 3, 128}, - {3, 3, 1, 14336, 8192, 3, 128}, - {3, 4, 1, 14336, 8192, 2, 128}, - {3, 5, 1, 14336, 8192, 2, 128}, - {3, 6, 1, 14336, 8192, 1, 128}, - {3, 7, 1, 14336, 8192, 1, 128}, - {3, 8, 1, 14336, 8192, 2, 128}, - {3, 1, 1, 14336, 12288, 3, 128}, - {3, 2, 1, 14336, 12288, 3, 128}, - {3, 3, 1, 14336, 12288, 3, 128}, - {3, 4, 1, 14336, 12288, 3, 96}, - {3, 5, 1, 14336, 12288, 4, 96}, - {3, 6, 1, 14336, 12288, 1, 128}, - {3, 7, 1, 14336, 12288, 4, 96}, - {3, 8, 1, 14336, 12288, 1, 96}, - {3, 1, 1, 14336, 14336, 3, 128}, - {3, 2, 1, 14336, 14336, 3, 128}, - {3, 3, 1, 14336, 14336, 3, 128}, - {3, 4, 1, 14336, 14336, 3, 112}, - {3, 5, 1, 14336, 14336, 3, 112}, - {3, 6, 1, 14336, 14336, 4, 112}, - {3, 7, 1, 14336, 14336, 4, 112}, - {3, 8, 1, 14336, 14336, 3, 112}, - {3, 1, 1, 14336, 16384, 3, 128}, - {3, 2, 1, 14336, 16384, 3, 128}, - {3, 3, 1, 14336, 16384, 3, 128}, - {3, 4, 1, 14336, 16384, 3, 128}, - {3, 5, 1, 14336, 16384, 3, 128}, - {3, 6, 1, 14336, 16384, 3, 128}, - {3, 7, 1, 14336, 16384, 1, 128}, - {3, 8, 1, 14336, 16384, 3, 96}, - {3, 1, 1, 14336, 24576, 3, 128}, - {3, 2, 1, 14336, 24576, 3, 128}, - {3, 3, 1, 14336, 24576, 3, 128}, - {3, 4, 1, 14336, 24576, 4, 96}, - {3, 5, 1, 14336, 24576, 4, 96}, - {3, 6, 1, 14336, 24576, 4, 96}, - {3, 7, 1, 14336, 24576, 4, 96}, - {3, 8, 1, 14336, 24576, 3, 96}, - {3, 1, 1, 14336, 51200, 3, 128}, - {3, 2, 1, 14336, 51200, 3, 128}, - {3, 3, 1, 14336, 51200, 3, 128}, - {3, 4, 1, 14336, 51200, 4, 112}, - {3, 5, 1, 14336, 51200, 4, 114}, - {3, 6, 1, 14336, 51200, 4, 128}, - {3, 7, 1, 14336, 51200, 4, 100}, - {3, 8, 1, 14336, 51200, 4, 100}, - {3, 1, 1, 14336, 128000, 3, 128}, - {3, 2, 1, 14336, 128000, 3, 128}, - {3, 3, 1, 14336, 128000, 3, 128}, - {3, 4, 1, 14336, 128000, 4, 124}, - {3, 5, 1, 14336, 128000, 4, 126}, - {3, 6, 1, 14336, 128000, 4, 100}, - {3, 7, 1, 14336, 128000, 4, 100}, - {3, 8, 1, 14336, 128000, 4, 94}, - {3, 1, 1, 16384, 512, 2, 62}, - {3, 2, 1, 16384, 512, 2, 62}, - {3, 3, 1, 16384, 512, 2, 64}, - {3, 4, 1, 16384, 512, 2, 56}, - {3, 5, 1, 16384, 512, 2, 64}, - {3, 6, 1, 16384, 512, 2, 64}, - {3, 7, 1, 16384, 512, 2, 64}, - {3, 8, 1, 16384, 512, 2, 66}, - {3, 1, 1, 16384, 1024, 2, 128}, - {3, 2, 1, 16384, 1024, 2, 104}, - {3, 3, 1, 16384, 1024, 2, 126}, - {3, 4, 1, 16384, 1024, 2, 96}, - {3, 5, 1, 16384, 1024, 2, 108}, - {3, 6, 1, 16384, 1024, 2, 96}, - {3, 7, 1, 16384, 1024, 2, 88}, - {3, 8, 1, 16384, 1024, 2, 80}, - {3, 1, 1, 16384, 2048, 2, 128}, - {3, 2, 1, 16384, 2048, 2, 128}, - {3, 3, 1, 16384, 2048, 3, 126}, - {3, 4, 1, 16384, 2048, 2, 128}, - {3, 5, 1, 16384, 2048, 2, 126}, - {3, 6, 1, 16384, 2048, 2, 96}, - {3, 7, 1, 16384, 2048, 1, 128}, - {3, 8, 1, 16384, 2048, 1, 96}, - {3, 1, 1, 16384, 3072, 3, 128}, - {3, 2, 1, 16384, 3072, 3, 128}, - {3, 3, 1, 16384, 3072, 3, 128}, - {3, 4, 1, 16384, 3072, 2, 128}, - {3, 5, 1, 16384, 3072, 2, 120}, - {3, 6, 1, 16384, 3072, 1, 128}, - {3, 7, 1, 16384, 3072, 2, 96}, - {3, 8, 1, 16384, 3072, 1, 96}, - {3, 1, 1, 16384, 4096, 3, 128}, - {3, 2, 1, 16384, 4096, 3, 128}, - {3, 3, 1, 16384, 4096, 3, 128}, - {3, 4, 1, 16384, 4096, 2, 128}, - {3, 5, 1, 16384, 4096, 2, 128}, - {3, 6, 1, 16384, 4096, 1, 124}, - {3, 7, 1, 16384, 4096, 1, 128}, - {3, 8, 1, 16384, 4096, 1, 96}, - {3, 1, 1, 16384, 5120, 3, 128}, - {3, 2, 1, 16384, 5120, 3, 128}, - {3, 3, 1, 16384, 5120, 3, 128}, - {3, 4, 1, 16384, 5120, 2, 120}, - {3, 5, 1, 16384, 5120, 2, 120}, - {3, 6, 1, 16384, 5120, 1, 120}, - {3, 7, 1, 16384, 5120, 1, 128}, - {3, 8, 1, 16384, 5120, 1, 96}, - {3, 1, 1, 16384, 8192, 3, 128}, - {3, 2, 1, 16384, 8192, 3, 128}, - {3, 3, 1, 16384, 8192, 3, 128}, - {3, 4, 1, 16384, 8192, 2, 128}, - {3, 5, 1, 16384, 8192, 2, 128}, - {3, 6, 1, 16384, 8192, 1, 128}, - {3, 7, 1, 16384, 8192, 1, 128}, - {3, 8, 1, 16384, 8192, 2, 128}, - {3, 1, 1, 16384, 12288, 3, 128}, - {3, 2, 1, 16384, 12288, 3, 128}, - {3, 3, 1, 16384, 12288, 3, 128}, - {3, 4, 1, 16384, 12288, 3, 96}, - {3, 5, 1, 16384, 12288, 4, 96}, - {3, 6, 1, 16384, 12288, 1, 128}, - {3, 7, 1, 16384, 12288, 4, 96}, - {3, 8, 1, 16384, 12288, 1, 96}, - {3, 1, 1, 16384, 14336, 3, 128}, - {3, 2, 1, 16384, 14336, 3, 128}, - {3, 3, 1, 16384, 14336, 3, 126}, - {3, 4, 1, 16384, 14336, 3, 112}, - {3, 5, 1, 16384, 14336, 3, 112}, - {3, 6, 1, 16384, 14336, 3, 112}, - {3, 7, 1, 16384, 14336, 4, 112}, - {3, 8, 1, 16384, 14336, 2, 112}, - {3, 1, 1, 16384, 16384, 3, 128}, - {3, 2, 1, 16384, 16384, 3, 128}, - {3, 3, 1, 16384, 16384, 3, 128}, - {3, 4, 1, 16384, 16384, 3, 128}, - {3, 5, 1, 16384, 16384, 3, 128}, - {3, 6, 1, 16384, 16384, 3, 128}, - {3, 7, 1, 16384, 16384, 1, 128}, - {3, 8, 1, 16384, 16384, 3, 96}, - {3, 1, 1, 16384, 24576, 3, 128}, - {3, 2, 1, 16384, 24576, 3, 128}, - {3, 3, 1, 16384, 24576, 3, 128}, - {3, 4, 1, 16384, 24576, 4, 96}, - {3, 5, 1, 16384, 24576, 4, 96}, - {3, 6, 1, 16384, 24576, 4, 96}, - {3, 7, 1, 16384, 24576, 4, 96}, - {3, 8, 1, 16384, 24576, 3, 96}, - {3, 1, 1, 16384, 51200, 3, 128}, - {3, 2, 1, 16384, 51200, 3, 128}, - {3, 3, 1, 16384, 51200, 3, 128}, - {3, 4, 1, 16384, 51200, 4, 100}, - {3, 5, 1, 16384, 51200, 4, 120}, - {3, 6, 1, 16384, 51200, 4, 120}, - {3, 7, 1, 16384, 51200, 4, 100}, - {3, 8, 1, 16384, 51200, 4, 100}, - {3, 1, 1, 16384, 128000, 3, 128}, - {3, 2, 1, 16384, 128000, 3, 128}, - {3, 3, 1, 16384, 128000, 3, 128}, - {3, 4, 1, 16384, 128000, 4, 126}, - {3, 5, 1, 16384, 128000, 4, 126}, - {3, 6, 1, 16384, 128000, 4, 116}, - {3, 7, 1, 16384, 128000, 4, 100}, - {3, 8, 1, 16384, 128000, 4, 86}, - {3, 1, 1, 24576, 512, 2, 72}, - {3, 2, 1, 24576, 512, 2, 72}, - {3, 3, 1, 24576, 512, 2, 84}, - {3, 4, 1, 24576, 512, 2, 72}, - {3, 5, 1, 24576, 512, 2, 84}, - {3, 6, 1, 24576, 512, 2, 80}, - {3, 7, 1, 24576, 512, 2, 84}, - {3, 8, 1, 24576, 512, 2, 72}, - {3, 1, 1, 24576, 1024, 2, 128}, - {3, 2, 1, 24576, 1024, 2, 126}, - {3, 3, 1, 24576, 1024, 2, 128}, - {3, 4, 1, 24576, 1024, 2, 112}, - {3, 5, 1, 24576, 1024, 2, 108}, - {3, 6, 1, 24576, 1024, 2, 96}, - {3, 7, 1, 24576, 1024, 2, 96}, - {3, 8, 1, 24576, 1024, 2, 80}, - {3, 1, 1, 24576, 2048, 2, 128}, - {3, 2, 1, 24576, 2048, 2, 128}, - {3, 3, 1, 24576, 2048, 3, 128}, - {3, 4, 1, 24576, 2048, 2, 128}, - {3, 5, 1, 24576, 2048, 2, 126}, - {3, 6, 1, 24576, 2048, 2, 96}, - {3, 7, 1, 24576, 2048, 2, 96}, - {3, 8, 1, 24576, 2048, 1, 96}, - {3, 1, 1, 24576, 3072, 3, 128}, - {3, 2, 1, 24576, 3072, 3, 128}, - {3, 3, 1, 24576, 3072, 3, 128}, - {3, 4, 1, 24576, 3072, 2, 128}, - {3, 5, 1, 24576, 3072, 2, 120}, - {3, 6, 1, 24576, 3072, 1, 128}, - {3, 7, 1, 24576, 3072, 2, 96}, - {3, 8, 1, 24576, 3072, 1, 96}, - {3, 1, 1, 24576, 4096, 3, 128}, - {3, 2, 1, 24576, 4096, 3, 128}, - {3, 3, 1, 24576, 4096, 3, 128}, - {3, 4, 1, 24576, 4096, 2, 128}, - {3, 5, 1, 24576, 4096, 2, 128}, - {3, 6, 1, 24576, 4096, 1, 128}, - {3, 7, 1, 24576, 4096, 1, 128}, - {3, 8, 1, 24576, 4096, 1, 96}, - {3, 1, 1, 24576, 5120, 3, 128}, - {3, 2, 1, 24576, 5120, 3, 128}, - {3, 3, 1, 24576, 5120, 3, 128}, - {3, 4, 1, 24576, 5120, 2, 120}, - {3, 5, 1, 24576, 5120, 2, 120}, - {3, 6, 1, 24576, 5120, 2, 120}, - {3, 7, 1, 24576, 5120, 2, 120}, - {3, 8, 1, 24576, 5120, 1, 96}, - {3, 1, 1, 24576, 8192, 3, 128}, - {3, 2, 1, 24576, 8192, 3, 128}, - {3, 3, 1, 24576, 8192, 3, 128}, - {3, 4, 1, 24576, 8192, 2, 128}, - {3, 5, 1, 24576, 8192, 2, 128}, - {3, 6, 1, 24576, 8192, 1, 128}, - {3, 7, 1, 24576, 8192, 1, 128}, - {3, 8, 1, 24576, 8192, 2, 128}, - {3, 1, 1, 24576, 12288, 3, 128}, - {3, 2, 1, 24576, 12288, 3, 128}, - {3, 3, 1, 24576, 12288, 3, 128}, - {3, 4, 1, 24576, 12288, 3, 96}, - {3, 5, 1, 24576, 12288, 4, 120}, - {3, 6, 1, 24576, 12288, 4, 72}, - {3, 7, 1, 24576, 12288, 4, 96}, - {3, 8, 1, 24576, 12288, 1, 96}, - {3, 1, 1, 24576, 14336, 3, 128}, - {3, 2, 1, 24576, 14336, 3, 128}, - {3, 3, 1, 24576, 14336, 3, 126}, - {3, 4, 1, 24576, 14336, 3, 112}, - {3, 5, 1, 24576, 14336, 4, 112}, - {3, 6, 1, 24576, 14336, 4, 112}, - {3, 7, 1, 24576, 14336, 4, 112}, - {3, 8, 1, 24576, 14336, 3, 112}, - {3, 1, 1, 24576, 16384, 3, 128}, - {3, 2, 1, 24576, 16384, 3, 128}, - {3, 3, 1, 24576, 16384, 3, 128}, - {3, 4, 1, 24576, 16384, 4, 96}, - {3, 5, 1, 24576, 16384, 3, 128}, - {3, 6, 1, 24576, 16384, 4, 128}, - {3, 7, 1, 24576, 16384, 1, 128}, - {3, 8, 1, 24576, 16384, 3, 96}, - {3, 1, 1, 24576, 24576, 3, 128}, - {3, 2, 1, 24576, 24576, 3, 128}, - {3, 3, 1, 24576, 24576, 3, 128}, - {3, 4, 1, 24576, 24576, 4, 96}, - {3, 5, 1, 24576, 24576, 4, 96}, - {3, 6, 1, 24576, 24576, 4, 96}, - {3, 7, 1, 24576, 24576, 4, 96}, - {3, 8, 1, 24576, 24576, 3, 96}, - {3, 1, 1, 24576, 51200, 3, 128}, - {3, 2, 1, 24576, 51200, 3, 128}, - {3, 3, 1, 24576, 51200, 3, 126}, - {3, 4, 1, 24576, 51200, 3, 120}, - {3, 5, 1, 24576, 51200, 4, 126}, - {3, 6, 1, 24576, 51200, 4, 128}, - {3, 7, 1, 24576, 51200, 4, 100}, - {3, 8, 1, 24576, 51200, 4, 100}, - {3, 1, 1, 24576, 128000, 3, 128}, - {3, 2, 1, 24576, 128000, 3, 128}, - {3, 3, 1, 24576, 128000, 3, 128}, - {3, 4, 1, 24576, 128000, 3, 124}, - {3, 5, 1, 24576, 128000, 4, 126}, - {3, 6, 1, 24576, 128000, 4, 126}, - {3, 7, 1, 24576, 128000, 4, 100}, - {3, 8, 1, 24576, 128000, 4, 126}, - {2, 1, 1, 128, 512, 1, 8}, - {2, 2, 1, 128, 512, 1, 8}, - {2, 3, 1, 128, 512, 1, 8}, - {2, 4, 1, 128, 512, 1, 8}, - {2, 5, 1, 128, 512, 1, 8}, - {2, 6, 1, 128, 512, 1, 8}, - {2, 7, 1, 128, 512, 1, 8}, - {2, 8, 1, 128, 512, 1, 8}, - {2, 1, 1, 128, 1024, 1, 16}, - {2, 2, 1, 128, 1024, 1, 16}, - {2, 3, 1, 128, 1024, 1, 16}, - {2, 4, 1, 128, 1024, 1, 16}, - {2, 5, 1, 128, 1024, 1, 16}, - {2, 6, 1, 128, 1024, 1, 16}, - {2, 7, 1, 128, 1024, 1, 16}, - {2, 8, 1, 128, 1024, 1, 16}, - {2, 1, 1, 128, 2048, 1, 32}, - {2, 2, 1, 128, 2048, 1, 32}, - {2, 3, 1, 128, 2048, 1, 32}, - {2, 4, 1, 128, 2048, 1, 32}, - {2, 5, 1, 128, 2048, 1, 32}, - {2, 6, 1, 128, 2048, 1, 32}, - {2, 7, 1, 128, 2048, 1, 32}, - {2, 8, 1, 128, 2048, 1, 32}, - {2, 1, 1, 128, 3072, 1, 48}, - {2, 2, 1, 128, 3072, 1, 48}, - {2, 3, 1, 128, 3072, 1, 48}, - {2, 4, 1, 128, 3072, 1, 48}, - {2, 5, 1, 128, 3072, 1, 48}, - {2, 6, 1, 128, 3072, 1, 48}, - {2, 7, 1, 128, 3072, 1, 48}, - {2, 8, 1, 128, 3072, 1, 48}, - {2, 1, 1, 128, 4096, 1, 64}, - {2, 2, 1, 128, 4096, 1, 64}, - {2, 3, 1, 128, 4096, 1, 64}, - {2, 4, 1, 128, 4096, 1, 64}, - {2, 5, 1, 128, 4096, 1, 64}, - {2, 6, 1, 128, 4096, 1, 64}, - {2, 7, 1, 128, 4096, 1, 64}, - {2, 8, 1, 128, 4096, 1, 64}, - {2, 1, 1, 128, 5120, 1, 80}, - {2, 2, 1, 128, 5120, 1, 80}, - {2, 3, 1, 128, 5120, 1, 80}, - {2, 4, 1, 128, 5120, 1, 80}, - {2, 5, 1, 128, 5120, 1, 80}, - {2, 6, 1, 128, 5120, 1, 80}, - {2, 7, 1, 128, 5120, 1, 64}, - {2, 8, 1, 128, 5120, 1, 80}, - {2, 1, 1, 128, 8192, 1, 64}, - {2, 2, 1, 128, 8192, 1, 64}, - {2, 3, 1, 128, 8192, 1, 64}, - {2, 4, 1, 128, 8192, 1, 64}, - {2, 5, 1, 128, 8192, 1, 64}, - {2, 6, 1, 128, 8192, 1, 64}, - {2, 7, 1, 128, 8192, 1, 64}, - {2, 8, 1, 128, 8192, 1, 64}, - {2, 1, 1, 128, 12288, 1, 84}, - {2, 2, 1, 128, 12288, 1, 84}, - {2, 3, 1, 128, 12288, 1, 84}, - {2, 4, 1, 128, 12288, 1, 84}, - {2, 5, 1, 128, 12288, 1, 84}, - {2, 6, 1, 128, 12288, 1, 84}, - {2, 7, 1, 128, 12288, 1, 84}, - {2, 8, 1, 128, 12288, 1, 80}, - {2, 1, 1, 128, 14336, 2, 84}, - {2, 2, 1, 128, 14336, 1, 84}, - {2, 3, 1, 128, 14336, 1, 84}, - {2, 4, 1, 128, 14336, 1, 84}, - {2, 5, 1, 128, 14336, 1, 84}, - {2, 6, 1, 128, 14336, 1, 84}, - {2, 7, 1, 128, 14336, 1, 84}, - {2, 8, 1, 128, 14336, 1, 84}, - {2, 1, 1, 128, 16384, 3, 64}, - {2, 2, 1, 128, 16384, 3, 64}, - {2, 3, 1, 128, 16384, 4, 64}, - {2, 4, 1, 128, 16384, 3, 64}, - {2, 5, 1, 128, 16384, 4, 64}, - {2, 6, 1, 128, 16384, 4, 64}, - {2, 7, 1, 128, 16384, 4, 64}, - {2, 8, 1, 128, 16384, 4, 64}, - {2, 1, 1, 128, 24576, 4, 84}, - {2, 2, 1, 128, 24576, 4, 84}, - {2, 3, 1, 128, 24576, 4, 84}, - {2, 4, 1, 128, 24576, 4, 84}, - {2, 5, 1, 128, 24576, 4, 84}, - {2, 6, 1, 128, 24576, 4, 84}, - {2, 7, 1, 128, 24576, 4, 64}, - {2, 8, 1, 128, 24576, 4, 84}, - {2, 1, 1, 128, 51200, 4, 80}, - {2, 2, 1, 128, 51200, 4, 80}, - {2, 3, 1, 128, 51200, 4, 80}, - {2, 4, 1, 128, 51200, 4, 80}, - {2, 5, 1, 128, 51200, 4, 80}, - {2, 6, 1, 128, 51200, 4, 80}, - {2, 7, 1, 128, 51200, 4, 80}, - {2, 8, 1, 128, 51200, 4, 80}, - {2, 1, 1, 128, 128000, 4, 84}, - {2, 2, 1, 128, 128000, 4, 84}, - {2, 3, 1, 128, 128000, 4, 84}, - {2, 4, 1, 128, 128000, 4, 84}, - {2, 5, 1, 128, 128000, 4, 84}, - {2, 6, 1, 128, 128000, 4, 84}, - {2, 7, 1, 128, 128000, 4, 84}, - {2, 8, 1, 128, 128000, 4, 80}, - {2, 1, 1, 256, 512, 2, 8}, - {2, 2, 1, 256, 512, 2, 8}, - {2, 3, 1, 256, 512, 2, 8}, - {2, 4, 1, 256, 512, 2, 8}, - {2, 5, 1, 256, 512, 2, 8}, - {2, 6, 1, 256, 512, 2, 8}, - {2, 7, 1, 256, 512, 2, 8}, - {2, 8, 1, 256, 512, 2, 8}, - {2, 1, 1, 256, 1024, 2, 16}, - {2, 2, 1, 256, 1024, 2, 16}, - {2, 3, 1, 256, 1024, 2, 16}, - {2, 4, 1, 256, 1024, 2, 16}, - {2, 5, 1, 256, 1024, 1, 16}, - {2, 6, 1, 256, 1024, 2, 16}, - {2, 7, 1, 256, 1024, 1, 16}, - {2, 8, 1, 256, 1024, 1, 16}, - {2, 1, 1, 256, 2048, 2, 32}, - {2, 2, 1, 256, 2048, 2, 32}, - {2, 3, 1, 256, 2048, 1, 32}, - {2, 4, 1, 256, 2048, 1, 32}, - {2, 5, 1, 256, 2048, 1, 32}, - {2, 6, 1, 256, 2048, 1, 32}, - {2, 7, 1, 256, 2048, 1, 32}, - {2, 8, 1, 256, 2048, 1, 32}, - {2, 1, 1, 256, 3072, 2, 48}, - {2, 2, 1, 256, 3072, 1, 48}, - {2, 3, 1, 256, 3072, 1, 48}, - {2, 4, 1, 256, 3072, 1, 48}, - {2, 5, 1, 256, 3072, 1, 48}, - {2, 6, 1, 256, 3072, 1, 48}, - {2, 7, 1, 256, 3072, 1, 48}, - {2, 8, 1, 256, 3072, 1, 48}, - {2, 1, 1, 256, 4096, 2, 64}, - {2, 2, 1, 256, 4096, 1, 64}, - {2, 3, 1, 256, 4096, 1, 64}, - {2, 4, 1, 256, 4096, 1, 64}, - {2, 5, 1, 256, 4096, 1, 64}, - {2, 6, 1, 256, 4096, 1, 64}, - {2, 7, 1, 256, 4096, 1, 64}, - {2, 8, 1, 256, 4096, 1, 64}, - {2, 1, 1, 256, 5120, 1, 80}, - {2, 2, 1, 256, 5120, 1, 80}, - {2, 3, 1, 256, 5120, 1, 80}, - {2, 4, 1, 256, 5120, 1, 80}, - {2, 5, 1, 256, 5120, 1, 80}, - {2, 6, 1, 256, 5120, 1, 80}, - {2, 7, 1, 256, 5120, 1, 80}, - {2, 8, 1, 256, 5120, 1, 80}, - {2, 1, 1, 256, 8192, 2, 64}, - {2, 2, 1, 256, 8192, 2, 64}, - {2, 3, 1, 256, 8192, 1, 84}, - {2, 4, 1, 256, 8192, 2, 64}, - {2, 5, 1, 256, 8192, 1, 84}, - {2, 6, 1, 256, 8192, 1, 84}, - {2, 7, 1, 256, 8192, 1, 84}, - {2, 8, 1, 256, 8192, 1, 84}, - {2, 1, 1, 256, 12288, 2, 84}, - {2, 2, 1, 256, 12288, 2, 84}, - {2, 3, 1, 256, 12288, 1, 84}, - {2, 4, 1, 256, 12288, 2, 84}, - {2, 5, 1, 256, 12288, 1, 84}, - {2, 6, 1, 256, 12288, 1, 84}, - {2, 7, 1, 256, 12288, 2, 84}, - {2, 8, 1, 256, 12288, 1, 84}, - {2, 1, 1, 256, 14336, 2, 84}, - {2, 2, 1, 256, 14336, 2, 84}, - {2, 3, 1, 256, 14336, 1, 84}, - {2, 4, 1, 256, 14336, 2, 84}, - {2, 5, 1, 256, 14336, 2, 84}, - {2, 6, 1, 256, 14336, 2, 84}, - {2, 7, 1, 256, 14336, 4, 56}, - {2, 8, 1, 256, 14336, 1, 84}, - {2, 1, 1, 256, 16384, 3, 64}, - {2, 2, 1, 256, 16384, 3, 64}, - {2, 3, 1, 256, 16384, 3, 64}, - {2, 4, 1, 256, 16384, 3, 64}, - {2, 5, 1, 256, 16384, 4, 64}, - {2, 6, 1, 256, 16384, 4, 64}, - {2, 7, 1, 256, 16384, 4, 64}, - {2, 8, 1, 256, 16384, 4, 64}, - {2, 1, 1, 256, 24576, 4, 84}, - {2, 2, 1, 256, 24576, 4, 84}, - {2, 3, 1, 256, 24576, 4, 84}, - {2, 4, 1, 256, 24576, 4, 80}, - {2, 5, 1, 256, 24576, 4, 84}, - {2, 6, 1, 256, 24576, 4, 84}, - {2, 7, 1, 256, 24576, 4, 84}, - {2, 8, 1, 256, 24576, 4, 84}, - {2, 1, 1, 256, 51200, 4, 84}, - {2, 2, 1, 256, 51200, 4, 84}, - {2, 3, 1, 256, 51200, 4, 84}, - {2, 4, 1, 256, 51200, 4, 84}, - {2, 5, 1, 256, 51200, 4, 84}, - {2, 6, 1, 256, 51200, 4, 84}, - {2, 7, 1, 256, 51200, 4, 84}, - {2, 8, 1, 256, 51200, 4, 80}, - {2, 1, 1, 256, 128000, 4, 84}, - {2, 2, 1, 256, 128000, 4, 84}, - {2, 3, 1, 256, 128000, 4, 84}, - {2, 4, 1, 256, 128000, 4, 84}, - {2, 5, 1, 256, 128000, 4, 84}, - {2, 6, 1, 256, 128000, 4, 84}, - {2, 7, 1, 256, 128000, 4, 84}, - {2, 8, 1, 256, 128000, 4, 80}, - {2, 1, 1, 512, 512, 2, 8}, - {2, 2, 1, 512, 512, 2, 16}, - {2, 3, 1, 512, 512, 2, 16}, - {2, 4, 1, 512, 512, 2, 8}, - {2, 5, 1, 512, 512, 2, 16}, - {2, 6, 1, 512, 512, 1, 16}, - {2, 7, 1, 512, 512, 1, 16}, - {2, 8, 1, 512, 512, 1, 16}, - {2, 1, 1, 512, 1024, 2, 24}, - {2, 2, 1, 512, 1024, 2, 16}, - {2, 3, 1, 512, 1024, 1, 24}, - {2, 4, 1, 512, 1024, 1, 24}, - {2, 5, 1, 512, 1024, 1, 24}, - {2, 6, 1, 512, 1024, 1, 32}, - {2, 7, 1, 512, 1024, 1, 32}, - {2, 8, 1, 512, 1024, 1, 32}, - {2, 1, 1, 512, 2048, 2, 32}, - {2, 2, 1, 512, 2048, 1, 48}, - {2, 3, 1, 512, 2048, 1, 64}, - {2, 4, 1, 512, 2048, 1, 48}, - {2, 5, 1, 512, 2048, 1, 64}, - {2, 6, 1, 512, 2048, 1, 64}, - {2, 7, 1, 512, 2048, 1, 64}, - {2, 8, 1, 512, 2048, 1, 64}, - {2, 1, 1, 512, 3072, 2, 48}, - {2, 2, 1, 512, 3072, 1, 72}, - {2, 3, 1, 512, 3072, 1, 72}, - {2, 4, 1, 512, 3072, 1, 72}, - {2, 5, 1, 512, 3072, 1, 72}, - {2, 6, 1, 512, 3072, 1, 72}, - {2, 7, 1, 512, 3072, 1, 72}, - {2, 8, 1, 512, 3072, 1, 72}, - {2, 1, 1, 512, 4096, 2, 64}, - {2, 2, 1, 512, 4096, 2, 64}, - {2, 3, 1, 512, 4096, 1, 84}, - {2, 4, 1, 512, 4096, 2, 64}, - {2, 5, 1, 512, 4096, 1, 84}, - {2, 6, 1, 512, 4096, 1, 84}, - {2, 7, 1, 512, 4096, 1, 84}, - {2, 8, 1, 512, 4096, 1, 84}, - {2, 1, 1, 512, 5120, 2, 80}, - {2, 2, 1, 512, 5120, 2, 80}, - {2, 3, 1, 512, 5120, 1, 80}, - {2, 4, 1, 512, 5120, 2, 80}, - {2, 5, 1, 512, 5120, 1, 80}, - {2, 6, 1, 512, 5120, 1, 80}, - {2, 7, 1, 512, 5120, 2, 80}, - {2, 8, 1, 512, 5120, 1, 80}, - {2, 1, 1, 512, 8192, 2, 84}, - {2, 2, 1, 512, 8192, 2, 84}, - {2, 3, 1, 512, 8192, 3, 64}, - {2, 4, 1, 512, 8192, 2, 84}, - {2, 5, 1, 512, 8192, 2, 84}, - {2, 6, 1, 512, 8192, 2, 84}, - {2, 7, 1, 512, 8192, 2, 84}, - {2, 8, 1, 512, 8192, 2, 84}, - {2, 1, 1, 512, 12288, 3, 84}, - {2, 2, 1, 512, 12288, 3, 84}, - {2, 3, 1, 512, 12288, 3, 84}, - {2, 4, 1, 512, 12288, 3, 84}, - {2, 5, 1, 512, 12288, 2, 84}, - {2, 6, 1, 512, 12288, 2, 84}, - {2, 7, 1, 512, 12288, 4, 72}, - {2, 8, 1, 512, 12288, 3, 78}, - {2, 1, 1, 512, 14336, 3, 84}, - {2, 2, 1, 512, 14336, 3, 82}, - {2, 3, 1, 512, 14336, 3, 84}, - {2, 4, 1, 512, 14336, 3, 84}, - {2, 5, 1, 512, 14336, 4, 84}, - {2, 6, 1, 512, 14336, 4, 84}, - {2, 7, 1, 512, 14336, 4, 82}, - {2, 8, 1, 512, 14336, 4, 74}, - {2, 1, 1, 512, 16384, 3, 84}, - {2, 2, 1, 512, 16384, 3, 82}, - {2, 3, 1, 512, 16384, 4, 84}, - {2, 4, 1, 512, 16384, 3, 84}, - {2, 5, 1, 512, 16384, 4, 84}, - {2, 6, 1, 512, 16384, 4, 84}, - {2, 7, 1, 512, 16384, 4, 84}, - {2, 8, 1, 512, 16384, 3, 64}, - {2, 1, 1, 512, 24576, 4, 84}, - {2, 2, 1, 512, 24576, 3, 84}, - {2, 3, 1, 512, 24576, 4, 84}, - {2, 4, 1, 512, 24576, 3, 84}, - {2, 5, 1, 512, 24576, 4, 84}, - {2, 6, 1, 512, 24576, 4, 84}, - {2, 7, 1, 512, 24576, 4, 84}, - {2, 8, 1, 512, 24576, 4, 80}, - {2, 1, 1, 512, 51200, 4, 84}, - {2, 2, 1, 512, 51200, 3, 80}, - {2, 3, 1, 512, 51200, 4, 84}, - {2, 4, 1, 512, 51200, 4, 84}, - {2, 5, 1, 512, 51200, 4, 84}, - {2, 6, 1, 512, 51200, 4, 84}, - {2, 7, 1, 512, 51200, 4, 82}, - {2, 8, 1, 512, 51200, 4, 80}, - {2, 1, 1, 512, 128000, 3, 84}, - {2, 2, 1, 512, 128000, 3, 84}, - {2, 3, 1, 512, 128000, 4, 84}, - {2, 4, 1, 512, 128000, 3, 84}, - {2, 5, 1, 512, 128000, 4, 84}, - {2, 6, 1, 512, 128000, 4, 84}, - {2, 7, 1, 512, 128000, 4, 80}, - {2, 8, 1, 512, 128000, 4, 80}, - {2, 1, 1, 1024, 512, 2, 16}, - {2, 2, 1, 1024, 512, 2, 16}, - {2, 3, 1, 1024, 512, 2, 16}, - {2, 4, 1, 1024, 512, 2, 16}, - {2, 5, 1, 1024, 512, 2, 16}, - {2, 6, 1, 1024, 512, 2, 16}, - {2, 7, 1, 1024, 512, 2, 16}, - {2, 8, 1, 1024, 512, 2, 16}, - {2, 1, 1, 1024, 1024, 2, 32}, - {2, 2, 1, 1024, 1024, 2, 32}, - {2, 3, 1, 1024, 1024, 2, 32}, - {2, 4, 1, 1024, 1024, 2, 32}, - {2, 5, 1, 1024, 1024, 2, 32}, - {2, 6, 1, 1024, 1024, 2, 32}, - {2, 7, 1, 1024, 1024, 2, 32}, - {2, 8, 1, 1024, 1024, 2, 32}, - {2, 1, 1, 1024, 2048, 2, 64}, - {2, 2, 1, 1024, 2048, 2, 64}, - {2, 3, 1, 1024, 2048, 1, 64}, - {2, 4, 1, 1024, 2048, 2, 64}, - {2, 5, 1, 1024, 2048, 2, 64}, - {2, 6, 1, 1024, 2048, 2, 64}, - {2, 7, 1, 1024, 2048, 2, 64}, - {2, 8, 1, 1024, 2048, 1, 80}, - {2, 1, 1, 1024, 3072, 2, 72}, - {2, 2, 1, 1024, 3072, 2, 72}, - {2, 3, 1, 1024, 3072, 2, 72}, - {2, 4, 1, 1024, 3072, 2, 72}, - {2, 5, 1, 1024, 3072, 2, 72}, - {2, 6, 1, 1024, 3072, 2, 72}, - {2, 7, 1, 1024, 3072, 2, 72}, - {2, 8, 1, 1024, 3072, 2, 82}, - {2, 1, 1, 1024, 4096, 2, 84}, - {2, 2, 1, 1024, 4096, 2, 84}, - {2, 3, 1, 1024, 4096, 2, 84}, - {2, 4, 1, 1024, 4096, 2, 84}, - {2, 5, 1, 1024, 4096, 2, 84}, - {2, 6, 1, 1024, 4096, 2, 84}, - {2, 7, 1, 1024, 4096, 2, 84}, - {2, 8, 1, 1024, 4096, 2, 84}, - {2, 1, 1, 1024, 5120, 2, 80}, - {2, 2, 1, 1024, 5120, 2, 80}, - {2, 3, 1, 1024, 5120, 2, 80}, - {2, 4, 1, 1024, 5120, 2, 80}, - {2, 5, 1, 1024, 5120, 2, 80}, - {2, 6, 1, 1024, 5120, 2, 80}, - {2, 7, 1, 1024, 5120, 2, 80}, - {2, 8, 1, 1024, 5120, 2, 80}, - {2, 1, 1, 1024, 8192, 3, 84}, - {2, 2, 1, 1024, 8192, 3, 84}, - {2, 3, 1, 1024, 8192, 3, 84}, - {2, 4, 1, 1024, 8192, 3, 84}, - {2, 5, 1, 1024, 8192, 2, 84}, - {2, 6, 1, 1024, 8192, 2, 84}, - {2, 7, 1, 1024, 8192, 4, 80}, - {2, 8, 1, 1024, 8192, 3, 64}, - {2, 1, 1, 1024, 12288, 3, 82}, - {2, 2, 1, 1024, 12288, 3, 84}, - {2, 3, 1, 1024, 12288, 3, 84}, - {2, 4, 1, 1024, 12288, 3, 84}, - {2, 5, 1, 1024, 12288, 4, 84}, - {2, 6, 1, 1024, 12288, 4, 84}, - {2, 7, 1, 1024, 12288, 4, 82}, - {2, 8, 1, 1024, 12288, 3, 80}, - {2, 1, 1, 1024, 14336, 3, 84}, - {2, 2, 1, 1024, 14336, 3, 84}, - {2, 3, 1, 1024, 14336, 3, 84}, - {2, 4, 1, 1024, 14336, 3, 84}, - {2, 5, 1, 1024, 14336, 4, 84}, - {2, 6, 1, 1024, 14336, 4, 84}, - {2, 7, 1, 1024, 14336, 4, 82}, - {2, 8, 1, 1024, 14336, 3, 78}, - {2, 1, 1, 1024, 16384, 3, 82}, - {2, 2, 1, 1024, 16384, 3, 82}, - {2, 3, 1, 1024, 16384, 3, 84}, - {2, 4, 1, 1024, 16384, 3, 84}, - {2, 5, 1, 1024, 16384, 4, 84}, - {2, 6, 1, 1024, 16384, 4, 84}, - {2, 7, 1, 1024, 16384, 4, 84}, - {2, 8, 1, 1024, 16384, 3, 64}, - {2, 1, 1, 1024, 24576, 3, 84}, - {2, 2, 1, 1024, 24576, 3, 84}, - {2, 3, 1, 1024, 24576, 4, 84}, - {2, 4, 1, 1024, 24576, 3, 84}, - {2, 5, 1, 1024, 24576, 4, 84}, - {2, 6, 1, 1024, 24576, 4, 84}, - {2, 7, 1, 1024, 24576, 4, 84}, - {2, 8, 1, 1024, 24576, 4, 70}, - {2, 1, 1, 1024, 51200, 3, 84}, - {2, 2, 1, 1024, 51200, 3, 84}, - {2, 3, 1, 1024, 51200, 3, 84}, - {2, 4, 1, 1024, 51200, 3, 84}, - {2, 5, 1, 1024, 51200, 4, 84}, - {2, 6, 1, 1024, 51200, 4, 84}, - {2, 7, 1, 1024, 51200, 4, 80}, - {2, 8, 1, 1024, 51200, 4, 80}, - {2, 1, 1, 1024, 128000, 3, 84}, - {2, 2, 1, 1024, 128000, 3, 84}, - {2, 3, 1, 1024, 128000, 3, 84}, - {2, 4, 1, 1024, 128000, 3, 84}, - {2, 5, 1, 1024, 128000, 4, 84}, - {2, 6, 1, 1024, 128000, 4, 84}, - {2, 7, 1, 1024, 128000, 4, 84}, - {2, 8, 1, 1024, 128000, 4, 80}, - {2, 1, 1, 2048, 512, 2, 20}, - {2, 2, 1, 2048, 512, 2, 20}, - {2, 3, 1, 2048, 512, 2, 26}, - {2, 4, 1, 2048, 512, 2, 20}, - {2, 5, 1, 2048, 512, 2, 24}, - {2, 6, 1, 2048, 512, 2, 24}, - {2, 7, 1, 2048, 512, 2, 24}, - {2, 8, 1, 2048, 512, 2, 26}, - {2, 1, 1, 2048, 1024, 2, 40}, - {2, 2, 1, 2048, 1024, 2, 40}, - {2, 3, 1, 2048, 1024, 2, 52}, - {2, 4, 1, 2048, 1024, 2, 40}, - {2, 5, 1, 2048, 1024, 2, 40}, - {2, 6, 1, 2048, 1024, 2, 40}, - {2, 7, 1, 2048, 1024, 2, 48}, - {2, 8, 1, 2048, 1024, 2, 48}, - {2, 1, 1, 2048, 2048, 2, 80}, - {2, 2, 1, 2048, 2048, 2, 80}, - {2, 3, 1, 2048, 2048, 2, 80}, - {2, 4, 1, 2048, 2048, 2, 80}, - {2, 5, 1, 2048, 2048, 2, 80}, - {2, 6, 1, 2048, 2048, 2, 80}, - {2, 7, 1, 2048, 2048, 2, 84}, - {2, 8, 1, 2048, 2048, 2, 80}, - {2, 1, 1, 2048, 3072, 2, 78}, - {2, 2, 1, 2048, 3072, 2, 84}, - {2, 3, 1, 2048, 3072, 2, 84}, - {2, 4, 1, 2048, 3072, 2, 82}, - {2, 5, 1, 2048, 3072, 2, 84}, - {2, 6, 1, 2048, 3072, 2, 82}, - {2, 7, 1, 2048, 3072, 2, 82}, - {2, 8, 1, 2048, 3072, 2, 82}, - {2, 1, 1, 2048, 4096, 2, 84}, - {2, 2, 1, 2048, 4096, 2, 84}, - {2, 3, 1, 2048, 4096, 3, 80}, - {2, 4, 1, 2048, 4096, 2, 84}, - {2, 5, 1, 2048, 4096, 2, 84}, - {2, 6, 1, 2048, 4096, 2, 84}, - {2, 7, 1, 2048, 4096, 2, 84}, - {2, 8, 1, 2048, 4096, 2, 84}, - {2, 1, 1, 2048, 5120, 3, 80}, - {2, 2, 1, 2048, 5120, 3, 80}, - {2, 3, 1, 2048, 5120, 3, 80}, - {2, 4, 1, 2048, 5120, 3, 80}, - {2, 5, 1, 2048, 5120, 2, 84}, - {2, 6, 1, 2048, 5120, 2, 84}, - {2, 7, 1, 2048, 5120, 2, 84}, - {2, 8, 1, 2048, 5120, 3, 76}, - {2, 1, 1, 2048, 8192, 3, 84}, - {2, 2, 1, 2048, 8192, 3, 84}, - {2, 3, 1, 2048, 8192, 3, 84}, - {2, 4, 1, 2048, 8192, 3, 84}, - {2, 5, 1, 2048, 8192, 4, 82}, - {2, 6, 1, 2048, 8192, 4, 82}, - {2, 7, 1, 2048, 8192, 4, 82}, - {2, 8, 1, 2048, 8192, 3, 64}, - {2, 1, 1, 2048, 12288, 3, 84}, - {2, 2, 1, 2048, 12288, 3, 84}, - {2, 3, 1, 2048, 12288, 3, 84}, - {2, 4, 1, 2048, 12288, 3, 84}, - {2, 5, 1, 2048, 12288, 4, 84}, - {2, 6, 1, 2048, 12288, 4, 84}, - {2, 7, 1, 2048, 12288, 4, 82}, - {2, 8, 1, 2048, 12288, 3, 78}, - {2, 1, 1, 2048, 14336, 3, 84}, - {2, 2, 1, 2048, 14336, 3, 84}, - {2, 3, 1, 2048, 14336, 3, 84}, - {2, 4, 1, 2048, 14336, 3, 84}, - {2, 5, 1, 2048, 14336, 4, 84}, - {2, 6, 1, 2048, 14336, 4, 84}, - {2, 7, 1, 2048, 14336, 4, 84}, - {2, 8, 1, 2048, 14336, 4, 72}, - {2, 1, 1, 2048, 16384, 3, 84}, - {2, 2, 1, 2048, 16384, 3, 84}, - {2, 3, 1, 2048, 16384, 3, 84}, - {2, 4, 1, 2048, 16384, 3, 84}, - {2, 5, 1, 2048, 16384, 4, 84}, - {2, 6, 1, 2048, 16384, 4, 84}, - {2, 7, 1, 2048, 16384, 4, 84}, - {2, 8, 1, 2048, 16384, 4, 72}, - {2, 1, 1, 2048, 24576, 3, 84}, - {2, 2, 1, 2048, 24576, 3, 84}, - {2, 3, 1, 2048, 24576, 3, 84}, - {2, 4, 1, 2048, 24576, 3, 84}, - {2, 5, 1, 2048, 24576, 4, 84}, - {2, 6, 1, 2048, 24576, 4, 84}, - {2, 7, 1, 2048, 24576, 4, 84}, - {2, 8, 1, 2048, 24576, 4, 84}, - {2, 1, 1, 2048, 51200, 3, 84}, - {2, 2, 1, 2048, 51200, 3, 84}, - {2, 3, 1, 2048, 51200, 3, 84}, - {2, 4, 1, 2048, 51200, 3, 84}, - {2, 5, 1, 2048, 51200, 4, 84}, - {2, 6, 1, 2048, 51200, 4, 84}, - {2, 7, 1, 2048, 51200, 4, 80}, - {2, 8, 1, 2048, 51200, 4, 76}, - {2, 1, 1, 2048, 128000, 3, 84}, - {2, 2, 1, 2048, 128000, 3, 84}, - {2, 3, 1, 2048, 128000, 3, 84}, - {2, 4, 1, 2048, 128000, 3, 84}, - {2, 5, 1, 2048, 128000, 4, 84}, - {2, 6, 1, 2048, 128000, 4, 84}, - {2, 7, 1, 2048, 128000, 4, 84}, - {2, 8, 1, 2048, 128000, 4, 70}, - {2, 1, 1, 3072, 512, 2, 24}, - {2, 2, 1, 3072, 512, 2, 32}, - {2, 3, 1, 3072, 512, 2, 32}, - {2, 4, 1, 3072, 512, 2, 24}, - {2, 5, 1, 3072, 512, 2, 32}, - {2, 6, 1, 3072, 512, 2, 32}, - {2, 7, 1, 3072, 512, 2, 32}, - {2, 8, 1, 3072, 512, 2, 32}, - {2, 1, 1, 3072, 1024, 2, 56}, - {2, 2, 1, 3072, 1024, 2, 48}, - {2, 3, 1, 3072, 1024, 2, 64}, - {2, 4, 1, 3072, 1024, 2, 48}, - {2, 5, 1, 3072, 1024, 2, 64}, - {2, 6, 1, 3072, 1024, 2, 64}, - {2, 7, 1, 3072, 1024, 2, 64}, - {2, 8, 1, 3072, 1024, 2, 64}, - {2, 1, 1, 3072, 2048, 2, 82}, - {2, 2, 1, 3072, 2048, 2, 84}, - {2, 3, 1, 3072, 2048, 2, 82}, - {2, 4, 1, 3072, 2048, 2, 82}, - {2, 5, 1, 3072, 2048, 2, 82}, - {2, 6, 1, 3072, 2048, 2, 84}, - {2, 7, 1, 3072, 2048, 2, 82}, - {2, 8, 1, 3072, 2048, 2, 82}, - {2, 1, 1, 3072, 3072, 2, 84}, - {2, 2, 1, 3072, 3072, 2, 84}, - {2, 3, 1, 3072, 3072, 3, 78}, - {2, 4, 1, 3072, 3072, 2, 82}, - {2, 5, 1, 3072, 3072, 2, 84}, - {2, 6, 1, 3072, 3072, 2, 82}, - {2, 7, 1, 3072, 3072, 2, 84}, - {2, 8, 1, 3072, 3072, 2, 84}, - {2, 1, 1, 3072, 4096, 2, 84}, - {2, 2, 1, 3072, 4096, 3, 82}, - {2, 3, 1, 3072, 4096, 3, 84}, - {2, 4, 1, 3072, 4096, 2, 84}, - {2, 5, 1, 3072, 4096, 2, 84}, - {2, 6, 1, 3072, 4096, 2, 84}, - {2, 7, 1, 3072, 4096, 2, 84}, - {2, 8, 1, 3072, 4096, 3, 64}, - {2, 1, 1, 3072, 5120, 3, 84}, - {2, 2, 1, 3072, 5120, 3, 84}, - {2, 3, 1, 3072, 5120, 3, 84}, - {2, 4, 1, 3072, 5120, 3, 84}, - {2, 5, 1, 3072, 5120, 2, 84}, - {2, 6, 1, 3072, 5120, 2, 84}, - {2, 7, 1, 3072, 5120, 4, 80}, - {2, 8, 1, 3072, 5120, 3, 76}, - {2, 1, 1, 3072, 8192, 3, 84}, - {2, 2, 1, 3072, 8192, 3, 84}, - {2, 3, 1, 3072, 8192, 3, 84}, - {2, 4, 1, 3072, 8192, 3, 84}, - {2, 5, 1, 3072, 8192, 4, 84}, - {2, 6, 1, 3072, 8192, 4, 84}, - {2, 7, 1, 3072, 8192, 4, 82}, - {2, 8, 1, 3072, 8192, 3, 64}, - {2, 1, 1, 3072, 12288, 3, 84}, - {2, 2, 1, 3072, 12288, 3, 84}, - {2, 3, 1, 3072, 12288, 3, 84}, - {2, 4, 1, 3072, 12288, 3, 84}, - {2, 5, 1, 3072, 12288, 4, 84}, - {2, 6, 1, 3072, 12288, 4, 84}, - {2, 7, 1, 3072, 12288, 4, 82}, - {2, 8, 1, 3072, 12288, 4, 72}, - {2, 1, 1, 3072, 14336, 3, 84}, - {2, 2, 1, 3072, 14336, 3, 84}, - {2, 3, 1, 3072, 14336, 3, 84}, - {2, 4, 1, 3072, 14336, 3, 84}, - {2, 5, 1, 3072, 14336, 4, 84}, - {2, 6, 1, 3072, 14336, 4, 84}, - {2, 7, 1, 3072, 14336, 4, 84}, - {2, 8, 1, 3072, 14336, 4, 74}, - {2, 1, 1, 3072, 16384, 3, 84}, - {2, 2, 1, 3072, 16384, 3, 84}, - {2, 3, 1, 3072, 16384, 3, 84}, - {2, 4, 1, 3072, 16384, 3, 84}, - {2, 5, 1, 3072, 16384, 4, 84}, - {2, 6, 1, 3072, 16384, 4, 84}, - {2, 7, 1, 3072, 16384, 4, 84}, - {2, 8, 1, 3072, 16384, 4, 70}, - {2, 1, 1, 3072, 24576, 3, 84}, - {2, 2, 1, 3072, 24576, 3, 84}, - {2, 3, 1, 3072, 24576, 3, 84}, - {2, 4, 1, 3072, 24576, 3, 84}, - {2, 5, 1, 3072, 24576, 4, 84}, - {2, 6, 1, 3072, 24576, 4, 84}, - {2, 7, 1, 3072, 24576, 4, 84}, - {2, 8, 1, 3072, 24576, 4, 84}, - {2, 1, 1, 3072, 51200, 3, 84}, - {2, 2, 1, 3072, 51200, 3, 84}, - {2, 3, 1, 3072, 51200, 3, 84}, - {2, 4, 1, 3072, 51200, 3, 84}, - {2, 5, 1, 3072, 51200, 4, 84}, - {2, 6, 1, 3072, 51200, 4, 84}, - {2, 7, 1, 3072, 51200, 4, 80}, - {2, 8, 1, 3072, 51200, 4, 70}, - {2, 1, 1, 3072, 128000, 3, 84}, - {2, 2, 1, 3072, 128000, 3, 84}, - {2, 3, 1, 3072, 128000, 3, 84}, - {2, 4, 1, 3072, 128000, 3, 84}, - {2, 5, 1, 3072, 128000, 4, 84}, - {2, 6, 1, 3072, 128000, 4, 84}, - {2, 7, 1, 3072, 128000, 4, 80}, - {2, 8, 1, 3072, 128000, 4, 70}, - {2, 1, 1, 4096, 512, 2, 32}, - {2, 2, 1, 4096, 512, 2, 32}, - {2, 3, 1, 4096, 512, 2, 32}, - {2, 4, 1, 4096, 512, 2, 32}, - {2, 5, 1, 4096, 512, 2, 32}, - {2, 6, 1, 4096, 512, 2, 32}, - {2, 7, 1, 4096, 512, 2, 32}, - {2, 8, 1, 4096, 512, 2, 32}, - {2, 1, 1, 4096, 1024, 2, 64}, - {2, 2, 1, 4096, 1024, 2, 64}, - {2, 3, 1, 4096, 1024, 2, 64}, - {2, 4, 1, 4096, 1024, 2, 64}, - {2, 5, 1, 4096, 1024, 2, 64}, - {2, 6, 1, 4096, 1024, 2, 64}, - {2, 7, 1, 4096, 1024, 2, 70}, - {2, 8, 1, 4096, 1024, 2, 64}, - {2, 1, 1, 4096, 2048, 2, 82}, - {2, 2, 1, 4096, 2048, 2, 82}, - {2, 3, 1, 4096, 2048, 2, 82}, - {2, 4, 1, 4096, 2048, 2, 82}, - {2, 5, 1, 4096, 2048, 2, 82}, - {2, 6, 1, 4096, 2048, 2, 82}, - {2, 7, 1, 4096, 2048, 2, 82}, - {2, 8, 1, 4096, 2048, 2, 82}, - {2, 1, 1, 4096, 3072, 2, 84}, - {2, 2, 1, 4096, 3072, 2, 84}, - {2, 3, 1, 4096, 3072, 3, 82}, - {2, 4, 1, 4096, 3072, 2, 82}, - {2, 5, 1, 4096, 3072, 2, 84}, - {2, 6, 1, 4096, 3072, 2, 84}, - {2, 7, 1, 4096, 3072, 2, 84}, - {2, 8, 1, 4096, 3072, 3, 68}, - {2, 1, 1, 4096, 4096, 3, 82}, - {2, 2, 1, 4096, 4096, 3, 82}, - {2, 3, 1, 4096, 4096, 3, 84}, - {2, 4, 1, 4096, 4096, 3, 82}, - {2, 5, 1, 4096, 4096, 2, 84}, - {2, 6, 1, 4096, 4096, 2, 84}, - {2, 7, 1, 4096, 4096, 3, 84}, - {2, 8, 1, 4096, 4096, 3, 64}, - {2, 1, 1, 4096, 5120, 3, 84}, - {2, 2, 1, 4096, 5120, 3, 84}, - {2, 3, 1, 4096, 5120, 3, 84}, - {2, 4, 1, 4096, 5120, 3, 84}, - {2, 5, 1, 4096, 5120, 4, 84}, - {2, 6, 1, 4096, 5120, 4, 84}, - {2, 7, 1, 4096, 5120, 4, 80}, - {2, 8, 1, 4096, 5120, 3, 72}, - {2, 1, 1, 4096, 8192, 3, 84}, - {2, 2, 1, 4096, 8192, 3, 84}, - {2, 3, 1, 4096, 8192, 3, 84}, - {2, 4, 1, 4096, 8192, 3, 84}, - {2, 5, 1, 4096, 8192, 4, 84}, - {2, 6, 1, 4096, 8192, 4, 84}, - {2, 7, 1, 4096, 8192, 4, 82}, - {2, 8, 1, 4096, 8192, 3, 64}, - {2, 1, 1, 4096, 12288, 3, 84}, - {2, 2, 1, 4096, 12288, 3, 84}, - {2, 3, 1, 4096, 12288, 3, 84}, - {2, 4, 1, 4096, 12288, 3, 84}, - {2, 5, 1, 4096, 12288, 4, 84}, - {2, 6, 1, 4096, 12288, 4, 84}, - {2, 7, 1, 4096, 12288, 4, 80}, - {2, 8, 1, 4096, 12288, 4, 72}, - {2, 1, 1, 4096, 14336, 3, 84}, - {2, 2, 1, 4096, 14336, 3, 84}, - {2, 3, 1, 4096, 14336, 3, 84}, - {2, 4, 1, 4096, 14336, 3, 84}, - {2, 5, 1, 4096, 14336, 4, 84}, - {2, 6, 1, 4096, 14336, 4, 84}, - {2, 7, 1, 4096, 14336, 4, 84}, - {2, 8, 1, 4096, 14336, 4, 78}, - {2, 1, 1, 4096, 16384, 3, 84}, - {2, 2, 1, 4096, 16384, 3, 84}, - {2, 3, 1, 4096, 16384, 3, 84}, - {2, 4, 1, 4096, 16384, 3, 84}, - {2, 5, 1, 4096, 16384, 4, 84}, - {2, 6, 1, 4096, 16384, 4, 84}, - {2, 7, 1, 4096, 16384, 4, 84}, - {2, 8, 1, 4096, 16384, 4, 70}, - {2, 1, 1, 4096, 24576, 3, 84}, - {2, 2, 1, 4096, 24576, 3, 84}, - {2, 3, 1, 4096, 24576, 3, 84}, - {2, 4, 1, 4096, 24576, 3, 84}, - {2, 5, 1, 4096, 24576, 4, 84}, - {2, 6, 1, 4096, 24576, 4, 84}, - {2, 7, 1, 4096, 24576, 4, 84}, - {2, 8, 1, 4096, 24576, 4, 74}, - {2, 1, 1, 4096, 51200, 3, 84}, - {2, 2, 1, 4096, 51200, 3, 84}, - {2, 3, 1, 4096, 51200, 3, 84}, - {2, 4, 1, 4096, 51200, 3, 84}, - {2, 5, 1, 4096, 51200, 4, 84}, - {2, 6, 1, 4096, 51200, 4, 84}, - {2, 7, 1, 4096, 51200, 4, 80}, - {2, 8, 1, 4096, 51200, 4, 70}, - {2, 1, 1, 4096, 128000, 3, 84}, - {2, 2, 1, 4096, 128000, 3, 84}, - {2, 3, 1, 4096, 128000, 3, 84}, - {2, 4, 1, 4096, 128000, 3, 84}, - {2, 5, 1, 4096, 128000, 4, 84}, - {2, 6, 1, 4096, 128000, 4, 84}, - {2, 7, 1, 4096, 128000, 4, 84}, - {2, 8, 1, 4096, 128000, 4, 70}, - {2, 1, 1, 5120, 512, 2, 32}, - {2, 2, 1, 5120, 512, 2, 36}, - {2, 3, 1, 5120, 512, 2, 40}, - {2, 4, 1, 5120, 512, 2, 36}, - {2, 5, 1, 5120, 512, 2, 40}, - {2, 6, 1, 5120, 512, 2, 40}, - {2, 7, 1, 5120, 512, 2, 40}, - {2, 8, 1, 5120, 512, 2, 40}, - {2, 1, 1, 5120, 1024, 2, 64}, - {2, 2, 1, 5120, 1024, 2, 64}, - {2, 3, 1, 5120, 1024, 2, 80}, - {2, 4, 1, 5120, 1024, 2, 72}, - {2, 5, 1, 5120, 1024, 2, 78}, - {2, 6, 1, 5120, 1024, 2, 78}, - {2, 7, 1, 5120, 1024, 2, 78}, - {2, 8, 1, 5120, 1024, 2, 78}, - {2, 1, 1, 5120, 2048, 2, 84}, - {2, 2, 1, 5120, 2048, 2, 84}, - {2, 3, 1, 5120, 2048, 2, 84}, - {2, 4, 1, 5120, 2048, 2, 84}, - {2, 5, 1, 5120, 2048, 2, 84}, - {2, 6, 1, 5120, 2048, 2, 84}, - {2, 7, 1, 5120, 2048, 2, 84}, - {2, 8, 1, 5120, 2048, 2, 84}, - {2, 1, 1, 5120, 3072, 3, 84}, - {2, 2, 1, 5120, 3072, 3, 84}, - {2, 3, 1, 5120, 3072, 3, 84}, - {2, 4, 1, 5120, 3072, 3, 84}, - {2, 5, 1, 5120, 3072, 2, 84}, - {2, 6, 1, 5120, 3072, 2, 84}, - {2, 7, 1, 5120, 3072, 2, 84}, - {2, 8, 1, 5120, 3072, 3, 68}, - {2, 1, 1, 5120, 4096, 3, 84}, - {2, 2, 1, 5120, 4096, 3, 84}, - {2, 3, 1, 5120, 4096, 3, 84}, - {2, 4, 1, 5120, 4096, 3, 84}, - {2, 5, 1, 5120, 4096, 2, 84}, - {2, 6, 1, 5120, 4096, 2, 84}, - {2, 7, 1, 5120, 4096, 4, 80}, - {2, 8, 1, 5120, 4096, 3, 64}, - {2, 1, 1, 5120, 5120, 3, 84}, - {2, 2, 1, 5120, 5120, 3, 84}, - {2, 3, 1, 5120, 5120, 3, 84}, - {2, 4, 1, 5120, 5120, 3, 84}, - {2, 5, 1, 5120, 5120, 4, 84}, - {2, 6, 1, 5120, 5120, 4, 84}, - {2, 7, 1, 5120, 5120, 4, 80}, - {2, 8, 1, 5120, 5120, 3, 68}, - {2, 1, 1, 5120, 8192, 3, 84}, - {2, 2, 1, 5120, 8192, 3, 84}, - {2, 3, 1, 5120, 8192, 3, 84}, - {2, 4, 1, 5120, 8192, 3, 84}, - {2, 5, 1, 5120, 8192, 4, 84}, - {2, 6, 1, 5120, 8192, 4, 84}, - {2, 7, 1, 5120, 8192, 4, 80}, - {2, 8, 1, 5120, 8192, 3, 64}, - {2, 1, 1, 5120, 12288, 3, 84}, - {2, 2, 1, 5120, 12288, 3, 84}, - {2, 3, 1, 5120, 12288, 3, 84}, - {2, 4, 1, 5120, 12288, 3, 84}, - {2, 5, 1, 5120, 12288, 4, 84}, - {2, 6, 1, 5120, 12288, 4, 84}, - {2, 7, 1, 5120, 12288, 4, 80}, - {2, 8, 1, 5120, 12288, 4, 72}, - {2, 1, 1, 5120, 14336, 3, 84}, - {2, 2, 1, 5120, 14336, 3, 84}, - {2, 3, 1, 5120, 14336, 3, 84}, - {2, 4, 1, 5120, 14336, 3, 84}, - {2, 5, 1, 5120, 14336, 4, 84}, - {2, 6, 1, 5120, 14336, 4, 84}, - {2, 7, 1, 5120, 14336, 4, 84}, - {2, 8, 1, 5120, 14336, 4, 84}, - {2, 1, 1, 5120, 16384, 3, 84}, - {2, 2, 1, 5120, 16384, 3, 84}, - {2, 3, 1, 5120, 16384, 3, 84}, - {2, 4, 1, 5120, 16384, 3, 84}, - {2, 5, 1, 5120, 16384, 4, 84}, - {2, 6, 1, 5120, 16384, 4, 84}, - {2, 7, 1, 5120, 16384, 4, 80}, - {2, 8, 1, 5120, 16384, 4, 70}, - {2, 1, 1, 5120, 24576, 3, 84}, - {2, 2, 1, 5120, 24576, 3, 84}, - {2, 3, 1, 5120, 24576, 3, 84}, - {2, 4, 1, 5120, 24576, 3, 84}, - {2, 5, 1, 5120, 24576, 4, 84}, - {2, 6, 1, 5120, 24576, 4, 84}, - {2, 7, 1, 5120, 24576, 4, 80}, - {2, 8, 1, 5120, 24576, 4, 84}, - {2, 1, 1, 5120, 51200, 3, 84}, - {2, 2, 1, 5120, 51200, 3, 84}, - {2, 3, 1, 5120, 51200, 3, 84}, - {2, 4, 1, 5120, 51200, 3, 84}, - {2, 5, 1, 5120, 51200, 4, 84}, - {2, 6, 1, 5120, 51200, 4, 84}, - {2, 7, 1, 5120, 51200, 4, 80}, - {2, 8, 1, 5120, 51200, 4, 80}, - {2, 1, 1, 5120, 128000, 3, 84}, - {2, 2, 1, 5120, 128000, 3, 84}, - {2, 3, 1, 5120, 128000, 3, 84}, - {2, 4, 1, 5120, 128000, 3, 84}, - {2, 5, 1, 5120, 128000, 4, 84}, - {2, 6, 1, 5120, 128000, 4, 84}, - {2, 7, 1, 5120, 128000, 4, 80}, - {2, 8, 1, 5120, 128000, 4, 80}, - {2, 1, 1, 8192, 512, 2, 48}, - {2, 2, 1, 8192, 512, 2, 42}, - {2, 3, 1, 8192, 512, 2, 52}, - {2, 4, 1, 8192, 512, 2, 42}, - {2, 5, 1, 8192, 512, 2, 52}, - {2, 6, 1, 8192, 512, 2, 52}, - {2, 7, 1, 8192, 512, 2, 52}, - {2, 8, 1, 8192, 512, 2, 52}, - {2, 1, 1, 8192, 1024, 2, 82}, - {2, 2, 1, 8192, 1024, 2, 82}, - {2, 3, 1, 8192, 1024, 2, 82}, - {2, 4, 1, 8192, 1024, 2, 82}, - {2, 5, 1, 8192, 1024, 2, 82}, - {2, 6, 1, 8192, 1024, 2, 82}, - {2, 7, 1, 8192, 1024, 2, 82}, - {2, 8, 1, 8192, 1024, 2, 82}, - {2, 1, 1, 8192, 2048, 2, 84}, - {2, 2, 1, 8192, 2048, 2, 84}, - {2, 3, 1, 8192, 2048, 3, 84}, - {2, 4, 1, 8192, 2048, 2, 84}, - {2, 5, 1, 8192, 2048, 2, 84}, - {2, 6, 1, 8192, 2048, 2, 84}, - {2, 7, 1, 8192, 2048, 2, 84}, - {2, 8, 1, 8192, 2048, 3, 64}, - {2, 1, 1, 8192, 3072, 3, 84}, - {2, 2, 1, 8192, 3072, 3, 84}, - {2, 3, 1, 8192, 3072, 3, 84}, - {2, 4, 1, 8192, 3072, 3, 84}, - {2, 5, 1, 8192, 3072, 2, 84}, - {2, 6, 1, 8192, 3072, 2, 84}, - {2, 7, 1, 8192, 3072, 3, 84}, - {2, 8, 1, 8192, 3072, 3, 68}, - {2, 1, 1, 8192, 4096, 3, 84}, - {2, 2, 1, 8192, 4096, 3, 84}, - {2, 3, 1, 8192, 4096, 3, 84}, - {2, 4, 1, 8192, 4096, 3, 84}, - {2, 5, 1, 8192, 4096, 4, 84}, - {2, 6, 1, 8192, 4096, 4, 84}, - {2, 7, 1, 8192, 4096, 4, 82}, - {2, 8, 1, 8192, 4096, 3, 64}, - {2, 1, 1, 8192, 5120, 3, 84}, - {2, 2, 1, 8192, 5120, 3, 84}, - {2, 3, 1, 8192, 5120, 3, 84}, - {2, 4, 1, 8192, 5120, 3, 84}, - {2, 5, 1, 8192, 5120, 4, 84}, - {2, 6, 1, 8192, 5120, 4, 84}, - {2, 7, 1, 8192, 5120, 4, 80}, - {2, 8, 1, 8192, 5120, 3, 68}, - {2, 1, 1, 8192, 8192, 3, 84}, - {2, 2, 1, 8192, 8192, 3, 84}, - {2, 3, 1, 8192, 8192, 3, 84}, - {2, 4, 1, 8192, 8192, 3, 84}, - {2, 5, 1, 8192, 8192, 4, 84}, - {2, 6, 1, 8192, 8192, 4, 84}, - {2, 7, 1, 8192, 8192, 4, 82}, - {2, 8, 1, 8192, 8192, 3, 64}, - {2, 1, 1, 8192, 12288, 3, 84}, - {2, 2, 1, 8192, 12288, 3, 84}, - {2, 3, 1, 8192, 12288, 3, 84}, - {2, 4, 1, 8192, 12288, 3, 84}, - {2, 5, 1, 8192, 12288, 4, 84}, - {2, 6, 1, 8192, 12288, 4, 84}, - {2, 7, 1, 8192, 12288, 4, 80}, - {2, 8, 1, 8192, 12288, 4, 72}, - {2, 1, 1, 8192, 14336, 3, 84}, - {2, 2, 1, 8192, 14336, 3, 84}, - {2, 3, 1, 8192, 14336, 3, 84}, - {2, 4, 1, 8192, 14336, 3, 84}, - {2, 5, 1, 8192, 14336, 4, 84}, - {2, 6, 1, 8192, 14336, 4, 84}, - {2, 7, 1, 8192, 14336, 4, 84}, - {2, 8, 1, 8192, 14336, 4, 84}, - {2, 1, 1, 8192, 16384, 3, 84}, - {2, 2, 1, 8192, 16384, 3, 84}, - {2, 3, 1, 8192, 16384, 3, 84}, - {2, 4, 1, 8192, 16384, 3, 84}, - {2, 5, 1, 8192, 16384, 4, 84}, - {2, 6, 1, 8192, 16384, 4, 84}, - {2, 7, 1, 8192, 16384, 4, 84}, - {2, 8, 1, 8192, 16384, 4, 68}, - {2, 1, 1, 8192, 24576, 3, 84}, - {2, 2, 1, 8192, 24576, 3, 84}, - {2, 3, 1, 8192, 24576, 3, 84}, - {2, 4, 1, 8192, 24576, 3, 84}, - {2, 5, 1, 8192, 24576, 4, 84}, - {2, 6, 1, 8192, 24576, 4, 84}, - {2, 7, 1, 8192, 24576, 4, 80}, - {2, 8, 1, 8192, 24576, 4, 78}, - {2, 1, 1, 8192, 51200, 3, 84}, - {2, 2, 1, 8192, 51200, 3, 84}, - {2, 3, 1, 8192, 51200, 3, 84}, - {2, 4, 1, 8192, 51200, 3, 84}, - {2, 5, 1, 8192, 51200, 4, 84}, - {2, 6, 1, 8192, 51200, 4, 84}, - {2, 7, 1, 8192, 51200, 4, 80}, - {2, 8, 1, 8192, 51200, 4, 80}, - {2, 1, 1, 8192, 128000, 3, 84}, - {2, 2, 1, 8192, 128000, 3, 84}, - {2, 3, 1, 8192, 128000, 3, 84}, - {2, 4, 1, 8192, 128000, 3, 84}, - {2, 5, 1, 8192, 128000, 4, 84}, - {2, 6, 1, 8192, 128000, 4, 84}, - {2, 7, 1, 8192, 128000, 4, 80}, - {2, 8, 1, 8192, 128000, 4, 70}, - {2, 1, 1, 12288, 512, 2, 64}, - {2, 2, 1, 12288, 512, 2, 64}, - {2, 3, 1, 12288, 512, 2, 64}, - {2, 4, 1, 12288, 512, 2, 52}, - {2, 5, 1, 12288, 512, 2, 64}, - {2, 6, 1, 12288, 512, 2, 64}, - {2, 7, 1, 12288, 512, 2, 64}, - {2, 8, 1, 12288, 512, 2, 64}, - {2, 1, 1, 12288, 1024, 2, 84}, - {2, 2, 1, 12288, 1024, 2, 84}, - {2, 3, 1, 12288, 1024, 2, 84}, - {2, 4, 1, 12288, 1024, 2, 84}, - {2, 5, 1, 12288, 1024, 2, 84}, - {2, 6, 1, 12288, 1024, 2, 84}, - {2, 7, 1, 12288, 1024, 2, 84}, - {2, 8, 1, 12288, 1024, 2, 84}, - {2, 1, 1, 12288, 2048, 3, 84}, - {2, 2, 1, 12288, 2048, 3, 84}, - {2, 3, 1, 12288, 2048, 3, 84}, - {2, 4, 1, 12288, 2048, 3, 84}, - {2, 5, 1, 12288, 2048, 2, 84}, - {2, 6, 1, 12288, 2048, 2, 84}, - {2, 7, 1, 12288, 2048, 3, 84}, - {2, 8, 1, 12288, 2048, 3, 64}, - {2, 1, 1, 12288, 3072, 3, 84}, - {2, 2, 1, 12288, 3072, 3, 84}, - {2, 3, 1, 12288, 3072, 3, 84}, - {2, 4, 1, 12288, 3072, 3, 84}, - {2, 5, 1, 12288, 3072, 4, 84}, - {2, 6, 1, 12288, 3072, 4, 84}, - {2, 7, 1, 12288, 3072, 3, 84}, - {2, 8, 1, 12288, 3072, 3, 72}, - {2, 1, 1, 12288, 4096, 3, 84}, - {2, 2, 1, 12288, 4096, 3, 84}, - {2, 3, 1, 12288, 4096, 3, 84}, - {2, 4, 1, 12288, 4096, 3, 84}, - {2, 5, 1, 12288, 4096, 4, 84}, - {2, 6, 1, 12288, 4096, 4, 84}, - {2, 7, 1, 12288, 4096, 4, 80}, - {2, 8, 1, 12288, 4096, 3, 64}, - {2, 1, 1, 12288, 5120, 3, 84}, - {2, 2, 1, 12288, 5120, 3, 84}, - {2, 3, 1, 12288, 5120, 3, 84}, - {2, 4, 1, 12288, 5120, 3, 84}, - {2, 5, 1, 12288, 5120, 4, 84}, - {2, 6, 1, 12288, 5120, 4, 84}, - {2, 7, 1, 12288, 5120, 4, 80}, - {2, 8, 1, 12288, 5120, 3, 80}, - {2, 1, 1, 12288, 8192, 3, 84}, - {2, 2, 1, 12288, 8192, 3, 84}, - {2, 3, 1, 12288, 8192, 3, 84}, - {2, 4, 1, 12288, 8192, 3, 84}, - {2, 5, 1, 12288, 8192, 4, 84}, - {2, 6, 1, 12288, 8192, 4, 84}, - {2, 7, 1, 12288, 8192, 4, 80}, - {2, 8, 1, 12288, 8192, 3, 64}, - {2, 1, 1, 12288, 12288, 3, 84}, - {2, 2, 1, 12288, 12288, 3, 84}, - {2, 3, 1, 12288, 12288, 3, 84}, - {2, 4, 1, 12288, 12288, 3, 84}, - {2, 5, 1, 12288, 12288, 4, 84}, - {2, 6, 1, 12288, 12288, 4, 84}, - {2, 7, 1, 12288, 12288, 4, 80}, - {2, 8, 1, 12288, 12288, 4, 72}, - {2, 1, 1, 12288, 14336, 3, 84}, - {2, 2, 1, 12288, 14336, 3, 84}, - {2, 3, 1, 12288, 14336, 3, 84}, - {2, 4, 1, 12288, 14336, 3, 84}, - {2, 5, 1, 12288, 14336, 4, 84}, - {2, 6, 1, 12288, 14336, 4, 84}, - {2, 7, 1, 12288, 14336, 4, 84}, - {2, 8, 1, 12288, 14336, 3, 84}, - {2, 1, 1, 12288, 16384, 3, 84}, - {2, 2, 1, 12288, 16384, 3, 84}, - {2, 3, 1, 12288, 16384, 3, 84}, - {2, 4, 1, 12288, 16384, 3, 84}, - {2, 5, 1, 12288, 16384, 4, 84}, - {2, 6, 1, 12288, 16384, 4, 84}, - {2, 7, 1, 12288, 16384, 4, 80}, - {2, 8, 1, 12288, 16384, 3, 64}, - {2, 1, 1, 12288, 24576, 3, 84}, - {2, 2, 1, 12288, 24576, 3, 84}, - {2, 3, 1, 12288, 24576, 3, 84}, - {2, 4, 1, 12288, 24576, 3, 84}, - {2, 5, 1, 12288, 24576, 4, 84}, - {2, 6, 1, 12288, 24576, 4, 84}, - {2, 7, 1, 12288, 24576, 4, 80}, - {2, 8, 1, 12288, 24576, 4, 78}, - {2, 1, 1, 12288, 51200, 3, 84}, - {2, 2, 1, 12288, 51200, 3, 84}, - {2, 3, 1, 12288, 51200, 3, 84}, - {2, 4, 1, 12288, 51200, 3, 84}, - {2, 5, 1, 12288, 51200, 4, 84}, - {2, 6, 1, 12288, 51200, 4, 84}, - {2, 7, 1, 12288, 51200, 4, 80}, - {2, 8, 1, 12288, 51200, 4, 68}, - {2, 1, 1, 12288, 128000, 3, 84}, - {2, 2, 1, 12288, 128000, 3, 84}, - {2, 3, 1, 12288, 128000, 3, 84}, - {2, 4, 1, 12288, 128000, 3, 84}, - {2, 5, 1, 12288, 128000, 4, 84}, - {2, 6, 1, 12288, 128000, 4, 84}, - {2, 7, 1, 12288, 128000, 4, 80}, - {2, 8, 1, 12288, 128000, 4, 70}, - {2, 1, 1, 14336, 512, 2, 60}, - {2, 2, 1, 14336, 512, 2, 64}, - {2, 3, 1, 14336, 512, 2, 64}, - {2, 4, 1, 14336, 512, 2, 60}, - {2, 5, 1, 14336, 512, 2, 64}, - {2, 6, 1, 14336, 512, 2, 64}, - {2, 7, 1, 14336, 512, 2, 72}, - {2, 8, 1, 14336, 512, 2, 64}, - {2, 1, 1, 14336, 1024, 2, 84}, - {2, 2, 1, 14336, 1024, 2, 84}, - {2, 3, 1, 14336, 1024, 2, 84}, - {2, 4, 1, 14336, 1024, 2, 84}, - {2, 5, 1, 14336, 1024, 2, 84}, - {2, 6, 1, 14336, 1024, 2, 84}, - {2, 7, 1, 14336, 1024, 2, 84}, - {2, 8, 1, 14336, 1024, 2, 84}, - {2, 1, 1, 14336, 2048, 3, 84}, - {2, 2, 1, 14336, 2048, 3, 84}, - {2, 3, 1, 14336, 2048, 3, 84}, - {2, 4, 1, 14336, 2048, 3, 84}, - {2, 5, 1, 14336, 2048, 2, 84}, - {2, 6, 1, 14336, 2048, 2, 84}, - {2, 7, 1, 14336, 2048, 3, 84}, - {2, 8, 1, 14336, 2048, 3, 64}, - {2, 1, 1, 14336, 3072, 3, 84}, - {2, 2, 1, 14336, 3072, 3, 84}, - {2, 3, 1, 14336, 3072, 3, 84}, - {2, 4, 1, 14336, 3072, 3, 84}, - {2, 5, 1, 14336, 3072, 4, 84}, - {2, 6, 1, 14336, 3072, 4, 84}, - {2, 7, 1, 14336, 3072, 4, 84}, - {2, 8, 1, 14336, 3072, 3, 72}, - {2, 1, 1, 14336, 4096, 3, 84}, - {2, 2, 1, 14336, 4096, 3, 84}, - {2, 3, 1, 14336, 4096, 3, 84}, - {2, 4, 1, 14336, 4096, 3, 84}, - {2, 5, 1, 14336, 4096, 4, 84}, - {2, 6, 1, 14336, 4096, 4, 84}, - {2, 7, 1, 14336, 4096, 4, 80}, - {2, 8, 1, 14336, 4096, 3, 64}, - {2, 1, 1, 14336, 5120, 3, 84}, - {2, 2, 1, 14336, 5120, 3, 84}, - {2, 3, 1, 14336, 5120, 3, 84}, - {2, 4, 1, 14336, 5120, 3, 84}, - {2, 5, 1, 14336, 5120, 4, 84}, - {2, 6, 1, 14336, 5120, 4, 84}, - {2, 7, 1, 14336, 5120, 4, 80}, - {2, 8, 1, 14336, 5120, 3, 68}, - {2, 1, 1, 14336, 8192, 3, 84}, - {2, 2, 1, 14336, 8192, 3, 84}, - {2, 3, 1, 14336, 8192, 3, 84}, - {2, 4, 1, 14336, 8192, 3, 84}, - {2, 5, 1, 14336, 8192, 4, 84}, - {2, 6, 1, 14336, 8192, 4, 84}, - {2, 7, 1, 14336, 8192, 4, 80}, - {2, 8, 1, 14336, 8192, 3, 64}, - {2, 1, 1, 14336, 12288, 3, 84}, - {2, 2, 1, 14336, 12288, 3, 84}, - {2, 3, 1, 14336, 12288, 3, 84}, - {2, 4, 1, 14336, 12288, 3, 84}, - {2, 5, 1, 14336, 12288, 4, 84}, - {2, 6, 1, 14336, 12288, 4, 84}, - {2, 7, 1, 14336, 12288, 4, 80}, - {2, 8, 1, 14336, 12288, 3, 72}, - {2, 1, 1, 14336, 14336, 3, 84}, - {2, 2, 1, 14336, 14336, 3, 84}, - {2, 3, 1, 14336, 14336, 3, 84}, - {2, 4, 1, 14336, 14336, 3, 84}, - {2, 5, 1, 14336, 14336, 4, 84}, - {2, 6, 1, 14336, 14336, 4, 84}, - {2, 7, 1, 14336, 14336, 4, 84}, - {2, 8, 1, 14336, 14336, 3, 84}, - {2, 1, 1, 14336, 16384, 3, 84}, - {2, 2, 1, 14336, 16384, 3, 84}, - {2, 3, 1, 14336, 16384, 3, 84}, - {2, 4, 1, 14336, 16384, 3, 84}, - {2, 5, 1, 14336, 16384, 4, 84}, - {2, 6, 1, 14336, 16384, 4, 84}, - {2, 7, 1, 14336, 16384, 4, 80}, - {2, 8, 1, 14336, 16384, 4, 68}, - {2, 1, 1, 14336, 24576, 3, 84}, - {2, 2, 1, 14336, 24576, 3, 84}, - {2, 3, 1, 14336, 24576, 3, 84}, - {2, 4, 1, 14336, 24576, 3, 84}, - {2, 5, 1, 14336, 24576, 4, 84}, - {2, 6, 1, 14336, 24576, 4, 84}, - {2, 7, 1, 14336, 24576, 4, 80}, - {2, 8, 1, 14336, 24576, 4, 78}, - {2, 1, 1, 14336, 51200, 3, 84}, - {2, 2, 1, 14336, 51200, 3, 84}, - {2, 3, 1, 14336, 51200, 3, 84}, - {2, 4, 1, 14336, 51200, 3, 84}, - {2, 5, 1, 14336, 51200, 4, 84}, - {2, 6, 1, 14336, 51200, 4, 84}, - {2, 7, 1, 14336, 51200, 4, 80}, - {2, 8, 1, 14336, 51200, 4, 80}, - {2, 1, 1, 14336, 128000, 3, 84}, - {2, 2, 1, 14336, 128000, 3, 84}, - {2, 3, 1, 14336, 128000, 3, 84}, - {2, 4, 1, 14336, 128000, 3, 84}, - {2, 5, 1, 14336, 128000, 4, 84}, - {2, 6, 1, 14336, 128000, 4, 84}, - {2, 7, 1, 14336, 128000, 4, 80}, - {2, 8, 1, 14336, 128000, 4, 70}, - {2, 1, 1, 16384, 512, 2, 64}, - {2, 2, 1, 16384, 512, 2, 64}, - {2, 3, 1, 16384, 512, 2, 76}, - {2, 4, 1, 16384, 512, 2, 64}, - {2, 5, 1, 16384, 512, 2, 64}, - {2, 6, 1, 16384, 512, 2, 76}, - {2, 7, 1, 16384, 512, 2, 76}, - {2, 8, 1, 16384, 512, 2, 72}, - {2, 1, 1, 16384, 1024, 2, 84}, - {2, 2, 1, 16384, 1024, 2, 84}, - {2, 3, 1, 16384, 1024, 2, 84}, - {2, 4, 1, 16384, 1024, 2, 84}, - {2, 5, 1, 16384, 1024, 2, 84}, - {2, 6, 1, 16384, 1024, 2, 84}, - {2, 7, 1, 16384, 1024, 2, 84}, - {2, 8, 1, 16384, 1024, 2, 84}, - {2, 1, 1, 16384, 2048, 3, 84}, - {2, 2, 1, 16384, 2048, 3, 84}, - {2, 3, 1, 16384, 2048, 3, 84}, - {2, 4, 1, 16384, 2048, 3, 84}, - {2, 5, 1, 16384, 2048, 2, 84}, - {2, 6, 1, 16384, 2048, 2, 84}, - {2, 7, 1, 16384, 2048, 3, 84}, - {2, 8, 1, 16384, 2048, 3, 64}, - {2, 1, 1, 16384, 3072, 3, 84}, - {2, 2, 1, 16384, 3072, 3, 84}, - {2, 3, 1, 16384, 3072, 3, 84}, - {2, 4, 1, 16384, 3072, 3, 84}, - {2, 5, 1, 16384, 3072, 4, 84}, - {2, 6, 1, 16384, 3072, 4, 84}, - {2, 7, 1, 16384, 3072, 4, 80}, - {2, 8, 1, 16384, 3072, 3, 68}, - {2, 1, 1, 16384, 4096, 3, 84}, - {2, 2, 1, 16384, 4096, 3, 84}, - {2, 3, 1, 16384, 4096, 3, 84}, - {2, 4, 1, 16384, 4096, 3, 84}, - {2, 5, 1, 16384, 4096, 4, 84}, - {2, 6, 1, 16384, 4096, 4, 84}, - {2, 7, 1, 16384, 4096, 4, 80}, - {2, 8, 1, 16384, 4096, 3, 66}, - {2, 1, 1, 16384, 5120, 3, 84}, - {2, 2, 1, 16384, 5120, 3, 84}, - {2, 3, 1, 16384, 5120, 3, 84}, - {2, 4, 1, 16384, 5120, 3, 84}, - {2, 5, 1, 16384, 5120, 4, 84}, - {2, 6, 1, 16384, 5120, 4, 84}, - {2, 7, 1, 16384, 5120, 4, 80}, - {2, 8, 1, 16384, 5120, 3, 68}, - {2, 1, 1, 16384, 8192, 3, 84}, - {2, 2, 1, 16384, 8192, 3, 84}, - {2, 3, 1, 16384, 8192, 3, 84}, - {2, 4, 1, 16384, 8192, 3, 84}, - {2, 5, 1, 16384, 8192, 4, 84}, - {2, 6, 1, 16384, 8192, 4, 84}, - {2, 7, 1, 16384, 8192, 4, 80}, - {2, 8, 1, 16384, 8192, 3, 64}, - {2, 1, 1, 16384, 12288, 3, 84}, - {2, 2, 1, 16384, 12288, 3, 84}, - {2, 3, 1, 16384, 12288, 3, 84}, - {2, 4, 1, 16384, 12288, 3, 84}, - {2, 5, 1, 16384, 12288, 4, 84}, - {2, 6, 1, 16384, 12288, 4, 84}, - {2, 7, 1, 16384, 12288, 4, 80}, - {2, 8, 1, 16384, 12288, 3, 72}, - {2, 1, 1, 16384, 14336, 3, 84}, - {2, 2, 1, 16384, 14336, 3, 84}, - {2, 3, 1, 16384, 14336, 3, 84}, - {2, 4, 1, 16384, 14336, 3, 84}, - {2, 5, 1, 16384, 14336, 4, 84}, - {2, 6, 1, 16384, 14336, 4, 84}, - {2, 7, 1, 16384, 14336, 4, 84}, - {2, 8, 1, 16384, 14336, 4, 84}, - {2, 1, 1, 16384, 16384, 3, 84}, - {2, 2, 1, 16384, 16384, 3, 84}, - {2, 3, 1, 16384, 16384, 3, 84}, - {2, 4, 1, 16384, 16384, 3, 84}, - {2, 5, 1, 16384, 16384, 4, 84}, - {2, 6, 1, 16384, 16384, 4, 84}, - {2, 7, 1, 16384, 16384, 4, 80}, - {2, 8, 1, 16384, 16384, 4, 68}, - {2, 1, 1, 16384, 24576, 3, 84}, - {2, 2, 1, 16384, 24576, 3, 84}, - {2, 3, 1, 16384, 24576, 3, 84}, - {2, 4, 1, 16384, 24576, 3, 84}, - {2, 5, 1, 16384, 24576, 4, 84}, - {2, 6, 1, 16384, 24576, 4, 84}, - {2, 7, 1, 16384, 24576, 4, 80}, - {2, 8, 1, 16384, 24576, 4, 84}, - {2, 1, 1, 16384, 51200, 3, 84}, - {2, 2, 1, 16384, 51200, 3, 84}, - {2, 3, 1, 16384, 51200, 3, 84}, - {2, 4, 1, 16384, 51200, 3, 84}, - {2, 5, 1, 16384, 51200, 4, 84}, - {2, 6, 1, 16384, 51200, 4, 84}, - {2, 7, 1, 16384, 51200, 4, 80}, - {2, 8, 1, 16384, 51200, 4, 80}, - {2, 1, 1, 16384, 128000, 3, 84}, - {2, 2, 1, 16384, 128000, 3, 84}, - {2, 3, 1, 16384, 128000, 3, 84}, - {2, 4, 1, 16384, 128000, 3, 84}, - {2, 5, 1, 16384, 128000, 4, 84}, - {2, 6, 1, 16384, 128000, 4, 84}, - {2, 7, 1, 16384, 128000, 4, 80}, - {2, 8, 1, 16384, 128000, 4, 80}, - {2, 1, 1, 24576, 512, 2, 80}, - {2, 2, 1, 24576, 512, 2, 72}, - {2, 3, 1, 24576, 512, 2, 84}, - {2, 4, 1, 24576, 512, 2, 72}, - {2, 5, 1, 24576, 512, 2, 84}, - {2, 6, 1, 24576, 512, 2, 84}, - {2, 7, 1, 24576, 512, 2, 84}, - {2, 8, 1, 24576, 512, 2, 84}, - {2, 1, 1, 24576, 1024, 2, 84}, - {2, 2, 1, 24576, 1024, 2, 84}, - {2, 3, 1, 24576, 1024, 3, 84}, - {2, 4, 1, 24576, 1024, 2, 84}, - {2, 5, 1, 24576, 1024, 2, 84}, - {2, 6, 1, 24576, 1024, 2, 84}, - {2, 7, 1, 24576, 1024, 2, 84}, - {2, 8, 1, 24576, 1024, 2, 84}, - {2, 1, 1, 24576, 2048, 3, 84}, - {2, 2, 1, 24576, 2048, 3, 84}, - {2, 3, 1, 24576, 2048, 3, 84}, - {2, 4, 1, 24576, 2048, 3, 84}, - {2, 5, 1, 24576, 2048, 4, 84}, - {2, 6, 1, 24576, 2048, 4, 84}, - {2, 7, 1, 24576, 2048, 3, 84}, - {2, 8, 1, 24576, 2048, 3, 64}, - {2, 1, 1, 24576, 3072, 3, 84}, - {2, 2, 1, 24576, 3072, 3, 84}, - {2, 3, 1, 24576, 3072, 3, 84}, - {2, 4, 1, 24576, 3072, 3, 84}, - {2, 5, 1, 24576, 3072, 4, 84}, - {2, 6, 1, 24576, 3072, 4, 84}, - {2, 7, 1, 24576, 3072, 4, 84}, - {2, 8, 1, 24576, 3072, 3, 72}, - {2, 1, 1, 24576, 4096, 3, 84}, - {2, 2, 1, 24576, 4096, 3, 84}, - {2, 3, 1, 24576, 4096, 3, 84}, - {2, 4, 1, 24576, 4096, 3, 84}, - {2, 5, 1, 24576, 4096, 4, 84}, - {2, 6, 1, 24576, 4096, 4, 84}, - {2, 7, 1, 24576, 4096, 4, 80}, - {2, 8, 1, 24576, 4096, 3, 64}, - {2, 1, 1, 24576, 5120, 3, 84}, - {2, 2, 1, 24576, 5120, 3, 84}, - {2, 3, 1, 24576, 5120, 3, 84}, - {2, 4, 1, 24576, 5120, 3, 84}, - {2, 5, 1, 24576, 5120, 4, 84}, - {2, 6, 1, 24576, 5120, 4, 84}, - {2, 7, 1, 24576, 5120, 4, 80}, - {2, 8, 1, 24576, 5120, 3, 80}, - {2, 1, 1, 24576, 8192, 3, 84}, - {2, 2, 1, 24576, 8192, 3, 84}, - {2, 3, 1, 24576, 8192, 3, 84}, - {2, 4, 1, 24576, 8192, 3, 84}, - {2, 5, 1, 24576, 8192, 4, 84}, - {2, 6, 1, 24576, 8192, 4, 84}, - {2, 7, 1, 24576, 8192, 4, 80}, - {2, 8, 1, 24576, 8192, 3, 64}, - {2, 1, 1, 24576, 12288, 3, 84}, - {2, 2, 1, 24576, 12288, 3, 84}, - {2, 3, 1, 24576, 12288, 3, 84}, - {2, 4, 1, 24576, 12288, 3, 84}, - {2, 5, 1, 24576, 12288, 4, 84}, - {2, 6, 1, 24576, 12288, 4, 84}, - {2, 7, 1, 24576, 12288, 4, 80}, - {2, 8, 1, 24576, 12288, 4, 72}, - {2, 1, 1, 24576, 14336, 3, 84}, - {2, 2, 1, 24576, 14336, 3, 84}, - {2, 3, 1, 24576, 14336, 3, 84}, - {2, 4, 1, 24576, 14336, 3, 84}, - {2, 5, 1, 24576, 14336, 4, 84}, - {2, 6, 1, 24576, 14336, 4, 84}, - {2, 7, 1, 24576, 14336, 4, 84}, - {2, 8, 1, 24576, 14336, 3, 84}, - {2, 1, 1, 24576, 16384, 3, 84}, - {2, 2, 1, 24576, 16384, 3, 84}, - {2, 3, 1, 24576, 16384, 3, 84}, - {2, 4, 1, 24576, 16384, 3, 84}, - {2, 5, 1, 24576, 16384, 4, 84}, - {2, 6, 1, 24576, 16384, 4, 84}, - {2, 7, 1, 24576, 16384, 4, 80}, - {2, 8, 1, 24576, 16384, 4, 68}, - {2, 1, 1, 24576, 24576, 3, 84}, - {2, 2, 1, 24576, 24576, 3, 84}, - {2, 3, 1, 24576, 24576, 3, 84}, - {2, 4, 1, 24576, 24576, 3, 84}, - {2, 5, 1, 24576, 24576, 4, 84}, - {2, 6, 1, 24576, 24576, 4, 84}, - {2, 7, 1, 24576, 24576, 4, 80}, - {2, 8, 1, 24576, 24576, 4, 84}, - {2, 1, 1, 24576, 51200, 3, 84}, - {2, 2, 1, 24576, 51200, 3, 84}, - {2, 3, 1, 24576, 51200, 3, 84}, - {2, 4, 1, 24576, 51200, 3, 84}, - {2, 5, 1, 24576, 51200, 4, 84}, - {2, 6, 1, 24576, 51200, 4, 84}, - {2, 7, 1, 24576, 51200, 4, 80}, - {2, 8, 1, 24576, 51200, 4, 80}, - {2, 1, 1, 24576, 128000, 3, 84}, - {2, 2, 1, 24576, 128000, 3, 84}, - {2, 3, 1, 24576, 128000, 3, 84}, - {2, 4, 1, 24576, 128000, 3, 84}, - {2, 5, 1, 24576, 128000, 4, 84}, - {2, 6, 1, 24576, 128000, 4, 84}, - {2, 7, 1, 24576, 128000, 4, 80}, - {2, 8, 1, 24576, 128000, 4, 70}, - {0, 0, 0, 0, 0, 0, 0}}; diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe.cu b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe.cu index 28103a3dfe..d56befa19d 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe.cu @@ -5,7 +5,7 @@ namespace cg = cooperative_groups; #include "../util.h" #include "../util.cuh" -#include "exl3_moe_kernel.cuh" +#include "comp_units/exl3_moe_instances.cuh" #include "exl3_devctx.cuh" #include @@ -16,18 +16,27 @@ int exl3_moe_max_concurrency(int device) { std::set moe_kernel_attr_set[MAX_DEVICES] = {}; -typedef void (*fp_exl3_moe_kernel)(EXL3_MOE_KERNEL_ARGS); - fp_exl3_moe_kernel exl3_moe_kernel_instances[] = { - exl3_moe_kernel<0, 128>, exl3_moe_kernel<0, 256>, // Switch Kg, Ku and Kd - // at runtime - exl3_moe_kernel<1, 128>, exl3_moe_kernel<1, 256>, // Compile-time Kg = Ku = - // Kd - exl3_moe_kernel<2, 128>, exl3_moe_kernel<2, 256>, // ... - exl3_moe_kernel<3, 128>, exl3_moe_kernel<3, 256>, exl3_moe_kernel<4, 128>, - exl3_moe_kernel<4, 256>, exl3_moe_kernel<5, 128>, exl3_moe_kernel<5, 256>, - exl3_moe_kernel<6, 128>, exl3_moe_kernel<6, 256>, exl3_moe_kernel<7, 128>, - exl3_moe_kernel<7, 256>, exl3_moe_kernel<8, 128>, exl3_moe_kernel<8, 256>}; + // [K][cb - 1][N_off]: K = 0 switches Kg/Ku/Kd at runtime, K > 0 = + // compile-time Kg = Ku = Kd + exl3_moe_kernel_k0_n128_cb1(), exl3_moe_kernel_k0_n256_cb1(), + exl3_moe_kernel_k0_n128_cb2(), exl3_moe_kernel_k0_n256_cb2(), + exl3_moe_kernel_k1_n128_cb1(), exl3_moe_kernel_k1_n256_cb1(), + exl3_moe_kernel_k1_n128_cb2(), exl3_moe_kernel_k1_n256_cb2(), + exl3_moe_kernel_k2_n128_cb1(), exl3_moe_kernel_k2_n256_cb1(), + exl3_moe_kernel_k2_n128_cb2(), exl3_moe_kernel_k2_n256_cb2(), + exl3_moe_kernel_k3_n128_cb1(), exl3_moe_kernel_k3_n256_cb1(), + exl3_moe_kernel_k3_n128_cb2(), exl3_moe_kernel_k3_n256_cb2(), + exl3_moe_kernel_k4_n128_cb1(), exl3_moe_kernel_k4_n256_cb1(), + exl3_moe_kernel_k4_n128_cb2(), exl3_moe_kernel_k4_n256_cb2(), + exl3_moe_kernel_k5_n128_cb1(), exl3_moe_kernel_k5_n256_cb1(), + exl3_moe_kernel_k5_n128_cb2(), exl3_moe_kernel_k5_n256_cb2(), + exl3_moe_kernel_k6_n128_cb1(), exl3_moe_kernel_k6_n256_cb1(), + exl3_moe_kernel_k6_n128_cb2(), exl3_moe_kernel_k6_n256_cb2(), + exl3_moe_kernel_k7_n128_cb1(), exl3_moe_kernel_k7_n256_cb1(), + exl3_moe_kernel_k7_n128_cb2(), exl3_moe_kernel_k7_n256_cb2(), + exl3_moe_kernel_k8_n128_cb1(), exl3_moe_kernel_k8_n256_cb1(), + exl3_moe_kernel_k8_n128_cb2(), exl3_moe_kernel_k8_n256_cb2()}; /* Fused mixture-of-experts MLP operation for EXL3 weights @@ -65,7 +74,7 @@ hidden_dim), fp16 intermediate_dim), fp16 act_function: - int, see exl3_moe.h + int, see exl3_moe.cuh K_gate K_up @@ -91,6 +100,12 @@ intermediate_dim), fp16 down_mcg down_mul1: bool, codebook flags + + num_active: + number of experts with 0 < token count <= max_tokens_per_expert, i.e. +the number of experts this kernel will process. Used to size the launch: fewer, +wider expert groups when few experts are active. Pass -1 if unknown (defaults to +MOE_SMS_PER_EXPERT-wide groups at max concurrency) */ void exl3_moe(const at::Tensor& hidden_state, const at::Tensor& output_state, @@ -115,12 +130,15 @@ void exl3_moe(const at::Tensor& hidden_state, const at::Tensor& output_state, const bool gate_mcg, const bool gate_mul1, const bool up_mcg, const bool up_mul1, const bool down_mcg, const bool down_mul1, - const float act_limit) { + const float act_limit, const int num_active) { const torch::stable::accelerator::DeviceGuard device_guard( hidden_state.get_device_index()); cudaStream_t stream = get_current_cuda_stream(hidden_state.get_device_index()); + // Nothing for the fused kernel to do + if (num_active == 0) return; + // Validate args TORCH_CHECK_DTYPE(hidden_state, kHalf); TORCH_CHECK_DIM(hidden_state, 2); @@ -159,12 +177,12 @@ void exl3_moe(const at::Tensor& hidden_state, const at::Tensor& output_state, // (gate)"); TORCH_CHECK(!(up_mcg && up_mul1), "Specified both mcg and mul1 // (up)"); TORCH_CHECK(!(down_mcg && down_mul1), "Specified both mcg and mul1 // (down)"); - TORCH_CHECK(gate_mcg && !gate_mul1, - "MoE kernel: Only mcg codebook is currently supported"); - TORCH_CHECK(up_mcg && !up_mul1, - "MoE kernel: Only mcg codebook is currently supported"); - TORCH_CHECK(down_mcg && !down_mul1, - "MoE kernel: Only mcg codebook is currently supported"); + TORCH_CHECK(gate_mcg == up_mcg && up_mcg == down_mcg && + gate_mul1 == up_mul1 && up_mul1 == down_mul1, + "MoE kernel: gate/up/down must share the same codebook"); + TORCH_CHECK(gate_mcg != gate_mul1, + "MoE kernel: Only mcg and mul1 codebooks are supported"); + const int cb_idx = gate_mul1 ? 1 : 0; // TORCH_CHECK(act_function == MOE_ACT_SILU, "MoE kernel: Only SiLU is // currently supported"); @@ -191,15 +209,25 @@ void exl3_moe(const at::Tensor& hidden_state, const at::Tensor& output_state, int cc = DevCtx::instance().get_cc(device); int* locks = DevCtx::instance().get_locks(device); - // Launch + // Launch. All blocks of the grid must be co-resident for the group barriers, + // so groups * width <= num_sms. With a known number of active experts, launch + // only as many groups as there are experts and widen them to use the freed + // SMs, up to MOE_MAX_SMS_PER_EXPERT int block_dim = EXL3_GEMM_BASE_THREADS * MOE_TILESIZE_K / 16; TORCH_CHECK(concurrency * MOE_SMS_PER_EXPERT <= num_sms, "Concurrency too high for device num_sms"); - dim3 grid_dim(MOE_SMS_PER_EXPERT, 1, concurrency); + int num_groups = MIN((int)concurrency, MOE_MAX_GROUPS); + int group_size = MOE_SMS_PER_EXPERT; + if (num_active > 0) { + num_groups = MIN(num_groups, num_active); + group_size = MIN(num_sms / num_groups, MOE_MAX_SMS_PER_EXPERT); + } + dim3 grid_dim(group_size, 1, num_groups); int N_off = 0; if (hidden_dim % 256 == 0 && intermediate_dim % 256 == 0) N_off = 1; - fp_exl3_moe_kernel kernel = exl3_moe_kernel_instances[2 * K + N_off]; + fp_exl3_moe_kernel kernel = + exl3_moe_kernel_instances[4 * K + 2 * cb_idx + N_off]; if (moe_kernel_attr_set[device].find((void*)kernel) == moe_kernel_attr_set[device].end()) { @@ -253,7 +281,7 @@ void exl3_moe(const at::Tensor& hidden_state, const at::Tensor& output_state, (void*)&num_experts, (void*)&num_experts_per_tok, (void*)&max_tokens_per_expert, - (void*)&concurrency, + (void*)&num_groups, (void*)&act_limit, (void*)&act_function, (void*)&K_gate, @@ -261,8 +289,8 @@ void exl3_moe(const at::Tensor& hidden_state, const at::Tensor& output_state, (void*)&K_down, (void*)&locks}; - cudaLaunchCooperativeKernel((void*)kernel, grid_dim, block_dim, kernelArgs, - SMEM_MAX, stream); + cudaLaunchKernel((void*)kernel, grid_dim, block_dim, kernelArgs, SMEM_MAX, + stream); cuda_check(cudaPeekAtLastError()); } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe.cuh index 8146c2272e..edc97b1554 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe.cuh @@ -27,4 +27,4 @@ void exl3_moe(const at::Tensor& hidden_state, const at::Tensor& output_state, const bool gate_mcg, const bool gate_mul1, const bool up_mcg, const bool up_mul1, const bool down_mcg, const bool down_mul1, - const float act_limit); + const float act_limit, const int num_active); diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe_common.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe_common.cuh new file mode 100644 index 0000000000..dfc76b167b --- /dev/null +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe_common.cuh @@ -0,0 +1,50 @@ +#pragma once + +#include +#include + +#define MOE_ACT_SILU 0 +#define MOE_ACT_GELU 1 +#define MOE_ACT_RELU2_NOGATE \ + 2 // non-gated relu2 (NemotronH): gate GEMM and staging skipped + +#define MOE_SMS_PER_EXPERT \ + 8 // default/minimum group width, also sets max concurrency (buffer count) +#define MOE_MAX_SMS_PER_EXPERT \ + 32 // widest expert group when few experts are active +#define MOE_TILESIZE_K 32 +#define MOE_TILESIZE_M 16 +#define MOE_SH_STAGES 3 +#define MOE_FRAG_STAGES 3 + +#ifndef EXL3_GEMM_BASE_THREADS + #define EXL3_GEMM_BASE_THREADS 256 +#endif + +#ifndef SMEM_MAX + #define SMEM_MAX (90 * 1024) // max shared memory on compute capability 8.6 +#endif + +#define EXL3_MOE_KERNEL_ARGS \ + const half *__restrict__ hidden_state, half *__restrict__ temp_state_g, \ + half *__restrict__ temp_state_u, half *__restrict__ temp_intermediate_g, \ + half *__restrict__ temp_intermediate_u, \ + float *__restrict__ output_state, \ + \ + const uint16_t **__restrict__ gate_trellis, \ + const half **__restrict__ gate_suh, const half **__restrict__ gate_svh, \ + const uint16_t **__restrict__ up_trellis, \ + const half **__restrict__ up_suh, const half **__restrict__ up_svh, \ + const uint16_t **__restrict__ down_trellis, \ + const half **__restrict__ down_suh, const half **__restrict__ down_svh, \ + \ + const int64_t *__restrict__ expert_count, \ + const int64_t *__restrict__ token_sorted, \ + const half *__restrict__ weight_sorted, \ + \ + const int hidden_dim, const int intermediate_dim, const int num_experts, \ + const int num_experts_per_tok, const int max_tokens_per_expert, \ + const int concurrency, const float act_limit, const int act_function, \ + const int K_gate, const int K_up, const int K_down, \ + \ + int *__restrict__ locks diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe_kernel.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe_kernel.cuh index ff2c192ac7..e9e05dddfe 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe_kernel.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/exl3_moe_kernel.cuh @@ -1,51 +1,29 @@ #pragma once +#include +#include +#include +#include + +#include "exl3_moe_common.cuh" +#include "../util.h" +#include "../util.cuh" #include "exl3_kernel_map.cuh" #include "hadamard_inner.cuh" #include "exl3_gemm_inner.cuh" #include "exl3_devctx.cuh" #include "../ptx.cuh" -#define MOE_ACT_SILU 0 -#define MOE_ACT_GELU 1 - -#define MOE_SMS_PER_EXPERT 12 -#define MOE_TILESIZE_K 32 -#define MOE_TILESIZE_M 16 -#define MOE_SH_STAGES 4 -#define MOE_FRAG_STAGES 3 - -#define EXL3_MOE_KERNEL_ARGS \ - const half *__restrict__ hidden_state, half *__restrict__ temp_state_g, \ - half *__restrict__ temp_state_u, half *__restrict__ temp_intermediate_g, \ - half *__restrict__ temp_intermediate_u, \ - float *__restrict__ output_state, \ - \ - const uint16_t **__restrict__ gate_trellis, \ - const half **__restrict__ gate_suh, const half **__restrict__ gate_svh, \ - const uint16_t **__restrict__ up_trellis, \ - const half **__restrict__ up_suh, const half **__restrict__ up_svh, \ - const uint16_t **__restrict__ down_trellis, \ - const half **__restrict__ down_suh, const half **__restrict__ down_svh, \ - \ - const int64_t *__restrict__ expert_count, \ - const int64_t *__restrict__ token_sorted, \ - const half *__restrict__ weight_sorted, \ - \ - const int hidden_dim, const int intermediate_dim, const int num_experts, \ - const int num_experts_per_tok, const int max_tokens_per_expert, \ - const int concurrency, const float act_limit, const int act_function, \ - const int K_gate, const int K_up, const int K_down, \ - \ - int *__restrict__ locks - -template +template __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / 16) void exl3_moe_kernel(EXL3_MOE_KERNEL_ARGS) { const int group_idx = blockIdx.z; const int block_idx = blockIdx.x; - const int block_threads = blockDim.x; - const int group_threads = MOE_SMS_PER_EXPERT * block_threads; + const int group_size = gridDim.x; // SMs per expert, set at launch + const int num_groups = gridDim.z; + const int block_threads = + EXL3_GEMM_BASE_THREADS * MOE_TILESIZE_K / 16; // blockDim.x + const int group_threads = group_size * block_threads; const int warp_id = threadIdx.x / 32; const int warps_per_group = group_threads / 32; const int warps_per_block = block_threads / 32; @@ -60,9 +38,20 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / // Barriers for group sync int* barrier_counters_sense = locks + BARRIER_LOCKS_OFFSET; + // Expert scheduler state, self-resetting: [0] next ticket, [1] retired + // groups, [2 + g] ticket for group g + int* sched = locks + MOE_SCHED_OFFSET; + // Individual GEMM barriers per group locks += group_idx * MAX(hidden_dim, intermediate_dim) / 128; + // Dynamic expert assignment: active experts are numbered in scan order, and + // each group processes the active expert matching its current ticket. Initial + // tickets are the group indices; after finishing an expert, a group draws the + // next unclaimed ticket, so load balances greedily without assuming uniform + // cost per expert + int ticket = group_idx; + // Loop over experts int start = 0; int end = 0; @@ -79,8 +68,8 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / if (token_count == 0) continue; if (token_count > max_tokens_per_expert) continue; - // Skip if expert is assigned to different group - if (expert_idx_assign++ % concurrency != group_idx) continue; + // Skip if expert is claimed by a different group + if (expert_idx_assign++ != ticket) continue; // EXL3 weights for g, u, d const uint16_t* exp_gate_trellis = gate_trellis[expert_idx]; @@ -93,7 +82,9 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / const half* exp_down_suh = down_suh[expert_idx]; const half* exp_down_svh = down_svh[expert_idx]; - // Gather + input hadamard for g, u + // Gather + input hadamard for g, u. Non-gated mode skips the g staging (and + // the g GEMM below); the activation synthesizes the gate lane from u + const bool gated = act_function != MOE_ACT_RELU2_NOGATE; auto had_gather_gu_in = [&]() { const int warps_per_token = hidden_dim / 128; const int total_warps = token_count * warps_per_token; @@ -104,14 +95,15 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / int token_off = warp_idx % warps_per_token; const half* in_ptr = hidden_state + token_idx * hidden_dim + token_off * 128; - had_hf_r_128_inner(in_ptr, temp_state_g + 128 * warp_idx, - exp_gate_suh + 128 * token_off, nullptr, - 0.088388347648f); - had_hf_r_128_inner(in_ptr, temp_state_u + 128 * warp_idx, - exp_up_suh + 128 * token_off, nullptr, - 0.088388347648f); + if (gated) + had_hf_r_128_inner(in_ptr, temp_state_g + 128 * warp_idx, + exp_gate_suh + 128 * token_off, + 0.088388347648f); + had_hf_r_128_inner(in_ptr, temp_state_u + 128 * warp_idx, + exp_up_suh + 128 * token_off, + 0.088388347648f); } - group_barrier(group_idx, MOE_SMS_PER_EXPERT, barrier_counters_sense); + group_barrier(group_idx, group_size, barrier_counters_sense); }; had_gather_gu_in(); @@ -121,37 +113,38 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / const uint16_t* trellis, const int K) { int size_m = token_count; while (size_m > 0) { -#define ARGS \ - in_addr, trellis, out_addr, size_m, hidden_dim, intermediate_dim, locks +#define ARGS \ + in_addr, trellis, out_addr, MIN(size_m, 16), hidden_dim, intermediate_dim, \ + locks, nullptr #define SHAPE_ARGS \ MOE_TILESIZE_M, MOE_TILESIZE_K, MOE_TILESIZE_N, MOE_SH_STAGES, MOE_FRAG_STAGES if constexpr (t_bits) - exl3_gemm_kernel_inner(ARGS); + exl3_gemm_kernel_inner(ARGS); else switch (K) { case 1: - exl3_gemm_kernel_inner<1, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<1, false, cb, SHAPE_ARGS, false>(ARGS); break; case 2: - exl3_gemm_kernel_inner<2, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<2, false, cb, SHAPE_ARGS, false>(ARGS); break; case 3: - exl3_gemm_kernel_inner<3, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<3, false, cb, SHAPE_ARGS, false>(ARGS); break; case 4: - exl3_gemm_kernel_inner<4, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<4, false, cb, SHAPE_ARGS, false>(ARGS); break; case 5: - exl3_gemm_kernel_inner<5, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<5, false, cb, SHAPE_ARGS, false>(ARGS); break; case 6: - exl3_gemm_kernel_inner<6, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<6, false, cb, SHAPE_ARGS, false>(ARGS); break; case 7: - exl3_gemm_kernel_inner<7, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<7, false, cb, SHAPE_ARGS, false>(ARGS); break; case 8: - exl3_gemm_kernel_inner<8, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<8, false, cb, SHAPE_ARGS, false>(ARGS); break; }; #undef ARGS @@ -160,12 +153,13 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / in_addr += 16 * hidden_dim; out_addr += 16 * intermediate_dim; size_m -= 16; - group_barrier(group_idx, MOE_SMS_PER_EXPERT, barrier_counters_sense); } }; - gemm_up(temp_state_g, temp_intermediate_g, exp_gate_trellis, K_gate); + if (gated) + gemm_up(temp_state_g, temp_intermediate_g, exp_gate_trellis, K_gate); gemm_up(temp_state_u, temp_intermediate_u, exp_up_trellis, K_up); + group_barrier(group_idx, group_size, barrier_counters_sense); // Output hadamard for g, u + activation+gate + input hadamard for d auto had_guad = [&]() { @@ -182,7 +176,7 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / exp_down_suh + 128 * token_off, 0.088388347648f, act_limit, act_function); } - group_barrier(group_idx, MOE_SMS_PER_EXPERT, barrier_counters_sense); + group_barrier(group_idx, group_size, barrier_counters_sense); }; had_guad(); @@ -192,37 +186,38 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / const uint16_t* trellis, const int K) { int size_m = token_count; while (size_m > 0) { -#define ARGS \ - in_addr, trellis, out_addr, size_m, intermediate_dim, hidden_dim, locks +#define ARGS \ + in_addr, trellis, out_addr, MIN(size_m, 16), intermediate_dim, hidden_dim, \ + locks, nullptr #define SHAPE_ARGS \ MOE_TILESIZE_M, MOE_TILESIZE_K, MOE_TILESIZE_N, MOE_SH_STAGES, MOE_FRAG_STAGES if constexpr (t_bits) - exl3_gemm_kernel_inner(ARGS); + exl3_gemm_kernel_inner(ARGS); else switch (K) { case 1: - exl3_gemm_kernel_inner<1, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<1, false, cb, SHAPE_ARGS, false>(ARGS); break; case 2: - exl3_gemm_kernel_inner<2, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<2, false, cb, SHAPE_ARGS, false>(ARGS); break; case 3: - exl3_gemm_kernel_inner<3, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<3, false, cb, SHAPE_ARGS, false>(ARGS); break; case 4: - exl3_gemm_kernel_inner<4, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<4, false, cb, SHAPE_ARGS, false>(ARGS); break; case 5: - exl3_gemm_kernel_inner<5, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<5, false, cb, SHAPE_ARGS, false>(ARGS); break; case 6: - exl3_gemm_kernel_inner<6, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<6, false, cb, SHAPE_ARGS, false>(ARGS); break; case 7: - exl3_gemm_kernel_inner<7, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<7, false, cb, SHAPE_ARGS, false>(ARGS); break; case 8: - exl3_gemm_kernel_inner<8, false, 1, SHAPE_ARGS>(ARGS); + exl3_gemm_kernel_inner<8, false, cb, SHAPE_ARGS, false>(ARGS); break; }; #undef ARGS @@ -231,11 +226,11 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / in_addr += 16 * intermediate_dim; out_addr += 16 * hidden_dim; size_m -= 16; - group_barrier(group_idx, MOE_SMS_PER_EXPERT, barrier_counters_sense); } }; gemm_down(temp_intermediate_g, temp_state_g, exp_down_trellis, K_down); + group_barrier(group_idx, group_size, barrier_counters_sense); // Output hadamard for d + scatter add auto had_d_out = [&]() { @@ -254,9 +249,31 @@ __global__ __launch_bounds__(EXL3_GEMM_BASE_THREADS* MOE_TILESIZE_K / exp_down_svh + 128 * token_off, 0.088388347648f * __half2float(weight)); } - group_barrier(group_idx, MOE_SMS_PER_EXPERT, barrier_counters_sense); }; had_d_out(); + + // Draw the next ticket and publish it to the group through the + // end-of-expert barrier, which also protects the temp buffers for reuse. + // Grabbed tickets continue from num_groups since 0..num_groups-1 are + // implicit + if (block_idx == 0 && threadIdx.x == 0) + sched[2 + group_idx] = num_groups + atomicAdd(&sched[0], 1); + group_barrier(group_idx, group_size, barrier_counters_sense); + ticket = sched[2 + group_idx]; + } + + // Retire group; last group out resets the scheduler for the next launch. The + // acq_rel increment orders each group's earlier ticket grabs before the last + // group's reset (plain atomics are relaxed, so without this a straggler's + // in-flight grab could land after the reset and leak into the next launch) + if (block_idx == 0 && threadIdx.x == 0) { + cuda::atomic_ref next_ticket(sched[0]); + cuda::atomic_ref retired_groups(sched[1]); + int retired = retired_groups.fetch_add(1, cuda::memory_order_acq_rel); + if (retired == num_groups - 1) { + next_ticket.store(0, cuda::memory_order_relaxed); + retired_groups.store(0, cuda::memory_order_relaxed); + } } } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/hadamard.cu b/csrc/quantization/exl3/exllamav3_ext/quant/hadamard.cu index 0cd6bf047c..b88ffb4664 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/hadamard.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/hadamard.cu @@ -4,52 +4,58 @@ #include "../util.cuh" #include "hadamard_inner.cuh" +template __global__ __launch_bounds__(32) void had_hf_r_128_kernel( const half* __restrict__ input_ptr, half* __restrict__ output_ptr, - const half* __restrict__ pre_scale, const half* __restrict__ post_scale, - const float r_scale) { - input_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - output_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - had_hf_r_128_inner(input_ptr, output_ptr, pre_scale, post_scale, r_scale); + const half* __restrict__ scale, const float r_scale) { + input_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + output_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + had_hf_r_128_inner(input_ptr, output_ptr, scale, + r_scale); } +template __global__ __launch_bounds__(32) void had_ff_r_128_kernel( const float* __restrict__ input_ptr, float* __restrict__ output_ptr, - const half* __restrict__ pre_scale, const half* __restrict__ post_scale, - const float r_scale) { - input_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - output_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - had_ff_r_128_inner(input_ptr, output_ptr, pre_scale, post_scale, r_scale); + const half* __restrict__ scale, const float r_scale) { + input_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + output_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + had_ff_r_128_inner(input_ptr, output_ptr, scale, + r_scale); } +template __global__ __launch_bounds__(32) void had_hf_r_128_dual_kernel( const half* __restrict__ input1_ptr, half* __restrict__ output1_ptr, - const half* __restrict__ pre1_scale, const half* __restrict__ post1_scale, - const half* __restrict__ input2_ptr, half* __restrict__ output2_ptr, - const half* __restrict__ pre2_scale, const half* __restrict__ post2_scale, + const half* __restrict__ scale_1, const half* __restrict__ input2_ptr, + half* __restrict__ output2_ptr, const half* __restrict__ scale_2, const float r_scale) { - input1_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - output1_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - had_hf_r_128_inner(input1_ptr, output1_ptr, pre1_scale, post1_scale, r_scale); - - input2_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - output2_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - had_hf_r_128_inner(input2_ptr, output2_ptr, pre2_scale, post2_scale, r_scale); + input1_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + output1_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + had_hf_r_128_inner(input1_ptr, output1_ptr, scale_1, + r_scale); + + input2_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + output2_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + had_hf_r_128_inner(input2_ptr, output2_ptr, scale_2, + r_scale); } +template __global__ __launch_bounds__(32) void had_ff_r_128_dual_kernel( const float* __restrict__ input1_ptr, float* __restrict__ output1_ptr, - const half* __restrict__ pre1_scale, const half* __restrict__ post1_scale, - const float* __restrict__ input2_ptr, float* __restrict__ output2_ptr, - const half* __restrict__ pre2_scale, const half* __restrict__ post2_scale, + const half* __restrict__ scale_1, const float* __restrict__ input2_ptr, + float* __restrict__ output2_ptr, const half* __restrict__ scale_2, const float r_scale) { - input1_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - output1_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - had_ff_r_128_inner(input1_ptr, output1_ptr, pre1_scale, post1_scale, r_scale); - - input2_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - output2_ptr += gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; - had_ff_r_128_inner(input2_ptr, output2_ptr, pre2_scale, post2_scale, r_scale); + input1_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + output1_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + had_ff_r_128_inner(input1_ptr, output1_ptr, scale_1, + r_scale); + + input2_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + output2_ptr += (size_t)gridDim.y * 128 * blockIdx.x + blockIdx.y * 128; + had_ff_r_128_inner(input2_ptr, output2_ptr, scale_2, + r_scale); } /* @@ -78,19 +84,35 @@ void had_r_128(const at::Tensor& input, const at::Tensor& output, if (input.scalar_type() == at::kHalf) { TORCH_CHECK_DTYPE(output, kHalf); - had_hf_r_128_kernel<<>>( - (const half*)input.data_ptr(), (half*)output.data_ptr(), - (const half*)OPTPTR(pre_scale), (const half*)OPTPTR(post_scale), - r_scale); + if (pre_scale.has_value()) + had_hf_r_128_kernel<<>>( + (const half*)input.data_ptr(), (half*)output.data_ptr(), + (const half*)OPTPTR(pre_scale), r_scale); + else if (post_scale.has_value()) + had_hf_r_128_kernel<<>>( + (const half*)input.data_ptr(), (half*)output.data_ptr(), + (const half*)OPTPTR(post_scale), r_scale); + else + had_hf_r_128_kernel<<>>( + (const half*)input.data_ptr(), (half*)output.data_ptr(), + (const half*)nullptr, r_scale); cuda_check(cudaPeekAtLastError()); } else if (input.scalar_type() == at::kFloat) { TORCH_CHECK_DTYPE(output, kFloat); - had_ff_r_128_kernel<<>>( - (const float*)input.data_ptr(), (float*)output.data_ptr(), - (const half*)OPTPTR(pre_scale), (const half*)OPTPTR(post_scale), - r_scale); + if (pre_scale.has_value()) + had_ff_r_128_kernel<<>>( + (const float*)input.data_ptr(), (float*)output.data_ptr(), + (const half*)OPTPTR(pre_scale), r_scale); + else if (post_scale.has_value()) + had_ff_r_128_kernel<<>>( + (const float*)input.data_ptr(), (float*)output.data_ptr(), + (const half*)OPTPTR(post_scale), r_scale); + else + had_ff_r_128_kernel<<>>( + (const float*)input.data_ptr(), (float*)output.data_ptr(), + (const half*)nullptr, r_scale); cuda_check(cudaPeekAtLastError()); } @@ -117,6 +139,10 @@ void had_r_128_dual(const at::Tensor& input1, const at::Tensor& output1, int rows = input1.size(0); int cols = input1.size(1); + TORCH_CHECK(pre_scale1.has_value() == pre_scale2.has_value() && + post_scale1.has_value() == post_scale2.has_value(), + "Cannot mix scaling modes in dual had") + int blocks = cols / 128; float r_scale = scale * 0.088388347648f; // scale / sqrt(128) @@ -125,23 +151,42 @@ void had_r_128_dual(const at::Tensor& input1, const at::Tensor& output1, if (input1.scalar_type() == at::kHalf) { TORCH_CHECK_DTYPE(output1, kHalf); - had_hf_r_128_dual_kernel<<>>( - (const half*)input1.data_ptr(), (half*)output1.data_ptr(), - (const half*)OPTPTR(pre_scale1), (const half*)OPTPTR(post_scale1), - (const half*)input2.data_ptr(), (half*)output2.data_ptr(), - (const half*)OPTPTR(pre_scale2), (const half*)OPTPTR(post_scale2), - r_scale); + if (pre_scale1.has_value()) + had_hf_r_128_dual_kernel<<>>( + (const half*)input1.data_ptr(), (half*)output1.data_ptr(), + (const half*)OPTPTR(pre_scale1), (const half*)input2.data_ptr(), + (half*)output2.data_ptr(), (const half*)OPTPTR(pre_scale2), r_scale); + else if (post_scale1.has_value()) + had_hf_r_128_dual_kernel<<>>( + (const half*)input1.data_ptr(), (half*)output1.data_ptr(), + (const half*)OPTPTR(post_scale1), (const half*)input2.data_ptr(), + (half*)output2.data_ptr(), (const half*)OPTPTR(post_scale2), r_scale); + else + had_hf_r_128_dual_kernel<<>>( + (const half*)input1.data_ptr(), (half*)output1.data_ptr(), + (const half*)nullptr, (const half*)input2.data_ptr(), + (half*)output2.data_ptr(), (const half*)nullptr, r_scale); cuda_check(cudaPeekAtLastError()); } else if (input1.scalar_type() == at::kFloat) { TORCH_CHECK_DTYPE(output1, kFloat); - had_ff_r_128_dual_kernel<<>>( - (const float*)input1.data_ptr(), (float*)output1.data_ptr(), - (const half*)OPTPTR(pre_scale1), (const half*)OPTPTR(post_scale1), - (const float*)input2.data_ptr(), (float*)output2.data_ptr(), - (const half*)OPTPTR(pre_scale2), (const half*)OPTPTR(post_scale2), - r_scale); + if (pre_scale1.has_value()) + had_ff_r_128_dual_kernel<<>>( + (const float*)input1.data_ptr(), (float*)output1.data_ptr(), + (const half*)OPTPTR(pre_scale1), (const float*)input2.data_ptr(), + (float*)output2.data_ptr(), (const half*)OPTPTR(pre_scale2), r_scale); + else if (post_scale1.has_value()) + had_ff_r_128_dual_kernel<<>>( + (const float*)input1.data_ptr(), (float*)output1.data_ptr(), + (const half*)OPTPTR(post_scale1), (const float*)input2.data_ptr(), + (float*)output2.data_ptr(), (const half*)OPTPTR(post_scale2), + r_scale); + else + had_ff_r_128_dual_kernel<<>>( + (const float*)input1.data_ptr(), (float*)output1.data_ptr(), + (const half*)nullptr, (const float*)input2.data_ptr(), + (float*)output2.data_ptr(), (const half*)nullptr, r_scale); cuda_check(cudaPeekAtLastError()); } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/hadamard_inner.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/hadamard_inner.cuh index e4d8c7ddcf..6339051222 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/hadamard_inner.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/hadamard_inner.cuh @@ -3,6 +3,10 @@ #define ACT_SILU 0 #define ACT_GELU 1 +// Non-gated relu2 (NemotronH): the g input is unused (its GEMM is skipped by +// the caller); the gate lane is set to relu(u) so the gate multiply below +// yields relu(u) * u = relu^2(u) exactly +#define ACT_RELU2_NOGATE 2 // Hadamard transform 128-element vector across one warp, with optional pre and // post scales @@ -82,10 +86,10 @@ __device__ inline half2 shuffle_had_h2x32(half2 v, int lane_id) { // Half vector, half scales +template inline __device__ void had_hf_r_128_inner(const half* __restrict__ input_ptr, half* __restrict__ output_ptr, - const half* __restrict__ pre_scale, - const half* __restrict__ post_scale, + const half* __restrict__ scale, const float r_scale) { int t = threadIdx.x & 31; @@ -93,9 +97,9 @@ inline __device__ void had_hf_r_128_inner(const half* __restrict__ input_ptr, half4 v = ((half4*)input_ptr)[t]; // Pre scale - if (pre_scale) { + if constexpr (pre_scale) { int i = blockIdx.y * 32 + t; - half4 scales = ((half4*)pre_scale)[i]; + half4 scales = ((half4*)scale)[i]; v.x = __hmul2(v.x, scales.x); v.y = __hmul2(v.y, scales.y); } @@ -120,9 +124,9 @@ inline __device__ void had_hf_r_128_inner(const half* __restrict__ input_ptr, v.y = __floats2half2_rn(h2 * r_scale, h3 * r_scale); // Post scale - if (post_scale) { + if constexpr (post_scale) { int i = blockIdx.y * 32 + t; - half4 scales = ((half4*)post_scale)[i]; + half4 scales = ((half4*)scale)[i]; v.x = __hmul2(v.x, scales.x); v.y = __hmul2(v.y, scales.y); } @@ -133,10 +137,10 @@ inline __device__ void had_hf_r_128_inner(const half* __restrict__ input_ptr, // Float vector, half scales +template inline __device__ void had_ff_r_128_inner(const float* __restrict__ input_ptr, float* __restrict__ output_ptr, - const half* __restrict__ pre_scale, - const half* __restrict__ post_scale, + const half* __restrict__ scale, const float r_scale) { int t = threadIdx.x & 31; @@ -144,9 +148,9 @@ inline __device__ void had_ff_r_128_inner(const float* __restrict__ input_ptr, float4 v = ((float4*)input_ptr)[t]; // Pre scale - if (pre_scale) { + if constexpr (pre_scale) { int i = blockIdx.y * 32 + t; - half4 scales = ((half4*)pre_scale)[i]; + half4 scales = ((half4*)scale)[i]; v.x *= __low2float(scales.x); v.y *= __high2float(scales.x); v.z *= __low2float(scales.y); @@ -176,9 +180,9 @@ inline __device__ void had_ff_r_128_inner(const float* __restrict__ input_ptr, v.w *= r_scale; // Post scale - if (post_scale) { + if constexpr (post_scale) { int i = blockIdx.y * 32 + t; - half4 scales = ((half4*)post_scale)[i]; + half4 scales = ((half4*)scale)[i]; v.x *= __low2float(scales.x); v.y *= __high2float(scales.x); v.z *= __low2float(scales.y); @@ -189,6 +193,66 @@ inline __device__ void had_ff_r_128_inner(const float* __restrict__ input_ptr, ((float4*)output_ptr)[t] = v; } +// Float vector, half scales, half output + +template +inline __device__ void had_fh_r_128_inner(const float* __restrict__ input_ptr, + half* __restrict__ output_ptr, + const half* __restrict__ scale, + const float r_scale) { + int t = threadIdx.x & 31; + + // Load + float4 v = ((float4*)input_ptr)[t]; + + // Pre scale + if constexpr (pre_scale) { + int i = blockIdx.y * 32 + t; + half4 scales = ((half4*)scale)[i]; + v.x *= __low2float(scales.x); + v.y *= __high2float(scales.x); + v.z *= __low2float(scales.y); + v.w *= __high2float(scales.y); + } + + // 4 element had + float v0 = v.x; + float v1 = v.y; + float v2 = v.z; + float v3 = v.w; + float s0 = v0 + v1; + float d0 = v0 - v1; + float s1 = v2 + v3; + float d1 = v2 - v3; + v.x = s0 + s1; + v.y = d0 + d1; + v.z = s0 - s1; + v.w = d0 - d1; + + // 32 element had, warp shuffle + shuffle_had_f2x32(v.x, v.y, t); + shuffle_had_f2x32(v.z, v.w, t); + v.x *= r_scale; + v.y *= r_scale; + v.z *= r_scale; + v.w *= r_scale; + + half4 o; + o.x = __floats2half2_rn(v.x, v.y); + o.y = __floats2half2_rn(v.z, v.w); + + // Post scale + if constexpr (post_scale) { + int i = blockIdx.y * 32 + t; + half4 scales = ((half4*)scale)[i]; + o.x = __hmul2(o.x, scales.x); + o.y = __hmul2(o.y, scales.y); + } + + // Store + ((half4*)output_ptr)[t] = o; +} + // Fused op: o <- in_had(silu(out_had(g)) * out_had(u)) inline __device__ void had_hf_r_128_guad_inner( @@ -241,23 +305,28 @@ inline __device__ void had_hf_r_128_guad_inner( return __float22half2_rn(xf); }; - // Load - half4 vg = ((half4*)input_ptr_g)[t]; + // Load. In non-gated mode the g buffer holds no data (its GEMM is skipped); + // the gate lane is synthesized from u in the activation switch below + half4 vg = {}; half4 vu = ((half4*)input_ptr_u)[t]; // Hadamard - vg = had(vg); vu = had(vu); // Post scale TODO: should maybe do this in float32 int i = blockIdx.y * 32 + t; - half4 scales_g = ((half4*)post_scale_g)[i]; half4 scales_u = ((half4*)post_scale_u)[i]; - vg.x = __hmul2(vg.x, scales_g.x); - vg.y = __hmul2(vg.y, scales_g.y); vu.x = __hmul2(vu.x, scales_u.x); vu.y = __hmul2(vu.y, scales_u.y); + if (act_function != ACT_RELU2_NOGATE) { + vg = ((half4*)input_ptr_g)[t]; + vg = had(vg); + half4 scales_g = ((half4*)post_scale_g)[i]; + vg.x = __hmul2(vg.x, scales_g.x); + vg.y = __hmul2(vg.y, scales_g.y); + } + // Activation switch (act_function) { case ACT_SILU: @@ -270,6 +339,11 @@ inline __device__ void had_hf_r_128_guad_inner( vg.y = _gelu(vg.y); break; + case ACT_RELU2_NOGATE: + vg.x = __hmax2(vu.x, __float2half2_rn(0.0f)); + vg.y = __hmax2(vu.y, __float2half2_rn(0.0f)); + break; + default: break; } diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/reconstruct.cu b/csrc/quantization/exl3/exllamav3_ext/quant/reconstruct.cu index 1d45ffaa75..0483b21f83 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/reconstruct.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/reconstruct.cu @@ -5,11 +5,10 @@ #include "../ptx.cuh" #include "exl3_dq.cuh" -// TODO: Benchmark, profile, unit test - template __global__ __launch_bounds__(256) void reconstruct_kernel( - half* __restrict__ g_unpacked, const uint16_t* __restrict__ g_packed) { + half* __restrict__ g_unpacked, const uint16_t* __restrict__ g_packed, + int packed_blocks_n, int packed_n_offset) { constexpr int packed_size = 256 * K / 16; // in uint16s int t = threadIdx.x; @@ -18,13 +17,12 @@ __global__ __launch_bounds__(256) void reconstruct_kernel( int k = blockIdx.y; int n = blockIdx.x * 8; int tiles_n = gridDim.x; - int blocks_n = tiles_n * 8; + int out_blocks_n = tiles_n * 8; // Load packed 16*128 tile __shared__ uint32_t s_packed[8][packed_size / 2]; - g_packed += (k * blocks_n + n) * packed_size; - for (int s = t; s < packed_size * 8 / 8; s += 256) - ((int4*)s_packed)[t] = ((int4*)g_packed)[t]; + g_packed += (k * packed_blocks_n + packed_n_offset + n) * packed_size; + if (t < packed_size) ((int4*)s_packed)[t] = ((int4*)g_packed)[t]; __syncthreads(); // Dequant @@ -39,7 +37,6 @@ __global__ __launch_bounds__(256) void reconstruct_kernel( half2 n1 = __shfl_down_sync(0xFFFFFFFF, frag[0][1], 4, 32); half2 n2 = __shfl_down_sync(0xFFFFFFFF, frag[1][0], 4, 32); half2 n3 = __shfl_down_sync(0xFFFFFFFF, frag[1][1], 4, 32); - __syncwarp(); if (!(lane_id & 4)) { half2 m0 = __halves2half2(__low2half(frag[0][0]), __low2half(n0)); @@ -72,7 +69,7 @@ __global__ __launch_bounds__(256) void reconstruct_kernel( int c = t % 16; int4* tile_int4 = (reinterpret_cast(tile)); int4* out_int4 = - ((int4*)g_unpacked) + (k * 16 + r) * 2 * blocks_n + n * 2 + c; + ((int4*)g_unpacked) + (k * 16 + r) * 2 * out_blocks_n + n * 2 + c; *out_int4 = tile_int4[t]; } @@ -87,19 +84,30 @@ constexpr auto reconstruct_kernel_instances = /* Reconstruct encoded+packed tensor */ -void reconstruct(at::Tensor unpacked, at::Tensor packed, int K, bool mcg, - bool mul1) { +void reconstruct_slice(at::Tensor unpacked, at::Tensor packed, int K, bool mcg, + bool mul1, int64_t n_offset) { const torch::stable::accelerator::DeviceGuard device_guard( unpacked.get_device_index()); cudaStream_t stream = get_current_cuda_stream(unpacked.get_device_index()); TORCH_CHECK_SHAPES(unpacked, 0, packed, 0, 16); - TORCH_CHECK_SHAPES(unpacked, 1, packed, 1, 16); TORCH_CHECK_SIZE(packed, 2, 256 * K / 16); TORCH_CHECK_DTYPE(unpacked, kHalf); int rows = packed.size(0); - int cols = packed.size(1); + int packed_cols = packed.size(1); + + if (unpacked.numel() == 0) return; + + TORCH_CHECK(unpacked.size(1) % 128 == 0, + "unpacked N dimension must be divisible by 128"); + TORCH_CHECK(n_offset % 128 == 0, "n_offset must be divisible by 128"); + TORCH_CHECK(n_offset >= 0, "n_offset must be non-negative"); + TORCH_CHECK(n_offset + unpacked.size(1) <= packed.size(1) * 16, + "reconstruct slice exceeds packed tensor bounds"); + + int cols = unpacked.size(1) / 16; + int packed_n_offset = n_offset / 16; dim3 blockDim(256); dim3 gridDim(cols / 8, rows); @@ -111,6 +119,13 @@ void reconstruct(at::Tensor unpacked, at::Tensor packed, int K, bool mcg, cbi += 16; reconstruct_kernel_instances[cbi]<<>>( - (half*)unpacked.data_ptr(), (const uint16_t*)packed.data_ptr()); + (half*)unpacked.data_ptr(), (const uint16_t*)packed.data_ptr(), + packed_cols, packed_n_offset); cuda_check(cudaPeekAtLastError()); } + +void reconstruct(at::Tensor unpacked, at::Tensor packed, int K, bool mcg, + bool mul1) { + TORCH_CHECK_SHAPES(unpacked, 1, packed, 1, 16); + reconstruct_slice(unpacked, packed, K, mcg, mul1, 0); +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/reconstruct.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/reconstruct.cuh index e3896ba0d0..7134ae49e9 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/reconstruct.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/reconstruct.cuh @@ -4,3 +4,6 @@ void reconstruct(at::Tensor unpacked, at::Tensor packed, int K, bool mcg, bool mul1); + +void reconstruct_slice(at::Tensor unpacked, at::Tensor packed, int K, bool mcg, + bool mul1, int64_t n_offset); diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/util.cu b/csrc/quantization/exl3/exllamav3_ext/quant/util.cu index c5407254d8..7a8722ddd3 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/util.cu +++ b/csrc/quantization/exl3/exllamav3_ext/quant/util.cu @@ -87,3 +87,52 @@ void count_inf_nan(at::Tensor x, at::Tensor y) { else TORCH_CHECK(false, "Unsupported dtype"); } + +__global__ void make_gate_up_indices_kernel(int64_t* out, + const int64_t* indices, + int64_t count, int64_t offset) { + const int64_t index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= count) return; + out[index] = indices[index]; + out[index + count] = indices[index] + offset; +} + +void exl3_make_gate_up_indices(at::Tensor out, at::Tensor indices, + int64_t offset) { + const torch::stable::accelerator::DeviceGuard device_guard( + indices.get_device_index()); + cudaStream_t stream = get_current_cuda_stream(indices.get_device_index()); + TORCH_CHECK_DTYPE(out, kLong); + TORCH_CHECK_DTYPE(indices, kLong); + TORCH_CHECK(out.numel() == indices.numel() * 2, + "out must have twice as many elements as indices"); + const int64_t count = indices.numel(); + make_gate_up_indices_kernel<<>>( + static_cast(out.data_ptr()), + static_cast(indices.data_ptr()), count, offset); +} + +__global__ void silu_mul_kernel(half* out, const half* gate, const half* up, + int64_t count) { + const int64_t index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= count) return; + const float gate_f = __half2float(gate[index]); + out[index] = __float2half_rn((gate_f / (1.0f + __expf(-gate_f))) * + __half2float(up[index])); +} + +void exl3_silu_mul(at::Tensor out, at::Tensor gate, at::Tensor up) { + const torch::stable::accelerator::DeviceGuard device_guard( + gate.get_device_index()); + cudaStream_t stream = get_current_cuda_stream(gate.get_device_index()); + TORCH_CHECK_DTYPE(out, kHalf); + TORCH_CHECK_DTYPE(gate, kHalf); + TORCH_CHECK_DTYPE(up, kHalf); + TORCH_CHECK_NUMEL(out, gate); + TORCH_CHECK_NUMEL(out, up); + const int64_t count = out.numel(); + silu_mul_kernel<<>>( + static_cast(out.data_ptr()), + static_cast(gate.data_ptr()), + static_cast(up.data_ptr()), count); +} diff --git a/csrc/quantization/exl3/exllamav3_ext/quant/util.cuh b/csrc/quantization/exl3/exllamav3_ext/quant/util.cuh index c63cf6c62d..314306391e 100644 --- a/csrc/quantization/exl3/exllamav3_ext/quant/util.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/quant/util.cuh @@ -4,3 +4,8 @@ #include void count_inf_nan(at::Tensor x, at::Tensor y); + +void exl3_make_gate_up_indices(at::Tensor out, at::Tensor indices, + int64_t offset); + +void exl3_silu_mul(at::Tensor out, at::Tensor gate, at::Tensor up); diff --git a/csrc/quantization/exl3/exllamav3_ext/util.cuh b/csrc/quantization/exl3/exllamav3_ext/util.cuh index 974e488c8b..d6343ae5cd 100644 --- a/csrc/quantization/exl3/exllamav3_ext/util.cuh +++ b/csrc/quantization/exl3/exllamav3_ext/util.cuh @@ -1,5 +1,10 @@ #pragma once +#include +#include +#include +#include + typedef struct __align__(8) half4 { half2 x; half2 y; diff --git a/csrc/quantization/exl3/exllamav3_ext/util.h b/csrc/quantization/exl3/exllamav3_ext/util.h index 7bdde145ab..fa150c1ae4 100644 --- a/csrc/quantization/exl3/exllamav3_ext/util.h +++ b/csrc/quantization/exl3/exllamav3_ext/util.h @@ -8,9 +8,8 @@ #include #include -// Keep the imported exllamav3 kernel sources close to upstream while binding -// their tensor-facing surface to PyTorch's stable ABI. These are source-level -// aliases only; no ATen or c10 symbols are linked into the extension. +// Bind the vendored tensor-facing API to PyTorch's stable ABI. These aliases +// are source-level compatibility only; the extension does not link ATen/c10. namespace at { using Tensor = torch::stable::Tensor; inline constexpr auto kFloat = torch::headeronly::ScalarType::Float;