summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/audio_core/codec.cpp4
-rw-r--r--src/audio_core/codec.h4
-rw-r--r--src/audio_core/hle/source.cpp49
-rw-r--r--src/audio_core/hle/source.h2
-rw-r--r--src/audio_core/interpolate.cpp86
-rw-r--r--src/audio_core/interpolate.h31
-rw-r--r--src/citra/citra.cpp2
-rw-r--r--src/citra/citra.rc8
-rw-r--r--src/citra/config.cpp11
-rw-r--r--src/citra/default_ini.h29
-rw-r--r--src/citra/emu_window/emu_window_sdl2.cpp10
-rw-r--r--src/citra/emu_window/emu_window_sdl2.h4
-rw-r--r--src/citra_qt/CMakeLists.txt8
-rw-r--r--src/citra_qt/bootmanager.cpp10
-rw-r--r--src/citra_qt/bootmanager.h4
-rw-r--r--src/citra_qt/citra-qt.rc12
-rw-r--r--src/citra_qt/configuration/config.cpp23
-rw-r--r--src/citra_qt/configuration/configure.ui15
-rw-r--r--src/citra_qt/configuration/configure_dialog.cpp1
-rw-r--r--src/citra_qt/configuration/configure_graphics.ui33
-rw-r--r--src/citra_qt/configuration/configure_system.cpp3
-rw-r--r--src/citra_qt/configuration/configure_web.cpp102
-rw-r--r--src/citra_qt/configuration/configure_web.h40
-rw-r--r--src/citra_qt/configuration/configure_web.ui190
-rw-r--r--src/citra_qt/debugger/graphics/graphics_cmdlists.cpp4
-rw-r--r--src/citra_qt/debugger/graphics/graphics_surface.cpp3
-rw-r--r--src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp41
-rw-r--r--src/citra_qt/main.cpp48
-rw-r--r--src/citra_qt/main.h2
-rw-r--r--src/citra_qt/ui_settings.h2
-rw-r--r--src/common/common_types.h4
-rw-r--r--src/common/quaternion.h5
-rw-r--r--src/common/scm_rev.cpp.in2
-rw-r--r--src/common/scm_rev.h1
-rw-r--r--src/common/string_util.cpp2
-rw-r--r--src/common/string_util.h2
-rw-r--r--src/common/vector_math.h29
-rw-r--r--src/core/CMakeLists.txt20
-rw-r--r--src/core/arm/arm_interface.h22
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp93
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h17
-rw-r--r--src/core/arm/dyncom/arm_dyncom.cpp19
-rw-r--r--src/core/arm/dyncom/arm_dyncom.h5
-rw-r--r--src/core/arm/dyncom/arm_dyncom_interpreter.cpp8
-rw-r--r--src/core/arm/skyeye_common/armstate.h2
-rw-r--r--src/core/core.cpp12
-rw-r--r--src/core/core.h9
-rw-r--r--src/core/core_timing.cpp36
-rw-r--r--src/core/core_timing.h6
-rw-r--r--src/core/file_sys/archive_backend.cpp2
-rw-r--r--src/core/file_sys/archive_ncch.cpp29
-rw-r--r--src/core/file_sys/archive_sdmc.cpp41
-rw-r--r--src/core/file_sys/archive_selfncch.cpp60
-rw-r--r--src/core/file_sys/archive_selfncch.h13
-rw-r--r--src/core/file_sys/ncch_container.cpp423
-rw-r--r--src/core/file_sys/ncch_container.h274
-rw-r--r--src/core/file_sys/savedata_archive.cpp41
-rw-r--r--src/core/file_sys/title_metadata.cpp212
-rw-r--r--src/core/file_sys/title_metadata.h125
-rw-r--r--src/core/frontend/emu_window.cpp97
-rw-r--r--src/core/frontend/emu_window.h114
-rw-r--r--src/core/frontend/framebuffer_layout.cpp36
-rw-r--r--src/core/frontend/framebuffer_layout.h11
-rw-r--r--src/core/frontend/input.h25
-rw-r--r--src/core/frontend/motion_emu.cpp89
-rw-r--r--src/core/frontend/motion_emu.h52
-rw-r--r--src/core/gdbstub/gdbstub.cpp24
-rw-r--r--src/core/hle/applets/erreula.cpp4
-rw-r--r--src/core/hle/applets/mii_selector.cpp10
-rw-r--r--src/core/hle/applets/mii_selector.h57
-rw-r--r--src/core/hle/applets/mint.cpp4
-rw-r--r--src/core/hle/applets/swkbd.cpp4
-rw-r--r--src/core/hle/function_wrappers.h108
-rw-r--r--src/core/hle/ipc.h8
-rw-r--r--src/core/hle/ipc_helpers.h12
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp2
-rw-r--r--src/core/hle/kernel/kernel.h5
-rw-r--r--src/core/hle/kernel/memory.cpp30
-rw-r--r--src/core/hle/kernel/memory.h2
-rw-r--r--src/core/hle/kernel/mutex.cpp5
-rw-r--r--src/core/hle/kernel/mutex.h3
-rw-r--r--src/core/hle/kernel/process.cpp3
-rw-r--r--src/core/hle/kernel/resource_limit.cpp2
-rw-r--r--src/core/hle/kernel/resource_limit.h2
-rw-r--r--src/core/hle/kernel/semaphore.cpp3
-rw-r--r--src/core/hle/kernel/semaphore.h3
-rw-r--r--src/core/hle/kernel/shared_memory.cpp30
-rw-r--r--src/core/hle/kernel/shared_memory.h2
-rw-r--r--src/core/hle/kernel/thread.cpp68
-rw-r--r--src/core/hle/kernel/thread.h48
-rw-r--r--src/core/hle/kernel/vm_manager.cpp19
-rw-r--r--src/core/hle/kernel/vm_manager.h6
-rw-r--r--src/core/hle/kernel/wait_object.cpp13
-rw-r--r--src/core/hle/lock.cpp11
-rw-r--r--src/core/hle/lock.h18
-rw-r--r--src/core/hle/service/apt/apt.cpp729
-rw-r--r--src/core/hle/service/apt/apt.h20
-rw-r--r--src/core/hle/service/apt/apt_s.cpp8
-rw-r--r--src/core/hle/service/cam/cam.cpp2
-rw-r--r--src/core/hle/service/cfg/cfg.cpp6
-rw-r--r--src/core/hle/service/cfg/cfg.h2
-rw-r--r--src/core/hle/service/csnd_snd.cpp2
-rw-r--r--src/core/hle/service/dlp/dlp_clnt.cpp21
-rw-r--r--src/core/hle/service/dlp/dlp_fkcl.cpp18
-rw-r--r--src/core/hle/service/dlp/dlp_srvr.cpp9
-rw-r--r--src/core/hle/service/dsp_dsp.cpp7
-rw-r--r--src/core/hle/service/fs/archive.cpp20
-rw-r--r--src/core/hle/service/fs/archive.h7
-rw-r--r--src/core/hle/service/hid/hid.cpp44
-rw-r--r--src/core/hle/service/hid/hid.h2
-rw-r--r--src/core/hle/service/ir/ir_rst.cpp2
-rw-r--r--src/core/hle/service/ldr_ro/cro_helper.h6
-rw-r--r--src/core/hle/service/nim/nim.cpp18
-rw-r--r--src/core/hle/service/nim/nim.h11
-rw-r--r--src/core/hle/service/nim/nim_u.cpp2
-rw-r--r--src/core/hle/service/ns/ns.cpp16
-rw-r--r--src/core/hle/service/ns/ns.h16
-rw-r--r--src/core/hle/service/ns/ns_s.cpp34
-rw-r--r--src/core/hle/service/ns/ns_s.h (renamed from src/core/hle/service/ns_s.h)9
-rw-r--r--src/core/hle/service/ns_s.cpp33
-rw-r--r--src/core/hle/service/nwm/nwm_uds.cpp485
-rw-r--r--src/core/hle/service/nwm/nwm_uds.h12
-rw-r--r--src/core/hle/service/nwm/uds_beacon.cpp7
-rw-r--r--src/core/hle/service/nwm/uds_beacon.h30
-rw-r--r--src/core/hle/service/nwm/uds_connection.cpp88
-rw-r--r--src/core/hle/service/nwm/uds_connection.h56
-rw-r--r--src/core/hle/service/nwm/uds_data.cpp103
-rw-r--r--src/core/hle/service/nwm/uds_data.h86
-rw-r--r--src/core/hle/service/service.cpp5
-rw-r--r--src/core/hle/service/sm/sm.cpp4
-rw-r--r--src/core/hle/service/sm/sm.h3
-rw-r--r--src/core/hle/service/sm/srv.cpp28
-rw-r--r--src/core/hle/service/sm/srv.h1
-rw-r--r--src/core/hw/gpu.cpp20
-rw-r--r--src/core/hw/gpu.h4
-rw-r--r--src/core/loader/3dsx.cpp20
-rw-r--r--src/core/loader/3dsx.h2
-rw-r--r--src/core/loader/elf.cpp16
-rw-r--r--src/core/loader/elf.h2
-rw-r--r--src/core/loader/loader.h35
-rw-r--r--src/core/loader/ncch.cpp371
-rw-r--r--src/core/loader/ncch.h203
-rw-r--r--src/core/loader/nro.cpp12
-rw-r--r--src/core/loader/nro.h2
-rw-r--r--src/core/loader/nso.cpp12
-rw-r--r--src/core/loader/nso.h2
-rw-r--r--src/core/memory.cpp354
-rw-r--r--src/core/memory.h91
-rw-r--r--src/core/memory_setup.h10
-rw-r--r--src/core/settings.cpp2
-rw-r--r--src/core/settings.h11
-rw-r--r--src/core/telemetry_session.cpp86
-rw-r--r--src/core/telemetry_session.h22
-rw-r--r--src/input_common/CMakeLists.txt2
-rw-r--r--src/input_common/main.cpp15
-rw-r--r--src/input_common/main.h7
-rw-r--r--src/input_common/motion_emu.cpp168
-rw-r--r--src/input_common/motion_emu.h46
-rw-r--r--src/input_common/sdl/sdl.cpp2
-rw-r--r--src/network/packet.cpp40
-rw-r--r--src/network/packet.h4
-rw-r--r--src/network/room.cpp89
-rw-r--r--src/network/room.h21
-rw-r--r--src/network/room_member.cpp128
-rw-r--r--src/network/room_member.h59
-rw-r--r--src/tests/CMakeLists.txt4
-rw-r--r--src/tests/core/arm/arm_test_common.cpp137
-rw-r--r--src/tests/core/arm/arm_test_common.h84
-rw-r--r--src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp50
-rw-r--r--src/tests/core/arm/dyncom/vfp_vadd_f32.inc13456
-rw-r--r--src/tests/core/memory/memory.cpp56
-rw-r--r--src/video_core/CMakeLists.txt4
-rw-r--r--src/video_core/command_processor.cpp492
-rw-r--r--src/video_core/geometry_pipeline.cpp274
-rw-r--r--src/video_core/geometry_pipeline.h49
-rw-r--r--src/video_core/pica.cpp21
-rw-r--r--src/video_core/pica_state.h13
-rw-r--r--src/video_core/pica_types.h18
-rw-r--r--src/video_core/primitive_assembly.cpp15
-rw-r--r--src/video_core/primitive_assembly.h7
-rw-r--r--src/video_core/regs_framebuffer.h10
-rw-r--r--src/video_core/regs_pipeline.h43
-rw-r--r--src/video_core/regs_rasterizer.h14
-rw-r--r--src/video_core/regs_shader.h7
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp56
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h9
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.cpp115
-rw-r--r--src/video_core/renderer_opengl/gl_state.cpp13
-rw-r--r--src/video_core/renderer_opengl/gl_state.h3
-rw-r--r--src/video_core/shader/shader.cpp44
-rw-r--r--src/video_core/shader/shader.h49
-rw-r--r--src/video_core/shader/shader_interpreter.cpp18
-rw-r--r--src/video_core/shader/shader_jit_x64_compiler.cpp49
-rw-r--r--src/video_core/shader/shader_jit_x64_compiler.h2
-rw-r--r--src/video_core/swrasterizer/clipper.cpp46
-rw-r--r--src/video_core/swrasterizer/framebuffer.cpp2
-rw-r--r--src/video_core/swrasterizer/lighting.cpp308
-rw-r--r--src/video_core/swrasterizer/lighting.h19
-rw-r--r--src/video_core/swrasterizer/rasterizer.cpp29
-rw-r--r--src/video_core/swrasterizer/rasterizer.h6
-rw-r--r--src/video_core/swrasterizer/texturing.cpp4
-rw-r--r--src/video_core/utils.h14
-rw-r--r--src/web_service/CMakeLists.txt2
-rw-r--r--src/web_service/telemetry_json.cpp3
-rw-r--r--src/web_service/telemetry_json.h7
-rw-r--r--src/web_service/verify_login.cpp28
-rw-r--r--src/web_service/verify_login.h24
-rw-r--r--src/web_service/web_backend.cpp138
-rw-r--r--src/web_service/web_backend.h32
209 files changed, 20476 insertions, 2333 deletions
diff --git a/src/audio_core/codec.cpp b/src/audio_core/codec.cpp
index 7a3bd7eb3..6fba9fdae 100644
--- a/src/audio_core/codec.cpp
+++ b/src/audio_core/codec.cpp
@@ -117,7 +117,9 @@ StereoBuffer16 DecodePCM16(const unsigned num_channels, const u8* const data,
ret[i].fill(sample);
}
} else {
- std::memcpy(ret.data(), data, sample_count * 2 * sizeof(u16));
+ for (size_t i = 0; i < sample_count; ++i) {
+ std::memcpy(&ret[i], data + i * sizeof(s16) * 2, 2 * sizeof(s16));
+ }
}
return ret;
diff --git a/src/audio_core/codec.h b/src/audio_core/codec.h
index 2b0c395e6..877b2202d 100644
--- a/src/audio_core/codec.h
+++ b/src/audio_core/codec.h
@@ -5,13 +5,13 @@
#pragma once
#include <array>
-#include <vector>
+#include <deque>
#include "common/common_types.h"
namespace Codec {
/// A variable length buffer of signed PCM16 stereo samples.
-using StereoBuffer16 = std::vector<std::array<s16, 2>>;
+using StereoBuffer16 = std::deque<std::array<s16, 2>>;
/// See: Codec::DecodeADPCM
struct ADPCMState {
diff --git a/src/audio_core/hle/source.cpp b/src/audio_core/hle/source.cpp
index 92484c526..c12287700 100644
--- a/src/audio_core/hle/source.cpp
+++ b/src/audio_core/hle/source.cpp
@@ -244,17 +244,27 @@ void Source::GenerateFrame() {
break;
}
- const size_t size_to_copy =
- std::min(state.current_buffer.size(), current_frame.size() - frame_position);
-
- std::copy(state.current_buffer.begin(), state.current_buffer.begin() + size_to_copy,
- current_frame.begin() + frame_position);
- state.current_buffer.erase(state.current_buffer.begin(),
- state.current_buffer.begin() + size_to_copy);
-
- frame_position += size_to_copy;
- state.next_sample_number += static_cast<u32>(size_to_copy);
+ switch (state.interpolation_mode) {
+ case InterpolationMode::None:
+ AudioInterp::None(state.interp_state, state.current_buffer, state.rate_multiplier,
+ current_frame, frame_position);
+ break;
+ case InterpolationMode::Linear:
+ AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier,
+ current_frame, frame_position);
+ break;
+ case InterpolationMode::Polyphase:
+ // TODO(merry): Implement polyphase interpolation
+ LOG_DEBUG(Audio_DSP, "Polyphase interpolation unimplemented; falling back to linear");
+ AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier,
+ current_frame, frame_position);
+ break;
+ default:
+ UNIMPLEMENTED();
+ break;
+ }
}
+ state.next_sample_number += static_cast<u32>(frame_position);
state.filters.ProcessFrame(current_frame);
}
@@ -305,25 +315,6 @@ bool Source::DequeueBuffer() {
return true;
}
- switch (state.interpolation_mode) {
- case InterpolationMode::None:
- state.current_buffer =
- AudioInterp::None(state.interp_state, state.current_buffer, state.rate_multiplier);
- break;
- case InterpolationMode::Linear:
- state.current_buffer =
- AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier);
- break;
- case InterpolationMode::Polyphase:
- // TODO(merry): Implement polyphase interpolation
- state.current_buffer =
- AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier);
- break;
- default:
- UNIMPLEMENTED();
- break;
- }
-
// the first playthrough starts at play_position, loops start at the beginning of the buffer
state.current_sample_number = (!buf.has_played) ? buf.play_position : 0;
state.next_sample_number = state.current_sample_number;
diff --git a/src/audio_core/hle/source.h b/src/audio_core/hle/source.h
index ccb7f064f..c4d2debc2 100644
--- a/src/audio_core/hle/source.h
+++ b/src/audio_core/hle/source.h
@@ -108,7 +108,7 @@ private:
u32 current_sample_number = 0;
u32 next_sample_number = 0;
- std::vector<std::array<s16, 2>> current_buffer;
+ AudioInterp::StereoBuffer16 current_buffer;
// buffer_id state
diff --git a/src/audio_core/interpolate.cpp b/src/audio_core/interpolate.cpp
index 8a5d4181a..83573d772 100644
--- a/src/audio_core/interpolate.cpp
+++ b/src/audio_core/interpolate.cpp
@@ -13,74 +13,64 @@ namespace AudioInterp {
constexpr u64 scale_factor = 1 << 24;
constexpr u64 scale_mask = scale_factor - 1;
-/// Here we step over the input in steps of rate_multiplier, until we consume all of the input.
+/// Here we step over the input in steps of rate, until we consume all of the input.
/// Three adjacent samples are passed to fn each step.
template <typename Function>
-static StereoBuffer16 StepOverSamples(State& state, const StereoBuffer16& input,
- float rate_multiplier, Function fn) {
- ASSERT(rate_multiplier > 0);
+static void StepOverSamples(State& state, StereoBuffer16& input, float rate,
+ DSP::HLE::StereoFrame16& output, size_t& outputi, Function fn) {
+ ASSERT(rate > 0);
- if (input.size() < 2)
- return {};
+ if (input.empty())
+ return;
- StereoBuffer16 output;
- output.reserve(static_cast<size_t>(input.size() / rate_multiplier));
+ input.insert(input.begin(), {state.xn2, state.xn1});
- u64 step_size = static_cast<u64>(rate_multiplier * scale_factor);
+ const u64 step_size = static_cast<u64>(rate * scale_factor);
+ u64 fposition = state.fposition;
+ size_t inputi = 0;
- u64 fposition = 0;
- const u64 max_fposition = input.size() * scale_factor;
+ while (outputi < output.size()) {
+ inputi = static_cast<size_t>(fposition / scale_factor);
- while (fposition < 1 * scale_factor) {
- u64 fraction = fposition & scale_mask;
-
- output.push_back(fn(fraction, state.xn2, state.xn1, input[0]));
-
- fposition += step_size;
- }
-
- while (fposition < 2 * scale_factor) {
- u64 fraction = fposition & scale_mask;
-
- output.push_back(fn(fraction, state.xn1, input[0], input[1]));
-
- fposition += step_size;
- }
+ if (inputi + 2 >= input.size()) {
+ inputi = input.size() - 2;
+ break;
+ }
- while (fposition < max_fposition) {
u64 fraction = fposition & scale_mask;
-
- size_t index = static_cast<size_t>(fposition / scale_factor);
- output.push_back(fn(fraction, input[index - 2], input[index - 1], input[index]));
+ output[outputi++] = fn(fraction, input[inputi], input[inputi + 1], input[inputi + 2]);
fposition += step_size;
}
- state.xn2 = input[input.size() - 2];
- state.xn1 = input[input.size() - 1];
+ state.xn2 = input[inputi];
+ state.xn1 = input[inputi + 1];
+ state.fposition = fposition - inputi * scale_factor;
- return output;
+ input.erase(input.begin(), std::next(input.begin(), inputi + 2));
}
-StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multiplier) {
- return StepOverSamples(
- state, input, rate_multiplier,
+void None(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
+ size_t& outputi) {
+ StepOverSamples(
+ state, input, rate, output, outputi,
[](u64 fraction, const auto& x0, const auto& x1, const auto& x2) { return x0; });
}
-StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier) {
+void Linear(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
+ size_t& outputi) {
// Note on accuracy: Some values that this produces are +/- 1 from the actual firmware.
- return StepOverSamples(state, input, rate_multiplier,
- [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) {
- // This is a saturated subtraction. (Verified by black-box fuzzing.)
- s64 delta0 = MathUtil::Clamp<s64>(x1[0] - x0[0], -32768, 32767);
- s64 delta1 = MathUtil::Clamp<s64>(x1[1] - x0[1], -32768, 32767);
-
- return std::array<s16, 2>{
- static_cast<s16>(x0[0] + fraction * delta0 / scale_factor),
- static_cast<s16>(x0[1] + fraction * delta1 / scale_factor),
- };
- });
+ StepOverSamples(state, input, rate, output, outputi,
+ [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) {
+ // This is a saturated subtraction. (Verified by black-box fuzzing.)
+ s64 delta0 = MathUtil::Clamp<s64>(x1[0] - x0[0], -32768, 32767);
+ s64 delta1 = MathUtil::Clamp<s64>(x1[1] - x0[1], -32768, 32767);
+
+ return std::array<s16, 2>{
+ static_cast<s16>(x0[0] + fraction * delta0 / scale_factor),
+ static_cast<s16>(x0[1] + fraction * delta1 / scale_factor),
+ };
+ });
}
} // namespace AudioInterp
diff --git a/src/audio_core/interpolate.h b/src/audio_core/interpolate.h
index 19a7b66cb..8dff6111a 100644
--- a/src/audio_core/interpolate.h
+++ b/src/audio_core/interpolate.h
@@ -5,40 +5,45 @@
#pragma once
#include <array>
-#include <vector>
+#include <deque>
+#include "audio_core/hle/common.h"
#include "common/common_types.h"
namespace AudioInterp {
/// A variable length buffer of signed PCM16 stereo samples.
-using StereoBuffer16 = std::vector<std::array<s16, 2>>;
+using StereoBuffer16 = std::deque<std::array<s16, 2>>;
struct State {
- // Two historical samples.
+ /// Two historical samples.
std::array<s16, 2> xn1 = {}; ///< x[n-1]
std::array<s16, 2> xn2 = {}; ///< x[n-2]
+ /// Current fractional position.
+ u64 fposition = 0;
};
/**
* No interpolation. This is equivalent to a zero-order hold. There is a two-sample predelay.
* @param state Interpolation state.
* @param input Input buffer.
- * @param rate_multiplier Stretch factor. Must be a positive non-zero value.
- * rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0
- * performs upsampling.
- * @return The resampled audio buffer.
+ * @param rate Stretch factor. Must be a positive non-zero value.
+ * rate > 1.0 performs decimation and rate < 1.0 performs upsampling.
+ * @param output The resampled audio buffer.
+ * @param outputi The index of output to start writing to.
*/
-StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multiplier);
+void None(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
+ size_t& outputi);
/**
* Linear interpolation. This is equivalent to a first-order hold. There is a two-sample predelay.
* @param state Interpolation state.
* @param input Input buffer.
- * @param rate_multiplier Stretch factor. Must be a positive non-zero value.
- * rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0
- * performs upsampling.
- * @return The resampled audio buffer.
+ * @param rate Stretch factor. Must be a positive non-zero value.
+ * rate > 1.0 performs decimation and rate < 1.0 performs upsampling.
+ * @param output The resampled audio buffer.
+ * @param outputi The index of output to start writing to.
*/
-StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier);
+void Linear(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
+ size_t& outputi);
} // namespace AudioInterp
diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp
index 14574e56c..e524c5535 100644
--- a/src/citra/citra.cpp
+++ b/src/citra/citra.cpp
@@ -165,6 +165,8 @@ int main(int argc, char** argv) {
break; // Expected case
}
+ Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "SDL");
+
while (emu_window->IsOpen()) {
system.RunLoop();
}
diff --git a/src/citra/citra.rc b/src/citra/citra.rc
index fea603004..c490ef302 100644
--- a/src/citra/citra.rc
+++ b/src/citra/citra.rc
@@ -1,3 +1,4 @@
+#include "winresrc.h"
/////////////////////////////////////////////////////////////////////////////
//
// Icon
@@ -7,3 +8,10 @@
// remains consistent on all systems.
CITRA_ICON ICON "../../dist/citra.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// RT_MANIFEST
+//
+
+1 RT_MANIFEST "../../dist/citra.manifest"
diff --git a/src/citra/config.cpp b/src/citra/config.cpp
index 69247b166..45c28ad09 100644
--- a/src/citra/config.cpp
+++ b/src/citra/config.cpp
@@ -76,6 +76,11 @@ void Config::ReadValues() {
Settings::values.analogs[i] = default_param;
}
+ Settings::values.motion_device = sdl2_config->Get(
+ "Controls", "motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01");
+ Settings::values.touch_device =
+ sdl2_config->Get("Controls", "touch_device", "engine:emu_window");
+
// Core
Settings::values.use_cpu_jit = sdl2_config->GetBoolean("Core", "use_cpu_jit", true);
@@ -153,8 +158,14 @@ void Config::ReadValues() {
static_cast<u16>(sdl2_config->GetInteger("Debugging", "gdbstub_port", 24689));
// Web Service
+ Settings::values.enable_telemetry =
+ sdl2_config->GetBoolean("WebService", "enable_telemetry", true);
Settings::values.telemetry_endpoint_url = sdl2_config->Get(
"WebService", "telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry");
+ Settings::values.verify_endpoint_url = sdl2_config->Get(
+ "WebService", "verify_endpoint_url", "https://services.citra-emu.org/api/profile");
+ Settings::values.citra_username = sdl2_config->Get("WebService", "citra_username", "");
+ Settings::values.citra_token = sdl2_config->Get("WebService", "citra_token", "");
}
void Config::Reload() {
diff --git a/src/citra/default_ini.h b/src/citra/default_ini.h
index a12498e0f..59faf773f 100644
--- a/src/citra/default_ini.h
+++ b/src/citra/default_ini.h
@@ -12,7 +12,7 @@ const char* sdl2_config_file = R"(
# It should be in the format of "engine:[engine_name],[param1]:[value1],[param2]:[value2]..."
# Escape characters $0 (for ':'), $1 (for ',') and $2 (for '$') can be used in values
-# for button input, the following devices are avaible:
+# for button input, the following devices are available:
# - "keyboard" (default) for keyboard input. Required parameters:
# - "code": the code of the key to bind
# - "sdl" for joystick input using SDL. Required parameters:
@@ -21,7 +21,7 @@ const char* sdl2_config_file = R"(
# - "hat"(optional): the index of the hat to bind as direction buttons
# - "axis"(optional): the index of the axis to bind
# - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", "down", "left" or "right"
-# - "threshould"(only used for axis): a float value in (-1.0, 1.0) which the button is
+# - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is
# triggered if the axis value crosses
# - "direction"(only used for axis): "+" means the button is triggered when the axis value
# is greater than the threshold; "-" means the button is triggered when the axis value
@@ -42,8 +42,8 @@ button_zl=
button_zr=
button_home=
-# for analog input, the following devices are avaible:
-# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters:
+# for analog input, the following devices are available:
+# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters:
# - "up", "down", "left", "right": sub-devices for each direction.
# Should be in the format as a button input devices using escape characters, for example, "engine$0keyboard$1code$00"
# - "modifier": sub-devices as a modifier.
@@ -56,6 +56,16 @@ button_home=
circle_pad=
c_stick=
+# for motion input, the following devices are available:
+# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters:
+# - "update_period": update period in milliseconds (default to 100)
+# - "sensitivity": the coefficient converting mouse movement to tilting angle (default to 0.01)
+motion_device=
+
+# for touch input, the following devices are available:
+# - "emu_window" (default) for emulating touch input from mouse input to the emulation window. No parameters required
+touch_device=
+
[Core]
# Whether to use the Just-In-Time (JIT) compiler for CPU emulation
# 0: Interpreter (slow), 1 (default): JIT (fast)
@@ -170,7 +180,16 @@ use_gdbstub=false
gdbstub_port=24689
[WebService]
+# Whether or not to enable telemetry
+# 0: No, 1 (default): Yes
+enable_telemetry =
# Endpoint URL for submitting telemetry data
-telemetry_endpoint_url =
+telemetry_endpoint_url = https://services.citra-emu.org/api/telemetry
+# Endpoint URL to verify the username and token
+verify_endpoint_url = https://services.citra-emu.org/api/profile
+# Username and token for Citra Web Service
+# See https://services.citra-emu.org/ for more info
+citra_username =
+citra_token =
)";
}
diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp
index b0f808399..25643715a 100644
--- a/src/citra/emu_window/emu_window_sdl2.cpp
+++ b/src/citra/emu_window/emu_window_sdl2.cpp
@@ -16,11 +16,12 @@
#include "core/settings.h"
#include "input_common/keyboard.h"
#include "input_common/main.h"
+#include "input_common/motion_emu.h"
#include "network/network.h"
void EmuWindow_SDL2::OnMouseMotion(s32 x, s32 y) {
TouchMoved((unsigned)std::max(x, 0), (unsigned)std::max(y, 0));
- motion_emu->Tilt(x, y);
+ InputCommon::GetMotionEmu()->Tilt(x, y);
}
void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) {
@@ -32,9 +33,9 @@ void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) {
}
} else if (button == SDL_BUTTON_RIGHT) {
if (state == SDL_PRESSED) {
- motion_emu->BeginTilt(x, y);
+ InputCommon::GetMotionEmu()->BeginTilt(x, y);
} else {
- motion_emu->EndTilt();
+ InputCommon::GetMotionEmu()->EndTilt();
}
}
}
@@ -61,8 +62,6 @@ EmuWindow_SDL2::EmuWindow_SDL2() {
InputCommon::Init();
Network::Init();
- motion_emu = std::make_unique<Motion::MotionEmu>(*this);
-
SDL_SetMainReady();
// Initialize the window
@@ -117,7 +116,6 @@ EmuWindow_SDL2::EmuWindow_SDL2() {
EmuWindow_SDL2::~EmuWindow_SDL2() {
SDL_GL_DeleteContext(gl_context);
SDL_Quit();
- motion_emu = nullptr;
Network::Shutdown();
InputCommon::Shutdown();
diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h
index 1ce2991f7..3664d2fbe 100644
--- a/src/citra/emu_window/emu_window_sdl2.h
+++ b/src/citra/emu_window/emu_window_sdl2.h
@@ -7,7 +7,6 @@
#include <memory>
#include <utility>
#include "core/frontend/emu_window.h"
-#include "core/frontend/motion_emu.h"
struct SDL_Window;
@@ -57,7 +56,4 @@ private:
using SDL_GLContext = void*;
/// The OpenGL context associated with the window
SDL_GLContext gl_context;
-
- /// Motion sensors emulation
- std::unique_ptr<Motion::MotionEmu> motion_emu;
};
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index f364b2284..add7566c2 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -12,6 +12,7 @@ set(SRCS
configuration/configure_graphics.cpp
configuration/configure_input.cpp
configuration/configure_system.cpp
+ configuration/configure_web.cpp
debugger/graphics/graphics.cpp
debugger/graphics/graphics_breakpoint_observer.cpp
debugger/graphics/graphics_breakpoints.cpp
@@ -42,6 +43,7 @@ set(HEADERS
configuration/configure_graphics.h
configuration/configure_input.h
configuration/configure_system.h
+ configuration/configure_web.h
debugger/graphics/graphics.h
debugger/graphics/graphics_breakpoint_observer.h
debugger/graphics/graphics_breakpoints.h
@@ -71,11 +73,13 @@ set(UIS
configuration/configure_graphics.ui
configuration/configure_input.ui
configuration/configure_system.ui
+ configuration/configure_web.ui
debugger/registers.ui
hotkeys.ui
main.ui
)
+file(GLOB_RECURSE ICONS ${CMAKE_SOURCE_DIR}/dist/icons/*)
file(GLOB_RECURSE THEMES ${CMAKE_SOURCE_DIR}/dist/qt_themes/*)
create_directory_groups(${SRCS} ${HEADERS} ${UIS})
@@ -89,10 +93,10 @@ endif()
if (APPLE)
set(MACOSX_ICON "../../dist/citra.icns")
set_source_files_properties(${MACOSX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
- add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS} ${THEMES} ${MACOSX_ICON})
+ add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS} ${ICONS} ${THEMES} ${MACOSX_ICON})
set_target_properties(citra-qt PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
else()
- add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS} ${THEMES})
+ add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS} ${ICONS} ${THEMES})
endif()
target_link_libraries(citra-qt PRIVATE audio_core common core input_common network video_core)
target_link_libraries(citra-qt PRIVATE Boost::boost glad nihstro-headers Qt5::OpenGL Qt5::Widgets)
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index 30554890f..7107bfc60 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -17,6 +17,7 @@
#include "core/settings.h"
#include "input_common/keyboard.h"
#include "input_common/main.h"
+#include "input_common/motion_emu.h"
#include "network/network.h"
EmuThread::EmuThread(GRenderWindow* render_window)
@@ -201,7 +202,6 @@ qreal GRenderWindow::windowPixelRatio() {
}
void GRenderWindow::closeEvent(QCloseEvent* event) {
- motion_emu = nullptr;
emit Closed();
QWidget::closeEvent(event);
}
@@ -221,7 +221,7 @@ void GRenderWindow::mousePressEvent(QMouseEvent* event) {
this->TouchPressed(static_cast<unsigned>(pos.x() * pixelRatio),
static_cast<unsigned>(pos.y() * pixelRatio));
} else if (event->button() == Qt::RightButton) {
- motion_emu->BeginTilt(pos.x(), pos.y());
+ InputCommon::GetMotionEmu()->BeginTilt(pos.x(), pos.y());
}
}
@@ -230,14 +230,14 @@ void GRenderWindow::mouseMoveEvent(QMouseEvent* event) {
qreal pixelRatio = windowPixelRatio();
this->TouchMoved(std::max(static_cast<unsigned>(pos.x() * pixelRatio), 0u),
std::max(static_cast<unsigned>(pos.y() * pixelRatio), 0u));
- motion_emu->Tilt(pos.x(), pos.y());
+ InputCommon::GetMotionEmu()->Tilt(pos.x(), pos.y());
}
void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) {
if (event->button() == Qt::LeftButton)
this->TouchReleased();
else if (event->button() == Qt::RightButton)
- motion_emu->EndTilt();
+ InputCommon::GetMotionEmu()->EndTilt();
}
void GRenderWindow::focusOutEvent(QFocusEvent* event) {
@@ -290,13 +290,11 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest(
}
void GRenderWindow::OnEmulationStarting(EmuThread* emu_thread) {
- motion_emu = std::make_unique<Motion::MotionEmu>(*this);
this->emu_thread = emu_thread;
child->DisablePainting();
}
void GRenderWindow::OnEmulationStopping() {
- motion_emu = nullptr;
emu_thread = nullptr;
child->EnablePainting();
}
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index 4b3a3b3cc..6974edcbb 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -12,7 +12,6 @@
#include "common/thread.h"
#include "core/core.h"
#include "core/frontend/emu_window.h"
-#include "core/frontend/motion_emu.h"
class QKeyEvent;
class QScreen;
@@ -158,9 +157,6 @@ private:
EmuThread* emu_thread;
- /// Motion sensors emulation
- std::unique_ptr<Motion::MotionEmu> motion_emu;
-
protected:
void showEvent(QShowEvent* event) override;
};
diff --git a/src/citra_qt/citra-qt.rc b/src/citra_qt/citra-qt.rc
index fea603004..a48a9440d 100644
--- a/src/citra_qt/citra-qt.rc
+++ b/src/citra_qt/citra-qt.rc
@@ -1,3 +1,4 @@
+#include "winresrc.h"
/////////////////////////////////////////////////////////////////////////////
//
// Icon
@@ -5,5 +6,14 @@
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
-CITRA_ICON ICON "../../dist/citra.ico"
+// QT requires that the default application icon is named IDI_ICON1
+IDI_ICON1 ICON "../../dist/citra.ico"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// RT_MANIFEST
+//
+
+1 RT_MANIFEST "../../dist/citra.manifest"
diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp
index 75abb4ce6..5261f4c4c 100644
--- a/src/citra_qt/configuration/config.cpp
+++ b/src/citra_qt/configuration/config.cpp
@@ -57,6 +57,13 @@ void Config::ReadValues() {
Settings::values.analogs[i] = default_param;
}
+ Settings::values.motion_device =
+ qt_config->value("motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01")
+ .toString()
+ .toStdString();
+ Settings::values.touch_device =
+ qt_config->value("touch_device", "engine:emu_window").toString().toStdString();
+
qt_config->endGroup();
qt_config->beginGroup("Core");
@@ -134,10 +141,17 @@ void Config::ReadValues() {
qt_config->endGroup();
qt_config->beginGroup("WebService");
+ Settings::values.enable_telemetry = qt_config->value("enable_telemetry", true).toBool();
Settings::values.telemetry_endpoint_url =
qt_config->value("telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry")
.toString()
.toStdString();
+ Settings::values.verify_endpoint_url =
+ qt_config->value("verify_endpoint_url", "https://services.citra-emu.org/api/profile")
+ .toString()
+ .toStdString();
+ Settings::values.citra_username = qt_config->value("citra_username").toString().toStdString();
+ Settings::values.citra_token = qt_config->value("citra_token").toString().toStdString();
qt_config->endGroup();
qt_config->beginGroup("UI");
@@ -189,6 +203,7 @@ void Config::ReadValues() {
UISettings::values.show_status_bar = qt_config->value("showStatusBar", true).toBool();
UISettings::values.confirm_before_closing = qt_config->value("confirmClose", true).toBool();
UISettings::values.first_start = qt_config->value("firstStart", true).toBool();
+ UISettings::values.callout_flags = qt_config->value("calloutFlags", 0).toUInt();
qt_config->endGroup();
}
@@ -203,6 +218,8 @@ void Config::SaveValues() {
qt_config->setValue(QString::fromStdString(Settings::NativeAnalog::mapping[i]),
QString::fromStdString(Settings::values.analogs[i]));
}
+ qt_config->setValue("motion_device", QString::fromStdString(Settings::values.motion_device));
+ qt_config->setValue("touch_device", QString::fromStdString(Settings::values.touch_device));
qt_config->endGroup();
qt_config->beginGroup("Core");
@@ -277,8 +294,13 @@ void Config::SaveValues() {
qt_config->endGroup();
qt_config->beginGroup("WebService");
+ qt_config->setValue("enable_telemetry", Settings::values.enable_telemetry);
qt_config->setValue("telemetry_endpoint_url",
QString::fromStdString(Settings::values.telemetry_endpoint_url));
+ qt_config->setValue("verify_endpoint_url",
+ QString::fromStdString(Settings::values.verify_endpoint_url));
+ qt_config->setValue("citra_username", QString::fromStdString(Settings::values.citra_username));
+ qt_config->setValue("citra_token", QString::fromStdString(Settings::values.citra_token));
qt_config->endGroup();
qt_config->beginGroup("UI");
@@ -314,6 +336,7 @@ void Config::SaveValues() {
qt_config->setValue("showStatusBar", UISettings::values.show_status_bar);
qt_config->setValue("confirmClose", UISettings::values.confirm_before_closing);
qt_config->setValue("firstStart", UISettings::values.first_start);
+ qt_config->setValue("calloutFlags", UISettings::values.callout_flags);
qt_config->endGroup();
}
diff --git a/src/citra_qt/configuration/configure.ui b/src/citra_qt/configuration/configure.ui
index 85e206e42..6abd1917e 100644
--- a/src/citra_qt/configuration/configure.ui
+++ b/src/citra_qt/configuration/configure.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>441</width>
- <height>501</height>
+ <width>740</width>
+ <height>500</height>
</rect>
</property>
<property name="windowTitle">
@@ -49,6 +49,11 @@
<string>Debug</string>
</attribute>
</widget>
+ <widget class="ConfigureWeb" name="webTab">
+ <attribute name="title">
+ <string>Web</string>
+ </attribute>
+ </widget>
</widget>
</item>
<item>
@@ -97,6 +102,12 @@
<header>configuration/configure_graphics.h</header>
<container>1</container>
</customwidget>
+ <customwidget>
+ <class>ConfigureWeb</class>
+ <extends>QWidget</extends>
+ <header>configuration/configure_web.h</header>
+ <container>1</container>
+ </customwidget>
</customwidgets>
<resources/>
<connections>
diff --git a/src/citra_qt/configuration/configure_dialog.cpp b/src/citra_qt/configuration/configure_dialog.cpp
index dfc8c03a7..b87dc0e6c 100644
--- a/src/citra_qt/configuration/configure_dialog.cpp
+++ b/src/citra_qt/configuration/configure_dialog.cpp
@@ -23,5 +23,6 @@ void ConfigureDialog::applyConfiguration() {
ui->graphicsTab->applyConfiguration();
ui->audioTab->applyConfiguration();
ui->debugTab->applyConfiguration();
+ ui->webTab->applyConfiguration();
Settings::Apply();
}
diff --git a/src/citra_qt/configuration/configure_graphics.ui b/src/citra_qt/configuration/configure_graphics.ui
index 228f2a869..5667b14b6 100644
--- a/src/citra_qt/configuration/configure_graphics.ui
+++ b/src/citra_qt/configuration/configure_graphics.ui
@@ -63,57 +63,57 @@
<widget class="QComboBox" name="resolution_factor_combobox">
<item>
<property name="text">
- <string notr="true">Auto (Window Size)</string>
+ <string>Auto (Window Size)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">Native (400x240)</string>
+ <string>Native (400x240)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">2x Native (800x480)</string>
+ <string>2x Native (800x480)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">3x Native (1200x720)</string>
+ <string>3x Native (1200x720)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">4x Native (1600x960)</string>
+ <string>4x Native (1600x960)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">5x Native (2000x1200)</string>
+ <string>5x Native (2000x1200)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">6x Native (2400x1440)</string>
+ <string>6x Native (2400x1440)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">7x Native (2800x1680)</string>
+ <string>7x Native (2800x1680)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">8x Native (3200x1920)</string>
+ <string>8x Native (3200x1920)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">9x Native (3600x2160)</string>
+ <string>9x Native (3600x2160)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">10x Native (4000x2400)</string>
+ <string>10x Native (4000x2400)</string>
</property>
</item>
</widget>
@@ -146,17 +146,22 @@
<widget class="QComboBox" name="layout_combobox">
<item>
<property name="text">
- <string notr="true">Default</string>
+ <string>Default</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">Single Screen</string>
+ <string>Single Screen</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">Large Screen</string>
+ <string>Large Screen</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Side by Side</string>
</property>
</item>
</widget>
diff --git a/src/citra_qt/configuration/configure_system.cpp b/src/citra_qt/configuration/configure_system.cpp
index 9b1e6711d..88a067c12 100644
--- a/src/citra_qt/configuration/configure_system.cpp
+++ b/src/citra_qt/configuration/configure_system.cpp
@@ -78,7 +78,8 @@ void ConfigureSystem::ReadSystemSettings() {
// set the console id
u64 console_id = Service::CFG::GetConsoleUniqueId();
- ui->label_console_id->setText("Console ID: 0x" + QString::number(console_id, 16).toUpper());
+ ui->label_console_id->setText(
+ tr("Console ID: 0x%1").arg(QString::number(console_id, 16).toUpper()));
}
void ConfigureSystem::applyConfiguration() {
diff --git a/src/citra_qt/configuration/configure_web.cpp b/src/citra_qt/configuration/configure_web.cpp
new file mode 100644
index 000000000..bf8c21ac7
--- /dev/null
+++ b/src/citra_qt/configuration/configure_web.cpp
@@ -0,0 +1,102 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <QMessageBox>
+#include "citra_qt/configuration/configure_web.h"
+#include "core/settings.h"
+#include "core/telemetry_session.h"
+#include "ui_configure_web.h"
+
+ConfigureWeb::ConfigureWeb(QWidget* parent)
+ : QWidget(parent), ui(std::make_unique<Ui::ConfigureWeb>()) {
+ ui->setupUi(this);
+ connect(ui->button_regenerate_telemetry_id, &QPushButton::clicked, this,
+ &ConfigureWeb::RefreshTelemetryID);
+ connect(ui->button_verify_login, &QPushButton::clicked, this, &ConfigureWeb::VerifyLogin);
+ connect(this, &ConfigureWeb::LoginVerified, this, &ConfigureWeb::OnLoginVerified);
+
+ this->setConfiguration();
+}
+
+ConfigureWeb::~ConfigureWeb() {}
+
+void ConfigureWeb::setConfiguration() {
+ ui->web_credentials_disclaimer->setWordWrap(true);
+ ui->telemetry_learn_more->setOpenExternalLinks(true);
+ ui->telemetry_learn_more->setText(tr("<a "
+ "href='https://citra-emu.org/entry/"
+ "telemetry-and-why-thats-a-good-thing/'>Learn more</a>"));
+
+ ui->web_signup_link->setOpenExternalLinks(true);
+ ui->web_signup_link->setText(tr("<a href='https://services.citra-emu.org/'>Sign up</a>"));
+ ui->web_token_info_link->setOpenExternalLinks(true);
+ ui->web_token_info_link->setText(
+ tr("<a href='https://citra-emu.org/wiki/citra-web-service/'>What is my token?</a>"));
+
+ ui->toggle_telemetry->setChecked(Settings::values.enable_telemetry);
+ ui->edit_username->setText(QString::fromStdString(Settings::values.citra_username));
+ ui->edit_token->setText(QString::fromStdString(Settings::values.citra_token));
+ // Connect after setting the values, to avoid calling OnLoginChanged now
+ connect(ui->edit_token, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged);
+ connect(ui->edit_username, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged);
+ ui->label_telemetry_id->setText(
+ tr("Telemetry ID: 0x%1").arg(QString::number(Core::GetTelemetryId(), 16).toUpper()));
+ user_verified = true;
+}
+
+void ConfigureWeb::applyConfiguration() {
+ Settings::values.enable_telemetry = ui->toggle_telemetry->isChecked();
+ if (user_verified) {
+ Settings::values.citra_username = ui->edit_username->text().toStdString();
+ Settings::values.citra_token = ui->edit_token->text().toStdString();
+ } else {
+ QMessageBox::warning(this, tr("Username and token not verfied"),
+ tr("Username and token were not verified. The changes to your "
+ "username and/or token have not been saved."));
+ }
+ Settings::Apply();
+}
+
+void ConfigureWeb::RefreshTelemetryID() {
+ const u64 new_telemetry_id{Core::RegenerateTelemetryId()};
+ ui->label_telemetry_id->setText(
+ tr("Telemetry ID: 0x%1").arg(QString::number(new_telemetry_id, 16).toUpper()));
+}
+
+void ConfigureWeb::OnLoginChanged() {
+ if (ui->edit_username->text().isEmpty() && ui->edit_token->text().isEmpty()) {
+ user_verified = true;
+ ui->label_username_verified->setPixmap(QPixmap(":/icons/checked.png"));
+ ui->label_token_verified->setPixmap(QPixmap(":/icons/checked.png"));
+ } else {
+ user_verified = false;
+ ui->label_username_verified->setPixmap(QPixmap(":/icons/failed.png"));
+ ui->label_token_verified->setPixmap(QPixmap(":/icons/failed.png"));
+ }
+}
+
+void ConfigureWeb::VerifyLogin() {
+ verified =
+ Core::VerifyLogin(ui->edit_username->text().toStdString(),
+ ui->edit_token->text().toStdString(), [&]() { emit LoginVerified(); });
+ ui->button_verify_login->setDisabled(true);
+ ui->button_verify_login->setText(tr("Verifying"));
+}
+
+void ConfigureWeb::OnLoginVerified() {
+ ui->button_verify_login->setEnabled(true);
+ ui->button_verify_login->setText(tr("Verify"));
+ if (verified.get()) {
+ user_verified = true;
+ ui->label_username_verified->setPixmap(QPixmap(":/icons/checked.png"));
+ ui->label_token_verified->setPixmap(QPixmap(":/icons/checked.png"));
+ } else {
+ ui->label_username_verified->setPixmap(QPixmap(":/icons/failed.png"));
+ ui->label_token_verified->setPixmap(QPixmap(":/icons/failed.png"));
+ QMessageBox::critical(
+ this, tr("Verification failed"),
+ tr("Verification failed. Check that you have entered your username and token "
+ "correctly, and that your internet connection is working."));
+ }
+}
diff --git a/src/citra_qt/configuration/configure_web.h b/src/citra_qt/configuration/configure_web.h
new file mode 100644
index 000000000..ad2d58f6e
--- /dev/null
+++ b/src/citra_qt/configuration/configure_web.h
@@ -0,0 +1,40 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <future>
+#include <memory>
+#include <QWidget>
+
+namespace Ui {
+class ConfigureWeb;
+}
+
+class ConfigureWeb : public QWidget {
+ Q_OBJECT
+
+public:
+ explicit ConfigureWeb(QWidget* parent = nullptr);
+ ~ConfigureWeb();
+
+ void applyConfiguration();
+
+public slots:
+ void RefreshTelemetryID();
+ void OnLoginChanged();
+ void VerifyLogin();
+ void OnLoginVerified();
+
+signals:
+ void LoginVerified();
+
+private:
+ void setConfiguration();
+
+ bool user_verified = true;
+ std::future<bool> verified;
+
+ std::unique_ptr<Ui::ConfigureWeb> ui;
+};
diff --git a/src/citra_qt/configuration/configure_web.ui b/src/citra_qt/configuration/configure_web.ui
new file mode 100644
index 000000000..dd996ab62
--- /dev/null
+++ b/src/citra_qt/configuration/configure_web.ui
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ConfigureWeb</class>
+ <widget class="QWidget" name="ConfigureWeb">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>926</width>
+ <height>561</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QGroupBox" name="groupBoxWebConfig">
+ <property name="title">
+ <string>Citra Web Service</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayoutCitraWebService">
+ <item>
+ <widget class="QLabel" name="web_credentials_disclaimer">
+ <property name="text">
+ <string>By providing your username and token, you agree to allow Citra to collect additional usage data, which may include user identifying information.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayoutCitraUsername">
+ <item row="2" column="3">
+ <widget class="QPushButton" name="button_verify_login">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::RightToLeft</enum>
+ </property>
+ <property name="text">
+ <string>Verify</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="web_signup_link">
+ <property name="text">
+ <string>Sign up</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="3">
+ <widget class="QLineEdit" name="edit_username">
+ <property name="maxLength">
+ <number>36</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_token">
+ <property name="text">
+ <string>Token: </string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <widget class="QLabel" name="label_token_verified">
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_username">
+ <property name="text">
+ <string>Username: </string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <widget class="QLabel" name="label_username_verified">
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="3">
+ <widget class="QLineEdit" name="edit_token">
+ <property name="maxLength">
+ <number>36</number>
+ </property>
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="web_token_info_link">
+ <property name="text">
+ <string>What is my token?</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Telemetry</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QCheckBox" name="toggle_telemetry">
+ <property name="text">
+ <string>Share anonymous usage data with the Citra team</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="telemetry_learn_more">
+ <property name="text">
+ <string>Learn more</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayoutTelemetryId">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_telemetry_id">
+ <property name="text">
+ <string>Telemetry ID:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QPushButton" name="button_regenerate_telemetry_id">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::RightToLeft</enum>
+ </property>
+ <property name="text">
+ <string>Regenerate</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp b/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
index 7d06ec28a..ce2b9fa50 100644
--- a/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
@@ -26,8 +26,8 @@
namespace {
QImage LoadTexture(const u8* src, const Pica::Texture::TextureInfo& info) {
QImage decoded_image(info.width, info.height, QImage::Format_ARGB32);
- for (int y = 0; y < info.height; ++y) {
- for (int x = 0; x < info.width; ++x) {
+ for (u32 y = 0; y < info.height; ++y) {
+ for (u32 x = 0; x < info.width; ++x) {
Math::Vec4<u8> color = Pica::Texture::LookupTexture(src, x, y, info, true);
decoded_image.setPixel(x, y, qRgba(color.r(), color.g(), color.b(), color.a()));
}
diff --git a/src/citra_qt/debugger/graphics/graphics_surface.cpp b/src/citra_qt/debugger/graphics/graphics_surface.cpp
index 47d9924e1..c974545ef 100644
--- a/src/citra_qt/debugger/graphics/graphics_surface.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_surface.cpp
@@ -273,7 +273,8 @@ void GraphicsSurfaceWidget::Pick(int x, int y) {
surface_picker_x_control->setValue(x);
surface_picker_y_control->setValue(y);
- if (x < 0 || x >= surface_width || y < 0 || y >= surface_height) {
+ if (x < 0 || x >= static_cast<int>(surface_width) || y < 0 ||
+ y >= static_cast<int>(surface_height)) {
surface_info_label->setText(tr("Pixel out of bounds"));
surface_info_label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
return;
diff --git a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
index e3f3194db..7f4ec0c52 100644
--- a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
@@ -183,23 +183,13 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
print_input(output, src1, swizzle.negate_src1,
SelectorToString(swizzle.src1_selector));
AlignToColumn(kInputOperandColumnWidth);
- if (src_is_inverted) {
- print_input(output, src2, swizzle.negate_src2,
- SelectorToString(swizzle.src2_selector));
- } else {
- print_input(output, src2, swizzle.negate_src2,
- SelectorToString(swizzle.src2_selector), true,
- instr.mad.AddressRegisterName());
- }
+ print_input(output, src2, swizzle.negate_src2,
+ SelectorToString(swizzle.src2_selector), true,
+ src_is_inverted ? "" : instr.mad.AddressRegisterName());
AlignToColumn(kInputOperandColumnWidth);
- if (src_is_inverted) {
- print_input(output, src3, swizzle.negate_src3,
- SelectorToString(swizzle.src3_selector), true,
- instr.mad.AddressRegisterName());
- } else {
- print_input(output, src3, swizzle.negate_src3,
- SelectorToString(swizzle.src3_selector));
- }
+ print_input(output, src3, swizzle.negate_src3,
+ SelectorToString(swizzle.src3_selector), true,
+ src_is_inverted ? instr.mad.AddressRegisterName() : "");
AlignToColumn(kInputOperandColumnWidth);
break;
}
@@ -222,16 +212,15 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
SourceRegister src1 = instr.common.GetSrc1(src_is_inverted);
print_input(output, src1, swizzle.negate_src1,
swizzle.SelectorToString(false), true,
- instr.common.AddressRegisterName());
+ src_is_inverted ? "" : instr.common.AddressRegisterName());
AlignToColumn(kInputOperandColumnWidth);
}
- // TODO: In some cases, the Address Register is used as an index for SRC2
- // instead of SRC1
if (opcode_info.subtype & OpCode::Info::Src2) {
SourceRegister src2 = instr.common.GetSrc2(src_is_inverted);
print_input(output, src2, swizzle.negate_src2,
- swizzle.SelectorToString(true));
+ swizzle.SelectorToString(true), true,
+ src_is_inverted ? instr.common.AddressRegisterName() : "");
AlignToColumn(kInputOperandColumnWidth);
}
break;
@@ -247,7 +236,9 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
switch (opcode.EffectiveOpCode()) {
case OpCode::Id::LOOP:
- output << "(unknown instruction format)";
+ output << 'i' << instr.flow_control.int_uniform_id << " (end on 0x"
+ << std::setw(4) << std::right << std::setfill('0') << std::hex
+ << (4 * instr.flow_control.dest_offset) << ")";
break;
default:
@@ -255,7 +246,7 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
output << '(';
if (instr.flow_control.op != instr.flow_control.JustY) {
- if (instr.flow_control.refx)
+ if (!instr.flow_control.refx)
output << '!';
output << "cc.x";
}
@@ -267,13 +258,17 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
}
if (instr.flow_control.op != instr.flow_control.JustX) {
- if (instr.flow_control.refy)
+ if (!instr.flow_control.refy)
output << '!';
output << "cc.y";
}
output << ") ";
} else if (opcode_info.subtype & OpCode::Info::HasUniformIndex) {
+ if (opcode.EffectiveOpCode() == OpCode::Id::JMPU &&
+ (instr.flow_control.num_instructions & 1) == 1) {
+ output << '!';
+ }
output << 'b' << instr.flow_control.bool_uniform_id << ' ';
}
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index 02bfdca3d..8adbcfe86 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -48,6 +48,47 @@
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
#endif
+/**
+ * "Callouts" are one-time instructional messages shown to the user. In the config settings, there
+ * is a bitfield "callout_flags" options, used to track if a message has already been shown to the
+ * user. This is 32-bits - if we have more than 32 callouts, we should retire and recyle old ones.
+ */
+enum class CalloutFlag : uint32_t {
+ Telemetry = 0x1,
+};
+
+static void ShowCalloutMessage(const QString& message, CalloutFlag flag) {
+ if (UISettings::values.callout_flags & static_cast<uint32_t>(flag)) {
+ return;
+ }
+
+ UISettings::values.callout_flags |= static_cast<uint32_t>(flag);
+
+ QMessageBox msg;
+ msg.setText(message);
+ msg.setStandardButtons(QMessageBox::Ok);
+ msg.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ msg.setStyleSheet("QLabel{min-width: 900px;}");
+ msg.exec();
+}
+
+void GMainWindow::ShowCallouts() {
+ static const QString telemetry_message =
+ tr("To help improve Citra, the Citra Team collects anonymous usage data. No private or "
+ "personally identifying information is collected. This data helps us to understand how "
+ "people use Citra and prioritize our efforts. Furthermore, it helps us to more easily "
+ "identify emulation bugs and performance issues. This data includes:<ul><li>Information"
+ " about the version of Citra you are using</li><li>Performance data about the games you "
+ "play</li><li>Your configuration settings</li><li>Information about your computer "
+ "hardware</li><li>Emulation errors and crash information</li></ul>By default, this "
+ "feature is enabled. To disable this feature, click 'Emulation' from the menu and then "
+ "select 'Configure...'. Then, on the 'Web' tab, uncheck 'Share anonymous usage data with"
+ " the Citra team'. <br/><br/>By using this software, you agree to the above terms.<br/>"
+ "<br/><a href='https://citra-emu.org/entry/telemetry-and-why-thats-a-good-thing/'>Learn "
+ "more</a>");
+ ShowCalloutMessage(telemetry_message, CalloutFlag::Telemetry);
+}
+
GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
Pica::g_debug_context = Pica::DebugContext::Construct();
setAcceptDrops(true);
@@ -73,6 +114,9 @@ GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
UpdateUITheme();
+ // Show one-time "callout" messages to the user
+ ShowCallouts();
+
QStringList args = QApplication::arguments();
if (args.length() >= 2) {
BootGame(args[1]);
@@ -311,7 +355,7 @@ bool GMainWindow::LoadROM(const QString& filename) {
if (!gladLoadGL()) {
QMessageBox::critical(this, tr("Error while initializing OpenGL 3.3 Core!"),
- tr("Your GPU may not support OpenGL 3.3, or you do not"
+ tr("Your GPU may not support OpenGL 3.3, or you do not "
"have the latest graphics driver."));
return false;
}
@@ -320,6 +364,8 @@ bool GMainWindow::LoadROM(const QString& filename) {
const Core::System::ResultStatus result{system.Load(render_window, filename.toStdString())};
+ Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "Qt");
+
if (result != Core::System::ResultStatus::Success) {
switch (result) {
case Core::System::ResultStatus::ErrorGetLoader:
diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h
index 360de2ced..d59a6d67d 100644
--- a/src/citra_qt/main.h
+++ b/src/citra_qt/main.h
@@ -80,6 +80,8 @@ private:
void BootGame(const QString& filename);
void ShutdownGame();
+ void ShowCallouts();
+
/**
* Stores the filename in the recently loaded files list.
* The new filename is stored at the beginning of the recently loaded files list.
diff --git a/src/citra_qt/ui_settings.h b/src/citra_qt/ui_settings.h
index 025c73f84..d85c92765 100644
--- a/src/citra_qt/ui_settings.h
+++ b/src/citra_qt/ui_settings.h
@@ -48,6 +48,8 @@ struct Values {
// Shortcut name <Shortcut, context>
std::vector<Shortcut> shortcuts;
+
+ uint32_t callout_flags;
};
extern Values values;
diff --git a/src/common/common_types.h b/src/common/common_types.h
index e8f7ac6be..844d34965 100644
--- a/src/common/common_types.h
+++ b/src/common/common_types.h
@@ -24,6 +24,7 @@
#pragma once
+#include <array>
#include <cstdint>
#ifdef _MSC_VER
@@ -50,6 +51,9 @@ typedef double f64; ///< 64-bit floating point
typedef u64 VAddr; ///< Represents a pointer in the userspace virtual address space.
typedef u64 PAddr; ///< Represents a pointer in the ARM11 physical address space.
+using u128 = std::array<std::uint64_t, 2>;
+static_assert(sizeof(u128) == 16, "u128 must be 128 bits wide");
+
// An inheritable class to disallow the copy constructor and operator= functions
class NonCopyable {
protected:
diff --git a/src/common/quaternion.h b/src/common/quaternion.h
index 84ac82ed3..77f626bcb 100644
--- a/src/common/quaternion.h
+++ b/src/common/quaternion.h
@@ -30,6 +30,11 @@ public:
return {xyz * other.w + other.xyz * w + Cross(xyz, other.xyz),
w * other.w - Dot(xyz, other.xyz)};
}
+
+ Quaternion<T> Normalized() const {
+ T length = std::sqrt(xyz.Length2() + w * w);
+ return {xyz / length, w / length};
+ }
};
template <typename T>
diff --git a/src/common/scm_rev.cpp.in b/src/common/scm_rev.cpp.in
index 0080db5d5..4083095d5 100644
--- a/src/common/scm_rev.cpp.in
+++ b/src/common/scm_rev.cpp.in
@@ -8,6 +8,7 @@
#define GIT_BRANCH "@GIT_BRANCH@"
#define GIT_DESC "@GIT_DESC@"
#define BUILD_NAME "@REPO_NAME@"
+#define BUILD_DATE "@BUILD_DATE@"
namespace Common {
@@ -15,6 +16,7 @@ const char g_scm_rev[] = GIT_REV;
const char g_scm_branch[] = GIT_BRANCH;
const char g_scm_desc[] = GIT_DESC;
const char g_build_name[] = BUILD_NAME;
+const char g_build_date[] = BUILD_DATE;
} // namespace
diff --git a/src/common/scm_rev.h b/src/common/scm_rev.h
index e22389803..18aaa1735 100644
--- a/src/common/scm_rev.h
+++ b/src/common/scm_rev.h
@@ -10,5 +10,6 @@ extern const char g_scm_rev[];
extern const char g_scm_branch[];
extern const char g_scm_desc[];
extern const char g_build_name[];
+extern const char g_build_date[];
} // namespace
diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp
index bad311793..6959915fa 100644
--- a/src/common/string_util.cpp
+++ b/src/common/string_util.cpp
@@ -117,7 +117,7 @@ std::string StringFromFormat(const char* format, ...) {
}
// For Debugging. Read out an u8 array.
-std::string ArrayToString(const u8* data, u32 size, int line_len, bool spaces) {
+std::string ArrayToString(const u8* data, size_t size, int line_len, bool spaces) {
std::ostringstream oss;
oss << std::setfill('0') << std::hex;
diff --git a/src/common/string_util.h b/src/common/string_util.h
index 075bf4ecb..259360aec 100644
--- a/src/common/string_util.h
+++ b/src/common/string_util.h
@@ -33,7 +33,7 @@ inline void CharArrayFromFormat(char (&out)[Count], const char* format, ...) {
}
// Good
-std::string ArrayToString(const u8* data, u32 size, int line_len = 20, bool spaces = true);
+std::string ArrayToString(const u8* data, size_t size, int line_len = 20, bool spaces = true);
std::string StripSpaces(const std::string& s);
std::string StripQuotes(const std::string& s);
diff --git a/src/common/vector_math.h b/src/common/vector_math.h
index c7a461a1e..3f0057d9e 100644
--- a/src/common/vector_math.h
+++ b/src/common/vector_math.h
@@ -90,8 +90,9 @@ public:
x -= other.x;
y -= other.y;
}
- template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type>
- Vec2<decltype(-T{})> operator-() const {
+
+ template <typename U = T>
+ Vec2<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const {
return MakeVec(-x, -y);
}
Vec2<decltype(T{} * T{})> operator*(const Vec2& other) const {
@@ -103,8 +104,7 @@ public:
}
template <typename V>
void operator*=(const V& f) {
- x *= f;
- y *= f;
+ *this = *this * f;
}
template <typename V>
Vec2<decltype(T{} / V{})> operator/(const V& f) const {
@@ -247,8 +247,9 @@ public:
y -= other.y;
z -= other.z;
}
- template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type>
- Vec3<decltype(-T{})> operator-() const {
+
+ template <typename U = T>
+ Vec3<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const {
return MakeVec(-x, -y, -z);
}
Vec3<decltype(T{} * T{})> operator*(const Vec3& other) const {
@@ -260,9 +261,7 @@ public:
}
template <typename V>
void operator*=(const V& f) {
- x *= f;
- y *= f;
- z *= f;
+ *this = *this * f;
}
template <typename V>
Vec3<decltype(T{} / V{})> operator/(const V& f) const {
@@ -462,8 +461,9 @@ public:
z -= other.z;
w -= other.w;
}
- template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type>
- Vec4<decltype(-T{})> operator-() const {
+
+ template <typename U = T>
+ Vec4<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const {
return MakeVec(-x, -y, -z, -w);
}
Vec4<decltype(T{} * T{})> operator*(const Vec4& other) const {
@@ -475,10 +475,7 @@ public:
}
template <typename V>
void operator*=(const V& f) {
- x *= f;
- y *= f;
- z *= f;
- w *= f;
+ *this = *this * f;
}
template <typename V>
Vec4<decltype(T{} / V{})> operator/(const V& f) const {
@@ -721,4 +718,4 @@ static inline Vec4<T> MakeVec(const T& x, const Vec3<T>& yzw) {
return MakeVec(x, yzw[0], yzw[1], yzw[2]);
}
-} // namespace
+} // namespace Math
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 33ce8dc81..8b25eaf0a 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -6,6 +6,8 @@ set(SRCS
arm/dyncom/arm_dyncom_interpreter.cpp
arm/dyncom/arm_dyncom_thumb.cpp
arm/dyncom/arm_dyncom_trans.cpp
+ arm/unicorn/arm_unicorn.cpp
+ arm/unicorn/unicorn_dynload.c
arm/skyeye_common/armstate.cpp
arm/skyeye_common/armsupp.cpp
arm/skyeye_common/vfp/vfp.cpp
@@ -26,14 +28,15 @@ set(SRCS
file_sys/archive_systemsavedata.cpp
file_sys/disk_archive.cpp
file_sys/ivfc_archive.cpp
+ file_sys/ncch_container.cpp
file_sys/path_parser.cpp
file_sys/savedata_archive.cpp
+ file_sys/title_metadata.cpp
frontend/camera/blank_camera.cpp
frontend/camera/factory.cpp
frontend/camera/interface.cpp
frontend/emu_window.cpp
frontend/framebuffer_layout.cpp
- frontend/motion_emu.cpp
gdbstub/gdbstub.cpp
hle/config_mem.cpp
hle/applets/applet.cpp
@@ -60,6 +63,7 @@ set(SRCS
hle/kernel/timer.cpp
hle/kernel/vm_manager.cpp
hle/kernel/wait_object.cpp
+ hle/lock.cpp
hle/romfs.cpp
hle/service/ac/ac.cpp
hle/service/ac/ac_i.cpp
@@ -135,7 +139,8 @@ set(SRCS
hle/service/nim/nim_aoc.cpp
hle/service/nim/nim_s.cpp
hle/service/nim/nim_u.cpp
- hle/service/ns_s.cpp
+ hle/service/ns/ns.cpp
+ hle/service/ns/ns_s.cpp
hle/service/nwm/nwm.cpp
hle/service/nwm/nwm_cec.cpp
hle/service/nwm/nwm_ext.cpp
@@ -145,6 +150,7 @@ set(SRCS
hle/service/nwm/nwm_tst.cpp
hle/service/nwm/nwm_uds.cpp
hle/service/nwm/uds_beacon.cpp
+ hle/service/nwm/uds_connection.cpp
hle/service/nwm/uds_data.cpp
hle/service/pm_app.cpp
hle/service/ptm/ptm.cpp
@@ -198,6 +204,8 @@ set(HEADERS
arm/dyncom/arm_dyncom_run.h
arm/dyncom/arm_dyncom_thumb.h
arm/dyncom/arm_dyncom_trans.h
+ arm/unicorn/arm_unicorn.h
+ arm/unicorn/unicorn_dynload.h
arm/skyeye_common/arm_regformat.h
arm/skyeye_common/armstate.h
arm/skyeye_common/armsupp.h
@@ -229,7 +237,6 @@ set(HEADERS
frontend/emu_window.h
frontend/framebuffer_layout.h
frontend/input.h
- frontend/motion_emu.h
gdbstub/gdbstub.h
hle/config_mem.h
hle/function_wrappers.h
@@ -261,6 +268,7 @@ set(HEADERS
hle/kernel/timer.h
hle/kernel/vm_manager.h
hle/kernel/wait_object.h
+ hle/lock.h
hle/result.h
hle/romfs.h
hle/service/ac/ac.h
@@ -337,7 +345,8 @@ set(HEADERS
hle/service/nim/nim_aoc.h
hle/service/nim/nim_s.h
hle/service/nim/nim_u.h
- hle/service/ns_s.h
+ hle/service/ns/ns.h
+ hle/service/ns/ns_s.h
hle/service/nwm/nwm.h
hle/service/nwm/nwm_cec.h
hle/service/nwm/nwm_ext.h
@@ -347,6 +356,7 @@ set(HEADERS
hle/service/nwm/nwm_tst.h
hle/service/nwm/nwm_uds.h
hle/service/nwm/uds_beacon.h
+ hle/service/nwm/uds_connection.h
hle/service/nwm/uds_data.h
hle/service/pm_app.h
hle/service/ptm/ptm.h
@@ -394,7 +404,7 @@ set(HEADERS
create_directory_groups(${SRCS} ${HEADERS})
add_library(core STATIC ${SRCS} ${HEADERS})
-target_link_libraries(core PUBLIC common PRIVATE audio_core video_core)
+target_link_libraries(core PUBLIC common PRIVATE audio_core network video_core)
target_link_libraries(core PUBLIC Boost::boost PRIVATE cryptopp dynarmic fmt lz4_static)
if (ENABLE_WEB_SERVICE)
target_link_libraries(core PUBLIC json-headers web_service)
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index f613556dd..0b3096347 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -5,6 +5,7 @@
#pragma once
#include "common/common_types.h"
+#include "core/hle/kernel/vm_manager.h"
#include "core/arm/skyeye_common/arm_regformat.h"
#include "core/arm/skyeye_common/vfp/asm_vfp.h"
@@ -19,10 +20,11 @@ public:
u64 sp;
u64 pc;
u64 cpsr;
- u64 fpu_registers[64];
+ u128 fpu_registers[32];
u64 fpscr;
u64 fpexc;
+
// TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT
VAddr tls_address;
};
@@ -41,9 +43,14 @@ public:
Run(1);
}
+ virtual void MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) {}
+
/// Clear all instruction cache
virtual void ClearInstructionCache() = 0;
+ /// Notify CPU emulation that page tables have changed
+ virtual void PageTableChanged() = 0;
+
/**
* Set the Program Counter to an address
* @param addr Address to set PC to
@@ -70,6 +77,10 @@ public:
*/
virtual void SetReg(int index, u64 value) = 0;
+ virtual const u128& GetExtReg(int index) const = 0;
+
+ virtual void SetExtReg(int index, u128& value) = 0;
+
/**
* Gets the value of a VFP register
* @param index Register index (0-31)
@@ -129,12 +140,6 @@ public:
virtual void SetTlsAddress(VAddr address) = 0;
/**
- * Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time)
- * @param ticks Number of ticks to advance the CPU core
- */
- virtual void AddTicks(u64 ticks) = 0;
-
- /**
* Saves the current CPU context
* @param ctx Thread context to save
*/
@@ -154,9 +159,6 @@ public:
return num_instructions;
}
- s64 down_count = 0; ///< A decreasing counter of remaining cycles before the next event,
- /// decreased by the cpu run loop
-
protected:
/**
* Executes the given number of instructions
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp
index 0ea1d76e4..6dcab5bab 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic.cpp
@@ -16,24 +16,6 @@
static void InterpreterFallback(u64 pc, Dynarmic::Jit* jit, void* user_arg) {
UNIMPLEMENTED_MSG("InterpreterFallback for ARM64 JIT does not exist!");
- //ARMul_State* state = static_cast<ARMul_State*>(user_arg);
-
- //state->Reg = jit->Regs();
- //state->Cpsr = jit->Cpsr();
- //state->Reg[15] = static_cast<u32>(pc);
- //state->ExtReg = jit->ExtRegs();
- //state->VFP[VFP_FPSCR] = jit->Fpscr();
- //state->NumInstrsToExecute = 1;
-
- //InterpreterMainLoop(state);
-
- //bool is_thumb = (state->Cpsr & (1 << 5)) != 0;
- //state->Reg[15] &= (is_thumb ? 0xFFFFFFFE : 0xFFFFFFFC);
-
- //jit->Regs() = state->Reg;
- //jit->Cpsr() = state->Cpsr;
- //jit->ExtRegs() = state->ExtReg;
- //jit->SetFpscr(state->VFP[VFP_FPSCR]);
}
static bool IsReadOnlyMemory(u64 vaddr) {
@@ -73,11 +55,10 @@ void MemoryWrite64(const u64 addr, const u64 data) {
Memory::Write64(static_cast<VAddr>(addr), data);
}
-static Dynarmic::UserCallbacks GetUserCallbacks(
- const std::shared_ptr<ARMul_State>& interpeter_state) {
+static Dynarmic::UserCallbacks GetUserCallbacks(ARM_Dynarmic* this_) {
Dynarmic::UserCallbacks user_callbacks{};
- //user_callbacks.InterpreterFallback = &InterpreterFallback;
- //user_callbacks.user_arg = static_cast<void*>(interpeter_state.get());
+ user_callbacks.InterpreterFallback = &InterpreterFallback;
+ user_callbacks.user_arg = static_cast<void*>(this_);
user_callbacks.CallSVC = &SVC::CallSVC;
user_callbacks.memory.IsReadOnlyMemory = &IsReadOnlyMemory;
user_callbacks.memory.ReadCode = &MemoryRead32;
@@ -90,13 +71,13 @@ static Dynarmic::UserCallbacks GetUserCallbacks(
user_callbacks.memory.Write32 = &MemoryWrite32;
user_callbacks.memory.Write64 = &MemoryWrite64;
//user_callbacks.page_table = Memory::GetCurrentPageTablePointers();
- user_callbacks.coprocessors[15] = std::make_shared<DynarmicCP15>(interpeter_state);
return user_callbacks;
}
ARM_Dynarmic::ARM_Dynarmic(PrivilegeMode initial_mode) {
- interpreter_state = std::make_shared<ARMul_State>(initial_mode);
- jit = std::make_unique<Dynarmic::Jit>(GetUserCallbacks(interpreter_state), Dynarmic::Arch::ARM64);
+}
+
+void ARM_Dynarmic::MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) {
}
void ARM_Dynarmic::SetPC(u64 pc) {
@@ -115,30 +96,26 @@ void ARM_Dynarmic::SetReg(int index, u64 value) {
jit->Regs64()[index] = value;
}
+const u128& ARM_Dynarmic::GetExtReg(int index) const {
+ return jit->ExtRegs64()[index];
+}
+
+void ARM_Dynarmic::SetExtReg(int index, u128& value) {
+ jit->ExtRegs64()[index] = value;
+}
+
u32 ARM_Dynarmic::GetVFPReg(int index) const {
- return jit->ExtRegs()[index];
+ return {};
}
void ARM_Dynarmic::SetVFPReg(int index, u32 value) {
- jit->ExtRegs()[index] = value;
}
u32 ARM_Dynarmic::GetVFPSystemReg(VFPSystemRegister reg) const {
- if (reg == VFP_FPSCR) {
- return jit->Fpscr();
- }
-
- // Dynarmic does not implement and/or expose other VFP registers, fallback to interpreter state
- return interpreter_state->VFP[reg];
+ return {};
}
void ARM_Dynarmic::SetVFPSystemReg(VFPSystemRegister reg, u32 value) {
- if (reg == VFP_FPSCR) {
- jit->SetFpscr(value);
- }
-
- // Dynarmic does not implement and/or expose other VFP registers, fallback to interpreter state
- interpreter_state->VFP[reg] = value;
}
u32 ARM_Dynarmic::GetCPSR() const {
@@ -150,11 +127,10 @@ void ARM_Dynarmic::SetCPSR(u32 cpsr) {
}
u32 ARM_Dynarmic::GetCP15Register(CP15Register reg) {
- return interpreter_state->CP15[reg];
+ return {};
}
void ARM_Dynarmic::SetCP15Register(CP15Register reg, u32 value) {
- interpreter_state->CP15[reg] = value;
}
VAddr ARM_Dynarmic::GetTlsAddress() const {
@@ -165,51 +141,39 @@ void ARM_Dynarmic::SetTlsAddress(VAddr address) {
jit->TlsAddr() = address;
}
-void ARM_Dynarmic::AddTicks(u64 ticks) {
- down_count -= ticks;
- if (down_count < 0) {
- CoreTiming::Advance();
- }
-}
-
MICROPROFILE_DEFINE(ARM_Jit, "ARM JIT", "ARM JIT", MP_RGB(255, 64, 64));
void ARM_Dynarmic::ExecuteInstructions(int num_instructions) {
+ ASSERT(Memory::GetCurrentPageTable() == current_page_table);
MICROPROFILE_SCOPE(ARM_Jit);
- unsigned ticks_executed = jit->Run(1 /*static_cast<unsigned>(num_instructions)*/);
+ std::size_t ticks_executed = jit->Run(static_cast<unsigned>(num_instructions));
- AddTicks(ticks_executed);
+ CoreTiming::AddTicks(ticks_executed);
}
void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) {
memcpy(ctx.cpu_registers, jit->Regs64().data(), sizeof(ctx.cpu_registers));
- //memcpy(ctx.fpu_registers, jit->ExtRegs().data(), sizeof(ctx.fpu_registers));
+ memcpy(ctx.fpu_registers, jit->ExtRegs64().data(), sizeof(ctx.fpu_registers));
ctx.lr = jit->Regs64()[30];
ctx.sp = jit->Regs64()[31];
ctx.pc = jit->Regs64()[32];
ctx.cpsr = jit->Cpsr();
- ctx.fpscr = jit->Fpscr();
- ctx.fpexc = interpreter_state->VFP[VFP_FPEXC];
-
// TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT
ctx.tls_address = jit->TlsAddr();
}
void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) {
memcpy(jit->Regs64().data(), ctx.cpu_registers, sizeof(ctx.cpu_registers));
- //memcpy(jit->ExtRegs().data(), ctx.fpu_registers, sizeof(ctx.fpu_registers));
+ memcpy(jit->ExtRegs64().data(), ctx.fpu_registers, sizeof(ctx.fpu_registers));
jit->Regs64()[30] = ctx.lr;
jit->Regs64()[31] = ctx.sp;
jit->Regs64()[32] = ctx.pc;
jit->Cpsr() = ctx.cpsr;
- jit->SetFpscr(ctx.fpscr);
- interpreter_state->VFP[VFP_FPEXC] = ctx.fpexc;
-
// TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT
jit->TlsAddr() = ctx.tls_address;
}
@@ -223,3 +187,16 @@ void ARM_Dynarmic::PrepareReschedule() {
void ARM_Dynarmic::ClearInstructionCache() {
jit->ClearCache();
}
+
+void ARM_Dynarmic::PageTableChanged() {
+ current_page_table = Memory::GetCurrentPageTable();
+
+ auto iter = jits.find(current_page_table);
+ if (iter != jits.end()) {
+ jit = iter->second.get();
+ return;
+ }
+
+ jit = new Dynarmic::Jit(GetUserCallbacks(this), Dynarmic::Arch::ARM64);
+ jits.emplace(current_page_table, std::unique_ptr<Dynarmic::Jit>(jit));
+}
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h
index fcdc1c0e0..6567359b0 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.h
+++ b/src/core/arm/dynarmic/arm_dynarmic.h
@@ -4,20 +4,29 @@
#pragma once
+#include <map>
#include <memory>
#include <dynarmic/dynarmic.h>
#include "common/common_types.h"
#include "core/arm/arm_interface.h"
#include "core/arm/skyeye_common/armstate.h"
+namespace Memory {
+struct PageTable;
+} // namespace Memory
+
class ARM_Dynarmic final : public ARM_Interface {
public:
ARM_Dynarmic(PrivilegeMode initial_mode);
+ void MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) override;
+
void SetPC(u64 pc) override;
u64 GetPC() const override;
u64 GetReg(int index) const override;
void SetReg(int index, u64 value) override;
+ const u128& GetExtReg(int index) const override;
+ void SetExtReg(int index, u128& value) override;
u32 GetVFPReg(int index) const override;
void SetVFPReg(int index, u32 value) override;
u32 GetVFPSystemReg(VFPSystemRegister reg) const override;
@@ -29,8 +38,6 @@ public:
VAddr GetTlsAddress() const override;
void SetTlsAddress(VAddr address) override;
- void AddTicks(u64 ticks) override;
-
void SaveContext(ThreadContext& ctx) override;
void LoadContext(const ThreadContext& ctx) override;
@@ -38,8 +45,10 @@ public:
void ExecuteInstructions(int num_instructions) override;
void ClearInstructionCache() override;
+ void PageTableChanged() override;
private:
- std::unique_ptr<Dynarmic::Jit> jit;
- std::shared_ptr<ARMul_State> interpreter_state;
+ Dynarmic::Jit* jit = nullptr;
+ Memory::PageTable* current_page_table = nullptr;
+ std::map<Memory::PageTable*, std::unique_ptr<Dynarmic::Jit>> jits;
};
diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp
index 99758fc2a..5ebf7a2f1 100644
--- a/src/core/arm/dyncom/arm_dyncom.cpp
+++ b/src/core/arm/dyncom/arm_dyncom.cpp
@@ -29,6 +29,10 @@ void ARM_DynCom::SetPC(u64 pc) {
state->Reg[15] = pc;
}
+void ARM_DynCom::PageTableChanged() {
+ ClearInstructionCache();
+}
+
u64 ARM_DynCom::GetPC() const {
return state->Reg[15];
}
@@ -41,6 +45,13 @@ void ARM_DynCom::SetReg(int index, u64 value) {
state->Reg[index] = value;
}
+const u128& ARM_DynCom::GetExtReg(int index) const {
+ return {};
+}
+
+void ARM_DynCom::SetExtReg(int index, u128& value) {
+}
+
u32 ARM_DynCom::GetVFPReg(int index) const {
return state->ExtReg[index];
}
@@ -80,12 +91,6 @@ VAddr ARM_DynCom::GetTlsAddress() const {
void ARM_DynCom::SetTlsAddress(VAddr /*address*/) {
}
-void ARM_DynCom::AddTicks(u64 ticks) {
- down_count -= ticks;
- if (down_count < 0)
- CoreTiming::Advance();
-}
-
void ARM_DynCom::ExecuteInstructions(int num_instructions) {
state->NumInstrsToExecute = num_instructions;
@@ -93,7 +98,7 @@ void ARM_DynCom::ExecuteInstructions(int num_instructions) {
// executing one instruction at a time. Otherwise, if a block is being executed, more
// instructions may actually be executed than specified.
unsigned ticks_executed = InterpreterMainLoop(state.get());
- AddTicks(ticks_executed);
+ CoreTiming::AddTicks(ticks_executed);
}
void ARM_DynCom::SaveContext(ThreadContext& ctx) {
diff --git a/src/core/arm/dyncom/arm_dyncom.h b/src/core/arm/dyncom/arm_dyncom.h
index 44e674ae2..cc3c0f3da 100644
--- a/src/core/arm/dyncom/arm_dyncom.h
+++ b/src/core/arm/dyncom/arm_dyncom.h
@@ -16,11 +16,14 @@ public:
~ARM_DynCom();
void ClearInstructionCache() override;
+ void PageTableChanged() override;
void SetPC(u64 pc) override;
u64 GetPC() const override;
u64 GetReg(int index) const override;
void SetReg(int index, u64 value) override;
+ const u128& GetExtReg(int index) const override;
+ void SetExtReg(int index, u128& value) override;
u32 GetVFPReg(int index) const override;
void SetVFPReg(int index, u32 value) override;
u32 GetVFPSystemReg(VFPSystemRegister reg) const override;
@@ -32,8 +35,6 @@ public:
VAddr GetTlsAddress() const override;
void SetTlsAddress(VAddr address) override;
- void AddTicks(u64 ticks) override;
-
void SaveContext(ThreadContext& ctx) override;
void LoadContext(const ThreadContext& ctx) override;
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
index f4fbb8d04..3522d1e82 100644
--- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
@@ -759,7 +759,7 @@ static ThumbDecodeStatus DecodeThumbInstruction(u32 inst, u32 addr, u32* arm_ins
ThumbDecodeStatus ret = TranslateThumbInstruction(addr, inst, arm_inst, inst_size);
if (ret == ThumbDecodeStatus::BRANCH) {
int inst_index;
- int table_length = arm_instruction_trans_len;
+ int table_length = static_cast<int>(arm_instruction_trans_len);
u32 tinstr = GetThumbInstruction(inst, addr);
switch ((tinstr & 0xF800) >> 11) {
@@ -838,7 +838,7 @@ static unsigned int InterpreterTranslateInstruction(const ARMul_State* cpu, cons
return inst_size;
}
-static int InterpreterTranslateBlock(ARMul_State* cpu, int& bb_start, u32 addr) {
+static int InterpreterTranslateBlock(ARMul_State* cpu, std::size_t& bb_start, u32 addr) {
MICROPROFILE_SCOPE(DynCom_Decode);
// Decode instruction, get index
@@ -871,7 +871,7 @@ static int InterpreterTranslateBlock(ARMul_State* cpu, int& bb_start, u32 addr)
return KEEP_GOING;
}
-static int InterpreterTranslateSingle(ARMul_State* cpu, int& bb_start, u32 addr) {
+static int InterpreterTranslateSingle(ARMul_State* cpu, std::size_t& bb_start, u32 addr) {
MICROPROFILE_SCOPE(DynCom_Decode);
ARM_INST_PTR inst_base = nullptr;
@@ -1620,7 +1620,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
unsigned int addr;
unsigned int num_instrs = 0;
- int ptr;
+ std::size_t ptr;
LOAD_NZCVT;
DISPATCH : {
diff --git a/src/core/arm/skyeye_common/armstate.h b/src/core/arm/skyeye_common/armstate.h
index 1a707ff7e..893877797 100644
--- a/src/core/arm/skyeye_common/armstate.h
+++ b/src/core/arm/skyeye_common/armstate.h
@@ -230,7 +230,7 @@ public:
// TODO(bunnei): Move this cache to a better place - it should be per codeset (likely per
// process for our purposes), not per ARMul_State (which tracks CPU core state).
- std::unordered_map<u32, int> instruction_cache;
+ std::unordered_map<u32, std::size_t> instruction_cache;
private:
void ResetMPCoreCP15Registers();
diff --git a/src/core/core.cpp b/src/core/core.cpp
index d08f18623..c5448630f 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -9,16 +9,19 @@
#include "core/arm/arm_interface.h"
#include "core/arm/dynarmic/arm_dynarmic.h"
#include "core/arm/dyncom/arm_dyncom.h"
+#include "core/arm/unicorn/arm_unicorn.h"
#include "core/core.h"
#include "core/core_timing.h"
#include "core/gdbstub/gdbstub.h"
#include "core/hle/kernel/kernel.h"
+#include "core/hle/kernel/process.h"
#include "core/hle/kernel/thread.h"
#include "core/hle/service/service.h"
#include "core/hw/hw.h"
#include "core/loader/loader.h"
#include "core/memory_setup.h"
#include "core/settings.h"
+#include "network/network.h"
#include "video_core/video_core.h"
namespace Core {
@@ -99,7 +102,7 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file
return init_result;
}
- const Loader::ResultStatus load_result{app_loader->Load()};
+ const Loader::ResultStatus load_result{app_loader->Load(Kernel::g_current_process)};
if (Loader::ResultStatus::Success != load_result) {
LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result);
System::Shutdown();
@@ -136,7 +139,6 @@ void System::Reschedule() {
}
System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
- Memory::InitMemoryMap();
LOG_DEBUG(HW_Memory, "initialized OK");
if (Settings::values.use_cpu_jit) {
@@ -188,8 +190,12 @@ void System::Shutdown() {
cpu_core = nullptr;
app_loader = nullptr;
telemetry_session = nullptr;
+ if (auto room_member = Network::GetRoomMember().lock()) {
+ Network::GameInfo game_info{};
+ room_member->SendGameInfo(game_info);
+ }
LOG_DEBUG(Core, "Shutdown OK");
}
-} // namespace
+} // namespace Core
diff --git a/src/core/core.h b/src/core/core.h
index 4e3b6b409..9805cc694 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -7,6 +7,7 @@
#include <memory>
#include <string>
#include "common/common_types.h"
+#include "core/loader/loader.h"
#include "core/memory.h"
#include "core/perf_stats.h"
#include "core/telemetry_session.h"
@@ -14,10 +15,6 @@
class EmuWindow;
class ARM_Interface;
-namespace Loader {
-class AppLoader;
-}
-
namespace Core {
class System {
@@ -119,6 +116,10 @@ public:
return status_details;
}
+ Loader::AppLoader& GetAppLoader() const {
+ return *app_loader;
+ }
+
private:
/**
* Initialize the emulated system.
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index 276ecfdf6..5e2a5d00f 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -57,6 +57,9 @@ static s64 idled_cycles;
static s64 last_global_time_ticks;
static s64 last_global_time_us;
+static s64 down_count = 0; ///< A decreasing counter of remaining cycles before the next event,
+ /// decreased by the cpu run loop
+
static std::recursive_mutex external_event_section;
// Warning: not included in save state.
@@ -146,7 +149,7 @@ void UnregisterAllEvents() {
}
void Init() {
- Core::CPU().down_count = INITIAL_SLICE_LENGTH;
+ down_count = INITIAL_SLICE_LENGTH;
g_slice_length = INITIAL_SLICE_LENGTH;
global_timer = 0;
idled_cycles = 0;
@@ -185,8 +188,15 @@ void Shutdown() {
}
}
+void AddTicks(u64 ticks) {
+ down_count -= ticks;
+ if (down_count < 0) {
+ Advance();
+ }
+}
+
u64 GetTicks() {
- return (u64)global_timer + g_slice_length - Core::CPU().down_count;
+ return (u64)global_timer + g_slice_length - down_count;
}
u64 GetIdleTicks() {
@@ -460,18 +470,18 @@ void MoveEvents() {
}
void ForceCheck() {
- s64 cycles_executed = g_slice_length - Core::CPU().down_count;
+ s64 cycles_executed = g_slice_length - down_count;
global_timer += cycles_executed;
// This will cause us to check for new events immediately.
- Core::CPU().down_count = 0;
+ down_count = 0;
// But let's not eat a bunch more time in Advance() because of this.
g_slice_length = 0;
}
void Advance() {
- s64 cycles_executed = g_slice_length - Core::CPU().down_count;
+ s64 cycles_executed = g_slice_length - down_count;
global_timer += cycles_executed;
- Core::CPU().down_count = g_slice_length;
+ down_count = g_slice_length;
if (has_ts_events)
MoveEvents();
@@ -480,7 +490,7 @@ void Advance() {
if (!first) {
if (g_slice_length < 10000) {
g_slice_length += 10000;
- Core::CPU().down_count += g_slice_length;
+ down_count += g_slice_length;
}
} else {
// Note that events can eat cycles as well.
@@ -490,7 +500,7 @@ void Advance() {
const int diff = target - g_slice_length;
g_slice_length += diff;
- Core::CPU().down_count += diff;
+ down_count += diff;
}
if (advance_callback)
advance_callback(static_cast<int>(cycles_executed));
@@ -506,12 +516,12 @@ void LogPendingEvents() {
}
void Idle(int max_idle) {
- s64 cycles_down = Core::CPU().down_count;
+ s64 cycles_down = down_count;
if (max_idle != 0 && cycles_down > max_idle)
cycles_down = max_idle;
if (first && cycles_down > 0) {
- s64 cycles_executed = g_slice_length - Core::CPU().down_count;
+ s64 cycles_executed = g_slice_length - down_count;
s64 cycles_next_event = first->time - global_timer;
if (cycles_next_event < cycles_executed + cycles_down) {
@@ -526,9 +536,9 @@ void Idle(int max_idle) {
cycles_down / (float)(g_clock_rate_arm11 * 0.001f));
idled_cycles += cycles_down;
- Core::CPU().down_count -= cycles_down;
- if (Core::CPU().down_count == 0)
- Core::CPU().down_count = -1;
+ down_count -= cycles_down;
+ if (down_count == 0)
+ down_count = -1;
}
std::string GetScheduledEventsSummary() {
diff --git a/src/core/core_timing.h b/src/core/core_timing.h
index d2f85cd4d..897350801 100644
--- a/src/core/core_timing.h
+++ b/src/core/core_timing.h
@@ -67,6 +67,12 @@ void Shutdown();
typedef void (*MHzChangeCallback)();
typedef std::function<void(u64 userdata, int cycles_late)> TimedCallback;
+/**
+* Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time)
+* @param ticks Number of ticks to advance the CPU core
+*/
+void AddTicks(u64 ticks);
+
u64 GetTicks();
u64 GetIdleTicks();
u64 GetGlobalTimeUs();
diff --git a/src/core/file_sys/archive_backend.cpp b/src/core/file_sys/archive_backend.cpp
index 1fae0ede0..87a240d7a 100644
--- a/src/core/file_sys/archive_backend.cpp
+++ b/src/core/file_sys/archive_backend.cpp
@@ -90,6 +90,8 @@ std::u16string Path::AsU16Str() const {
LOG_ERROR(Service_FS, "LowPathType cannot be converted to u16string!");
return {};
}
+
+ UNREACHABLE();
}
std::vector<u8> Path::AsBinary() const {
diff --git a/src/core/file_sys/archive_ncch.cpp b/src/core/file_sys/archive_ncch.cpp
index 6d9007731..e8c5be983 100644
--- a/src/core/file_sys/archive_ncch.cpp
+++ b/src/core/file_sys/archive_ncch.cpp
@@ -13,7 +13,10 @@
#include "core/file_sys/archive_ncch.h"
#include "core/file_sys/errors.h"
#include "core/file_sys/ivfc_archive.h"
+#include "core/file_sys/ncch_container.h"
+#include "core/file_sys/title_metadata.h"
#include "core/hle/service/fs/archive.h"
+#include "core/loader/loader.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// FileSys namespace
@@ -25,8 +28,18 @@ static std::string GetNCCHContainerPath(const std::string& nand_directory) {
}
static std::string GetNCCHPath(const std::string& mount_point, u32 high, u32 low) {
- return Common::StringFromFormat("%s%08x/%08x/content/00000000.app.romfs", mount_point.c_str(),
- high, low);
+ u32 content_id = 0;
+
+ // TODO(shinyquagsire23): Title database should be doing this path lookup
+ std::string content_path =
+ Common::StringFromFormat("%s%08x/%08x/content/", mount_point.c_str(), high, low);
+ std::string tmd_path = content_path + "00000000.tmd";
+ TitleMetadata tmd(tmd_path);
+ if (tmd.Load() == Loader::ResultStatus::Success) {
+ content_id = tmd.GetBootContentID();
+ }
+
+ return Common::StringFromFormat("%s%08x.app", content_path.c_str(), content_id);
}
ArchiveFactory_NCCH::ArchiveFactory_NCCH(const std::string& nand_directory)
@@ -38,9 +51,14 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path&
u32 high = data[1];
u32 low = data[0];
std::string file_path = GetNCCHPath(mount_point, high, low);
- auto file = std::make_shared<FileUtil::IOFile>(file_path, "rb");
- if (!file->IsOpen()) {
+ std::shared_ptr<FileUtil::IOFile> romfs_file;
+ u64 romfs_offset = 0;
+ u64 romfs_size = 0;
+ auto ncch_container = NCCHContainer(file_path);
+
+ if (ncch_container.ReadRomFS(romfs_file, romfs_offset, romfs_size) !=
+ Loader::ResultStatus::Success) {
// High Title ID of the archive: The category (https://3dbrew.org/wiki/Title_list).
constexpr u32 shared_data_archive = 0x0004009B;
constexpr u32 system_data_archive = 0x000400DB;
@@ -74,9 +92,8 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path&
}
return ERROR_NOT_FOUND;
}
- auto size = file->GetSize();
- auto archive = std::make_unique<IVFCArchive>(file, 0, size);
+ auto archive = std::make_unique<IVFCArchive>(romfs_file, romfs_offset, romfs_size);
return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive));
}
diff --git a/src/core/file_sys/archive_sdmc.cpp b/src/core/file_sys/archive_sdmc.cpp
index 679909d06..fe3dce5d4 100644
--- a/src/core/file_sys/archive_sdmc.cpp
+++ b/src/core/file_sys/archive_sdmc.cpp
@@ -121,7 +121,25 @@ ResultCode SDMCArchive::DeleteFile(const Path& path) const {
}
ResultCode SDMCArchive::RenameFile(const Path& src_path, const Path& dest_path) const {
- if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) {
+ const PathParser path_parser_src(src_path);
+
+ // TODO: Verify these return codes with HW
+ if (!path_parser_src.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const PathParser path_parser_dest(dest_path);
+
+ if (!path_parser_dest.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
+ const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
+
+ if (FileUtil::Rename(src_path_full, dest_path_full)) {
return RESULT_SUCCESS;
}
@@ -260,8 +278,27 @@ ResultCode SDMCArchive::CreateDirectory(const Path& path) const {
}
ResultCode SDMCArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const {
- if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString()))
+ const PathParser path_parser_src(src_path);
+
+ // TODO: Verify these return codes with HW
+ if (!path_parser_src.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const PathParser path_parser_dest(dest_path);
+
+ if (!path_parser_dest.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
+ const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
+
+ if (FileUtil::Rename(src_path_full, dest_path_full)) {
return RESULT_SUCCESS;
+ }
// TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't
// exist or similar. Verify.
diff --git a/src/core/file_sys/archive_selfncch.cpp b/src/core/file_sys/archive_selfncch.cpp
index 298a37a44..3222000cf 100644
--- a/src/core/file_sys/archive_selfncch.cpp
+++ b/src/core/file_sys/archive_selfncch.cpp
@@ -3,12 +3,14 @@
// Refer to the license.txt file included.
#include <array>
+#include <cinttypes>
#include "common/common_types.h"
#include "common/logging/log.h"
#include "common/swap.h"
#include "core/file_sys/archive_selfncch.h"
#include "core/file_sys/errors.h"
#include "core/file_sys/ivfc_archive.h"
+#include "core/hle/kernel/process.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// FileSys namespace
@@ -102,8 +104,7 @@ public:
switch (static_cast<SelfNCCHFilePathType>(file_path.type)) {
case SelfNCCHFilePathType::UpdateRomFS:
- LOG_WARNING(Service_FS, "(STUBBED) open update RomFS");
- return OpenRomFS();
+ return OpenUpdateRomFS();
case SelfNCCHFilePathType::RomFS:
return OpenRomFS();
@@ -179,6 +180,17 @@ private:
}
}
+ ResultVal<std::unique_ptr<FileBackend>> OpenUpdateRomFS() const {
+ if (ncch_data.update_romfs_file) {
+ return MakeResult<std::unique_ptr<FileBackend>>(std::make_unique<IVFCFile>(
+ ncch_data.update_romfs_file, ncch_data.update_romfs_offset,
+ ncch_data.update_romfs_size));
+ } else {
+ LOG_INFO(Service_FS, "Unable to read update RomFS");
+ return ERROR_ROMFS_NOT_FOUND;
+ }
+ }
+
ResultVal<std::unique_ptr<FileBackend>> OpenExeFS(const std::string& filename) const {
if (filename == "icon") {
if (ncch_data.icon) {
@@ -217,31 +229,59 @@ private:
NCCHData ncch_data;
};
-ArchiveFactory_SelfNCCH::ArchiveFactory_SelfNCCH(Loader::AppLoader& app_loader) {
+void ArchiveFactory_SelfNCCH::Register(Loader::AppLoader& app_loader) {
+ u64 program_id = 0;
+ if (app_loader.ReadProgramId(program_id) != Loader::ResultStatus::Success) {
+ LOG_WARNING(
+ Service_FS,
+ "Could not read program id when registering with SelfNCCH, this might be a 3dsx file");
+ }
+
+ LOG_DEBUG(Service_FS, "Registering program %016" PRIX64 " with the SelfNCCH archive factory",
+ program_id);
+
+ if (ncch_data.find(program_id) != ncch_data.end()) {
+ LOG_WARNING(Service_FS, "Registering program %016" PRIX64
+ " with SelfNCCH will override existing mapping",
+ program_id);
+ }
+
+ NCCHData& data = ncch_data[program_id];
+
std::shared_ptr<FileUtil::IOFile> romfs_file_;
if (Loader::ResultStatus::Success ==
- app_loader.ReadRomFS(romfs_file_, ncch_data.romfs_offset, ncch_data.romfs_size)) {
+ app_loader.ReadRomFS(romfs_file_, data.romfs_offset, data.romfs_size)) {
+
+ data.romfs_file = std::move(romfs_file_);
+ }
+
+ std::shared_ptr<FileUtil::IOFile> update_romfs_file;
+ if (Loader::ResultStatus::Success ==
+ app_loader.ReadUpdateRomFS(update_romfs_file, data.update_romfs_offset,
+ data.update_romfs_size)) {
- ncch_data.romfs_file = std::move(romfs_file_);
+ data.update_romfs_file = std::move(update_romfs_file);
}
std::vector<u8> buffer;
if (Loader::ResultStatus::Success == app_loader.ReadIcon(buffer))
- ncch_data.icon = std::make_shared<std::vector<u8>>(std::move(buffer));
+ data.icon = std::make_shared<std::vector<u8>>(std::move(buffer));
buffer.clear();
if (Loader::ResultStatus::Success == app_loader.ReadLogo(buffer))
- ncch_data.logo = std::make_shared<std::vector<u8>>(std::move(buffer));
+ data.logo = std::make_shared<std::vector<u8>>(std::move(buffer));
buffer.clear();
if (Loader::ResultStatus::Success == app_loader.ReadBanner(buffer))
- ncch_data.banner = std::make_shared<std::vector<u8>>(std::move(buffer));
+ data.banner = std::make_shared<std::vector<u8>>(std::move(buffer));
}
ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SelfNCCH::Open(const Path& path) {
- auto archive = std::make_unique<SelfNCCHArchive>(ncch_data);
- return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive));
+ //auto archive = std::make_unique<SelfNCCHArchive>(
+ // ncch_data[Kernel::g_current_process->codeset->program_id]);
+ //return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive));
+ return {};
}
ResultCode ArchiveFactory_SelfNCCH::Format(const Path&, const FileSys::ArchiveFormatInfo&) {
diff --git a/src/core/file_sys/archive_selfncch.h b/src/core/file_sys/archive_selfncch.h
index f1b971296..0d6d6766e 100644
--- a/src/core/file_sys/archive_selfncch.h
+++ b/src/core/file_sys/archive_selfncch.h
@@ -6,6 +6,7 @@
#include <memory>
#include <string>
+#include <unordered_map>
#include <vector>
#include "common/common_types.h"
#include "core/file_sys/archive_backend.h"
@@ -24,12 +25,19 @@ struct NCCHData {
std::shared_ptr<FileUtil::IOFile> romfs_file;
u64 romfs_offset = 0;
u64 romfs_size = 0;
+
+ std::shared_ptr<FileUtil::IOFile> update_romfs_file;
+ u64 update_romfs_offset = 0;
+ u64 update_romfs_size = 0;
};
/// File system interface to the SelfNCCH archive
class ArchiveFactory_SelfNCCH final : public ArchiveFactory {
public:
- explicit ArchiveFactory_SelfNCCH(Loader::AppLoader& app_loader);
+ ArchiveFactory_SelfNCCH() = default;
+
+ /// Registers a loaded application so that we can open its SelfNCCH archive when requested.
+ void Register(Loader::AppLoader& app_loader);
std::string GetName() const override {
return "SelfNCCH";
@@ -39,7 +47,8 @@ public:
ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path) const override;
private:
- NCCHData ncch_data;
+ /// Mapping of ProgramId -> NCCHData
+ std::unordered_map<u64, NCCHData> ncch_data;
};
} // namespace FileSys
diff --git a/src/core/file_sys/ncch_container.cpp b/src/core/file_sys/ncch_container.cpp
new file mode 100644
index 000000000..b9fb940c7
--- /dev/null
+++ b/src/core/file_sys/ncch_container.cpp
@@ -0,0 +1,423 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <cinttypes>
+#include <cstring>
+#include <memory>
+#include "common/common_types.h"
+#include "common/logging/log.h"
+#include "core/core.h"
+#include "core/file_sys/ncch_container.h"
+#include "core/loader/loader.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+static const int kMaxSections = 8; ///< Maximum number of sections (files) in an ExeFs
+static const int kBlockSize = 0x200; ///< Size of ExeFS blocks (in bytes)
+
+/**
+ * Get the decompressed size of an LZSS compressed ExeFS file
+ * @param buffer Buffer of compressed file
+ * @param size Size of compressed buffer
+ * @return Size of decompressed buffer
+ */
+static u32 LZSS_GetDecompressedSize(const u8* buffer, u32 size) {
+ u32 offset_size = *(u32*)(buffer + size - 4);
+ return offset_size + size;
+}
+
+/**
+ * Decompress ExeFS file (compressed with LZSS)
+ * @param compressed Compressed buffer
+ * @param compressed_size Size of compressed buffer
+ * @param decompressed Decompressed buffer
+ * @param decompressed_size Size of decompressed buffer
+ * @return True on success, otherwise false
+ */
+static bool LZSS_Decompress(const u8* compressed, u32 compressed_size, u8* decompressed,
+ u32 decompressed_size) {
+ const u8* footer = compressed + compressed_size - 8;
+ u32 buffer_top_and_bottom = *reinterpret_cast<const u32*>(footer);
+ u32 out = decompressed_size;
+ u32 index = compressed_size - ((buffer_top_and_bottom >> 24) & 0xFF);
+ u32 stop_index = compressed_size - (buffer_top_and_bottom & 0xFFFFFF);
+
+ memset(decompressed, 0, decompressed_size);
+ memcpy(decompressed, compressed, compressed_size);
+
+ while (index > stop_index) {
+ u8 control = compressed[--index];
+
+ for (unsigned i = 0; i < 8; i++) {
+ if (index <= stop_index)
+ break;
+ if (index <= 0)
+ break;
+ if (out <= 0)
+ break;
+
+ if (control & 0x80) {
+ // Check if compression is out of bounds
+ if (index < 2)
+ return false;
+ index -= 2;
+
+ u32 segment_offset = compressed[index] | (compressed[index + 1] << 8);
+ u32 segment_size = ((segment_offset >> 12) & 15) + 3;
+ segment_offset &= 0x0FFF;
+ segment_offset += 2;
+
+ // Check if compression is out of bounds
+ if (out < segment_size)
+ return false;
+
+ for (unsigned j = 0; j < segment_size; j++) {
+ // Check if compression is out of bounds
+ if (out + segment_offset >= decompressed_size)
+ return false;
+
+ u8 data = decompressed[out + segment_offset];
+ decompressed[--out] = data;
+ }
+ } else {
+ // Check if compression is out of bounds
+ if (out < 1)
+ return false;
+ decompressed[--out] = compressed[--index];
+ }
+ control <<= 1;
+ }
+ }
+ return true;
+}
+
+NCCHContainer::NCCHContainer(const std::string& filepath) : filepath(filepath) {
+ file = FileUtil::IOFile(filepath, "rb");
+}
+
+Loader::ResultStatus NCCHContainer::OpenFile(const std::string& filepath) {
+ this->filepath = filepath;
+ file = FileUtil::IOFile(filepath, "rb");
+
+ if (!file.IsOpen()) {
+ LOG_WARNING(Service_FS, "Failed to open %s", filepath.c_str());
+ return Loader::ResultStatus::Error;
+ }
+
+ LOG_DEBUG(Service_FS, "Opened %s", filepath.c_str());
+ return Loader::ResultStatus::Success;
+}
+
+Loader::ResultStatus NCCHContainer::Load() {
+ if (is_loaded)
+ return Loader::ResultStatus::Success;
+
+ if (file.IsOpen()) {
+ // Reset read pointer in case this file has been read before.
+ file.Seek(0, SEEK_SET);
+
+ if (file.ReadBytes(&ncch_header, sizeof(NCCH_Header)) != sizeof(NCCH_Header))
+ return Loader::ResultStatus::Error;
+
+ // Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)...
+ if (Loader::MakeMagic('N', 'C', 'S', 'D') == ncch_header.magic) {
+ LOG_DEBUG(Service_FS, "Only loading the first (bootable) NCCH within the NCSD file!");
+ ncch_offset = 0x4000;
+ file.Seek(ncch_offset, SEEK_SET);
+ file.ReadBytes(&ncch_header, sizeof(NCCH_Header));
+ }
+
+ // Verify we are loading the correct file type...
+ if (Loader::MakeMagic('N', 'C', 'C', 'H') != ncch_header.magic)
+ return Loader::ResultStatus::ErrorInvalidFormat;
+
+ has_header = true;
+
+ // System archives and DLC don't have an extended header but have RomFS
+ if (ncch_header.extended_header_size) {
+ if (file.ReadBytes(&exheader_header, sizeof(ExHeader_Header)) !=
+ sizeof(ExHeader_Header))
+ return Loader::ResultStatus::Error;
+
+ is_compressed = (exheader_header.codeset_info.flags.flag & 1) == 1;
+ u32 entry_point = exheader_header.codeset_info.text.address;
+ u32 code_size = exheader_header.codeset_info.text.code_size;
+ u32 stack_size = exheader_header.codeset_info.stack_size;
+ u32 bss_size = exheader_header.codeset_info.bss_size;
+ u32 core_version = exheader_header.arm11_system_local_caps.core_version;
+ u8 priority = exheader_header.arm11_system_local_caps.priority;
+ u8 resource_limit_category =
+ exheader_header.arm11_system_local_caps.resource_limit_category;
+
+ LOG_DEBUG(Service_FS, "Name: %s",
+ exheader_header.codeset_info.name);
+ LOG_DEBUG(Service_FS, "Program ID: %016" PRIX64,
+ ncch_header.program_id);
+ LOG_DEBUG(Service_FS, "Code compressed: %s", is_compressed ? "yes" : "no");
+ LOG_DEBUG(Service_FS, "Entry point: 0x%08X", entry_point);
+ LOG_DEBUG(Service_FS, "Code size: 0x%08X", code_size);
+ LOG_DEBUG(Service_FS, "Stack size: 0x%08X", stack_size);
+ LOG_DEBUG(Service_FS, "Bss size: 0x%08X", bss_size);
+ LOG_DEBUG(Service_FS, "Core version: %d", core_version);
+ LOG_DEBUG(Service_FS, "Thread priority: 0x%X", priority);
+ LOG_DEBUG(Service_FS, "Resource limit category: %d", resource_limit_category);
+ LOG_DEBUG(Service_FS, "System Mode: %d",
+ static_cast<int>(exheader_header.arm11_system_local_caps.system_mode));
+
+ if (exheader_header.system_info.jump_id != ncch_header.program_id) {
+ LOG_ERROR(Service_FS,
+ "ExHeader Program ID mismatch: the ROM is probably encrypted.");
+ return Loader::ResultStatus::ErrorEncrypted;
+ }
+
+ has_exheader = true;
+ }
+
+ // DLC can have an ExeFS and a RomFS but no extended header
+ if (ncch_header.exefs_size) {
+ exefs_offset = ncch_header.exefs_offset * kBlockSize;
+ u32 exefs_size = ncch_header.exefs_size * kBlockSize;
+
+ LOG_DEBUG(Service_FS, "ExeFS offset: 0x%08X", exefs_offset);
+ LOG_DEBUG(Service_FS, "ExeFS size: 0x%08X", exefs_size);
+
+ file.Seek(exefs_offset + ncch_offset, SEEK_SET);
+ if (file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) != sizeof(ExeFs_Header))
+ return Loader::ResultStatus::Error;
+
+ exefs_file = FileUtil::IOFile(filepath, "rb");
+ has_exefs = true;
+ }
+
+ if (ncch_header.romfs_offset != 0 && ncch_header.romfs_size != 0)
+ has_romfs = true;
+ }
+
+ LoadOverrides();
+
+ // We need at least one of these or overrides, practically
+ if (!(has_exefs || has_romfs || is_tainted))
+ return Loader::ResultStatus::Error;
+
+ is_loaded = true;
+ return Loader::ResultStatus::Success;
+}
+
+Loader::ResultStatus NCCHContainer::LoadOverrides() {
+ // Check for split-off files, mark the archive as tainted if we will use them
+ std::string romfs_override = filepath + ".romfs";
+ if (FileUtil::Exists(romfs_override)) {
+ is_tainted = true;
+ }
+
+ // If we have a split-off exefs file/folder, it takes priority
+ std::string exefs_override = filepath + ".exefs";
+ std::string exefsdir_override = filepath + ".exefsdir/";
+ if (FileUtil::Exists(exefs_override)) {
+ exefs_file = FileUtil::IOFile(exefs_override, "rb");
+
+ if (exefs_file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) == sizeof(ExeFs_Header)) {
+ LOG_DEBUG(Service_FS, "Loading ExeFS section from %s", exefs_override.c_str());
+ exefs_offset = 0;
+ is_tainted = true;
+ has_exefs = true;
+ } else {
+ exefs_file = FileUtil::IOFile(filepath, "rb");
+ }
+ } else if (FileUtil::Exists(exefsdir_override) && FileUtil::IsDirectory(exefsdir_override)) {
+ is_tainted = true;
+ }
+
+ if (is_tainted)
+ LOG_WARNING(Service_FS,
+ "Loaded NCCH %s is tainted, application behavior may not be as expected!",
+ filepath.c_str());
+
+ return Loader::ResultStatus::Success;
+}
+
+Loader::ResultStatus NCCHContainer::LoadSectionExeFS(const char* name, std::vector<u8>& buffer) {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return result;
+
+ // Check if we have files that can drop-in and replace
+ result = LoadOverrideExeFSSection(name, buffer);
+ if (result == Loader::ResultStatus::Success || !has_exefs)
+ return result;
+
+ // If we don't have any separate files, we'll need a full ExeFS
+ if (!exefs_file.IsOpen())
+ return Loader::ResultStatus::Error;
+
+ LOG_DEBUG(Service_FS, "%d sections:", kMaxSections);
+ // Iterate through the ExeFs archive until we find a section with the specified name...
+ for (unsigned section_number = 0; section_number < kMaxSections; section_number++) {
+ const auto& section = exefs_header.section[section_number];
+
+ // Load the specified section...
+ if (strcmp(section.name, name) == 0) {
+ LOG_DEBUG(Service_FS, "%d - offset: 0x%08X, size: 0x%08X, name: %s", section_number,
+ section.offset, section.size, section.name);
+
+ s64 section_offset =
+ (section.offset + exefs_offset + sizeof(ExeFs_Header) + ncch_offset);
+ exefs_file.Seek(section_offset, SEEK_SET);
+
+ if (strcmp(section.name, ".code") == 0 && is_compressed) {
+ // Section is compressed, read compressed .code section...
+ std::unique_ptr<u8[]> temp_buffer;
+ try {
+ temp_buffer.reset(new u8[section.size]);
+ } catch (std::bad_alloc&) {
+ return Loader::ResultStatus::ErrorMemoryAllocationFailed;
+ }
+
+ if (exefs_file.ReadBytes(&temp_buffer[0], section.size) != section.size)
+ return Loader::ResultStatus::Error;
+
+ // Decompress .code section...
+ u32 decompressed_size = LZSS_GetDecompressedSize(&temp_buffer[0], section.size);
+ buffer.resize(decompressed_size);
+ if (!LZSS_Decompress(&temp_buffer[0], section.size, &buffer[0], decompressed_size))
+ return Loader::ResultStatus::ErrorInvalidFormat;
+ } else {
+ // Section is uncompressed...
+ buffer.resize(section.size);
+ if (exefs_file.ReadBytes(&buffer[0], section.size) != section.size)
+ return Loader::ResultStatus::Error;
+ }
+ return Loader::ResultStatus::Success;
+ }
+ }
+ return Loader::ResultStatus::ErrorNotUsed;
+}
+
+Loader::ResultStatus NCCHContainer::LoadOverrideExeFSSection(const char* name,
+ std::vector<u8>& buffer) {
+ std::string override_name;
+
+ // Map our section name to the extracted equivalent
+ if (!strcmp(name, ".code"))
+ override_name = "code.bin";
+ else if (!strcmp(name, "icon"))
+ override_name = "code.bin";
+ else if (!strcmp(name, "banner"))
+ override_name = "banner.bnr";
+ else if (!strcmp(name, "logo"))
+ override_name = "logo.bcma.lz";
+ else
+ return Loader::ResultStatus::Error;
+
+ std::string section_override = filepath + ".exefsdir/" + override_name;
+ FileUtil::IOFile section_file(section_override, "rb");
+
+ if (section_file.IsOpen()) {
+ auto section_size = section_file.GetSize();
+ buffer.resize(section_size);
+
+ section_file.Seek(0, SEEK_SET);
+ if (section_file.ReadBytes(&buffer[0], section_size) == section_size) {
+ LOG_WARNING(Service_FS, "File %s overriding built-in ExeFS file",
+ section_override.c_str());
+ return Loader::ResultStatus::Success;
+ }
+ }
+ return Loader::ResultStatus::ErrorNotUsed;
+}
+
+Loader::ResultStatus NCCHContainer::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
+ u64& offset, u64& size) {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return result;
+
+ if (ReadOverrideRomFS(romfs_file, offset, size) == Loader::ResultStatus::Success)
+ return Loader::ResultStatus::Success;
+
+ if (!has_romfs) {
+ LOG_DEBUG(Service_FS, "RomFS requested from NCCH which has no RomFS");
+ return Loader::ResultStatus::ErrorNotUsed;
+ }
+
+ if (!file.IsOpen())
+ return Loader::ResultStatus::Error;
+
+ u32 romfs_offset = ncch_offset + (ncch_header.romfs_offset * kBlockSize) + 0x1000;
+ u32 romfs_size = (ncch_header.romfs_size * kBlockSize) - 0x1000;
+
+ LOG_DEBUG(Service_FS, "RomFS offset: 0x%08X", romfs_offset);
+ LOG_DEBUG(Service_FS, "RomFS size: 0x%08X", romfs_size);
+
+ if (file.GetSize() < romfs_offset + romfs_size)
+ return Loader::ResultStatus::Error;
+
+ // We reopen the file, to allow its position to be independent from file's
+ romfs_file = std::make_shared<FileUtil::IOFile>(filepath, "rb");
+ if (!romfs_file->IsOpen())
+ return Loader::ResultStatus::Error;
+
+ offset = romfs_offset;
+ size = romfs_size;
+
+ return Loader::ResultStatus::Success;
+}
+
+Loader::ResultStatus NCCHContainer::ReadOverrideRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
+ u64& offset, u64& size) {
+ // Check for RomFS overrides
+ std::string split_filepath = filepath + ".romfs";
+ if (FileUtil::Exists(split_filepath)) {
+ romfs_file = std::make_shared<FileUtil::IOFile>(split_filepath, "rb");
+ if (romfs_file->IsOpen()) {
+ LOG_WARNING(Service_FS, "File %s overriding built-in RomFS", split_filepath.c_str());
+ offset = 0;
+ size = romfs_file->GetSize();
+ return Loader::ResultStatus::Success;
+ }
+ }
+
+ return Loader::ResultStatus::ErrorNotUsed;
+}
+
+Loader::ResultStatus NCCHContainer::ReadProgramId(u64_le& program_id) {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return result;
+
+ if (!has_header)
+ return Loader::ResultStatus::ErrorNotUsed;
+
+ program_id = ncch_header.program_id;
+ return Loader::ResultStatus::Success;
+}
+
+bool NCCHContainer::HasExeFS() {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return false;
+
+ return has_exefs;
+}
+
+bool NCCHContainer::HasRomFS() {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return false;
+
+ return has_romfs;
+}
+
+bool NCCHContainer::HasExHeader() {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return false;
+
+ return has_exheader;
+}
+
+} // namespace FileSys
diff --git a/src/core/file_sys/ncch_container.h b/src/core/file_sys/ncch_container.h
new file mode 100644
index 000000000..2cc9d13dc
--- /dev/null
+++ b/src/core/file_sys/ncch_container.h
@@ -0,0 +1,274 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <cstddef>
+#include <memory>
+#include <string>
+#include <vector>
+#include "common/bit_field.h"
+#include "common/common_types.h"
+#include "common/file_util.h"
+#include "common/swap.h"
+#include "core/core.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+/// NCCH header (Note: "NCCH" appears to be a publicly unknown acronym)
+
+struct NCCH_Header {
+ u8 signature[0x100];
+ u32_le magic;
+ u32_le content_size;
+ u8 partition_id[8];
+ u16_le maker_code;
+ u16_le version;
+ u8 reserved_0[4];
+ u64_le program_id;
+ u8 reserved_1[0x10];
+ u8 logo_region_hash[0x20];
+ u8 product_code[0x10];
+ u8 extended_header_hash[0x20];
+ u32_le extended_header_size;
+ u8 reserved_2[4];
+ u8 flags[8];
+ u32_le plain_region_offset;
+ u32_le plain_region_size;
+ u32_le logo_region_offset;
+ u32_le logo_region_size;
+ u32_le exefs_offset;
+ u32_le exefs_size;
+ u32_le exefs_hash_region_size;
+ u8 reserved_3[4];
+ u32_le romfs_offset;
+ u32_le romfs_size;
+ u32_le romfs_hash_region_size;
+ u8 reserved_4[4];
+ u8 exefs_super_block_hash[0x20];
+ u8 romfs_super_block_hash[0x20];
+};
+
+static_assert(sizeof(NCCH_Header) == 0x200, "NCCH header structure size is wrong");
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// ExeFS (executable file system) headers
+
+struct ExeFs_SectionHeader {
+ char name[8];
+ u32 offset;
+ u32 size;
+};
+
+struct ExeFs_Header {
+ ExeFs_SectionHeader section[8];
+ u8 reserved[0x80];
+ u8 hashes[8][0x20];
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// ExHeader (executable file system header) headers
+
+struct ExHeader_SystemInfoFlags {
+ u8 reserved[5];
+ u8 flag;
+ u8 remaster_version[2];
+};
+
+struct ExHeader_CodeSegmentInfo {
+ u32 address;
+ u32 num_max_pages;
+ u32 code_size;
+};
+
+struct ExHeader_CodeSetInfo {
+ u8 name[8];
+ ExHeader_SystemInfoFlags flags;
+ ExHeader_CodeSegmentInfo text;
+ u32 stack_size;
+ ExHeader_CodeSegmentInfo ro;
+ u8 reserved[4];
+ ExHeader_CodeSegmentInfo data;
+ u32 bss_size;
+};
+
+struct ExHeader_DependencyList {
+ u8 program_id[0x30][8];
+};
+
+struct ExHeader_SystemInfo {
+ u64 save_data_size;
+ u64_le jump_id;
+ u8 reserved_2[0x30];
+};
+
+struct ExHeader_StorageInfo {
+ u8 ext_save_data_id[8];
+ u8 system_save_data_id[8];
+ u8 reserved[8];
+ u8 access_info[7];
+ u8 other_attributes;
+};
+
+struct ExHeader_ARM11_SystemLocalCaps {
+ u64_le program_id;
+ u32_le core_version;
+ u8 reserved_flags[2];
+ union {
+ u8 flags0;
+ BitField<0, 2, u8> ideal_processor;
+ BitField<2, 2, u8> affinity_mask;
+ BitField<4, 4, u8> system_mode;
+ };
+ u8 priority;
+ u8 resource_limit_descriptor[0x10][2];
+ ExHeader_StorageInfo storage_info;
+ u8 service_access_control[0x20][8];
+ u8 ex_service_access_control[0x2][8];
+ u8 reserved[0xf];
+ u8 resource_limit_category;
+};
+
+struct ExHeader_ARM11_KernelCaps {
+ u32_le descriptors[28];
+ u8 reserved[0x10];
+};
+
+struct ExHeader_ARM9_AccessControl {
+ u8 descriptors[15];
+ u8 descversion;
+};
+
+struct ExHeader_Header {
+ ExHeader_CodeSetInfo codeset_info;
+ ExHeader_DependencyList dependency_list;
+ ExHeader_SystemInfo system_info;
+ ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
+ ExHeader_ARM11_KernelCaps arm11_kernel_caps;
+ ExHeader_ARM9_AccessControl arm9_access_control;
+ struct {
+ u8 signature[0x100];
+ u8 ncch_public_key_modulus[0x100];
+ ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
+ ExHeader_ARM11_KernelCaps arm11_kernel_caps;
+ ExHeader_ARM9_AccessControl arm9_access_control;
+ } access_desc;
+};
+
+static_assert(sizeof(ExHeader_Header) == 0x800, "ExHeader structure size is wrong");
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+/**
+ * Helper which implements an interface to deal with NCCH containers which can
+ * contain ExeFS archives or RomFS archives for games or other applications.
+ */
+class NCCHContainer {
+public:
+ NCCHContainer(const std::string& filepath);
+ NCCHContainer() {}
+
+ Loader::ResultStatus OpenFile(const std::string& filepath);
+
+ /**
+ * Ensure ExeFS and exheader is loaded and ready for reading sections
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus Load();
+
+ /**
+ * Attempt to find overridden sections for the NCCH and mark the container as tainted
+ * if any are found.
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus LoadOverrides();
+
+ /**
+ * Reads an application ExeFS section of an NCCH file (e.g. .code, .logo, etc.)
+ * @param name Name of section to read out of NCCH file
+ * @param buffer Vector to read data into
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus LoadSectionExeFS(const char* name, std::vector<u8>& buffer);
+
+ /**
+ * Reads an application ExeFS section from external files instead of an NCCH file,
+ * (e.g. code.bin, logo.bcma.lz, icon.icn, banner.bnr)
+ * @param name Name of section to read from external files
+ * @param buffer Vector to read data into
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus LoadOverrideExeFSSection(const char* name, std::vector<u8>& buffer);
+
+ /**
+ * Get the RomFS of the NCCH container
+ * Since the RomFS can be huge, we return a file reference instead of copying to a buffer
+ * @param romfs_file The file containing the RomFS
+ * @param offset The offset the romfs begins on
+ * @param size The size of the romfs
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
+ u64& size);
+
+ /**
+ * Get the override RomFS of the NCCH container
+ * Since the RomFS can be huge, we return a file reference instead of copying to a buffer
+ * @param romfs_file The file containing the RomFS
+ * @param offset The offset the romfs begins on
+ * @param size The size of the romfs
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus ReadOverrideRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
+ u64& offset, u64& size);
+
+ /**
+ * Get the Program ID of the NCCH container
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus ReadProgramId(u64_le& program_id);
+
+ /**
+ * Checks whether the NCCH container contains an ExeFS
+ * @return bool check result
+ */
+ bool HasExeFS();
+
+ /**
+ * Checks whether the NCCH container contains a RomFS
+ * @return bool check result
+ */
+ bool HasRomFS();
+
+ /**
+ * Checks whether the NCCH container contains an ExHeader
+ * @return bool check result
+ */
+ bool HasExHeader();
+
+ NCCH_Header ncch_header;
+ ExeFs_Header exefs_header;
+ ExHeader_Header exheader_header;
+
+private:
+ bool has_header = false;
+ bool has_exheader = false;
+ bool has_exefs = false;
+ bool has_romfs = false;
+
+ bool is_tainted = false; // Are there parts of this container being overridden?
+ bool is_loaded = false;
+ bool is_compressed = false;
+
+ u32 ncch_offset = 0; // Offset to NCCH header, can be 0 or after NCSD header
+ u32 exefs_offset = 0;
+
+ std::string filepath;
+ FileUtil::IOFile file;
+ FileUtil::IOFile exefs_file;
+};
+
+} // namespace FileSys
diff --git a/src/core/file_sys/savedata_archive.cpp b/src/core/file_sys/savedata_archive.cpp
index f540c4a93..f8f811ba0 100644
--- a/src/core/file_sys/savedata_archive.cpp
+++ b/src/core/file_sys/savedata_archive.cpp
@@ -106,7 +106,25 @@ ResultCode SaveDataArchive::DeleteFile(const Path& path) const {
}
ResultCode SaveDataArchive::RenameFile(const Path& src_path, const Path& dest_path) const {
- if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) {
+ const PathParser path_parser_src(src_path);
+
+ // TODO: Verify these return codes with HW
+ if (!path_parser_src.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const PathParser path_parser_dest(dest_path);
+
+ if (!path_parser_dest.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
+ const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
+
+ if (FileUtil::Rename(src_path_full, dest_path_full)) {
return RESULT_SUCCESS;
}
@@ -247,8 +265,27 @@ ResultCode SaveDataArchive::CreateDirectory(const Path& path) const {
}
ResultCode SaveDataArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const {
- if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString()))
+ const PathParser path_parser_src(src_path);
+
+ // TODO: Verify these return codes with HW
+ if (!path_parser_src.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const PathParser path_parser_dest(dest_path);
+
+ if (!path_parser_dest.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
+ const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
+
+ if (FileUtil::Rename(src_path_full, dest_path_full)) {
return RESULT_SUCCESS;
+ }
// TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't
// exist or similar. Verify.
diff --git a/src/core/file_sys/title_metadata.cpp b/src/core/file_sys/title_metadata.cpp
new file mode 100644
index 000000000..1ef8840a0
--- /dev/null
+++ b/src/core/file_sys/title_metadata.cpp
@@ -0,0 +1,212 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <cinttypes>
+#include <cryptopp/sha.h>
+#include "common/alignment.h"
+#include "common/file_util.h"
+#include "common/logging/log.h"
+#include "core/file_sys/title_metadata.h"
+#include "core/loader/loader.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+static u32 GetSignatureSize(u32 signature_type) {
+ switch (signature_type) {
+ case Rsa4096Sha1:
+ case Rsa4096Sha256:
+ return 0x200;
+
+ case Rsa2048Sha1:
+ case Rsa2048Sha256:
+ return 0x100;
+
+ case EllipticSha1:
+ case EcdsaSha256:
+ return 0x3C;
+ }
+}
+
+Loader::ResultStatus TitleMetadata::Load() {
+ FileUtil::IOFile file(filepath, "rb");
+ if (!file.IsOpen())
+ return Loader::ResultStatus::Error;
+
+ if (!file.ReadBytes(&signature_type, sizeof(u32_be)))
+ return Loader::ResultStatus::Error;
+
+ // Signature lengths are variable, and the body follows the signature
+ u32 signature_size = GetSignatureSize(signature_type);
+
+ tmd_signature.resize(signature_size);
+ if (!file.ReadBytes(&tmd_signature[0], signature_size))
+ return Loader::ResultStatus::Error;
+
+ // The TMD body start position is rounded to the nearest 0x40 after the signature
+ size_t body_start = Common::AlignUp(signature_size + sizeof(u32), 0x40);
+ file.Seek(body_start, SEEK_SET);
+
+ // Read our TMD body, then load the amount of ContentChunks specified
+ if (file.ReadBytes(&tmd_body, sizeof(TitleMetadata::Body)) != sizeof(TitleMetadata::Body))
+ return Loader::ResultStatus::Error;
+
+ for (u16 i = 0; i < tmd_body.content_count; i++) {
+ ContentChunk chunk;
+ if (file.ReadBytes(&chunk, sizeof(ContentChunk)) == sizeof(ContentChunk)) {
+ tmd_chunks.push_back(chunk);
+ } else {
+ LOG_ERROR(Service_FS, "Malformed TMD %s, failed to load content chunk index %u!",
+ filepath.c_str(), i);
+ return Loader::ResultStatus::ErrorInvalidFormat;
+ }
+ }
+
+ return Loader::ResultStatus::Success;
+}
+
+Loader::ResultStatus TitleMetadata::Save() {
+ FileUtil::IOFile file(filepath, "wb");
+ if (!file.IsOpen())
+ return Loader::ResultStatus::Error;
+
+ if (!file.WriteBytes(&signature_type, sizeof(u32_be)))
+ return Loader::ResultStatus::Error;
+
+ // Signature lengths are variable, and the body follows the signature
+ u32 signature_size = GetSignatureSize(signature_type);
+
+ if (!file.WriteBytes(tmd_signature.data(), signature_size))
+ return Loader::ResultStatus::Error;
+
+ // The TMD body start position is rounded to the nearest 0x40 after the signature
+ size_t body_start = Common::AlignUp(signature_size + sizeof(u32), 0x40);
+ file.Seek(body_start, SEEK_SET);
+
+ // Update our TMD body values and hashes
+ tmd_body.content_count = static_cast<u16>(tmd_chunks.size());
+
+ // TODO(shinyquagsire23): Do TMDs with more than one contentinfo exist?
+ // For now we'll just adjust the first index to hold all content chunks
+ // and ensure that no further content info data exists.
+ tmd_body.contentinfo = {};
+ tmd_body.contentinfo[0].index = 0;
+ tmd_body.contentinfo[0].command_count = static_cast<u16>(tmd_chunks.size());
+
+ CryptoPP::SHA256 chunk_hash;
+ for (u16 i = 0; i < tmd_body.content_count; i++) {
+ chunk_hash.Update(reinterpret_cast<u8*>(&tmd_chunks[i]), sizeof(ContentChunk));
+ }
+ chunk_hash.Final(tmd_body.contentinfo[0].hash.data());
+
+ CryptoPP::SHA256 contentinfo_hash;
+ for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) {
+ chunk_hash.Update(reinterpret_cast<u8*>(&tmd_body.contentinfo[i]), sizeof(ContentInfo));
+ }
+ chunk_hash.Final(tmd_body.contentinfo_hash.data());
+
+ // Write our TMD body, then write each of our ContentChunks
+ if (file.WriteBytes(&tmd_body, sizeof(TitleMetadata::Body)) != sizeof(TitleMetadata::Body))
+ return Loader::ResultStatus::Error;
+
+ for (u16 i = 0; i < tmd_body.content_count; i++) {
+ ContentChunk chunk = tmd_chunks[i];
+ if (file.WriteBytes(&chunk, sizeof(ContentChunk)) != sizeof(ContentChunk))
+ return Loader::ResultStatus::Error;
+ }
+
+ return Loader::ResultStatus::Success;
+}
+
+u64 TitleMetadata::GetTitleID() const {
+ return tmd_body.title_id;
+}
+
+u32 TitleMetadata::GetTitleType() const {
+ return tmd_body.title_type;
+}
+
+u16 TitleMetadata::GetTitleVersion() const {
+ return tmd_body.title_version;
+}
+
+u64 TitleMetadata::GetSystemVersion() const {
+ return tmd_body.system_version;
+}
+
+size_t TitleMetadata::GetContentCount() const {
+ return tmd_chunks.size();
+}
+
+u32 TitleMetadata::GetBootContentID() const {
+ return tmd_chunks[TMDContentIndex::Main].id;
+}
+
+u32 TitleMetadata::GetManualContentID() const {
+ return tmd_chunks[TMDContentIndex::Manual].id;
+}
+
+u32 TitleMetadata::GetDLPContentID() const {
+ return tmd_chunks[TMDContentIndex::DLP].id;
+}
+
+void TitleMetadata::SetTitleID(u64 title_id) {
+ tmd_body.title_id = title_id;
+}
+
+void TitleMetadata::SetTitleType(u32 type) {
+ tmd_body.title_type = type;
+}
+
+void TitleMetadata::SetTitleVersion(u16 version) {
+ tmd_body.title_version = version;
+}
+
+void TitleMetadata::SetSystemVersion(u64 version) {
+ tmd_body.system_version = version;
+}
+
+void TitleMetadata::AddContentChunk(const ContentChunk& chunk) {
+ tmd_chunks.push_back(chunk);
+}
+
+void TitleMetadata::Print() const {
+ LOG_DEBUG(Service_FS, "%s - %u chunks", filepath.c_str(),
+ static_cast<u32>(tmd_body.content_count));
+
+ // Content info describes ranges of content chunks
+ LOG_DEBUG(Service_FS, "Content info:");
+ for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) {
+ if (tmd_body.contentinfo[i].command_count == 0)
+ break;
+
+ LOG_DEBUG(Service_FS, " Index %04X, Command Count %04X",
+ static_cast<u32>(tmd_body.contentinfo[i].index),
+ static_cast<u32>(tmd_body.contentinfo[i].command_count));
+ }
+
+ // For each content info, print their content chunk range
+ for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) {
+ u16 index = static_cast<u16>(tmd_body.contentinfo[i].index);
+ u16 count = static_cast<u16>(tmd_body.contentinfo[i].command_count);
+
+ if (count == 0)
+ continue;
+
+ LOG_DEBUG(Service_FS, "Content chunks for content info index %zu:", i);
+ for (u16 j = index; j < index + count; j++) {
+ // Don't attempt to print content we don't have
+ if (j > tmd_body.content_count)
+ break;
+
+ const ContentChunk& chunk = tmd_chunks[j];
+ LOG_DEBUG(Service_FS, " ID %08X, Index %04X, Type %04x, Size %016" PRIX64,
+ static_cast<u32>(chunk.id), static_cast<u32>(chunk.index),
+ static_cast<u32>(chunk.type), static_cast<u64>(chunk.size));
+ }
+ }
+}
+} // namespace FileSys
diff --git a/src/core/file_sys/title_metadata.h b/src/core/file_sys/title_metadata.h
new file mode 100644
index 000000000..1fc157bf3
--- /dev/null
+++ b/src/core/file_sys/title_metadata.h
@@ -0,0 +1,125 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <string>
+#include <vector>
+#include "common/common_types.h"
+#include "common/swap.h"
+
+namespace Loader {
+enum class ResultStatus;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+enum TMDSignatureType : u32 {
+ Rsa4096Sha1 = 0x10000,
+ Rsa2048Sha1 = 0x10001,
+ EllipticSha1 = 0x10002,
+ Rsa4096Sha256 = 0x10003,
+ Rsa2048Sha256 = 0x10004,
+ EcdsaSha256 = 0x10005
+};
+
+enum TMDContentTypeFlag : u16 {
+ Encrypted = 1 << 1,
+ Disc = 1 << 2,
+ CFM = 1 << 3,
+ Optional = 1 << 14,
+ Shared = 1 << 15
+};
+
+/**
+ * Helper which implements an interface to read and write Title Metadata (TMD) files.
+ * If a file path is provided and the file exists, it can be parsed and used, otherwise
+ * it must be created. The TMD file can then be interpreted, modified and/or saved.
+ */
+class TitleMetadata {
+public:
+ struct ContentChunk {
+ u32_be id;
+ u16_be index;
+ u16_be type;
+ u64_be size;
+ std::array<u8, 0x20> hash;
+ };
+
+ static_assert(sizeof(ContentChunk) == 0x30, "TMD ContentChunk structure size is wrong");
+
+ struct ContentInfo {
+ u16_be index;
+ u16_be command_count;
+ std::array<u8, 0x20> hash;
+ };
+
+ static_assert(sizeof(ContentInfo) == 0x24, "TMD ContentInfo structure size is wrong");
+
+#pragma pack(push, 1)
+
+ struct Body {
+ std::array<u8, 0x40> issuer;
+ u8 version;
+ u8 ca_crl_version;
+ u8 signer_crl_version;
+ u8 reserved;
+ u64_be system_version;
+ u64_be title_id;
+ u32_be title_type;
+ u16_be group_id;
+ u32_be savedata_size;
+ u32_be srl_private_savedata_size;
+ std::array<u8, 4> reserved_2;
+ u8 srl_flag;
+ std::array<u8, 0x31> reserved_3;
+ u32_be access_rights;
+ u16_be title_version;
+ u16_be content_count;
+ u16_be boot_content;
+ std::array<u8, 2> reserved_4;
+ std::array<u8, 0x20> contentinfo_hash;
+ std::array<ContentInfo, 64> contentinfo;
+ };
+
+ static_assert(sizeof(Body) == 0x9C4, "TMD body structure size is wrong");
+
+#pragma pack(pop)
+
+ explicit TitleMetadata(std::string& path) : filepath(std::move(path)) {}
+ Loader::ResultStatus Load();
+ Loader::ResultStatus Save();
+
+ u64 GetTitleID() const;
+ u32 GetTitleType() const;
+ u16 GetTitleVersion() const;
+ u64 GetSystemVersion() const;
+ size_t GetContentCount() const;
+ u32 GetBootContentID() const;
+ u32 GetManualContentID() const;
+ u32 GetDLPContentID() const;
+
+ void SetTitleID(u64 title_id);
+ void SetTitleType(u32 type);
+ void SetTitleVersion(u16 version);
+ void SetSystemVersion(u64 version);
+ void AddContentChunk(const ContentChunk& chunk);
+
+ void Print() const;
+
+private:
+ enum TMDContentIndex { Main = 0, Manual = 1, DLP = 2 };
+
+ Body tmd_body;
+ u32_be signature_type;
+ std::vector<u8> tmd_signature;
+ std::vector<ContentChunk> tmd_chunks;
+
+ std::string filepath;
+};
+
+} // namespace FileSys
diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp
index 4f7d54a33..e67394177 100644
--- a/src/core/frontend/emu_window.cpp
+++ b/src/core/frontend/emu_window.cpp
@@ -2,14 +2,55 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <algorithm>
#include <cmath>
-#include "common/assert.h"
-#include "core/3ds.h"
-#include "core/core.h"
+#include <mutex>
#include "core/frontend/emu_window.h"
+#include "core/frontend/input.h"
#include "core/settings.h"
+class EmuWindow::TouchState : public Input::Factory<Input::TouchDevice>,
+ public std::enable_shared_from_this<TouchState> {
+public:
+ std::unique_ptr<Input::TouchDevice> Create(const Common::ParamPackage&) override {
+ return std::make_unique<Device>(shared_from_this());
+ }
+
+ std::mutex mutex;
+
+ bool touch_pressed = false; ///< True if touchpad area is currently pressed, otherwise false
+
+ float touch_x = 0.0f; ///< Touchpad X-position
+ float touch_y = 0.0f; ///< Touchpad Y-position
+
+private:
+ class Device : public Input::TouchDevice {
+ public:
+ explicit Device(std::weak_ptr<TouchState>&& touch_state) : touch_state(touch_state) {}
+ std::tuple<float, float, bool> GetStatus() const override {
+ if (auto state = touch_state.lock()) {
+ std::lock_guard<std::mutex> guard(state->mutex);
+ return std::make_tuple(state->touch_x, state->touch_y, state->touch_pressed);
+ }
+ return std::make_tuple(0.0f, 0.0f, false);
+ }
+
+ private:
+ std::weak_ptr<TouchState> touch_state;
+ };
+};
+
+EmuWindow::EmuWindow() {
+ // TODO: Find a better place to set this.
+ config.min_client_area_size = std::make_pair(400u, 480u);
+ active_config = config;
+ touch_state = std::make_shared<TouchState>();
+ Input::RegisterFactory<Input::TouchDevice>("emu_window", touch_state);
+}
+
+EmuWindow::~EmuWindow() {
+ Input::UnregisterFactory<Input::TouchDevice>("emu_window");
+}
+
/**
* Check if the given x/y coordinates are within the touchpad specified by the framebuffer layout
* @param layout FramebufferLayout object describing the framebuffer size and screen positions
@@ -38,22 +79,26 @@ void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) {
if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y))
return;
- touch_x = Core::kScreenBottomWidth * (framebuffer_x - framebuffer_layout.bottom_screen.left) /
- (framebuffer_layout.bottom_screen.right - framebuffer_layout.bottom_screen.left);
- touch_y = Core::kScreenBottomHeight * (framebuffer_y - framebuffer_layout.bottom_screen.top) /
- (framebuffer_layout.bottom_screen.bottom - framebuffer_layout.bottom_screen.top);
+ std::lock_guard<std::mutex> guard(touch_state->mutex);
+ touch_state->touch_x =
+ static_cast<float>(framebuffer_x - framebuffer_layout.bottom_screen.left) /
+ (framebuffer_layout.bottom_screen.right - framebuffer_layout.bottom_screen.left);
+ touch_state->touch_y =
+ static_cast<float>(framebuffer_y - framebuffer_layout.bottom_screen.top) /
+ (framebuffer_layout.bottom_screen.bottom - framebuffer_layout.bottom_screen.top);
- touch_pressed = true;
+ touch_state->touch_pressed = true;
}
void EmuWindow::TouchReleased() {
- touch_pressed = false;
- touch_x = 0;
- touch_y = 0;
+ std::lock_guard<std::mutex> guard(touch_state->mutex);
+ touch_state->touch_pressed = false;
+ touch_state->touch_x = 0;
+ touch_state->touch_y = 0;
}
void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) {
- if (!touch_pressed)
+ if (!touch_state->touch_pressed)
return;
if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y))
@@ -62,29 +107,6 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) {
TouchPressed(framebuffer_x, framebuffer_y);
}
-void EmuWindow::AccelerometerChanged(float x, float y, float z) {
- constexpr float coef = 512;
-
- std::lock_guard<std::mutex> lock(accel_mutex);
-
- // TODO(wwylele): do a time stretch as it in GyroscopeChanged
- // The time stretch formula should be like
- // stretched_vector = (raw_vector - gravity) * stretch_ratio + gravity
- accel_x = static_cast<s16>(x * coef);
- accel_y = static_cast<s16>(y * coef);
- accel_z = static_cast<s16>(z * coef);
-}
-
-void EmuWindow::GyroscopeChanged(float x, float y, float z) {
- constexpr float FULL_FPS = 60;
- float coef = GetGyroscopeRawToDpsCoefficient();
- float stretch = Core::System::GetInstance().perf_stats.GetLastFrameTimeScale();
- std::lock_guard<std::mutex> lock(gyro_mutex);
- gyro_x = static_cast<s16>(x * coef * stretch);
- gyro_y = static_cast<s16>(y * coef * stretch);
- gyro_z = static_cast<s16>(z * coef * stretch);
-}
-
void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) {
Layout::FramebufferLayout layout;
if (Settings::values.custom_layout == true) {
@@ -97,6 +119,9 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height)
case Settings::LayoutOption::LargeScreen:
layout = Layout::LargeFrameLayout(width, height, Settings::values.swap_screen);
break;
+ case Settings::LayoutOption::SideScreen:
+ layout = Layout::SideFrameLayout(width, height, Settings::values.swap_screen);
+ break;
case Settings::LayoutOption::Default:
default:
layout = Layout::DefaultFrameLayout(width, height, Settings::values.swap_screen);
diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h
index 9414123a4..c10dee51b 100644
--- a/src/core/frontend/emu_window.h
+++ b/src/core/frontend/emu_window.h
@@ -4,11 +4,10 @@
#pragma once
-#include <mutex>
+#include <memory>
#include <tuple>
#include <utility>
#include "common/common_types.h"
-#include "common/math_util.h"
#include "core/frontend/framebuffer_layout.h"
/**
@@ -69,84 +68,6 @@ public:
void TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y);
/**
- * Signal accelerometer state has changed.
- * @param x X-axis accelerometer value
- * @param y Y-axis accelerometer value
- * @param z Z-axis accelerometer value
- * @note all values are in unit of g (gravitational acceleration).
- * e.g. x = 1.0 means 9.8m/s^2 in x direction.
- * @see GetAccelerometerState for axis explanation.
- */
- void AccelerometerChanged(float x, float y, float z);
-
- /**
- * Signal gyroscope state has changed.
- * @param x X-axis accelerometer value
- * @param y Y-axis accelerometer value
- * @param z Z-axis accelerometer value
- * @note all values are in deg/sec.
- * @see GetGyroscopeState for axis explanation.
- */
- void GyroscopeChanged(float x, float y, float z);
-
- /**
- * Gets the current touch screen state (touch X/Y coordinates and whether or not it is pressed).
- * @note This should be called by the core emu thread to get a state set by the window thread.
- * @todo Fix this function to be thread-safe.
- * @return std::tuple of (x, y, pressed) where `x` and `y` are the touch coordinates and
- * `pressed` is true if the touch screen is currently being pressed
- */
- std::tuple<u16, u16, bool> GetTouchState() const {
- return std::make_tuple(touch_x, touch_y, touch_pressed);
- }
-
- /**
- * Gets the current accelerometer state (acceleration along each three axis).
- * Axis explained:
- * +x is the same direction as LEFT on D-pad.
- * +y is normal to the touch screen, pointing outward.
- * +z is the same direction as UP on D-pad.
- * Units:
- * 1 unit of return value = 1/512 g (measured by hw test),
- * where g is the gravitational acceleration (9.8 m/sec2).
- * @note This should be called by the core emu thread to get a state set by the window thread.
- * @return std::tuple of (x, y, z)
- */
- std::tuple<s16, s16, s16> GetAccelerometerState() {
- std::lock_guard<std::mutex> lock(accel_mutex);
- return std::make_tuple(accel_x, accel_y, accel_z);
- }
-
- /**
- * Gets the current gyroscope state (angular rates about each three axis).
- * Axis explained:
- * +x is the same direction as LEFT on D-pad.
- * +y is normal to the touch screen, pointing outward.
- * +z is the same direction as UP on D-pad.
- * Orientation is determined by right-hand rule.
- * Units:
- * 1 unit of return value = (1/coef) deg/sec,
- * where coef is the return value of GetGyroscopeRawToDpsCoefficient().
- * @note This should be called by the core emu thread to get a state set by the window thread.
- * @return std::tuple of (x, y, z)
- */
- std::tuple<s16, s16, s16> GetGyroscopeState() {
- std::lock_guard<std::mutex> lock(gyro_mutex);
- return std::make_tuple(gyro_x, gyro_y, gyro_z);
- }
-
- /**
- * Gets the coefficient for units conversion of gyroscope state.
- * The conversion formula is r = coefficient * v,
- * where v is angular rate in deg/sec,
- * and r is the gyroscope state.
- * @return float-type coefficient
- */
- f32 GetGyroscopeRawToDpsCoefficient() const {
- return 14.375f; // taken from hw test, and gyroscope's document
- }
-
- /**
* Returns currently active configuration.
* @note Accesses to the returned object need not be consistent because it may be modified in
* another thread
@@ -180,21 +101,8 @@ public:
void UpdateCurrentFramebufferLayout(unsigned width, unsigned height);
protected:
- EmuWindow() {
- // TODO: Find a better place to set this.
- config.min_client_area_size = std::make_pair(400u, 480u);
- active_config = config;
- touch_x = 0;
- touch_y = 0;
- touch_pressed = false;
- accel_x = 0;
- accel_y = -512;
- accel_z = 0;
- gyro_x = 0;
- gyro_y = 0;
- gyro_z = 0;
- }
- virtual ~EmuWindow() {}
+ EmuWindow();
+ virtual ~EmuWindow();
/**
* Processes any pending configuration changes from the last SetConfig call.
@@ -250,20 +158,8 @@ private:
/// ProcessConfigurationChanges)
WindowConfig active_config; ///< Internal active configuration
- bool touch_pressed; ///< True if touchpad area is currently pressed, otherwise false
-
- u16 touch_x; ///< Touchpad X-position in native 3DS pixel coordinates (0-320)
- u16 touch_y; ///< Touchpad Y-position in native 3DS pixel coordinates (0-240)
-
- std::mutex accel_mutex;
- s16 accel_x; ///< Accelerometer X-axis value in native 3DS units
- s16 accel_y; ///< Accelerometer Y-axis value in native 3DS units
- s16 accel_z; ///< Accelerometer Z-axis value in native 3DS units
-
- std::mutex gyro_mutex;
- s16 gyro_x; ///< Gyroscope X-axis value in native 3DS units
- s16 gyro_y; ///< Gyroscope Y-axis value in native 3DS units
- s16 gyro_z; ///< Gyroscope Z-axis value in native 3DS units
+ class TouchState;
+ std::shared_ptr<TouchState> touch_state;
/**
* Clip the provided coordinates to be inside the touchscreen area.
diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp
index d2d02f9ff..e9f778fcb 100644
--- a/src/core/frontend/framebuffer_layout.cpp
+++ b/src/core/frontend/framebuffer_layout.cpp
@@ -141,6 +141,40 @@ FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool swapped
return res;
}
+FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool swapped) {
+ ASSERT(width > 0);
+ ASSERT(height > 0);
+
+ FramebufferLayout res{width, height, true, true, {}, {}};
+ // Aspect ratio of both screens side by side
+ const float emulation_aspect_ratio = static_cast<float>(Core::kScreenTopHeight) /
+ (Core::kScreenTopWidth + Core::kScreenBottomWidth);
+ float window_aspect_ratio = static_cast<float>(height) / width;
+ MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height};
+ // Find largest Rectangle that can fit in the window size with the given aspect ratio
+ MathUtil::Rectangle<unsigned> screen_rect =
+ maxRectangle(screen_window_area, emulation_aspect_ratio);
+ // Find sizes of top and bottom screen
+ MathUtil::Rectangle<unsigned> top_screen = maxRectangle(screen_rect, TOP_SCREEN_ASPECT_RATIO);
+ MathUtil::Rectangle<unsigned> bot_screen = maxRectangle(screen_rect, BOT_SCREEN_ASPECT_RATIO);
+
+ if (window_aspect_ratio < emulation_aspect_ratio) {
+ // Apply borders to the left and right sides of the window.
+ u32 shift_horizontal = (screen_window_area.GetWidth() - screen_rect.GetWidth()) / 2;
+ top_screen = top_screen.TranslateX(shift_horizontal);
+ bot_screen = bot_screen.TranslateX(shift_horizontal);
+ } else {
+ // Window is narrower than the emulation content => apply borders to the top and bottom
+ u32 shift_vertical = (screen_window_area.GetHeight() - screen_rect.GetHeight()) / 2;
+ top_screen = top_screen.TranslateY(shift_vertical);
+ bot_screen = bot_screen.TranslateY(shift_vertical);
+ }
+ // Move the top screen to the right if we are swapped.
+ res.top_screen = swapped ? top_screen.TranslateX(bot_screen.GetWidth()) : top_screen;
+ res.bottom_screen = swapped ? bot_screen : bot_screen.TranslateX(top_screen.GetWidth());
+ return res;
+}
+
FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) {
ASSERT(width > 0);
ASSERT(height > 0);
@@ -158,4 +192,4 @@ FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) {
res.bottom_screen = bot_screen;
return res;
}
-}
+} // namespace Layout
diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h
index 9a7738969..4983cf103 100644
--- a/src/core/frontend/framebuffer_layout.h
+++ b/src/core/frontend/framebuffer_layout.h
@@ -54,6 +54,17 @@ FramebufferLayout SingleFrameLayout(unsigned width, unsigned height, bool is_swa
FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool is_swapped);
/**
+* Factory method for constructing a Frame with the Top screen and bottom
+* screen side by side
+* This is useful for devices with small screens, like the GPDWin
+* @param width Window framebuffer width in pixels
+* @param height Window framebuffer height in pixels
+* @param is_swapped if true, the bottom screen will be the left display
+* @return Newly created FramebufferLayout object with default screen regions initialized
+*/
+FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool is_swapped);
+
+/**
* Factory method for constructing a custom FramebufferLayout
* @param width Window framebuffer width in pixels
* @param height Window framebuffer height in pixels
diff --git a/src/core/frontend/input.h b/src/core/frontend/input.h
index 0a5713dc0..8c256beb5 100644
--- a/src/core/frontend/input.h
+++ b/src/core/frontend/input.h
@@ -11,6 +11,7 @@
#include <utility>
#include "common/logging/log.h"
#include "common/param_package.h"
+#include "common/vector_math.h"
namespace Input {
@@ -107,4 +108,28 @@ using ButtonDevice = InputDevice<bool>;
*/
using AnalogDevice = InputDevice<std::tuple<float, float>>;
+/**
+ * A motion device is an input device that returns a tuple of accelerometer state vector and
+ * gyroscope state vector.
+ *
+ * For both vectors:
+ * x+ is the same direction as LEFT on D-pad.
+ * y+ is normal to the touch screen, pointing outward.
+ * z+ is the same direction as UP on D-pad.
+ *
+ * For accelerometer state vector
+ * Units: g (gravitational acceleration)
+ *
+ * For gyroscope state vector:
+ * Orientation is determined by right-hand rule.
+ * Units: deg/sec
+ */
+using MotionDevice = InputDevice<std::tuple<Math::Vec3<float>, Math::Vec3<float>>>;
+
+/**
+ * A touch device is an input device that returns a tuple of two floats and a bool. The floats are
+ * x and y coordinates in the range 0.0 - 1.0, and the bool indicates whether it is pressed.
+ */
+using TouchDevice = InputDevice<std::tuple<float, float, bool>>;
+
} // namespace Input
diff --git a/src/core/frontend/motion_emu.cpp b/src/core/frontend/motion_emu.cpp
deleted file mode 100644
index 9a5b3185d..000000000
--- a/src/core/frontend/motion_emu.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2016 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "common/math_util.h"
-#include "common/quaternion.h"
-#include "core/frontend/emu_window.h"
-#include "core/frontend/motion_emu.h"
-
-namespace Motion {
-
-static constexpr int update_millisecond = 100;
-static constexpr auto update_duration =
- std::chrono::duration_cast<std::chrono::steady_clock::duration>(
- std::chrono::milliseconds(update_millisecond));
-
-MotionEmu::MotionEmu(EmuWindow& emu_window)
- : motion_emu_thread(&MotionEmu::MotionEmuThread, this, std::ref(emu_window)) {}
-
-MotionEmu::~MotionEmu() {
- if (motion_emu_thread.joinable()) {
- shutdown_event.Set();
- motion_emu_thread.join();
- }
-}
-
-void MotionEmu::MotionEmuThread(EmuWindow& emu_window) {
- auto update_time = std::chrono::steady_clock::now();
- Math::Quaternion<float> q = MakeQuaternion(Math::Vec3<float>(), 0);
- Math::Quaternion<float> old_q;
-
- while (!shutdown_event.WaitUntil(update_time)) {
- update_time += update_duration;
- old_q = q;
-
- {
- std::lock_guard<std::mutex> guard(tilt_mutex);
-
- // Find the quaternion describing current 3DS tilting
- q = MakeQuaternion(Math::MakeVec(-tilt_direction.y, 0.0f, tilt_direction.x),
- tilt_angle);
- }
-
- auto inv_q = q.Inverse();
-
- // Set the gravity vector in world space
- auto gravity = Math::MakeVec(0.0f, -1.0f, 0.0f);
-
- // Find the angular rate vector in world space
- auto angular_rate = ((q - old_q) * inv_q).xyz * 2;
- angular_rate *= 1000 / update_millisecond / MathUtil::PI * 180;
-
- // Transform the two vectors from world space to 3DS space
- gravity = QuaternionRotate(inv_q, gravity);
- angular_rate = QuaternionRotate(inv_q, angular_rate);
-
- // Update the sensor state
- emu_window.AccelerometerChanged(gravity.x, gravity.y, gravity.z);
- emu_window.GyroscopeChanged(angular_rate.x, angular_rate.y, angular_rate.z);
- }
-}
-
-void MotionEmu::BeginTilt(int x, int y) {
- mouse_origin = Math::MakeVec(x, y);
- is_tilting = true;
-}
-
-void MotionEmu::Tilt(int x, int y) {
- constexpr float SENSITIVITY = 0.01f;
- auto mouse_move = Math::MakeVec(x, y) - mouse_origin;
- if (is_tilting) {
- std::lock_guard<std::mutex> guard(tilt_mutex);
- if (mouse_move.x == 0 && mouse_move.y == 0) {
- tilt_angle = 0;
- } else {
- tilt_direction = mouse_move.Cast<float>();
- tilt_angle = MathUtil::Clamp(tilt_direction.Normalize() * SENSITIVITY, 0.0f,
- MathUtil::PI * 0.5f);
- }
- }
-}
-
-void MotionEmu::EndTilt() {
- std::lock_guard<std::mutex> guard(tilt_mutex);
- tilt_angle = 0;
- is_tilting = false;
-}
-
-} // namespace Motion
diff --git a/src/core/frontend/motion_emu.h b/src/core/frontend/motion_emu.h
deleted file mode 100644
index 99d41a726..000000000
--- a/src/core/frontend/motion_emu.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2016 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-#include "common/thread.h"
-#include "common/vector_math.h"
-
-class EmuWindow;
-
-namespace Motion {
-
-class MotionEmu final {
-public:
- MotionEmu(EmuWindow& emu_window);
- ~MotionEmu();
-
- /**
- * Signals that a motion sensor tilt has begun.
- * @param x the x-coordinate of the cursor
- * @param y the y-coordinate of the cursor
- */
- void BeginTilt(int x, int y);
-
- /**
- * Signals that a motion sensor tilt is occurring.
- * @param x the x-coordinate of the cursor
- * @param y the y-coordinate of the cursor
- */
- void Tilt(int x, int y);
-
- /**
- * Signals that a motion sensor tilt has ended.
- */
- void EndTilt();
-
-private:
- Math::Vec2<int> mouse_origin;
-
- std::mutex tilt_mutex;
- Math::Vec2<float> tilt_direction;
- float tilt_angle = 0;
-
- bool is_tilting = false;
-
- Common::Event shutdown_event;
- std::thread motion_emu_thread;
-
- void MotionEmuThread(EmuWindow& emu_window);
-};
-
-} // namespace Motion
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp
index 123fe7cd4..d6be16ef6 100644
--- a/src/core/gdbstub/gdbstub.cpp
+++ b/src/core/gdbstub/gdbstub.cpp
@@ -644,7 +644,7 @@ static void ReadMemory() {
auto start_offset = command_buffer + 1;
auto addr_pos = std::find(start_offset, command_buffer + command_length, ',');
- PAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset));
+ VAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset));
start_offset = addr_pos + 1;
u32 len =
@@ -656,12 +656,14 @@ static void ReadMemory() {
SendReply("E01");
}
- const u8* data = Memory::GetPointer(addr);
- if (!data) {
+ if (!Memory::IsValidVirtualAddress(addr)) {
return SendReply("E00");
}
- MemToGdbHex(reply, data, len);
+ std::vector<u8> data(len);
+ Memory::ReadBlock(addr, data.data(), len);
+
+ MemToGdbHex(reply, data.data(), len);
reply[len * 2] = '\0';
SendReply(reinterpret_cast<char*>(reply));
}
@@ -670,18 +672,20 @@ static void ReadMemory() {
static void WriteMemory() {
auto start_offset = command_buffer + 1;
auto addr_pos = std::find(start_offset, command_buffer + command_length, ',');
- PAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset));
+ VAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset));
start_offset = addr_pos + 1;
auto len_pos = std::find(start_offset, command_buffer + command_length, ':');
u32 len = HexToInt(start_offset, static_cast<u32>(len_pos - start_offset));
- u8* dst = Memory::GetPointer(addr);
- if (!dst) {
+ if (!Memory::IsValidVirtualAddress(addr)) {
return SendReply("E00");
}
- GdbHexToMem(dst, len_pos + 1, len);
+ std::vector<u8> data(len);
+
+ GdbHexToMem(data.data(), len_pos + 1, len);
+ Memory::WriteBlock(addr, data.data(), len);
SendReply("OK");
}
@@ -946,7 +950,7 @@ static void Init(u16 port) {
WSAStartup(MAKEWORD(2, 2), &InitData);
#endif
- int tmpsock = socket(PF_INET, SOCK_STREAM, 0);
+ int tmpsock = static_cast<int>(socket(PF_INET, SOCK_STREAM, 0));
if (tmpsock == -1) {
LOG_ERROR(Debug_GDBStub, "Failed to create gdb socket");
}
@@ -973,7 +977,7 @@ static void Init(u16 port) {
sockaddr_in saddr_client;
sockaddr* client_addr = reinterpret_cast<sockaddr*>(&saddr_client);
socklen_t client_addrlen = sizeof(saddr_client);
- gdbserver_socket = accept(tmpsock, client_addr, &client_addrlen);
+ gdbserver_socket = static_cast<int>(accept(tmpsock, client_addr, &client_addrlen));
if (gdbserver_socket < 0) {
// In the case that we couldn't start the server for whatever reason, just start CPU
// execution like normal.
diff --git a/src/core/hle/applets/erreula.cpp b/src/core/hle/applets/erreula.cpp
index 75d7fd9fc..518f371f5 100644
--- a/src/core/hle/applets/erreula.cpp
+++ b/src/core/hle/applets/erreula.cpp
@@ -31,8 +31,8 @@ ResultCode ErrEula::ReceiveParameter(const Service::APT::MessageParameter& param
heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
// Create a SharedMemory that directly points to this heap block.
framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
- heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite,
- MemoryPermission::ReadWrite, "ErrEula Memory");
+ heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
+ "ErrEula Memory");
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
diff --git a/src/core/hle/applets/mii_selector.cpp b/src/core/hle/applets/mii_selector.cpp
index 89f08daa2..f225c23a5 100644
--- a/src/core/hle/applets/mii_selector.cpp
+++ b/src/core/hle/applets/mii_selector.cpp
@@ -38,8 +38,8 @@ ResultCode MiiSelector::ReceiveParameter(const Service::APT::MessageParameter& p
heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
// Create a SharedMemory that directly points to this heap block.
framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
- heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite,
- MemoryPermission::ReadWrite, "MiiSelector Memory");
+ heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
+ "MiiSelector Memory");
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
@@ -66,7 +66,7 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa
// continue.
MiiResult result;
memset(&result, 0, sizeof(result));
- result.result_code = 0;
+ result.return_code = 0;
// Let the application know that we're closing
Service::APT::MessageParameter message;
@@ -82,5 +82,5 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa
}
void MiiSelector::Update() {}
-}
-} // namespace
+} // namespace Applets
+} // namespace HLE
diff --git a/src/core/hle/applets/mii_selector.h b/src/core/hle/applets/mii_selector.h
index ec00e29d2..136ce8948 100644
--- a/src/core/hle/applets/mii_selector.h
+++ b/src/core/hle/applets/mii_selector.h
@@ -16,51 +16,46 @@ namespace HLE {
namespace Applets {
struct MiiConfig {
- u8 unk_000;
- u8 unk_001;
- u8 unk_002;
- u8 unk_003;
- u8 unk_004;
+ u8 enable_cancel_button;
+ u8 enable_guest_mii;
+ u8 show_on_top_screen;
+ INSERT_PADDING_BYTES(5);
+ u16 title[0x40];
+ INSERT_PADDING_BYTES(4);
+ u8 show_guest_miis;
INSERT_PADDING_BYTES(3);
- u16 unk_008;
- INSERT_PADDING_BYTES(0x82);
- u8 unk_08C;
- INSERT_PADDING_BYTES(3);
- u16 unk_090;
+ u32 initially_selected_mii_index;
+ u8 guest_mii_whitelist[6];
+ u8 user_mii_whitelist[0x64];
INSERT_PADDING_BYTES(2);
- u32 unk_094;
- u16 unk_098;
- u8 unk_09A[0x64];
- u8 unk_0FE;
- u8 unk_0FF;
- u32 unk_100;
+ u32 magic_value;
};
-
static_assert(sizeof(MiiConfig) == 0x104, "MiiConfig structure has incorrect size");
#define ASSERT_REG_POSITION(field_name, position) \
static_assert(offsetof(MiiConfig, field_name) == position, \
"Field " #field_name " has invalid position")
-ASSERT_REG_POSITION(unk_008, 0x08);
-ASSERT_REG_POSITION(unk_08C, 0x8C);
-ASSERT_REG_POSITION(unk_090, 0x90);
-ASSERT_REG_POSITION(unk_094, 0x94);
-ASSERT_REG_POSITION(unk_0FE, 0xFE);
+ASSERT_REG_POSITION(title, 0x08);
+ASSERT_REG_POSITION(show_guest_miis, 0x8C);
+ASSERT_REG_POSITION(initially_selected_mii_index, 0x90);
+ASSERT_REG_POSITION(guest_mii_whitelist, 0x94);
#undef ASSERT_REG_POSITION
struct MiiResult {
- u32 result_code;
- u8 unk_04;
- INSERT_PADDING_BYTES(7);
- u8 unk_0C[0x60];
- u8 unk_6C[0x16];
+ u32 return_code;
+ u32 is_guest_mii_selected;
+ u32 selected_guest_mii_index;
+ // TODO(mailwl): expand to Mii Format structure: https://www.3dbrew.org/wiki/Mii
+ u8 selected_mii_data[0x5C];
INSERT_PADDING_BYTES(2);
+ u16 mii_data_checksum;
+ u16 guest_mii_name[0xC];
};
static_assert(sizeof(MiiResult) == 0x84, "MiiResult structure has incorrect size");
#define ASSERT_REG_POSITION(field_name, position) \
static_assert(offsetof(MiiResult, field_name) == position, \
"Field " #field_name " has invalid position")
-ASSERT_REG_POSITION(unk_0C, 0x0C);
-ASSERT_REG_POSITION(unk_6C, 0x6C);
+ASSERT_REG_POSITION(selected_mii_data, 0x0C);
+ASSERT_REG_POSITION(guest_mii_name, 0x6C);
#undef ASSERT_REG_POSITION
class MiiSelector final : public Applet {
@@ -79,5 +74,5 @@ private:
MiiConfig config;
};
-}
-} // namespace
+} // namespace Applets
+} // namespace HLE
diff --git a/src/core/hle/applets/mint.cpp b/src/core/hle/applets/mint.cpp
index 31a79ea17..50d79190b 100644
--- a/src/core/hle/applets/mint.cpp
+++ b/src/core/hle/applets/mint.cpp
@@ -31,8 +31,8 @@ ResultCode Mint::ReceiveParameter(const Service::APT::MessageParameter& paramete
heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
// Create a SharedMemory that directly points to this heap block.
framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
- heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite,
- MemoryPermission::ReadWrite, "Mint Memory");
+ heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
+ "Mint Memory");
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
diff --git a/src/core/hle/applets/swkbd.cpp b/src/core/hle/applets/swkbd.cpp
index fdf8807b0..0bc471a3a 100644
--- a/src/core/hle/applets/swkbd.cpp
+++ b/src/core/hle/applets/swkbd.cpp
@@ -41,8 +41,8 @@ ResultCode SoftwareKeyboard::ReceiveParameter(Service::APT::MessageParameter con
heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
// Create a SharedMemory that directly points to this heap block.
framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
- heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite,
- MemoryPermission::ReadWrite, "SoftwareKeyboard Memory");
+ heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
+ "SoftwareKeyboard Memory");
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
diff --git a/src/core/hle/function_wrappers.h b/src/core/hle/function_wrappers.h
index bc81c06b4..31fda6db3 100644
--- a/src/core/hle/function_wrappers.h
+++ b/src/core/hle/function_wrappers.h
@@ -24,19 +24,37 @@ static inline void FuncReturn(u64 res) {
Core::CPU().SetReg(0, res);
}
-/**
- * HLE a function return (64-bit) from the current ARM11 userland process
- * @param res Result to return (64-bit)
- * @todo Verify that this function is correct
- */
-static inline void FuncReturn64(u64 res) {
- Core::CPU().SetReg(0, (u32)(res & 0xFFFFFFFF));
- Core::CPU().SetReg(1, (u32)((res >> 32) & 0xFFFFFFFF));
-}
-
////////////////////////////////////////////////////////////////////////////////////////////////////
// Function wrappers that return type ResultCode
+template <ResultCode func(u64)>
+void Wrap() {
+ FuncReturn(func(PARAM(0)).raw);
+}
+
+template <ResultCode func(u32, u64, u32)>
+void Wrap() {
+ FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
+}
+
+template <ResultCode func(u64, u32)>
+void Wrap() {
+ FuncReturn(func(PARAM(0), PARAM(1)).raw);
+}
+
+template <ResultCode func(u64, u64, u64)>
+void Wrap() {
+ FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
+}
+
+template <ResultCode func(u64*, u64, u64, u64)>
+void Wrap() {
+ u64 param_1 = 0;
+ u32 retval = func(&param_1, PARAM(1), PARAM(2), PARAM(3)).raw;
+ Core::CPU().SetReg(1, param_1);
+ FuncReturn(retval);
+}
+
template <ResultCode func(u32, u32, u32, u32)>
void Wrap() {
FuncReturn(func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)).raw);
@@ -58,22 +76,21 @@ void Wrap() {
FuncReturn(retval);
}
-template <ResultCode func(s32*, u32*, s32, bool, s64)>
+template <ResultCode func(s32*, VAddr, s32, bool, s64)>
void Wrap() {
s32 param_1 = 0;
- s32 retval = func(&param_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2),
- (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0)))
- .raw;
+ s32 retval =
+ func(&param_1, PARAM(1), (s32)PARAM(2), (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0)))
+ .raw;
Core::CPU().SetReg(1, (u32)param_1);
FuncReturn(retval);
}
-template <ResultCode func(s32*, u32*, s32, u32)>
+template <ResultCode func(s32*, VAddr, s32, u32)>
void Wrap() {
s32 param_1 = 0;
- u32 retval =
- func(&param_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), PARAM(3)).raw;
+ u32 retval = func(&param_1, PARAM(1), (s32)PARAM(2), PARAM(3)).raw;
Core::CPU().SetReg(1, (u32)param_1);
FuncReturn(retval);
@@ -85,6 +102,14 @@ void Wrap() {
func(PARAM(0), PARAM(1), PARAM(2), PARAM(3), (((s64)PARAM(5) << 32) | PARAM(4))).raw);
}
+template <ResultCode func(u32, u64*)>
+void Wrap() {
+ u64 param_1 = 0;
+ u32 retval = func(PARAM(0), &param_1).raw;
+ Core::CPU().SetReg(1, param_1);
+ FuncReturn(retval);
+}
+
template <ResultCode func(u32*)>
void Wrap() {
u32 param_1 = 0;
@@ -100,16 +125,17 @@ void Wrap() {
FuncReturn(retval);
}
-template <ResultCode func(MemoryInfo*, PageInfo*, u32)>
+template <ResultCode func(MemoryInfo*, PageInfo*, u64)>
void Wrap() {
MemoryInfo memory_info = {};
PageInfo page_info = {};
u32 retval = func(&memory_info, &page_info, PARAM(2)).raw;
- Core::CPU().SetReg(1, memory_info.base_address);
- Core::CPU().SetReg(2, memory_info.size);
- Core::CPU().SetReg(3, memory_info.permission);
- Core::CPU().SetReg(4, memory_info.state);
- Core::CPU().SetReg(5, page_info.flags);
+
+ Memory::Write64(PARAM(0), memory_info.base_address);
+ Memory::Write64(PARAM(0) + 8, memory_info.size);
+ Memory::Write64(PARAM(0) + 16, memory_info.permission);
+ Memory::Write64(PARAM(0) + 24, memory_info.state);
+
FuncReturn(retval);
}
@@ -139,7 +165,7 @@ void Wrap() {
FuncReturn(func(PARAM(0), (s32)PARAM(1)).raw);
}
-template <ResultCode func(u32*, u32)>
+template <ResultCode func(u32*, u64)>
void Wrap() {
u32 param_1 = 0;
u32 retval = func(&param_1, PARAM(1)).raw;
@@ -152,21 +178,6 @@ void Wrap() {
FuncReturn(func(PARAM(0)).raw);
}
-template <ResultCode func(s64*, u32, u32*, u32)>
-void Wrap() {
- FuncReturn(func((s64*)Memory::GetPointer(PARAM(0)), PARAM(1),
- (u32*)Memory::GetPointer(PARAM(2)), (s32)PARAM(3))
- .raw);
-}
-
-template <ResultCode func(u32*, const char*)>
-void Wrap() {
- u32 param_1 = 0;
- u32 retval = func(&param_1, (char*)Memory::GetPointer(PARAM(1))).raw;
- Core::CPU().SetReg(1, param_1);
- FuncReturn(retval);
-}
-
template <ResultCode func(u32*, s32, s32)>
void Wrap() {
u32 param_1 = 0;
@@ -222,13 +233,11 @@ void Wrap() {
FuncReturn(func(PARAM(0), PARAM(1)).raw);
}
-template <ResultCode func(Kernel::Handle*, Kernel::Handle*, const char*, u32)>
+template <ResultCode func(Kernel::Handle*, Kernel::Handle*, VAddr, u32)>
void Wrap() {
Kernel::Handle param_1 = 0;
Kernel::Handle param_2 = 0;
- u32 retval = func(&param_1, &param_2,
- reinterpret_cast<const char*>(Memory::GetPointer(PARAM(2))), PARAM(3))
- .raw;
+ u32 retval = func(&param_1, &param_2, PARAM(2), PARAM(3)).raw;
Core::CPU().SetReg(1, param_1);
Core::CPU().SetReg(2, param_2);
FuncReturn(retval);
@@ -244,6 +253,11 @@ void Wrap() {
FuncReturn(retval);
}
+template <ResultCode func(u32, u32, u32)>
+void Wrap() {
+ FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
+}
+
////////////////////////////////////////////////////////////////////////////////////////////////////
// Function wrappers that return type u32
@@ -268,14 +282,14 @@ void Wrap() {
func(((s64)PARAM(1) << 32) | PARAM(0));
}
-template <void func(const char*, int len)>
+template <void func(VAddr, int len)>
void Wrap() {
- func((char*)Memory::GetPointer(PARAM(0)), PARAM(1));
+ func(PARAM(0), PARAM(1));
}
-template <void func(u8)>
+template <void func(u64, u64, u64)>
void Wrap() {
- func((u8)PARAM(0));
+ func(PARAM(0), PARAM(1), PARAM(2));
}
#undef PARAM
diff --git a/src/core/hle/ipc.h b/src/core/hle/ipc.h
index f7f96125a..87ed85df6 100644
--- a/src/core/hle/ipc.h
+++ b/src/core/hle/ipc.h
@@ -122,11 +122,11 @@ union StaticBufferDescInfo {
BitField<14, 18, u32> size;
};
-inline u32 StaticBufferDesc(u32 size, u8 buffer_id) {
+inline u32 StaticBufferDesc(size_t size, u8 buffer_id) {
StaticBufferDescInfo info{};
info.descriptor_type.Assign(StaticBuffer);
info.buffer_id.Assign(buffer_id);
- info.size.Assign(size);
+ info.size.Assign(static_cast<u32>(size));
return info.raw;
}
@@ -160,11 +160,11 @@ union MappedBufferDescInfo {
BitField<4, 28, u32> size;
};
-inline u32 MappedBufferDesc(u32 size, MappedBufferPermissions perms) {
+inline u32 MappedBufferDesc(size_t size, MappedBufferPermissions perms) {
MappedBufferDescInfo info{};
info.flags.Assign(MappedBuffer);
info.perms.Assign(perms);
- info.size.Assign(size);
+ info.size.Assign(static_cast<u32>(size));
return info.raw;
}
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h
index f0d89cffe..7cb95cbac 100644
--- a/src/core/hle/ipc_helpers.h
+++ b/src/core/hle/ipc_helpers.h
@@ -117,9 +117,9 @@ public:
void PushCurrentPIDHandle();
- void PushStaticBuffer(VAddr buffer_vaddr, u32 size, u8 buffer_id);
+ void PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id);
- void PushMappedBuffer(VAddr buffer_vaddr, u32 size, MappedBufferPermissions perms);
+ void PushMappedBuffer(VAddr buffer_vaddr, size_t size, MappedBufferPermissions perms);
};
/// Push ///
@@ -190,12 +190,12 @@ inline void RequestBuilder::PushCurrentPIDHandle() {
Push(u32(0));
}
-inline void RequestBuilder::PushStaticBuffer(VAddr buffer_vaddr, u32 size, u8 buffer_id) {
+inline void RequestBuilder::PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id) {
Push(StaticBufferDesc(size, buffer_id));
Push(buffer_vaddr);
}
-inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, u32 size,
+inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, size_t size,
MappedBufferPermissions perms) {
Push(MappedBufferDesc(size, perms));
Push(buffer_vaddr);
@@ -227,8 +227,8 @@ public:
bool validateHeader = true) {
if (validateHeader)
ValidateHeader();
- Header builderHeader{
- MakeHeader(header.command_id, normal_params_size, translate_params_size)};
+ Header builderHeader{MakeHeader(static_cast<u16>(header.command_id), normal_params_size,
+ translate_params_size)};
if (context != nullptr)
return {*context, builderHeader};
else
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 5ebe2eca4..6020e9764 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -37,7 +37,7 @@ SharedPtr<Object> HLERequestContext::GetIncomingHandle(u32 id_from_cmdbuf) const
u32 HLERequestContext::AddOutgoingHandle(SharedPtr<Object> object) {
request_handles.push_back(std::move(object));
- return request_handles.size() - 1;
+ return static_cast<u32>(request_handles.size() - 1);
}
void HLERequestContext::ClearIncomingObjects() {
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index 9cf288b08..73fab3981 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -8,6 +8,7 @@
#include <string>
#include <utility>
#include <boost/smart_ptr/intrusive_ptr.hpp>
+#include "common/assert.h"
#include "common/common_types.h"
namespace Kernel {
@@ -84,6 +85,8 @@ public:
case HandleType::ClientSession:
return false;
}
+
+ UNREACHABLE();
}
public:
@@ -129,4 +132,4 @@ void Init(u32 system_mode);
/// Shutdown the kernel
void Shutdown();
-} // namespace
+} // namespace Kernel
diff --git a/src/core/hle/kernel/memory.cpp b/src/core/hle/kernel/memory.cpp
index 496d07cb5..7f27e9655 100644
--- a/src/core/hle/kernel/memory.cpp
+++ b/src/core/hle/kernel/memory.cpp
@@ -8,7 +8,6 @@
#include <memory>
#include <utility>
#include <vector>
-#include "audio_core/audio_core.h"
#include "common/assert.h"
#include "common/common_types.h"
#include "common/logging/log.h"
@@ -24,7 +23,7 @@
namespace Kernel {
-static MemoryRegionInfo memory_regions[3];
+MemoryRegionInfo memory_regions[3];
/// Size of the APPLICATION, SYSTEM and BASE memory regions (respectively) for each system
/// memory configuration type.
@@ -96,9 +95,6 @@ MemoryRegionInfo* GetMemoryRegion(MemoryRegion region) {
}
}
-std::array<u8, Memory::VRAM_SIZE> vram;
-std::array<u8, Memory::N3DS_EXTRA_RAM_SIZE> n3ds_extra_ram;
-
void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mapping) {
using namespace Memory;
@@ -143,30 +139,14 @@ void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mappin
return;
}
- // TODO(yuriks): Use GetPhysicalPointer when that becomes independent of the virtual
- // mappings.
- u8* target_pointer = nullptr;
- switch (area->paddr_base) {
- case VRAM_PADDR:
- target_pointer = vram.data();
- break;
- case DSP_RAM_PADDR:
- target_pointer = AudioCore::GetDspMemory().data();
- break;
- case N3DS_EXTRA_RAM_PADDR:
- target_pointer = n3ds_extra_ram.data();
- break;
- default:
- UNREACHABLE();
- }
+ u8* target_pointer = Memory::GetPhysicalPointer(area->paddr_base + offset_into_region);
// TODO(yuriks): This flag seems to have some other effect, but it's unknown what
MemoryState memory_state = mapping.unk_flag ? MemoryState::Static : MemoryState::IO;
- auto vma = address_space
- .MapBackingMemory(mapping.address, target_pointer + offset_into_region,
- mapping.size, memory_state)
- .Unwrap();
+ auto vma =
+ address_space.MapBackingMemory(mapping.address, target_pointer, mapping.size, memory_state)
+ .Unwrap();
address_space.Reprotect(vma,
mapping.read_only ? VMAPermission::Read : VMAPermission::ReadWrite);
}
diff --git a/src/core/hle/kernel/memory.h b/src/core/hle/kernel/memory.h
index 08c1a9989..da6bb3563 100644
--- a/src/core/hle/kernel/memory.h
+++ b/src/core/hle/kernel/memory.h
@@ -26,4 +26,6 @@ MemoryRegionInfo* GetMemoryRegion(MemoryRegion region);
void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mapping);
void MapSharedPages(VMManager& address_space);
+
+extern MemoryRegionInfo memory_regions[3];
} // namespace Kernel
diff --git a/src/core/hle/kernel/mutex.cpp b/src/core/hle/kernel/mutex.cpp
index cef961289..30dade552 100644
--- a/src/core/hle/kernel/mutex.cpp
+++ b/src/core/hle/kernel/mutex.cpp
@@ -25,10 +25,11 @@ void ReleaseThreadMutexes(Thread* thread) {
Mutex::Mutex() {}
Mutex::~Mutex() {}
-SharedPtr<Mutex> Mutex::Create(bool initial_locked, std::string name) {
+SharedPtr<Mutex> Mutex::Create(bool initial_locked, VAddr addr, std::string name) {
SharedPtr<Mutex> mutex(new Mutex);
mutex->lock_count = 0;
+ mutex->addr = addr;
mutex->name = std::move(name);
mutex->holding_thread = nullptr;
@@ -90,7 +91,7 @@ void Mutex::UpdatePriority() {
if (!holding_thread)
return;
- s32 best_priority = THREADPRIO_LOWEST;
+ u32 best_priority = THREADPRIO_LOWEST;
for (auto& waiter : GetWaitingThreads()) {
if (waiter->current_priority < best_priority)
best_priority = waiter->current_priority;
diff --git a/src/core/hle/kernel/mutex.h b/src/core/hle/kernel/mutex.h
index bacacd690..503d3ee75 100644
--- a/src/core/hle/kernel/mutex.h
+++ b/src/core/hle/kernel/mutex.h
@@ -21,7 +21,7 @@ public:
* @param name Optional name of mutex
* @return Pointer to new Mutex object
*/
- static SharedPtr<Mutex> Create(bool initial_locked, std::string name = "Unknown");
+ static SharedPtr<Mutex> Create(bool initial_locked, VAddr addr, std::string name = "Unknown");
std::string GetTypeName() const override {
return "Mutex";
@@ -39,6 +39,7 @@ public:
u32 priority; ///< The priority of the mutex, used for priority inheritance.
std::string name; ///< Name of mutex (optional)
SharedPtr<Thread> holding_thread; ///< Thread that has acquired the mutex
+ VAddr addr;
/**
* Elevate the mutex priority to the best priority
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 84ebdbc58..9e145866f 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -129,7 +129,8 @@ void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) {
}
vm_manager.LogLayout(Log::Level::Debug);
- Kernel::SetupMainThread(entry_point, main_thread_priority);
+
+ Kernel::SetupMainThread(entry_point, main_thread_priority, this);
}
void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) {
diff --git a/src/core/hle/kernel/resource_limit.cpp b/src/core/hle/kernel/resource_limit.cpp
index a8f10a3ee..517dc47a8 100644
--- a/src/core/hle/kernel/resource_limit.cpp
+++ b/src/core/hle/kernel/resource_limit.cpp
@@ -61,7 +61,7 @@ s32 ResourceLimit::GetCurrentResourceValue(u32 resource) const {
}
}
-s32 ResourceLimit::GetMaxResourceValue(u32 resource) const {
+u32 ResourceLimit::GetMaxResourceValue(u32 resource) const {
switch (resource) {
case PRIORITY:
return max_priority;
diff --git a/src/core/hle/kernel/resource_limit.h b/src/core/hle/kernel/resource_limit.h
index 6cdfbcf8d..42874eb8d 100644
--- a/src/core/hle/kernel/resource_limit.h
+++ b/src/core/hle/kernel/resource_limit.h
@@ -67,7 +67,7 @@ public:
* @param resource Requested resource type
* @returns The max value of the resource type
*/
- s32 GetMaxResourceValue(u32 resource) const;
+ u32 GetMaxResourceValue(u32 resource) const;
/// Name of resource limit object.
std::string name;
diff --git a/src/core/hle/kernel/semaphore.cpp b/src/core/hle/kernel/semaphore.cpp
index fcf586728..2605b2595 100644
--- a/src/core/hle/kernel/semaphore.cpp
+++ b/src/core/hle/kernel/semaphore.cpp
@@ -13,7 +13,7 @@ namespace Kernel {
Semaphore::Semaphore() {}
Semaphore::~Semaphore() {}
-ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_count,
+ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_count, VAddr address,
std::string name) {
if (initial_count > max_count)
@@ -25,6 +25,7 @@ ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_cou
// and the rest is reserved for the caller thread
semaphore->max_count = max_count;
semaphore->available_count = initial_count;
+ semaphore->address = address;
semaphore->name = std::move(name);
return MakeResult<SharedPtr<Semaphore>>(std::move(semaphore));
diff --git a/src/core/hle/kernel/semaphore.h b/src/core/hle/kernel/semaphore.h
index 7b0cacf2e..77c491a24 100644
--- a/src/core/hle/kernel/semaphore.h
+++ b/src/core/hle/kernel/semaphore.h
@@ -22,7 +22,7 @@ public:
* @param name Optional name of semaphore
* @return The created semaphore
*/
- static ResultVal<SharedPtr<Semaphore>> Create(s32 initial_count, s32 max_count,
+ static ResultVal<SharedPtr<Semaphore>> Create(s32 initial_count, s32 max_count, VAddr address,
std::string name = "Unknown");
std::string GetTypeName() const override {
@@ -39,6 +39,7 @@ public:
s32 max_count; ///< Maximum number of simultaneous holders the semaphore can have
s32 available_count; ///< Number of free slots left in the semaphore
+ VAddr address;
std::string name; ///< Name of semaphore (optional)
bool ShouldWait(Thread* thread) const override;
diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp
index a7b66142f..d45daca35 100644
--- a/src/core/hle/kernel/shared_memory.cpp
+++ b/src/core/hle/kernel/shared_memory.cpp
@@ -42,7 +42,8 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u
memory_region->used += size;
shared_memory->linear_heap_phys_address =
- Memory::FCRAM_PADDR + memory_region->base + shared_memory->backing_block_offset;
+ Memory::FCRAM_PADDR + memory_region->base +
+ static_cast<PAddr>(shared_memory->backing_block_offset);
// Increase the amount of used linear heap memory for the owner process.
if (shared_memory->owner_process != nullptr) {
@@ -54,22 +55,19 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u
Kernel::g_current_process->vm_manager.RefreshMemoryBlockMappings(linheap_memory.get());
}
} else {
- // TODO(Subv): What happens if an application tries to create multiple memory blocks
- // pointing to the same address?
auto& vm_manager = shared_memory->owner_process->vm_manager;
// The memory is already available and mapped in the owner process.
- auto vma = vm_manager.FindVMA(address)->second;
- // Copy it over to our own storage
- shared_memory->backing_block = std::make_shared<std::vector<u8>>(
- vma.backing_block->data() + vma.offset, vma.backing_block->data() + vma.offset + size);
- shared_memory->backing_block_offset = 0;
- // Unmap the existing pages
- vm_manager.UnmapRange(address, size);
- // Map our own block into the address space
- vm_manager.MapMemoryBlock(address, shared_memory->backing_block, 0, size,
- MemoryState::Shared);
- // Reprotect the block with the new permissions
- vm_manager.ReprotectRange(address, size, ConvertPermissions(permissions));
+ auto vma = vm_manager.FindVMA(address);
+ ASSERT_MSG(vma != vm_manager.vma_map.end(), "Invalid memory address");
+ ASSERT_MSG(vma->second.backing_block, "Backing block doesn't exist for address");
+
+ // The returned VMA might be a bigger one encompassing the desired address.
+ auto vma_offset = address - vma->first;
+ ASSERT_MSG(vma_offset + size <= vma->second.size,
+ "Shared memory exceeds bounds of mapped block");
+
+ shared_memory->backing_block = vma->second.backing_block;
+ shared_memory->backing_block_offset = vma->second.offset + vma_offset;
}
shared_memory->base_address = address;
@@ -183,4 +181,4 @@ u8* SharedMemory::GetPointer(u32 offset) {
return backing_block->data() + backing_block_offset + offset;
}
-} // namespace
+} // namespace Kernel
diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h
index 94b335ed1..93a6f2182 100644
--- a/src/core/hle/kernel/shared_memory.h
+++ b/src/core/hle/kernel/shared_memory.h
@@ -114,7 +114,7 @@ public:
/// Backing memory for this shared memory block.
std::shared_ptr<std::vector<u8>> backing_block;
/// Offset into the backing block for this shared memory.
- u32 backing_block_offset;
+ size_t backing_block_offset;
/// Size of the memory block. Page-aligned.
u32 size;
/// Permission restrictions applied to the process which created the block.
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index c01d08ebb..75df49ac2 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -111,7 +111,7 @@ void Thread::Stop() {
Thread* ArbitrateHighestPriorityThread(u32 address) {
Thread* highest_priority_thread = nullptr;
- s32 priority = THREADPRIO_LOWEST;
+ u32 priority = THREADPRIO_LOWEST;
// Iterate through threads, find highest priority thread that is waiting to be arbitrated...
for (auto& thread : thread_list) {
@@ -171,15 +171,24 @@ static void SwitchContext(Thread* new_thread) {
// Cancel any outstanding wakeup events for this thread
CoreTiming::UnscheduleEvent(ThreadWakeupEventType, new_thread->callback_handle);
+ auto previous_process = Kernel::g_current_process;
+
current_thread = new_thread;
ready_queue.remove(new_thread->current_priority, new_thread);
new_thread->status = THREADSTATUS_RUNNING;
+ if (previous_process != current_thread->owner_process) {
+ Kernel::g_current_process = current_thread->owner_process;
+ SetCurrentPageTable(&Kernel::g_current_process->vm_manager.page_table);
+ }
+
Core::CPU().LoadContext(new_thread->context);
Core::CPU().SetCP15Register(CP15_THREAD_URO, new_thread->GetTLSAddress());
} else {
current_thread = nullptr;
+ // Note: We do not reset the current process and current page table when idling because
+ // technically we haven't changed processes, our threads are just paused.
}
}
@@ -238,12 +247,15 @@ static void ThreadWakeupCallback(u64 thread_handle, int cycles_late) {
if (thread->status == THREADSTATUS_WAIT_SYNCH_ANY ||
thread->status == THREADSTATUS_WAIT_SYNCH_ALL || thread->status == THREADSTATUS_WAIT_ARB) {
- thread->wait_set_output = false;
+
+ // Invoke the wakeup callback before clearing the wait objects
+ if (thread->wakeup_callback)
+ thread->wakeup_callback(ThreadWakeupReason::Timeout, thread, nullptr);
+
// Remove the thread from each of its waiting objects' waitlists
for (auto& object : thread->wait_objects)
object->RemoveWaitingThread(thread.get());
thread->wait_objects.clear();
- thread->SetWaitSynchronizationResult(RESULT_TIMEOUT);
}
thread->ResumeFromWait();
@@ -269,6 +281,9 @@ void Thread::ResumeFromWait() {
break;
case THREADSTATUS_READY:
+ // The thread's wakeup callback must have already been cleared when the thread was first
+ // awoken.
+ ASSERT(wakeup_callback == nullptr);
// If the thread is waiting on multiple wait objects, it might be awoken more than once
// before actually resuming. We can ignore subsequent wakeups if the thread status has
// already been set to THREADSTATUS_READY.
@@ -284,6 +299,8 @@ void Thread::ResumeFromWait() {
return;
}
+ wakeup_callback = nullptr;
+
ready_queue.push_back(current_priority, this);
status = THREADSTATUS_READY;
Core::System::GetInstance().PrepareReschedule();
@@ -302,7 +319,7 @@ static void DebugThreadQueue() {
}
for (auto& t : thread_list) {
- s32 priority = ready_queue.contains(t.get());
+ u32 priority = ready_queue.contains(t.get());
if (priority != -1) {
LOG_DEBUG(Kernel, "0x%02X %u", priority, t->GetObjectId());
}
@@ -352,7 +369,8 @@ static void ResetThreadContext(ARM_Interface::ThreadContext& context, VAddr stac
}
ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, u32 priority,
- u32 arg, s32 processor_id, VAddr stack_top) {
+ u32 arg, s32 processor_id, VAddr stack_top,
+ SharedPtr<Process> owner_process) {
// Check if priority is in ranged. Lowest priority -> highest priority id.
if (priority > THREADPRIO_LOWEST) {
LOG_ERROR(Kernel_SVC, "Invalid thread priority: %d", priority);
@@ -366,7 +384,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
// TODO(yuriks): Other checks, returning 0xD9001BEA
- if (!Memory::IsValidVirtualAddress(entry_point)) {
+ if (!Memory::IsValidVirtualAddress(*owner_process, entry_point)) {
LOG_ERROR(Kernel_SVC, "(name=%s): invalid entry %08x", name.c_str(), entry_point);
// TODO: Verify error
return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::Kernel,
@@ -385,15 +403,14 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
thread->nominal_priority = thread->current_priority = priority;
thread->last_running_ticks = CoreTiming::GetTicks();
thread->processor_id = processor_id;
- thread->wait_set_output = false;
thread->wait_objects.clear();
thread->wait_address = 0;
thread->name = std::move(name);
thread->callback_handle = wakeup_callback_handle_table.Create(thread).Unwrap();
- thread->owner_process = g_current_process;
+ thread->owner_process = owner_process;
// Find the next available TLS index, and mark it as used
- auto& tls_slots = Kernel::g_current_process->tls_slots;
+ auto& tls_slots = owner_process->tls_slots;
bool needs_allocation = true;
u32 available_page; // Which allocated page has free space
u32 available_slot; // Which slot within the page is free
@@ -412,18 +429,18 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
return ERR_OUT_OF_MEMORY;
}
- u32 offset = linheap_memory->size();
+ size_t offset = linheap_memory->size();
// Allocate some memory from the end of the linear heap for this region.
linheap_memory->insert(linheap_memory->end(), Memory::PAGE_SIZE, 0);
memory_region->used += Memory::PAGE_SIZE;
- Kernel::g_current_process->linear_heap_used += Memory::PAGE_SIZE;
+ owner_process->linear_heap_used += Memory::PAGE_SIZE;
tls_slots.emplace_back(0); // The page is completely available at the start
- available_page = tls_slots.size() - 1;
+ available_page = static_cast<u32>(tls_slots.size() - 1);
available_slot = 0; // Use the first slot in the new page
- auto& vm_manager = Kernel::g_current_process->vm_manager;
+ auto& vm_manager = owner_process->vm_manager;
vm_manager.RefreshMemoryBlockMappings(linheap_memory.get());
// Map the page to the current process' address space.
@@ -447,7 +464,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
return MakeResult<SharedPtr<Thread>>(std::move(thread));
}
-void Thread::SetPriority(s32 priority) {
+void Thread::SetPriority(u32 priority) {
ASSERT_MSG(priority <= THREADPRIO_LOWEST && priority >= THREADPRIO_HIGHEST,
"Invalid priority value.");
// If thread was ready, adjust queues
@@ -460,7 +477,7 @@ void Thread::SetPriority(s32 priority) {
}
void Thread::UpdatePriority() {
- s32 best_priority = nominal_priority;
+ u32 best_priority = nominal_priority;
for (auto& mutex : held_mutexes) {
if (mutex->priority < best_priority)
best_priority = mutex->priority;
@@ -468,7 +485,7 @@ void Thread::UpdatePriority() {
BoostPriority(best_priority);
}
-void Thread::BoostPriority(s32 priority) {
+void Thread::BoostPriority(u32 priority) {
// If thread was ready, adjust queues
if (status == THREADSTATUS_READY)
ready_queue.move(this, current_priority, priority);
@@ -477,21 +494,20 @@ void Thread::BoostPriority(s32 priority) {
current_priority = priority;
}
-SharedPtr<Thread> SetupMainThread(VAddr entry_point, s32 priority) {
- DEBUG_ASSERT(!GetCurrentThread());
+SharedPtr<Thread> SetupMainThread(u32 entry_point, u32 priority, SharedPtr<Process> owner_process) {
+ // Setup page table so we can write to memory
+ SetCurrentPageTable(&Kernel::g_current_process->vm_manager.page_table);
// Initialize new "main" thread
auto thread_res = Thread::Create("main", entry_point, priority, 0, THREADPROCESSORID_0,
- Memory::HEAP_VADDR_END);
+ Memory::HEAP_VADDR_END, owner_process);
SharedPtr<Thread> thread = std::move(thread_res).Unwrap();
thread->context.fpscr =
FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO | FPSCR_IXC; // 0x03C00010
- // Run new "main" thread
- SwitchContext(thread.get());
-
+ // Note: The newly created thread will be run when the scheduler fires.
return thread;
}
@@ -525,7 +541,13 @@ void Thread::SetWaitSynchronizationOutput(s32 output) {
s32 Thread::GetWaitObjectIndex(WaitObject* object) const {
ASSERT_MSG(!wait_objects.empty(), "Thread is not waiting for anything");
auto match = std::find(wait_objects.rbegin(), wait_objects.rend(), object);
- return std::distance(match, wait_objects.rend()) - 1;
+ return static_cast<s32>(std::distance(match, wait_objects.rend()) - 1);
+}
+
+VAddr Thread::GetCommandBufferAddress() const {
+ // Offset from the start of TLS at which the IPC command buffer begins.
+ static constexpr int CommandHeaderOffset = 0x80;
+ return GetTLSAddress() + CommandHeaderOffset;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index 2cadb91db..fafcab156 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -15,7 +15,7 @@
#include "core/hle/kernel/wait_object.h"
#include "core/hle/result.h"
-enum ThreadPriority : s32 {
+enum ThreadPriority : u32 {
THREADPRIO_HIGHEST = 0, ///< Highest thread priority
THREADPRIO_USERLAND_MAX = 24, ///< Highest thread priority for userland apps
THREADPRIO_DEFAULT = 48, ///< Default thread priority for userland apps
@@ -41,6 +41,11 @@ enum ThreadStatus {
THREADSTATUS_DEAD ///< Run to completion, or forcefully terminated
};
+enum class ThreadWakeupReason {
+ Signal, // The thread was woken up by WakeupAllWaitingThreads due to an object signal.
+ Timeout // The thread was woken up due to a wait timeout.
+};
+
namespace Kernel {
class Mutex;
@@ -56,10 +61,12 @@ public:
* @param arg User data to pass to the thread
* @param processor_id The ID(s) of the processors on which the thread is desired to be run
* @param stack_top The address of the thread's stack top
+ * @param owner_process The parent process for the thread
* @return A shared pointer to the newly created thread
*/
static ResultVal<SharedPtr<Thread>> Create(std::string name, VAddr entry_point, u32 priority,
- u32 arg, s32 processor_id, VAddr stack_top);
+ u32 arg, s32 processor_id, VAddr stack_top,
+ SharedPtr<Process> owner_process);
std::string GetName() const override {
return name;
@@ -80,7 +87,7 @@ public:
* Gets the thread's current priority
* @return The current thread's priority
*/
- s32 GetPriority() const {
+ u32 GetPriority() const {
return current_priority;
}
@@ -88,7 +95,7 @@ public:
* Sets the thread's current priority
* @param priority The new priority
*/
- void SetPriority(s32 priority);
+ void SetPriority(u32 priority);
/**
* Boost's a thread's priority to the best priority among the thread's held mutexes.
@@ -100,7 +107,7 @@ public:
* Temporarily boosts the thread's priority until the next time it is scheduled
* @param priority The new priority
*/
- void BoostPriority(s32 priority);
+ void BoostPriority(u32 priority);
/**
* Gets the thread's thread ID
@@ -116,9 +123,9 @@ public:
void ResumeFromWait();
/**
- * Schedules an event to wake up the specified thread after the specified delay
- * @param nanoseconds The time this thread will be allowed to sleep for
- */
+ * Schedules an event to wake up the specified thread after the specified delay
+ * @param nanoseconds The time this thread will be allowed to sleep for
+ */
void WakeAfterDelay(s64 nanoseconds);
/**
@@ -157,6 +164,12 @@ public:
return tls_address;
}
+ /*
+ * Returns the address of the current thread's command buffer, located in the TLS.
+ * @returns VAddr of the thread's command buffer.
+ */
+ VAddr GetCommandBufferAddress() const;
+
/**
* Returns whether this thread is waiting for all the objects in
* its wait list to become ready, as a result of a WaitSynchronizationN call
@@ -174,8 +187,8 @@ public:
VAddr entry_point;
VAddr stack_top;
- s32 nominal_priority; ///< Nominal thread priority, as set by the emulated application
- s32 current_priority; ///< Current thread priority, can be temporarily changed
+ u32 nominal_priority; ///< Nominal thread priority, as set by the emulated application
+ u32 current_priority; ///< Current thread priority, can be temporarily changed
u64 last_running_ticks; ///< CPU tick when thread was last running
@@ -197,14 +210,18 @@ public:
VAddr wait_address; ///< If waiting on an AddressArbiter, this is the arbitration address
- /// True if the WaitSynchronizationN output parameter should be set on thread wakeup.
- bool wait_set_output;
-
std::string name;
/// Handle used as userdata to reference this object when inserting into the CoreTiming queue.
Handle callback_handle;
+ using WakeupCallback = void(ThreadWakeupReason reason, SharedPtr<Thread> thread,
+ SharedPtr<WaitObject> object);
+ // Callback that will be invoked when the thread is resumed from a waiting state. If the thread
+ // was waiting via WaitSynchronizationN then the object will be the last object that became
+ // available. In case of a timeout, the object will be nullptr.
+ std::function<WakeupCallback> wakeup_callback;
+
private:
Thread();
~Thread() override;
@@ -214,9 +231,10 @@ private:
* Sets up the primary application thread
* @param entry_point The address at which the thread should start execution
* @param priority The priority to give the main thread
+ * @param owner_process The parent process for the main thread
* @return A shared pointer to the main thread
*/
-SharedPtr<Thread> SetupMainThread(VAddr entry_point, s32 priority);
+SharedPtr<Thread> SetupMainThread(u32 entry_point, u32 priority, SharedPtr<Process> owner_process);
/**
* Returns whether there are any threads that are ready to run.
@@ -276,4 +294,4 @@ void ThreadingShutdown();
*/
const std::vector<SharedPtr<Thread>>& GetThreadList();
-} // namespace
+} // namespace Kernel
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp
index f70c32501..9762ef535 100644
--- a/src/core/hle/kernel/vm_manager.cpp
+++ b/src/core/hle/kernel/vm_manager.cpp
@@ -4,8 +4,10 @@
#include <iterator>
#include "common/assert.h"
+#include "core/arm/arm_interface.h"
#include "core/hle/kernel/errors.h"
#include "core/hle/kernel/vm_manager.h"
+#include "core/core.h"
#include "core/memory.h"
#include "core/memory_setup.h"
#include "core/mmio.h"
@@ -56,6 +58,10 @@ void VMManager::Reset() {
initial_vma.size = MAX_ADDRESS;
vma_map.emplace(initial_vma.base, initial_vma);
+ page_table.pointers.fill(nullptr);
+ page_table.attributes.fill(Memory::PageType::Unmapped);
+ page_table.cached_res_count.fill(0);
+
//UpdatePageTableForVMA(initial_vma);
}
@@ -79,6 +85,8 @@ ResultVal<VMManager::VMAHandle> VMManager::MapMemoryBlock(VAddr target,
VirtualMemoryArea& final_vma = vma_handle->second;
ASSERT(final_vma.size == size);
+ Core::CPU().MapBackingMemory(target, size, block->data() + offset, VMAPermission::ReadWriteExecute);
+
final_vma.type = VMAType::AllocatedMemoryBlock;
final_vma.permissions = VMAPermission::ReadWrite;
final_vma.meminfo_state = state;
@@ -98,6 +106,8 @@ ResultVal<VMManager::VMAHandle> VMManager::MapBackingMemory(VAddr target, u8* me
VirtualMemoryArea& final_vma = vma_handle->second;
ASSERT(final_vma.size == size);
+ Core::CPU().MapBackingMemory(target, size, memory, VMAPermission::ReadWriteExecute);
+
final_vma.type = VMAType::BackingMemory;
final_vma.permissions = VMAPermission::ReadWrite;
final_vma.meminfo_state = state;
@@ -328,16 +338,17 @@ VMManager::VMAIter VMManager::MergeAdjacent(VMAIter iter) {
void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma) {
switch (vma.type) {
case VMAType::Free:
- Memory::UnmapRegion(vma.base, vma.size);
+ Memory::UnmapRegion(page_table, vma.base, vma.size);
break;
case VMAType::AllocatedMemoryBlock:
- Memory::MapMemoryRegion(vma.base, vma.size, vma.backing_block->data() + vma.offset);
+ Memory::MapMemoryRegion(page_table, vma.base, vma.size,
+ vma.backing_block->data() + vma.offset);
break;
case VMAType::BackingMemory:
- Memory::MapMemoryRegion(vma.base, vma.size, vma.backing_memory);
+ Memory::MapMemoryRegion(page_table, vma.base, vma.size, vma.backing_memory);
break;
case VMAType::MMIO:
- Memory::MapIoRegion(vma.base, vma.size, vma.mmio_handler);
+ Memory::MapIoRegion(page_table, vma.base, vma.size, vma.mmio_handler);
break;
}
}
diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h
index aa2265ce6..cb5bb8243 100644
--- a/src/core/hle/kernel/vm_manager.h
+++ b/src/core/hle/kernel/vm_manager.h
@@ -9,6 +9,7 @@
#include <vector>
#include "common/common_types.h"
#include "core/hle/result.h"
+#include "core/memory.h"
#include "core/mmio.h"
namespace Kernel {
@@ -102,7 +103,6 @@ struct VirtualMemoryArea {
* - http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files/
*/
class VMManager final {
- // TODO(yuriks): Make page tables switchable to support multiple VMManagers
public:
/**
* The maximum amount of address space managed by the kernel. Addresses above this are never
@@ -184,6 +184,10 @@ public:
/// Dumps the address space layout to the log, for debugging
void LogLayout(Log::Level log_level) const;
+ /// Each VMManager has its own page table, which is set as the main one when the owning process
+ /// is scheduled.
+ Memory::PageTable page_table;
+
private:
using VMAIter = decltype(vma_map)::iterator;
diff --git a/src/core/hle/kernel/wait_object.cpp b/src/core/hle/kernel/wait_object.cpp
index f245eda6c..469554908 100644
--- a/src/core/hle/kernel/wait_object.cpp
+++ b/src/core/hle/kernel/wait_object.cpp
@@ -34,7 +34,7 @@ void WaitObject::RemoveWaitingThread(Thread* thread) {
SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() {
Thread* candidate = nullptr;
- s32 candidate_priority = THREADPRIO_LOWEST + 1;
+ u32 candidate_priority = THREADPRIO_LOWEST + 1;
for (const auto& thread : waiting_threads) {
// The list of waiting threads must not contain threads that are not waiting to be awakened.
@@ -71,23 +71,20 @@ void WaitObject::WakeupAllWaitingThreads() {
while (auto thread = GetHighestPriorityReadyThread()) {
if (!thread->IsSleepingOnWaitAll()) {
Acquire(thread.get());
- // Set the output index of the WaitSynchronizationN call to the index of this object.
- if (thread->wait_set_output) {
- thread->SetWaitSynchronizationOutput(thread->GetWaitObjectIndex(this));
- thread->wait_set_output = false;
- }
} else {
for (auto& object : thread->wait_objects) {
object->Acquire(thread.get());
}
- // Note: This case doesn't update the output index of WaitSynchronizationN.
}
+ // Invoke the wakeup callback before clearing the wait objects
+ if (thread->wakeup_callback)
+ thread->wakeup_callback(ThreadWakeupReason::Signal, thread, this);
+
for (auto& object : thread->wait_objects)
object->RemoveWaitingThread(thread.get());
thread->wait_objects.clear();
- thread->SetWaitSynchronizationResult(RESULT_SUCCESS);
thread->ResumeFromWait();
}
}
diff --git a/src/core/hle/lock.cpp b/src/core/hle/lock.cpp
new file mode 100644
index 000000000..1c24c7ce9
--- /dev/null
+++ b/src/core/hle/lock.cpp
@@ -0,0 +1,11 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <core/hle/lock.h>
+
+namespace HLE {
+std::recursive_mutex g_hle_lock;
+}
diff --git a/src/core/hle/lock.h b/src/core/hle/lock.h
new file mode 100644
index 000000000..5c99fe996
--- /dev/null
+++ b/src/core/hle/lock.h
@@ -0,0 +1,18 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <mutex>
+
+namespace HLE {
+/*
+ * Synchronizes access to the internal HLE kernel structures, it is acquired when a guest
+ * application thread performs a syscall. It should be acquired by any host threads that read or
+ * modify the HLE kernel state. Note: Any operation that directly or indirectly reads from or writes
+ * to the emulated memory is not protected by this mutex, and should be avoided in any threads other
+ * than the CPU thread.
+ */
+extern std::recursive_mutex g_hle_lock;
+} // namespace HLE
diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp
index 5c44b43bb..912ab550d 100644
--- a/src/core/hle/service/apt/apt.cpp
+++ b/src/core/hle/service/apt/apt.cpp
@@ -2,6 +2,7 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <boost/optional.hpp>
#include "common/common_paths.h"
#include "common/file_util.h"
#include "common/logging/log.h"
@@ -18,6 +19,7 @@
#include "core/hle/service/apt/apt_s.h"
#include "core/hle/service/apt/apt_u.h"
#include "core/hle/service/apt/bcfnt/bcfnt.h"
+#include "core/hle/service/cfg/cfg.h"
#include "core/hle/service/fs/archive.h"
#include "core/hle/service/ptm/ptm.h"
#include "core/hle/service/service.h"
@@ -33,8 +35,6 @@ static bool shared_font_loaded = false;
static bool shared_font_relocated = false;
static Kernel::SharedPtr<Kernel::Mutex> lock;
-static Kernel::SharedPtr<Kernel::Event> notification_event; ///< APT notification event
-static Kernel::SharedPtr<Kernel::Event> parameter_event; ///< APT parameter event
static u32 cpu_percent; ///< CPU time available to the running application
@@ -43,43 +43,344 @@ static u8 unknown_ns_state_field;
static ScreencapPostPermission screen_capture_post_permission;
-/// Parameter data to be returned in the next call to Glance/ReceiveParameter
-static MessageParameter next_parameter;
+/// Parameter data to be returned in the next call to Glance/ReceiveParameter.
+/// TODO(Subv): Use std::optional once we migrate to C++17.
+static boost::optional<MessageParameter> next_parameter;
+
+enum class AppletPos { Application = 0, Library = 1, System = 2, SysLibrary = 3, Resident = 4 };
+
+static constexpr size_t NumAppletSlot = 4;
+
+enum class AppletSlot : u8 {
+ Application,
+ SystemApplet,
+ HomeMenu,
+ LibraryApplet,
+
+ // An invalid tag
+ Error,
+};
+
+union AppletAttributes {
+ u32 raw;
+
+ BitField<0, 3, u32> applet_pos;
+ BitField<29, 1, u32> is_home_menu;
+
+ AppletAttributes() : raw(0) {}
+ AppletAttributes(u32 attributes) : raw(attributes) {}
+};
+
+struct AppletSlotData {
+ AppletId applet_id;
+ AppletSlot slot;
+ bool registered;
+ AppletAttributes attributes;
+ Kernel::SharedPtr<Kernel::Event> notification_event;
+ Kernel::SharedPtr<Kernel::Event> parameter_event;
+};
+
+// Holds data about the concurrently running applets in the system.
+static std::array<AppletSlotData, NumAppletSlot> applet_slots = {};
+
+// This overload returns nullptr if no applet with the specified id has been started.
+static AppletSlotData* GetAppletSlotData(AppletId id) {
+ auto GetSlot = [](AppletSlot slot) -> AppletSlotData* {
+ return &applet_slots[static_cast<size_t>(slot)];
+ };
+
+ if (id == AppletId::Application) {
+ auto* slot = GetSlot(AppletSlot::Application);
+ if (slot->applet_id != AppletId::None)
+ return slot;
+
+ return nullptr;
+ }
+
+ if (id == AppletId::AnySystemApplet) {
+ auto* system_slot = GetSlot(AppletSlot::SystemApplet);
+ if (system_slot->applet_id != AppletId::None)
+ return system_slot;
+
+ // The Home Menu is also a system applet, but it lives in its own slot to be able to run
+ // concurrently with other system applets.
+ auto* home_slot = GetSlot(AppletSlot::HomeMenu);
+ if (home_slot->applet_id != AppletId::None)
+ return home_slot;
+
+ return nullptr;
+ }
+
+ if (id == AppletId::AnyLibraryApplet || id == AppletId::AnySysLibraryApplet) {
+ auto* slot = GetSlot(AppletSlot::LibraryApplet);
+ if (slot->applet_id == AppletId::None)
+ return nullptr;
+
+ u32 applet_pos = slot->attributes.applet_pos;
+
+ if (id == AppletId::AnyLibraryApplet && applet_pos == static_cast<u32>(AppletPos::Library))
+ return slot;
+
+ if (id == AppletId::AnySysLibraryApplet &&
+ applet_pos == static_cast<u32>(AppletPos::SysLibrary))
+ return slot;
+
+ return nullptr;
+ }
+
+ if (id == AppletId::HomeMenu || id == AppletId::AlternateMenu) {
+ auto* slot = GetSlot(AppletSlot::HomeMenu);
+ if (slot->applet_id != AppletId::None)
+ return slot;
+
+ return nullptr;
+ }
+
+ for (auto& slot : applet_slots) {
+ if (slot.applet_id == id)
+ return &slot;
+ }
+
+ return nullptr;
+}
+
+static AppletSlotData* GetAppletSlotData(AppletAttributes attributes) {
+ // Mapping from AppletPos to AppletSlot
+ static constexpr std::array<AppletSlot, 6> applet_position_slots = {
+ AppletSlot::Application, AppletSlot::LibraryApplet, AppletSlot::SystemApplet,
+ AppletSlot::LibraryApplet, AppletSlot::Error, AppletSlot::LibraryApplet};
+
+ u32 applet_pos = attributes.applet_pos;
+ if (applet_pos >= applet_position_slots.size())
+ return nullptr;
+
+ AppletSlot slot = applet_position_slots[applet_pos];
+
+ if (slot == AppletSlot::Error)
+ return nullptr;
+
+ // The Home Menu is a system applet, however, it has its own applet slot so that it can run
+ // concurrently with other system applets.
+ if (slot == AppletSlot::SystemApplet && attributes.is_home_menu)
+ return &applet_slots[static_cast<size_t>(AppletSlot::HomeMenu)];
+
+ return &applet_slots[static_cast<size_t>(slot)];
+}
void SendParameter(const MessageParameter& parameter) {
next_parameter = parameter;
- // Signal the event to let the application know that a new parameter is ready to be read
- parameter_event->Signal();
+ // Signal the event to let the receiver know that a new parameter is ready to be read
+ auto* const slot_data = GetAppletSlotData(static_cast<AppletId>(parameter.destination_id));
+ if (slot_data == nullptr) {
+ LOG_DEBUG(Service_APT, "No applet was registered with the id %03X",
+ parameter.destination_id);
+ return;
+ }
+
+ slot_data->parameter_event->Signal();
}
void Initialize(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x2, 2, 0); // 0x20080
u32 app_id = rp.Pop<u32>();
- u32 flags = rp.Pop<u32>();
+ u32 attributes = rp.Pop<u32>();
+
+ LOG_DEBUG(Service_APT, "called app_id=0x%08X, attributes=0x%08X", app_id, attributes);
+
+ auto* const slot_data = GetAppletSlotData(attributes);
+
+ // Note: The real NS service does not check if the attributes value is valid before accessing
+ // the data in the array
+ ASSERT_MSG(slot_data, "Invalid application attributes");
+
+ if (slot_data->registered) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(ResultCode(ErrorDescription::AlreadyExists, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+ return;
+ }
+
+ slot_data->applet_id = static_cast<AppletId>(app_id);
+ slot_data->attributes.raw = attributes;
+
IPC::RequestBuilder rb = rp.MakeBuilder(1, 3);
rb.Push(RESULT_SUCCESS);
- rb.PushCopyHandles(Kernel::g_handle_table.Create(notification_event).Unwrap(),
- Kernel::g_handle_table.Create(parameter_event).Unwrap());
+ rb.PushCopyHandles(Kernel::g_handle_table.Create(slot_data->notification_event).Unwrap(),
+ Kernel::g_handle_table.Create(slot_data->parameter_event).Unwrap());
+
+ if (slot_data->applet_id == AppletId::Application ||
+ slot_data->applet_id == AppletId::HomeMenu) {
+ // Initialize the APT parameter to wake up the application.
+ next_parameter.emplace();
+ next_parameter->signal = static_cast<u32>(SignalType::Wakeup);
+ next_parameter->sender_id = static_cast<u32>(AppletId::None);
+ next_parameter->destination_id = app_id;
+ // Not signaling the parameter event will cause the application (or Home Menu) to hang
+ // during startup. In the real console, it is usually the Kernel and Home Menu who cause NS
+ // to signal the HomeMenu and Application parameter events, respectively.
+ slot_data->parameter_event->Signal();
+ }
+}
- // TODO(bunnei): Check if these events are cleared every time Initialize is called.
- notification_event->Clear();
- parameter_event->Clear();
+static u32 DecompressLZ11(const u8* in, u8* out) {
+ u32_le decompressed_size;
+ memcpy(&decompressed_size, in, sizeof(u32));
+ in += 4;
+
+ u8 type = decompressed_size & 0xFF;
+ ASSERT(type == 0x11);
+ decompressed_size >>= 8;
- ASSERT_MSG((nullptr != lock), "Cannot initialize without lock");
- lock->Release();
+ u32 current_out_size = 0;
+ u8 flags = 0, mask = 1;
+ while (current_out_size < decompressed_size) {
+ if (mask == 1) {
+ flags = *(in++);
+ mask = 0x80;
+ } else {
+ mask >>= 1;
+ }
- LOG_DEBUG(Service_APT, "called app_id=0x%08X, flags=0x%08X", app_id, flags);
+ if (flags & mask) {
+ u8 byte1 = *(in++);
+ u32 length = byte1 >> 4;
+ u32 offset;
+ if (length == 0) {
+ u8 byte2 = *(in++);
+ u8 byte3 = *(in++);
+ length = (((byte1 & 0x0F) << 4) | (byte2 >> 4)) + 0x11;
+ offset = (((byte2 & 0x0F) << 8) | byte3) + 0x1;
+ } else if (length == 1) {
+ u8 byte2 = *(in++);
+ u8 byte3 = *(in++);
+ u8 byte4 = *(in++);
+ length = (((byte1 & 0x0F) << 12) | (byte2 << 4) | (byte3 >> 4)) + 0x111;
+ offset = (((byte3 & 0x0F) << 8) | byte4) + 0x1;
+ } else {
+ u8 byte2 = *(in++);
+ length = (byte1 >> 4) + 0x1;
+ offset = (((byte1 & 0x0F) << 8) | byte2) + 0x1;
+ }
+
+ for (u32 i = 0; i < length; i++) {
+ *out = *(out - offset);
+ ++out;
+ }
+
+ current_out_size += length;
+ } else {
+ *(out++) = *(in++);
+ current_out_size++;
+ }
+ }
+ return decompressed_size;
+}
+
+static bool LoadSharedFont() {
+ u8 font_region_code;
+ switch (CFG::GetRegionValue()) {
+ case 4: // CHN
+ font_region_code = 2;
+ break;
+ case 5: // KOR
+ font_region_code = 3;
+ break;
+ case 6: // TWN
+ font_region_code = 4;
+ break;
+ default: // JPN/EUR/USA
+ font_region_code = 1;
+ break;
+ }
+
+ const u64_le shared_font_archive_id_low = 0x0004009b00014002 | ((font_region_code - 1) << 8);
+ const u64_le shared_font_archive_id_high = 0x00000001ffffff00;
+ std::vector<u8> shared_font_archive_id(16);
+ std::memcpy(&shared_font_archive_id[0], &shared_font_archive_id_low, sizeof(u64));
+ std::memcpy(&shared_font_archive_id[8], &shared_font_archive_id_high, sizeof(u64));
+ FileSys::Path archive_path(shared_font_archive_id);
+ auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::NCCH, archive_path);
+ if (archive_result.Failed())
+ return false;
+
+ std::vector<u8> romfs_path(20, 0); // 20-byte all zero path for opening RomFS
+ FileSys::Path file_path(romfs_path);
+ FileSys::Mode open_mode = {};
+ open_mode.read_flag.Assign(1);
+ auto file_result = Service::FS::OpenFileFromArchive(*archive_result, file_path, open_mode);
+ if (file_result.Failed())
+ return false;
+
+ auto romfs = std::move(file_result).Unwrap();
+ std::vector<u8> romfs_buffer(romfs->backend->GetSize());
+ romfs->backend->Read(0, romfs_buffer.size(), romfs_buffer.data());
+ romfs->backend->Close();
+
+ const char16_t* file_name[4] = {u"cbf_std.bcfnt.lz", u"cbf_zh-Hans-CN.bcfnt.lz",
+ u"cbf_ko-Hang-KR.bcfnt.lz", u"cbf_zh-Hant-TW.bcfnt.lz"};
+ const u8* font_file =
+ RomFS::GetFilePointer(romfs_buffer.data(), {file_name[font_region_code - 1]});
+ if (font_file == nullptr)
+ return false;
+
+ struct {
+ u32_le status;
+ u32_le region;
+ u32_le decompressed_size;
+ INSERT_PADDING_WORDS(0x1D);
+ } shared_font_header{};
+ static_assert(sizeof(shared_font_header) == 0x80, "shared_font_header has incorrect size");
+
+ shared_font_header.status = 2; // successfully loaded
+ shared_font_header.region = font_region_code;
+ shared_font_header.decompressed_size =
+ DecompressLZ11(font_file, shared_font_mem->GetPointer(0x80));
+ std::memcpy(shared_font_mem->GetPointer(), &shared_font_header, sizeof(shared_font_header));
+ *shared_font_mem->GetPointer(0x83) = 'U'; // Change the magic from "CFNT" to "CFNU"
+
+ return true;
+}
+
+static bool LoadLegacySharedFont() {
+ // This is the legacy method to load shared font.
+ // The expected format is a decrypted, uncompressed BCFNT file with the 0x80 byte header
+ // generated by the APT:U service. The best way to get is by dumping it from RAM. We've provided
+ // a homebrew app to do this: https://github.com/citra-emu/3dsutils. Put the resulting file
+ // "shared_font.bin" in the Citra "sysdata" directory.
+ std::string filepath = FileUtil::GetUserPath(D_SYSDATA_IDX) + SHARED_FONT;
+
+ FileUtil::CreateFullPath(filepath); // Create path if not already created
+ FileUtil::IOFile file(filepath, "rb");
+ if (file.IsOpen()) {
+ file.ReadBytes(shared_font_mem->GetPointer(), file.GetSize());
+ return true;
+ }
+
+ return false;
}
void GetSharedFont(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x44, 0, 0); // 0x00440000
IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
+
+ // Log in telemetry if the game uses the shared font
+ Core::Telemetry().AddField(Telemetry::FieldType::Session, "RequiresSharedFont", true);
+
if (!shared_font_loaded) {
- LOG_ERROR(Service_APT, "shared font file missing - go dump it from your 3ds");
- rb.Push<u32>(-1); // TODO: Find the right error code
- rb.Skip(1 + 2, true);
- Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSharedFont);
- return;
+ // On real 3DS, font loading happens on booting. However, we load it on demand to coordinate
+ // with CFG region auto configuration, which happens later than APT initialization.
+ if (LoadSharedFont()) {
+ shared_font_loaded = true;
+ } else if (LoadLegacySharedFont()) {
+ LOG_WARNING(Service_APT, "Loaded shared font by legacy method");
+ shared_font_loaded = true;
+ } else {
+ LOG_ERROR(Service_APT, "shared font file missing - go dump it from your 3ds");
+ rb.Push<u32>(-1); // TODO: Find the right error code
+ rb.Skip(1 + 2, true);
+ Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSharedFont);
+ return;
+ }
}
// The shared font has to be relocated to the new address before being passed to the
@@ -115,7 +416,12 @@ void GetLockHandle(Service::Interface* self) {
// this will cause the app to wait until parameter_event is signaled.
u32 applet_attributes = rp.Pop<u32>();
IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
- rb.Push(RESULT_SUCCESS); // No error
+ rb.Push(RESULT_SUCCESS); // No error
+
+ // TODO(Subv): The output attributes should have an AppletPos of either Library or System |
+ // Library (depending on the type of the last launched applet) if the input attributes'
+ // AppletPos has the Library bit set.
+
rb.Push(applet_attributes); // Applet Attributes, this value is passed to Enable.
rb.Push<u32>(0); // Least significant bit = power button state
Kernel::Handle handle_copy = Kernel::g_handle_table.Create(lock).Unwrap();
@@ -128,10 +434,22 @@ void GetLockHandle(Service::Interface* self) {
void Enable(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x3, 1, 0); // 0x30040
u32 attributes = rp.Pop<u32>();
+
+ LOG_DEBUG(Service_APT, "called attributes=0x%08X", attributes);
+
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
- rb.Push(RESULT_SUCCESS); // No error
- parameter_event->Signal(); // Let the application know that it has been started
- LOG_WARNING(Service_APT, "(STUBBED) called attributes=0x%08X", attributes);
+
+ auto* const slot_data = GetAppletSlotData(attributes);
+
+ if (!slot_data) {
+ rb.Push(ResultCode(ErrCodes::InvalidAppletSlot, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+ return;
+ }
+
+ slot_data->registered = true;
+
+ rb.Push(RESULT_SUCCESS);
}
void GetAppletManInfo(Service::Interface* self) {
@@ -149,22 +467,27 @@ void GetAppletManInfo(Service::Interface* self) {
void IsRegistered(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x9, 1, 0); // 0x90040
- u32 app_id = rp.Pop<u32>();
+ AppletId app_id = static_cast<AppletId>(rp.Pop<u32>());
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
rb.Push(RESULT_SUCCESS); // No error
- // TODO(Subv): An application is considered "registered" if it has already called APT::Enable
- // handle this properly once we implement multiprocess support.
- bool is_registered = false; // Set to not registered by default
+ auto* const slot_data = GetAppletSlotData(app_id);
+
+ // Check if an LLE applet was registered first, then fallback to HLE applets
+ bool is_registered = slot_data && slot_data->registered;
- if (app_id == static_cast<u32>(AppletId::AnyLibraryApplet)) {
- is_registered = HLE::Applets::IsLibraryAppletRunning();
- } else if (auto applet = HLE::Applets::Applet::Get(static_cast<AppletId>(app_id))) {
- is_registered = true; // Set to registered
+ if (!is_registered) {
+ if (app_id == AppletId::AnyLibraryApplet) {
+ is_registered = HLE::Applets::IsLibraryAppletRunning();
+ } else if (auto applet = HLE::Applets::Applet::Get(app_id)) {
+ // The applet exists, set it as registered.
+ is_registered = true;
+ }
}
+
rb.Push(is_registered);
- LOG_WARNING(Service_APT, "(STUBBED) called app_id=0x%08X", app_id);
+ LOG_DEBUG(Service_APT, "called app_id=0x%08X", static_cast<u32>(app_id));
}
void InquireNotification(Service::Interface* self) {
@@ -186,14 +509,17 @@ void SendParameter(Service::Interface* self) {
size_t size;
VAddr buffer = rp.PopStaticBuffer(&size);
- std::shared_ptr<HLE::Applets::Applet> dest_applet =
- HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id));
+ LOG_DEBUG(Service_APT,
+ "called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X,"
+ "buffer_size=0x%08X, handle=0x%08X, size=0x%08zX, in_param_buffer_ptr=0x%08X",
+ src_app_id, dst_app_id, signal_type, buffer_size, handle, size, buffer);
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
- if (dest_applet == nullptr) {
- LOG_ERROR(Service_APT, "Unknown applet id=0x%08X", dst_app_id);
- rb.Push<u32>(-1); // TODO(Subv): Find the right error code
+ // A new parameter can not be sent if the previous one hasn't been consumed yet
+ if (next_parameter) {
+ rb.Push(ResultCode(ErrCodes::ParameterPresent, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
return;
}
@@ -205,12 +531,14 @@ void SendParameter(Service::Interface* self) {
param.buffer.resize(buffer_size);
Memory::ReadBlock(buffer, param.buffer.data(), param.buffer.size());
- rb.Push(dest_applet->ReceiveParameter(param));
+ SendParameter(param);
- LOG_WARNING(Service_APT,
- "(STUBBED) called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X,"
- "buffer_size=0x%08X, handle=0x%08X, size=0x%08zX, in_param_buffer_ptr=0x%08X",
- src_app_id, dst_app_id, signal_type, buffer_size, handle, size, buffer);
+ // If the applet is running in HLE mode, use the HLE interface to communicate with it.
+ if (auto dest_applet = HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id))) {
+ rb.Push(dest_applet->ReceiveParameter(param));
+ } else {
+ rb.Push(RESULT_SUCCESS);
+ }
}
void ReceiveParameter(Service::Interface* self) {
@@ -226,21 +554,40 @@ void ReceiveParameter(Service::Interface* self) {
"buffer_size is bigger than the size in the buffer descriptor (0x%08X > 0x%08zX)",
buffer_size, static_buff_size);
+ LOG_DEBUG(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size);
+
+ if (!next_parameter) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(ResultCode(ErrorDescription::NoData, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+ return;
+ }
+
+ if (next_parameter->destination_id != app_id) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::Applet, ErrorSummary::NotFound,
+ ErrorLevel::Status));
+ return;
+ }
+
IPC::RequestBuilder rb = rp.MakeBuilder(4, 4);
+
rb.Push(RESULT_SUCCESS); // No error
- rb.Push(next_parameter.sender_id);
- rb.Push(next_parameter.signal); // Signal type
- ASSERT_MSG(next_parameter.buffer.size() <= buffer_size, "Input static buffer is too small !");
- rb.Push(static_cast<u32>(next_parameter.buffer.size())); // Parameter buffer size
+ rb.Push(next_parameter->sender_id);
+ rb.Push(next_parameter->signal); // Signal type
+ ASSERT_MSG(next_parameter->buffer.size() <= buffer_size, "Input static buffer is too small !");
+ rb.Push(static_cast<u32>(next_parameter->buffer.size())); // Parameter buffer size
- rb.PushMoveHandles((next_parameter.object != nullptr)
- ? Kernel::g_handle_table.Create(next_parameter.object).Unwrap()
+ rb.PushMoveHandles((next_parameter->object != nullptr)
+ ? Kernel::g_handle_table.Create(next_parameter->object).Unwrap()
: 0);
- rb.PushStaticBuffer(buffer, static_cast<u32>(next_parameter.buffer.size()), 0);
- Memory::WriteBlock(buffer, next_parameter.buffer.data(), next_parameter.buffer.size());
+ rb.PushStaticBuffer(buffer, next_parameter->buffer.size(), 0);
+
+ Memory::WriteBlock(buffer, next_parameter->buffer.data(), next_parameter->buffer.size());
- LOG_WARNING(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size);
+ // Clear the parameter
+ next_parameter = boost::none;
}
void GlanceParameter(Service::Interface* self) {
@@ -256,37 +603,74 @@ void GlanceParameter(Service::Interface* self) {
"buffer_size is bigger than the size in the buffer descriptor (0x%08X > 0x%08zX)",
buffer_size, static_buff_size);
+ LOG_DEBUG(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size);
+
+ if (!next_parameter) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(ResultCode(ErrorDescription::NoData, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+ return;
+ }
+
+ if (next_parameter->destination_id != app_id) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::Applet, ErrorSummary::NotFound,
+ ErrorLevel::Status));
+ return;
+ }
+
IPC::RequestBuilder rb = rp.MakeBuilder(4, 4);
rb.Push(RESULT_SUCCESS); // No error
- rb.Push(next_parameter.sender_id);
- rb.Push(next_parameter.signal); // Signal type
- ASSERT_MSG(next_parameter.buffer.size() <= buffer_size, "Input static buffer is too small !");
- rb.Push(static_cast<u32>(next_parameter.buffer.size())); // Parameter buffer size
+ rb.Push(next_parameter->sender_id);
+ rb.Push(next_parameter->signal); // Signal type
+ ASSERT_MSG(next_parameter->buffer.size() <= buffer_size, "Input static buffer is too small !");
+ rb.Push(static_cast<u32>(next_parameter->buffer.size())); // Parameter buffer size
- rb.PushCopyHandles((next_parameter.object != nullptr)
- ? Kernel::g_handle_table.Create(next_parameter.object).Unwrap()
+ rb.PushMoveHandles((next_parameter->object != nullptr)
+ ? Kernel::g_handle_table.Create(next_parameter->object).Unwrap()
: 0);
- rb.PushStaticBuffer(buffer, static_cast<u32>(next_parameter.buffer.size()), 0);
- Memory::WriteBlock(buffer, next_parameter.buffer.data(), next_parameter.buffer.size());
+ rb.PushStaticBuffer(buffer, next_parameter->buffer.size(), 0);
+
+ Memory::WriteBlock(buffer, next_parameter->buffer.data(), next_parameter->buffer.size());
- LOG_WARNING(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size);
+ // Note: The NS module always clears the DSPSleep and DSPWakeup signals even in GlanceParameter.
+ if (next_parameter->signal == static_cast<u32>(SignalType::DspSleep) ||
+ next_parameter->signal == static_cast<u32>(SignalType::DspWakeup))
+ next_parameter = boost::none;
}
void CancelParameter(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0xF, 4, 0); // 0xF0100
- u32 check_sender = rp.Pop<u32>();
+ bool check_sender = rp.Pop<bool>();
u32 sender_appid = rp.Pop<u32>();
- u32 check_receiver = rp.Pop<u32>();
+ bool check_receiver = rp.Pop<bool>();
u32 receiver_appid = rp.Pop<u32>();
+
+ bool cancellation_success = true;
+
+ if (!next_parameter) {
+ cancellation_success = false;
+ } else {
+ if (check_sender && next_parameter->sender_id != sender_appid)
+ cancellation_success = false;
+
+ if (check_receiver && next_parameter->destination_id != receiver_appid)
+ cancellation_success = false;
+ }
+
+ if (cancellation_success)
+ next_parameter = boost::none;
+
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
+
rb.Push(RESULT_SUCCESS); // No error
- rb.Push(true); // Set to Success
+ rb.Push(cancellation_success);
- LOG_WARNING(Service_APT, "(STUBBED) called check_sender=0x%08X, sender_appid=0x%08X, "
- "check_receiver=0x%08X, receiver_appid=0x%08X",
- check_sender, sender_appid, check_receiver, receiver_appid);
+ LOG_DEBUG(Service_APT, "called check_sender=%u, sender_appid=0x%08X, "
+ "check_receiver=%u, receiver_appid=0x%08X",
+ check_sender, sender_appid, check_receiver, receiver_appid);
}
void PrepareToStartApplication(Service::Interface* self) {
@@ -383,7 +767,12 @@ void PrepareToStartLibraryApplet(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x18, 1, 0); // 0x180040
AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>());
+ LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
+
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+
+ // TODO(Subv): Launch the requested applet application.
+
auto applet = HLE::Applets::Applet::Get(applet_id);
if (applet) {
LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id);
@@ -391,14 +780,32 @@ void PrepareToStartLibraryApplet(Service::Interface* self) {
} else {
rb.Push(HLE::Applets::Applet::Create(applet_id));
}
- LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
+}
+
+void PrepareToStartNewestHomeMenu(Service::Interface* self) {
+ IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1A, 0, 0); // 0x1A0000
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+
+ // TODO(Subv): This command can only be called by a System Applet (return 0xC8A0CC04 otherwise).
+
+ // This command must return an error when called, otherwise the Home Menu will try to reboot the
+ // system.
+ rb.Push(ResultCode(ErrorDescription::AlreadyExists, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+
+ LOG_DEBUG(Service_APT, "called");
}
void PreloadLibraryApplet(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x16, 1, 0); // 0x160040
AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>());
+ LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
+
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+
+ // TODO(Subv): Launch the requested applet application.
+
auto applet = HLE::Applets::Applet::Get(applet_id);
if (applet) {
LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id);
@@ -406,34 +813,40 @@ void PreloadLibraryApplet(Service::Interface* self) {
} else {
rb.Push(HLE::Applets::Applet::Create(applet_id));
}
- LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
}
void StartLibraryApplet(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1E, 2, 4); // 0x1E0084
AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>());
- std::shared_ptr<HLE::Applets::Applet> applet = HLE::Applets::Applet::Get(applet_id);
-
- LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
-
- if (applet == nullptr) {
- LOG_ERROR(Service_APT, "unknown applet id=%08X", applet_id);
- IPC::RequestBuilder rb = rp.MakeBuilder(1, 0, false);
- rb.Push<u32>(-1); // TODO(Subv): Find the right error code
- return;
- }
size_t buffer_size = rp.Pop<u32>();
Kernel::Handle handle = rp.PopHandle();
VAddr buffer_addr = rp.PopStaticBuffer();
- AppletStartupParameter parameter;
- parameter.object = Kernel::g_handle_table.GetGeneric(handle);
- parameter.buffer.resize(buffer_size);
- Memory::ReadBlock(buffer_addr, parameter.buffer.data(), parameter.buffer.size());
+ LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
- rb.Push(applet->Start(parameter));
+
+ // Send the Wakeup signal to the applet
+ MessageParameter param;
+ param.destination_id = static_cast<u32>(applet_id);
+ param.sender_id = static_cast<u32>(AppletId::Application);
+ param.object = Kernel::g_handle_table.GetGeneric(handle);
+ param.signal = static_cast<u32>(SignalType::Wakeup);
+ param.buffer.resize(buffer_size);
+ Memory::ReadBlock(buffer_addr, param.buffer.data(), param.buffer.size());
+ SendParameter(param);
+
+ // In case the applet is being HLEd, attempt to communicate with it.
+ if (auto applet = HLE::Applets::Applet::Get(applet_id)) {
+ AppletStartupParameter parameter;
+ parameter.object = Kernel::g_handle_table.GetGeneric(handle);
+ parameter.buffer.resize(buffer_size);
+ Memory::ReadBlock(buffer_addr, parameter.buffer.data(), parameter.buffer.size());
+ rb.Push(applet->Start(parameter));
+ } else {
+ rb.Push(RESULT_SUCCESS);
+ }
}
void CancelLibraryApplet(Service::Interface* self) {
@@ -647,125 +1060,6 @@ void CheckNew3DS(Service::Interface* self) {
LOG_WARNING(Service_APT, "(STUBBED) called");
}
-static u32 DecompressLZ11(const u8* in, u8* out) {
- u32_le decompressed_size;
- memcpy(&decompressed_size, in, sizeof(u32));
- in += 4;
-
- u8 type = decompressed_size & 0xFF;
- ASSERT(type == 0x11);
- decompressed_size >>= 8;
-
- u32 current_out_size = 0;
- u8 flags = 0, mask = 1;
- while (current_out_size < decompressed_size) {
- if (mask == 1) {
- flags = *(in++);
- mask = 0x80;
- } else {
- mask >>= 1;
- }
-
- if (flags & mask) {
- u8 byte1 = *(in++);
- u32 length = byte1 >> 4;
- u32 offset;
- if (length == 0) {
- u8 byte2 = *(in++);
- u8 byte3 = *(in++);
- length = (((byte1 & 0x0F) << 4) | (byte2 >> 4)) + 0x11;
- offset = (((byte2 & 0x0F) << 8) | byte3) + 0x1;
- } else if (length == 1) {
- u8 byte2 = *(in++);
- u8 byte3 = *(in++);
- u8 byte4 = *(in++);
- length = (((byte1 & 0x0F) << 12) | (byte2 << 4) | (byte3 >> 4)) + 0x111;
- offset = (((byte3 & 0x0F) << 8) | byte4) + 0x1;
- } else {
- u8 byte2 = *(in++);
- length = (byte1 >> 4) + 0x1;
- offset = (((byte1 & 0x0F) << 8) | byte2) + 0x1;
- }
-
- for (u32 i = 0; i < length; i++) {
- *out = *(out - offset);
- ++out;
- }
-
- current_out_size += length;
- } else {
- *(out++) = *(in++);
- current_out_size++;
- }
- }
- return decompressed_size;
-}
-
-static bool LoadSharedFont() {
- // TODO (wwylele): load different font archive for region CHN/KOR/TWN
- const u64_le shared_font_archive_id_low = 0x0004009b00014002;
- const u64_le shared_font_archive_id_high = 0x00000001ffffff00;
- std::vector<u8> shared_font_archive_id(16);
- std::memcpy(&shared_font_archive_id[0], &shared_font_archive_id_low, sizeof(u64));
- std::memcpy(&shared_font_archive_id[8], &shared_font_archive_id_high, sizeof(u64));
- FileSys::Path archive_path(shared_font_archive_id);
- auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::NCCH, archive_path);
- if (archive_result.Failed())
- return false;
-
- std::vector<u8> romfs_path(20, 0); // 20-byte all zero path for opening RomFS
- FileSys::Path file_path(romfs_path);
- FileSys::Mode open_mode = {};
- open_mode.read_flag.Assign(1);
- auto file_result = Service::FS::OpenFileFromArchive(*archive_result, file_path, open_mode);
- if (file_result.Failed())
- return false;
-
- auto romfs = std::move(file_result).Unwrap();
- std::vector<u8> romfs_buffer(romfs->backend->GetSize());
- romfs->backend->Read(0, romfs_buffer.size(), romfs_buffer.data());
- romfs->backend->Close();
-
- const u8* font_file = RomFS::GetFilePointer(romfs_buffer.data(), {u"cbf_std.bcfnt.lz"});
- if (font_file == nullptr)
- return false;
-
- struct {
- u32_le status;
- u32_le region;
- u32_le decompressed_size;
- INSERT_PADDING_WORDS(0x1D);
- } shared_font_header{};
- static_assert(sizeof(shared_font_header) == 0x80, "shared_font_header has incorrect size");
-
- shared_font_header.status = 2; // successfully loaded
- shared_font_header.region = 1; // region JPN/EUR/USA
- shared_font_header.decompressed_size =
- DecompressLZ11(font_file, shared_font_mem->GetPointer(0x80));
- std::memcpy(shared_font_mem->GetPointer(), &shared_font_header, sizeof(shared_font_header));
- *shared_font_mem->GetPointer(0x83) = 'U'; // Change the magic from "CFNT" to "CFNU"
-
- return true;
-}
-
-static bool LoadLegacySharedFont() {
- // This is the legacy method to load shared font.
- // The expected format is a decrypted, uncompressed BCFNT file with the 0x80 byte header
- // generated by the APT:U service. The best way to get is by dumping it from RAM. We've provided
- // a homebrew app to do this: https://github.com/citra-emu/3dsutils. Put the resulting file
- // "shared_font.bin" in the Citra "sysdata" directory.
- std::string filepath = FileUtil::GetUserPath(D_SYSDATA_IDX) + SHARED_FONT;
-
- FileUtil::CreateFullPath(filepath); // Create path if not already created
- FileUtil::IOFile file(filepath, "rb");
- if (file.IsOpen()) {
- file.ReadBytes(shared_font_mem->GetPointer(), file.GetSize());
- return true;
- }
-
- return false;
-}
-
void Init() {
AddService(new APT_A_Interface);
AddService(new APT_S_Interface);
@@ -789,19 +1083,24 @@ void Init() {
shared_font_loaded = false;
}
- lock = Kernel::Mutex::Create(false, "APT_U:Lock");
+ lock = Kernel::Mutex::Create(false, 0, "APT_U:Lock");
cpu_percent = 0;
unknown_ns_state_field = 0;
screen_capture_post_permission =
ScreencapPostPermission::CleanThePermission; // TODO(JamePeng): verify the initial value
- // TODO(bunnei): Check if these are created in Initialize or on APT process startup.
- notification_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Notification");
- parameter_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Start");
-
- next_parameter.signal = static_cast<u32>(SignalType::Wakeup);
- next_parameter.destination_id = 0x300;
+ for (size_t slot = 0; slot < applet_slots.size(); ++slot) {
+ auto& slot_data = applet_slots[slot];
+ slot_data.slot = static_cast<AppletSlot>(slot);
+ slot_data.applet_id = AppletId::None;
+ slot_data.attributes.raw = 0;
+ slot_data.registered = false;
+ slot_data.notification_event =
+ Kernel::Event::Create(Kernel::ResetType::OneShot, "APT:Notification");
+ slot_data.parameter_event =
+ Kernel::Event::Create(Kernel::ResetType::OneShot, "APT:Parameter");
+ }
}
void Shutdown() {
@@ -809,10 +1108,14 @@ void Shutdown() {
shared_font_loaded = false;
shared_font_relocated = false;
lock = nullptr;
- notification_event = nullptr;
- parameter_event = nullptr;
- next_parameter.object = nullptr;
+ for (auto& slot : applet_slots) {
+ slot.registered = false;
+ slot.notification_event = nullptr;
+ slot.parameter_event = nullptr;
+ }
+
+ next_parameter = boost::none;
HLE::Applets::Shutdown();
}
diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h
index ee80926d2..7b79e1f3e 100644
--- a/src/core/hle/service/apt/apt.h
+++ b/src/core/hle/service/apt/apt.h
@@ -72,6 +72,8 @@ enum class SignalType : u32 {
/// App Id's used by APT functions
enum class AppletId : u32 {
+ None = 0,
+ AnySystemApplet = 0x100,
HomeMenu = 0x101,
AlternateMenu = 0x103,
Camera = 0x110,
@@ -83,6 +85,7 @@ enum class AppletId : u32 {
Miiverse = 0x117,
MiiversePost = 0x118,
AmiiboSettings = 0x119,
+ AnySysLibraryApplet = 0x200,
SoftwareKeyboard1 = 0x201,
Ed1 = 0x202,
PnoteApp = 0x204,
@@ -116,6 +119,13 @@ enum class ScreencapPostPermission : u32 {
DisableScreenshotPostingToMiiverse = 3
};
+namespace ErrCodes {
+enum {
+ ParameterPresent = 2,
+ InvalidAppletSlot = 4,
+};
+} // namespace ErrCodes
+
/// Send a parameter to the currently-running application, which will read it via ReceiveParameter
void SendParameter(const MessageParameter& parameter);
@@ -410,6 +420,16 @@ void GetAppCpuTimeLimit(Service::Interface* self);
void PrepareToStartLibraryApplet(Service::Interface* self);
/**
+ * APT::PrepareToStartNewestHomeMenu service function
+ * Inputs:
+ * 0 : Command header [0x001A0000]
+ * Outputs:
+ * 0 : Return header
+ * 1 : Result of function
+ */
+void PrepareToStartNewestHomeMenu(Service::Interface* self);
+
+/**
* APT::PreloadLibraryApplet service function
* Inputs:
* 0 : Command header [0x00160040]
diff --git a/src/core/hle/service/apt/apt_s.cpp b/src/core/hle/service/apt/apt_s.cpp
index ec5668d05..bb78ee7d7 100644
--- a/src/core/hle/service/apt/apt_s.cpp
+++ b/src/core/hle/service/apt/apt_s.cpp
@@ -17,10 +17,10 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00060040, GetAppletInfo, "GetAppletInfo"},
{0x00070000, nullptr, "GetLastSignaledAppletId"},
{0x00080000, nullptr, "CountRegisteredApplet"},
- {0x00090040, nullptr, "IsRegistered"},
+ {0x00090040, IsRegistered, "IsRegistered"},
{0x000A0040, nullptr, "GetAttribute"},
{0x000B0040, InquireNotification, "InquireNotification"},
- {0x000C0104, nullptr, "SendParameter"},
+ {0x000C0104, SendParameter, "SendParameter"},
{0x000D0080, ReceiveParameter, "ReceiveParameter"},
{0x000E0080, GlanceParameter, "GlanceParameter"},
{0x000F0100, nullptr, "CancelParameter"},
@@ -34,11 +34,11 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00170040, nullptr, "FinishPreloadingLibraryApplet"},
{0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"},
{0x00190040, nullptr, "PrepareToStartSystemApplet"},
- {0x001A0000, nullptr, "PrepareToStartNewestHomeMenu"},
+ {0x001A0000, PrepareToStartNewestHomeMenu, "PrepareToStartNewestHomeMenu"},
{0x001B00C4, nullptr, "StartApplication"},
{0x001C0000, nullptr, "WakeupApplication"},
{0x001D0000, nullptr, "CancelApplication"},
- {0x001E0084, nullptr, "StartLibraryApplet"},
+ {0x001E0084, StartLibraryApplet, "StartLibraryApplet"},
{0x001F0084, nullptr, "StartSystemApplet"},
{0x00200044, nullptr, "StartNewestHomeMenu"},
{0x00210000, nullptr, "OrderToCloseApplication"},
diff --git a/src/core/hle/service/cam/cam.cpp b/src/core/hle/service/cam/cam.cpp
index c9f9e9d95..8172edae8 100644
--- a/src/core/hle/service/cam/cam.cpp
+++ b/src/core/hle/service/cam/cam.cpp
@@ -177,7 +177,7 @@ void CompletionEventCallBack(u64 port_id, int) {
LOG_ERROR(Service_CAM, "The destination size (%u) doesn't match the source (%zu)!",
port.dest_size, buffer_size);
}
- Memory::WriteBlock(port.dest, buffer.data(), std::min<u32>(port.dest_size, buffer_size));
+ Memory::WriteBlock(port.dest, buffer.data(), std::min<size_t>(port.dest_size, buffer_size));
}
port.is_receiving = false;
diff --git a/src/core/hle/service/cfg/cfg.cpp b/src/core/hle/service/cfg/cfg.cpp
index 6624f1711..f78c25fb2 100644
--- a/src/core/hle/service/cfg/cfg.cpp
+++ b/src/core/hle/service/cfg/cfg.cpp
@@ -141,7 +141,7 @@ void GetCountryCodeString(Service::Interface* self) {
void GetCountryCodeID(Service::Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
- u16 country_code = cmd_buff[1];
+ u16 country_code = static_cast<u16>(cmd_buff[1]);
u16 country_code_id = 0;
// The following algorithm will fail if the first country code isn't 0.
@@ -168,7 +168,7 @@ void GetCountryCodeID(Service::Interface* self) {
cmd_buff[2] = country_code_id;
}
-static u32 GetRegionValue() {
+u32 GetRegionValue() {
if (Settings::values.region_value == Settings::REGION_VALUE_AUTO_SELECT)
return preferred_region_code;
@@ -681,7 +681,7 @@ void GenerateConsoleUniqueId(u32& random_number, u64& console_id) {
CryptoPP::AutoSeededRandomPool rng;
random_number = rng.GenerateWord32(0, 0xFFFF);
u64_le local_friend_code_seed;
- rng.GenerateBlock(reinterpret_cast<byte*>(&local_friend_code_seed),
+ rng.GenerateBlock(reinterpret_cast<CryptoPP::byte*>(&local_friend_code_seed),
sizeof(local_friend_code_seed));
console_id = (local_friend_code_seed & 0x3FFFFFFFF) | (static_cast<u64>(random_number) << 48);
}
diff --git a/src/core/hle/service/cfg/cfg.h b/src/core/hle/service/cfg/cfg.h
index 1659ebf32..282b6936b 100644
--- a/src/core/hle/service/cfg/cfg.h
+++ b/src/core/hle/service/cfg/cfg.h
@@ -101,6 +101,8 @@ void GetCountryCodeString(Service::Interface* self);
*/
void GetCountryCodeID(Service::Interface* self);
+u32 GetRegionValue();
+
/**
* CFG::SecureInfoGetRegion service function
* Inputs:
diff --git a/src/core/hle/service/csnd_snd.cpp b/src/core/hle/service/csnd_snd.cpp
index 9471ec1ef..aac903ccb 100644
--- a/src/core/hle/service/csnd_snd.cpp
+++ b/src/core/hle/service/csnd_snd.cpp
@@ -47,7 +47,7 @@ static void Initialize(Interface* self) {
MemoryPermission::ReadWrite, 0,
Kernel::MemoryRegion::BASE, "CSND:SharedMemory");
- mutex = Kernel::Mutex::Create(false, "CSND:mutex");
+ mutex = Kernel::Mutex::Create(false, 0, "CSND:mutex");
cmd_buff[1] = RESULT_SUCCESS.raw;
cmd_buff[2] = IPC::CopyHandleDesc(2);
diff --git a/src/core/hle/service/dlp/dlp_clnt.cpp b/src/core/hle/service/dlp/dlp_clnt.cpp
index 56f934b3f..6f2bf2061 100644
--- a/src/core/hle/service/dlp/dlp_clnt.cpp
+++ b/src/core/hle/service/dlp/dlp_clnt.cpp
@@ -8,7 +8,26 @@ namespace Service {
namespace DLP {
const Interface::FunctionInfo FunctionTable[] = {
- {0x000100C3, nullptr, "Initialize"}, {0x00110000, nullptr, "GetWirelessRebootPassphrase"},
+ {0x000100C3, nullptr, "Initialize"},
+ {0x00020000, nullptr, "Finalize"},
+ {0x00030000, nullptr, "GetEventDesc"},
+ {0x00040000, nullptr, "GetChannel"},
+ {0x00050180, nullptr, "StartScan"},
+ {0x00060000, nullptr, "StopScan"},
+ {0x00070080, nullptr, "GetServerInfo"},
+ {0x00080100, nullptr, "GetTitleInfo"},
+ {0x00090040, nullptr, "GetTitleInfoInOrder"},
+ {0x000A0080, nullptr, "DeleteScanInfo"},
+ {0x000B0100, nullptr, "PrepareForSystemDownload"},
+ {0x000C0000, nullptr, "StartSystemDownload"},
+ {0x000D0100, nullptr, "StartTitleDownload"},
+ {0x000E0000, nullptr, "GetMyStatus"},
+ {0x000F0040, nullptr, "GetConnectingNodes"},
+ {0x00100040, nullptr, "GetNodeInfo"},
+ {0x00110000, nullptr, "GetWirelessRebootPassphrase"},
+ {0x00120000, nullptr, "StopSession"},
+ {0x00130100, nullptr, "GetCupVersion"},
+ {0x00140100, nullptr, "GetDupAvailability"},
};
DLP_CLNT_Interface::DLP_CLNT_Interface() {
diff --git a/src/core/hle/service/dlp/dlp_fkcl.cpp b/src/core/hle/service/dlp/dlp_fkcl.cpp
index 29b9d52e0..fe6be7d32 100644
--- a/src/core/hle/service/dlp/dlp_fkcl.cpp
+++ b/src/core/hle/service/dlp/dlp_fkcl.cpp
@@ -8,7 +8,23 @@ namespace Service {
namespace DLP {
const Interface::FunctionInfo FunctionTable[] = {
- {0x00010083, nullptr, "Initialize"}, {0x000F0000, nullptr, "GetWirelessRebootPassphrase"},
+ {0x00010083, nullptr, "Initialize"},
+ {0x00020000, nullptr, "Finalize"},
+ {0x00030000, nullptr, "GetEventDesc"},
+ {0x00040000, nullptr, "GetChannels"},
+ {0x00050180, nullptr, "StartScan"},
+ {0x00060000, nullptr, "StopScan"},
+ {0x00070080, nullptr, "GetServerInfo"},
+ {0x00080100, nullptr, "GetTitleInfo"},
+ {0x00090040, nullptr, "GetTitleInfoInOrder"},
+ {0x000A0080, nullptr, "DeleteScanInfo"},
+ {0x000B0100, nullptr, "StartFakeSession"},
+ {0x000C0000, nullptr, "GetMyStatus"},
+ {0x000D0040, nullptr, "GetConnectingNodes"},
+ {0x000E0040, nullptr, "GetNodeInfo"},
+ {0x000F0000, nullptr, "GetWirelessRebootPassphrase"},
+ {0x00100000, nullptr, "StopSession"},
+ {0x00110203, nullptr, "Initialize2"},
};
DLP_FKCL_Interface::DLP_FKCL_Interface() {
diff --git a/src/core/hle/service/dlp/dlp_srvr.cpp b/src/core/hle/service/dlp/dlp_srvr.cpp
index 32cfa2c44..1bcea43d3 100644
--- a/src/core/hle/service/dlp/dlp_srvr.cpp
+++ b/src/core/hle/service/dlp/dlp_srvr.cpp
@@ -11,7 +11,7 @@
namespace Service {
namespace DLP {
-static void unk_0x000E0040(Interface* self) {
+static void IsChild(Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
cmd_buff[1] = RESULT_SUCCESS.raw;
@@ -24,14 +24,19 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00010183, nullptr, "Initialize"},
{0x00020000, nullptr, "Finalize"},
{0x00030000, nullptr, "GetServerState"},
+ {0x00040000, nullptr, "GetEventDescription"},
{0x00050080, nullptr, "StartAccepting"},
+ {0x00060000, nullptr, "EndAccepting"},
{0x00070000, nullptr, "StartDistribution"},
{0x000800C0, nullptr, "SendWirelessRebootPassphrase"},
{0x00090040, nullptr, "AcceptClient"},
+ {0x000A0040, nullptr, "DisconnectClient"},
{0x000B0042, nullptr, "GetConnectingClients"},
{0x000C0040, nullptr, "GetClientInfo"},
{0x000D0040, nullptr, "GetClientState"},
- {0x000E0040, unk_0x000E0040, "unk_0x000E0040"},
+ {0x000E0040, IsChild, "IsChild"},
+ {0x000F0303, nullptr, "InitializeWithName"},
+ {0x00100000, nullptr, "GetDupNoticeNeed"},
};
DLP_SRVR_Interface::DLP_SRVR_Interface() {
diff --git a/src/core/hle/service/dsp_dsp.cpp b/src/core/hle/service/dsp_dsp.cpp
index 7d746054f..42f8950f9 100644
--- a/src/core/hle/service/dsp_dsp.cpp
+++ b/src/core/hle/service/dsp_dsp.cpp
@@ -147,9 +147,10 @@ static void LoadComponent(Service::Interface* self) {
LOG_INFO(Service_DSP, "Firmware hash: %#" PRIx64,
Common::ComputeHash64(component_data.data(), component_data.size()));
// Some versions of the firmware have the location of DSP structures listed here.
- ASSERT(size > 0x37C);
- LOG_INFO(Service_DSP, "Structures hash: %#" PRIx64,
- Common::ComputeHash64(component_data.data() + 0x340, 60));
+ if (size > 0x37C) {
+ LOG_INFO(Service_DSP, "Structures hash: %#" PRIx64,
+ Common::ComputeHash64(component_data.data() + 0x340, 60));
+ }
LOG_WARNING(Service_DSP,
"(STUBBED) called size=0x%X, prog_mask=0x%08X, data_mask=0x%08X, buffer=0x%08X",
diff --git a/src/core/hle/service/fs/archive.cpp b/src/core/hle/service/fs/archive.cpp
index 033fbc9aa..4ee7df73c 100644
--- a/src/core/hle/service/fs/archive.cpp
+++ b/src/core/hle/service/fs/archive.cpp
@@ -20,6 +20,7 @@
#include "core/file_sys/archive_savedata.h"
#include "core/file_sys/archive_sdmc.h"
#include "core/file_sys/archive_sdmcwriteonly.h"
+#include "core/file_sys/archive_selfncch.h"
#include "core/file_sys/archive_systemsavedata.h"
#include "core/file_sys/directory_backend.h"
#include "core/file_sys/errors.h"
@@ -48,7 +49,7 @@ struct hash<Service::FS::ArchiveIdCode> {
return std::hash<Type>()(static_cast<Type>(id_code));
}
};
-}
+} // namespace std
static constexpr Kernel::Handle INVALID_HANDLE{};
@@ -216,7 +217,7 @@ void Directory::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> serve
LOG_TRACE(Service_FS, "Read %s: count=%d", GetName().c_str(), count);
// Number of entries actually read
- u32 read = backend->Read(entries.size(), entries.data());
+ u32 read = backend->Read(static_cast<u32>(entries.size()), entries.data());
cmd_buff[2] = read;
Memory::WriteBlock(address, entries.data(), read * sizeof(FileSys::Entry));
break;
@@ -564,6 +565,21 @@ void RegisterArchiveTypes() {
auto systemsavedata_factory =
std::make_unique<FileSys::ArchiveFactory_SystemSaveData>(nand_directory);
RegisterArchiveType(std::move(systemsavedata_factory), ArchiveIdCode::SystemSaveData);
+
+ auto selfncch_factory = std::make_unique<FileSys::ArchiveFactory_SelfNCCH>();
+ RegisterArchiveType(std::move(selfncch_factory), ArchiveIdCode::SelfNCCH);
+}
+
+void RegisterSelfNCCH(Loader::AppLoader& app_loader) {
+ auto itr = id_code_map.find(ArchiveIdCode::SelfNCCH);
+ if (itr == id_code_map.end()) {
+ LOG_ERROR(Service_FS,
+ "Could not register a new NCCH because the SelfNCCH archive hasn't been created");
+ return;
+ }
+
+ auto* factory = static_cast<FileSys::ArchiveFactory_SelfNCCH*>(itr->second.get());
+ factory->Register(app_loader);
}
void UnregisterArchiveTypes() {
diff --git a/src/core/hle/service/fs/archive.h b/src/core/hle/service/fs/archive.h
index 3a3371c88..e3c8fc2ef 100644
--- a/src/core/hle/service/fs/archive.h
+++ b/src/core/hle/service/fs/archive.h
@@ -21,6 +21,10 @@ static constexpr char SYSTEM_ID[]{"00000000000000000000000000000000"};
/// The scrambled SD card CID, also known as ID1
static constexpr char SDCARD_ID[]{"00000000000000000000000000000000"};
+namespace Loader {
+class AppLoader;
+}
+
namespace Service {
namespace FS {
@@ -259,6 +263,9 @@ void ArchiveInit();
/// Shutdown archives
void ArchiveShutdown();
+/// Registers a new NCCH file with the SelfNCCH archive factory
+void RegisterSelfNCCH(Loader::AppLoader& app_loader);
+
/// Register all archive types
void RegisterArchiveTypes();
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 2014b8461..379fbd71c 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -7,8 +7,9 @@
#include <cmath>
#include <memory>
#include "common/logging/log.h"
+#include "core/3ds.h"
+#include "core/core.h"
#include "core/core_timing.h"
-#include "core/frontend/emu_window.h"
#include "core/frontend/input.h"
#include "core/hle/ipc.h"
#include "core/hle/kernel/event.h"
@@ -18,7 +19,6 @@
#include "core/hle/service/hid/hid_spvr.h"
#include "core/hle/service/hid/hid_user.h"
#include "core/hle/service/service.h"
-#include "video_core/video_core.h"
namespace Service {
namespace HID {
@@ -50,10 +50,15 @@ constexpr u64 pad_update_ticks = BASE_CLOCK_RATE_ARM11 / 234;
constexpr u64 accelerometer_update_ticks = BASE_CLOCK_RATE_ARM11 / 104;
constexpr u64 gyroscope_update_ticks = BASE_CLOCK_RATE_ARM11 / 101;
+constexpr float accelerometer_coef = 512.0f; // measured from hw test result
+constexpr float gyroscope_coef = 14.375f; // got from hwtest GetGyroscopeLowRawToDpsCoefficient call
+
static std::atomic<bool> is_device_reload_pending;
static std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID>
buttons;
static std::unique_ptr<Input::AnalogDevice> circle_pad;
+static std::unique_ptr<Input::MotionDevice> motion_device;
+static std::unique_ptr<Input::TouchDevice> touch_device;
DirectionState GetStickDirectionState(s16 circle_pad_x, s16 circle_pad_y) {
// 30 degree and 60 degree are angular thresholds for directions
@@ -90,6 +95,8 @@ static void LoadInputDevices() {
buttons.begin(), Input::CreateDevice<Input::ButtonDevice>);
circle_pad = Input::CreateDevice<Input::AnalogDevice>(
Settings::values.analogs[Settings::NativeAnalog::CirclePad]);
+ motion_device = Input::CreateDevice<Input::MotionDevice>(Settings::values.motion_device);
+ touch_device = Input::CreateDevice<Input::TouchDevice>(Settings::values.touch_device);
}
static void UnloadInputDevices() {
@@ -97,6 +104,8 @@ static void UnloadInputDevices() {
button.reset();
}
circle_pad.reset();
+ motion_device.reset();
+ touch_device.reset();
}
static void UpdatePadCallback(u64 userdata, int cycles_late) {
@@ -165,8 +174,10 @@ static void UpdatePadCallback(u64 userdata, int cycles_late) {
// Get the current touch entry
TouchDataEntry& touch_entry = mem->touch.entries[mem->touch.index];
bool pressed = false;
-
- std::tie(touch_entry.x, touch_entry.y, pressed) = VideoCore::g_emu_window->GetTouchState();
+ float x, y;
+ std::tie(x, y, pressed) = touch_device->GetStatus();
+ touch_entry.x = static_cast<u16>(x * Core::kScreenBottomWidth);
+ touch_entry.y = static_cast<u16>(y * Core::kScreenBottomHeight);
touch_entry.valid.Assign(pressed ? 1 : 0);
// TODO(bunnei): We're not doing anything with offset 0xA8 + 0x18 of HID SharedMemory, which
@@ -193,10 +204,19 @@ static void UpdateAccelerometerCallback(u64 userdata, int cycles_late) {
mem->accelerometer.index = next_accelerometer_index;
next_accelerometer_index = (next_accelerometer_index + 1) % mem->accelerometer.entries.size();
+ Math::Vec3<float> accel;
+ std::tie(accel, std::ignore) = motion_device->GetStatus();
+ accel *= accelerometer_coef;
+ // TODO(wwylele): do a time stretch like the one in UpdateGyroscopeCallback
+ // The time stretch formula should be like
+ // stretched_vector = (raw_vector - gravity) * stretch_ratio + gravity
+
AccelerometerDataEntry& accelerometer_entry =
mem->accelerometer.entries[mem->accelerometer.index];
- std::tie(accelerometer_entry.x, accelerometer_entry.y, accelerometer_entry.z) =
- VideoCore::g_emu_window->GetAccelerometerState();
+
+ accelerometer_entry.x = static_cast<s16>(accel.x);
+ accelerometer_entry.y = static_cast<s16>(accel.y);
+ accelerometer_entry.z = static_cast<s16>(accel.z);
// Make up "raw" entry
// TODO(wwylele):
@@ -227,8 +247,14 @@ static void UpdateGyroscopeCallback(u64 userdata, int cycles_late) {
next_gyroscope_index = (next_gyroscope_index + 1) % mem->gyroscope.entries.size();
GyroscopeDataEntry& gyroscope_entry = mem->gyroscope.entries[mem->gyroscope.index];
- std::tie(gyroscope_entry.x, gyroscope_entry.y, gyroscope_entry.z) =
- VideoCore::g_emu_window->GetGyroscopeState();
+
+ Math::Vec3<float> gyro;
+ std::tie(std::ignore, gyro) = motion_device->GetStatus();
+ double stretch = Core::System::GetInstance().perf_stats.GetLastFrameTimeScale();
+ gyro *= gyroscope_coef * static_cast<float>(stretch);
+ gyroscope_entry.x = static_cast<s16>(gyro.x);
+ gyroscope_entry.y = static_cast<s16>(gyro.y);
+ gyroscope_entry.z = static_cast<s16>(gyro.z);
// Make up "raw" entry
mem->gyroscope.raw_entry.x = gyroscope_entry.x;
@@ -326,7 +352,7 @@ void GetGyroscopeLowRawToDpsCoefficient(Service::Interface* self) {
cmd_buff[1] = RESULT_SUCCESS.raw;
- f32 coef = VideoCore::g_emu_window->GetGyroscopeRawToDpsCoefficient();
+ f32 coef = gyroscope_coef;
memcpy(&cmd_buff[2], &coef, 4);
}
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 1ef972e70..ef25926b5 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -24,7 +24,7 @@ namespace HID {
*/
struct PadState {
union {
- u32 hex;
+ u32 hex{};
BitField<0, 1, u32> a;
BitField<1, 1, u32> b;
diff --git a/src/core/hle/service/ir/ir_rst.cpp b/src/core/hle/service/ir/ir_rst.cpp
index 837413f93..0912d5756 100644
--- a/src/core/hle/service/ir/ir_rst.cpp
+++ b/src/core/hle/service/ir/ir_rst.cpp
@@ -18,7 +18,7 @@ namespace Service {
namespace IR {
union PadState {
- u32_le hex;
+ u32_le hex{};
BitField<14, 1, u32_le> zl;
BitField<15, 1, u32_le> zr;
diff --git a/src/core/hle/service/ldr_ro/cro_helper.h b/src/core/hle/service/ldr_ro/cro_helper.h
index 3bc10dbdc..57b4fb6df 100644
--- a/src/core/hle/service/ldr_ro/cro_helper.h
+++ b/src/core/hle/service/ldr_ro/cro_helper.h
@@ -413,7 +413,8 @@ private:
*/
template <typename T>
void GetEntry(std::size_t index, T& data) const {
- Memory::ReadBlock(GetField(T::TABLE_OFFSET_FIELD) + index * sizeof(T), &data, sizeof(T));
+ Memory::ReadBlock(GetField(T::TABLE_OFFSET_FIELD) + static_cast<u32>(index * sizeof(T)),
+ &data, sizeof(T));
}
/**
@@ -425,7 +426,8 @@ private:
*/
template <typename T>
void SetEntry(std::size_t index, const T& data) {
- Memory::WriteBlock(GetField(T::TABLE_OFFSET_FIELD) + index * sizeof(T), &data, sizeof(T));
+ Memory::WriteBlock(GetField(T::TABLE_OFFSET_FIELD) + static_cast<u32>(index * sizeof(T)),
+ &data, sizeof(T));
}
/**
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp
index d5624fe54..b10d5852b 100644
--- a/src/core/hle/service/nim/nim.cpp
+++ b/src/core/hle/service/nim/nim.cpp
@@ -5,6 +5,8 @@
#include "common/common_types.h"
#include "common/logging/log.h"
#include "core/hle/ipc.h"
+#include "core/hle/ipc_helpers.h"
+#include "core/hle/kernel/event.h"
#include "core/hle/service/nim/nim.h"
#include "core/hle/service/nim/nim_aoc.h"
#include "core/hle/service/nim/nim_s.h"
@@ -14,6 +16,16 @@
namespace Service {
namespace NIM {
+static Kernel::SharedPtr<Kernel::Event> nim_system_update_event;
+
+void CheckForSysUpdateEvent(Service::Interface* self) {
+ IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x5, 0, 0); // 0x50000
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
+ rb.Push(RESULT_SUCCESS);
+ rb.PushCopyHandles(Kernel::g_handle_table.Create(nim_system_update_event).Unwrap());
+ LOG_TRACE(Service_NIM, "called");
+}
+
void CheckSysUpdateAvailable(Service::Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
@@ -29,9 +41,13 @@ void Init() {
AddService(new NIM_AOC_Interface);
AddService(new NIM_S_Interface);
AddService(new NIM_U_Interface);
+
+ nim_system_update_event = Kernel::Event::Create(ResetType::OneShot, "NIM System Update Event");
}
-void Shutdown() {}
+void Shutdown() {
+ nim_system_update_event = nullptr;
+}
} // namespace NIM
diff --git a/src/core/hle/service/nim/nim.h b/src/core/hle/service/nim/nim.h
index c3106f18b..dbf605e5a 100644
--- a/src/core/hle/service/nim/nim.h
+++ b/src/core/hle/service/nim/nim.h
@@ -11,6 +11,17 @@ class Interface;
namespace NIM {
/**
+ * NIM::CheckForSysUpdateEvent service function
+ * Inputs:
+ * 1 : None
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : Copy handle descriptor
+ * 3 : System Update event handle
+ */
+void CheckForSysUpdateEvent(Service::Interface* self);
+
+/**
* NIM::CheckSysUpdateAvailable service function
* Inputs:
* 1 : None
diff --git a/src/core/hle/service/nim/nim_u.cpp b/src/core/hle/service/nim/nim_u.cpp
index 7664bad60..569660278 100644
--- a/src/core/hle/service/nim/nim_u.cpp
+++ b/src/core/hle/service/nim/nim_u.cpp
@@ -12,7 +12,7 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00010000, nullptr, "StartSysUpdate"},
{0x00020000, nullptr, "GetUpdateDownloadProgress"},
{0x00040000, nullptr, "FinishTitlesInstall"},
- {0x00050000, nullptr, "CheckForSysUpdateEvent"},
+ {0x00050000, CheckForSysUpdateEvent, "CheckForSysUpdateEvent"},
{0x00090000, CheckSysUpdateAvailable, "CheckSysUpdateAvailable"},
{0x000A0000, nullptr, "GetState"},
{0x000B0000, nullptr, "GetSystemTitleHash"},
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
new file mode 100644
index 000000000..9e19c38bf
--- /dev/null
+++ b/src/core/hle/service/ns/ns.cpp
@@ -0,0 +1,16 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/ns/ns.h"
+#include "core/hle/service/ns/ns_s.h"
+
+namespace Service {
+namespace NS {
+
+void InstallInterfaces(SM::ServiceManager& service_manager) {
+ std::make_shared<NS_S>()->InstallAsService(service_manager);
+}
+
+} // namespace NS
+} // namespace Service
diff --git a/src/core/hle/service/ns/ns.h b/src/core/hle/service/ns/ns.h
new file mode 100644
index 000000000..c3d67d98c
--- /dev/null
+++ b/src/core/hle/service/ns/ns.h
@@ -0,0 +1,16 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service {
+namespace NS {
+
+/// Registers all NS services with the specified service manager.
+void InstallInterfaces(SM::ServiceManager& service_manager);
+
+} // namespace NS
+} // namespace Service
diff --git a/src/core/hle/service/ns/ns_s.cpp b/src/core/hle/service/ns/ns_s.cpp
new file mode 100644
index 000000000..d952888dc
--- /dev/null
+++ b/src/core/hle/service/ns/ns_s.cpp
@@ -0,0 +1,34 @@
+// Copyright 2015 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/ns/ns_s.h"
+
+namespace Service {
+namespace NS {
+
+NS_S::NS_S() : ServiceFramework("ns:s", 2) {
+ static const FunctionInfo functions[] = {
+ {0x000100C0, nullptr, "LaunchFIRM"},
+ {0x000200C0, nullptr, "LaunchTitle"},
+ {0x00030000, nullptr, "TerminateApplication"},
+ {0x00040040, nullptr, "TerminateProcess"},
+ {0x000500C0, nullptr, "LaunchApplicationFIRM"},
+ {0x00060042, nullptr, "SetFIRMParams4A0"},
+ {0x00070042, nullptr, "CardUpdateInitialize"},
+ {0x00080000, nullptr, "CardUpdateShutdown"},
+ {0x000D0140, nullptr, "SetTWLBannerHMAC"},
+ {0x000E0000, nullptr, "ShutdownAsync"},
+ {0x00100180, nullptr, "RebootSystem"},
+ {0x00110100, nullptr, "TerminateTitle"},
+ {0x001200C0, nullptr, "SetApplicationCpuTimeLimit"},
+ {0x00150140, nullptr, "LaunchApplication"},
+ {0x00160000, nullptr, "RebootSystemClean"},
+ };
+ RegisterHandlers(functions);
+}
+
+NS_S::~NS_S() = default;
+
+} // namespace NS
+} // namespace Service
diff --git a/src/core/hle/service/ns_s.h b/src/core/hle/service/ns/ns_s.h
index 90288a521..660ae453f 100644
--- a/src/core/hle/service/ns_s.h
+++ b/src/core/hle/service/ns/ns_s.h
@@ -4,18 +4,17 @@
#pragma once
+#include "core/hle/kernel/kernel.h"
#include "core/hle/service/service.h"
namespace Service {
namespace NS {
-class NS_S final : public Interface {
+/// Interface to "ns:s" service
+class NS_S final : public ServiceFramework<NS_S> {
public:
NS_S();
-
- std::string GetPortName() const override {
- return "ns:s";
- }
+ ~NS_S();
};
} // namespace NS
diff --git a/src/core/hle/service/ns_s.cpp b/src/core/hle/service/ns_s.cpp
deleted file mode 100644
index 215c9aacc..000000000
--- a/src/core/hle/service/ns_s.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "core/hle/service/ns_s.h"
-
-namespace Service {
-namespace NS {
-
-const Interface::FunctionInfo FunctionTable[] = {
- {0x000100C0, nullptr, "LaunchFIRM"},
- {0x000200C0, nullptr, "LaunchTitle"},
- {0x00030000, nullptr, "TerminateApplication"},
- {0x00040040, nullptr, "TerminateProcess"},
- {0x000500C0, nullptr, "LaunchApplicationFIRM"},
- {0x00060042, nullptr, "SetFIRMParams4A0"},
- {0x00070042, nullptr, "CardUpdateInitialize"},
- {0x00080000, nullptr, "CardUpdateShutdown"},
- {0x000D0140, nullptr, "SetTWLBannerHMAC"},
- {0x000E0000, nullptr, "ShutdownAsync"},
- {0x00100180, nullptr, "RebootSystem"},
- {0x00110100, nullptr, "TerminateTitle"},
- {0x001200C0, nullptr, "SetApplicationCpuTimeLimit"},
- {0x00150140, nullptr, "LaunchApplication"},
- {0x00160000, nullptr, "RebootSystemClean"},
-};
-
-NS_S::NS_S() {
- Register(FunctionTable);
-}
-
-} // namespace NS
-} // namespace Service
diff --git a/src/core/hle/service/nwm/nwm_uds.cpp b/src/core/hle/service/nwm/nwm_uds.cpp
index 6dbdff044..87a6b0eca 100644
--- a/src/core/hle/service/nwm/nwm_uds.cpp
+++ b/src/core/hle/service/nwm/nwm_uds.cpp
@@ -2,8 +2,11 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <algorithm>
#include <array>
#include <cstring>
+#include <list>
+#include <mutex>
#include <unordered_map>
#include <vector>
#include "common/common_types.h"
@@ -12,11 +15,14 @@
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/event.h"
#include "core/hle/kernel/shared_memory.h"
+#include "core/hle/lock.h"
#include "core/hle/result.h"
#include "core/hle/service/nwm/nwm_uds.h"
#include "core/hle/service/nwm/uds_beacon.h"
+#include "core/hle/service/nwm/uds_connection.h"
#include "core/hle/service/nwm/uds_data.h"
#include "core/memory.h"
+#include "network/network.h"
namespace Service {
namespace NWM {
@@ -34,9 +40,12 @@ static ConnectionStatus connection_status{};
/* Node information about the current network.
* The amount of elements in this vector is always the maximum number
* of nodes specified in the network configuration.
- * The first node is always the host, so this always contains at least 1 entry.
+ * The first node is always the host.
*/
-static NodeList node_info(1);
+static NodeList node_info;
+
+// Node information about our own system.
+static NodeInfo current_node;
// Mapping of bind node ids to their respective events.
static std::unordered_map<u32, Kernel::SharedPtr<Kernel::Event>> bind_node_events;
@@ -51,6 +60,298 @@ static NetworkInfo network_info;
// Event that will generate and send the 802.11 beacon frames.
static int beacon_broadcast_event;
+// Mutex to synchronize access to the connection status between the emulation thread and the
+// network thread.
+static std::mutex connection_status_mutex;
+
+// Mutex to synchronize access to the list of received beacons between the emulation thread and the
+// network thread.
+static std::mutex beacon_mutex;
+
+// Number of beacons to store before we start dropping the old ones.
+// TODO(Subv): Find a more accurate value for this limit.
+constexpr size_t MaxBeaconFrames = 15;
+
+// List of the last <MaxBeaconFrames> beacons received from the network.
+static std::list<Network::WifiPacket> received_beacons;
+
+/**
+ * Returns a list of received 802.11 beacon frames from the specified sender since the last call.
+ */
+std::list<Network::WifiPacket> GetReceivedBeacons(const MacAddress& sender) {
+ std::lock_guard<std::mutex> lock(beacon_mutex);
+ if (sender != Network::BroadcastMac) {
+ std::list<Network::WifiPacket> filtered_list;
+ const auto beacon = std::find_if(received_beacons.begin(), received_beacons.end(),
+ [&sender](const Network::WifiPacket& packet) {
+ return packet.transmitter_address == sender;
+ });
+ if (beacon != received_beacons.end()) {
+ filtered_list.push_back(*beacon);
+ // TODO(B3N30): Check if the complete deque is cleared or just the fetched entries
+ received_beacons.erase(beacon);
+ }
+ return filtered_list;
+ }
+ return std::move(received_beacons);
+}
+
+/// Sends a WifiPacket to the room we're currently connected to.
+void SendPacket(Network::WifiPacket& packet) {
+ // TODO(Subv): Implement.
+}
+
+/*
+ * Returns an available index in the nodes array for the
+ * currently-hosted UDS network.
+ */
+static u16 GetNextAvailableNodeId() {
+ for (u16 index = 0; index < connection_status.max_nodes; ++index) {
+ if ((connection_status.node_bitmask & (1 << index)) == 0)
+ return index;
+ }
+
+ // Any connection attempts to an already full network should have been refused.
+ ASSERT_MSG(false, "No available connection slots in the network");
+}
+
+// Inserts the received beacon frame in the beacon queue and removes any older beacons if the size
+// limit is exceeded.
+void HandleBeaconFrame(const Network::WifiPacket& packet) {
+ std::lock_guard<std::mutex> lock(beacon_mutex);
+ const auto unique_beacon =
+ std::find_if(received_beacons.begin(), received_beacons.end(),
+ [&packet](const Network::WifiPacket& new_packet) {
+ return new_packet.transmitter_address == packet.transmitter_address;
+ });
+ if (unique_beacon != received_beacons.end()) {
+ // We already have a beacon from the same mac in the deque, remove the old one;
+ received_beacons.erase(unique_beacon);
+ }
+
+ received_beacons.emplace_back(packet);
+
+ // Discard old beacons if the buffer is full.
+ if (received_beacons.size() > MaxBeaconFrames)
+ received_beacons.pop_front();
+}
+
+void HandleAssociationResponseFrame(const Network::WifiPacket& packet) {
+ auto assoc_result = GetAssociationResult(packet.data);
+
+ ASSERT_MSG(std::get<AssocStatus>(assoc_result) == AssocStatus::Successful,
+ "Could not join network");
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ ASSERT(connection_status.status == static_cast<u32>(NetworkStatus::Connecting));
+ }
+
+ // Send the EAPoL-Start packet to the server.
+ using Network::WifiPacket;
+ WifiPacket eapol_start;
+ eapol_start.channel = network_channel;
+ eapol_start.data = GenerateEAPoLStartFrame(std::get<u16>(assoc_result), current_node);
+ // TODO(B3N30): Encrypt the packet.
+ eapol_start.destination_address = packet.transmitter_address;
+ eapol_start.type = WifiPacket::PacketType::Data;
+
+ SendPacket(eapol_start);
+}
+
+static void HandleEAPoLPacket(const Network::WifiPacket& packet) {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+
+ if (GetEAPoLFrameType(packet.data) == EAPoLStartMagic) {
+ if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
+ LOG_DEBUG(Service_NWM, "Connection sequence aborted, because connection status is %u",
+ connection_status.status);
+ return;
+ }
+
+ auto node = DeserializeNodeInfoFromFrame(packet.data);
+
+ if (connection_status.max_nodes == connection_status.total_nodes) {
+ // Reject connection attempt
+ LOG_ERROR(Service_NWM, "Reached maximum nodes, but reject packet wasn't sent.");
+ // TODO(B3N30): Figure out what packet is sent here
+ return;
+ }
+
+ // Get an unused network node id
+ u16 node_id = GetNextAvailableNodeId();
+ node.network_node_id = node_id + 1;
+
+ connection_status.node_bitmask |= 1 << node_id;
+ connection_status.changed_nodes |= 1 << node_id;
+ connection_status.nodes[node_id] = node.network_node_id;
+ connection_status.total_nodes++;
+
+ u8 current_nodes = network_info.total_nodes;
+ node_info[current_nodes] = node;
+
+ network_info.total_nodes++;
+
+ // Send the EAPoL-Logoff packet.
+ using Network::WifiPacket;
+ WifiPacket eapol_logoff;
+ eapol_logoff.channel = network_channel;
+ eapol_logoff.data =
+ GenerateEAPoLLogoffFrame(packet.transmitter_address, node.network_node_id, node_info,
+ network_info.max_nodes, network_info.total_nodes);
+ // TODO(Subv): Encrypt the packet.
+ eapol_logoff.destination_address = packet.transmitter_address;
+ eapol_logoff.type = WifiPacket::PacketType::Data;
+
+ SendPacket(eapol_logoff);
+ // TODO(B3N30): Broadcast updated node list
+ // The 3ds does this presumably to support spectators.
+ std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+ connection_status_event->Signal();
+ } else {
+ if (connection_status.status != static_cast<u32>(NetworkStatus::NotConnected)) {
+ LOG_DEBUG(Service_NWM, "Connection sequence aborted, because connection status is %u",
+ connection_status.status);
+ return;
+ }
+ auto logoff = ParseEAPoLLogoffFrame(packet.data);
+
+ network_info.total_nodes = logoff.connected_nodes;
+ network_info.max_nodes = logoff.max_nodes;
+
+ connection_status.network_node_id = logoff.assigned_node_id;
+ connection_status.total_nodes = logoff.connected_nodes;
+ connection_status.max_nodes = logoff.max_nodes;
+
+ node_info.clear();
+ node_info.reserve(network_info.max_nodes);
+ for (size_t index = 0; index < logoff.connected_nodes; ++index) {
+ connection_status.node_bitmask |= 1 << index;
+ connection_status.changed_nodes |= 1 << index;
+ connection_status.nodes[index] = logoff.nodes[index].network_node_id;
+
+ node_info.emplace_back(DeserializeNodeInfo(logoff.nodes[index]));
+ }
+
+ // We're now connected, signal the application
+ connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsClient);
+ // Some games require ConnectToNetwork to block, for now it doesn't
+ // If blocking is implemented this lock needs to be changed,
+ // otherwise it might cause deadlocks
+ std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+ connection_status_event->Signal();
+ }
+}
+
+/*
+ * Start a connection sequence with an UDS server. The sequence starts by sending an 802.11
+ * authentication frame with SEQ1.
+ */
+void StartConnectionSequence(const MacAddress& server) {
+ using Network::WifiPacket;
+ WifiPacket auth_request;
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ ASSERT(connection_status.status == static_cast<u32>(NetworkStatus::NotConnected));
+
+ // TODO(Subv): Handle timeout.
+
+ // Send an authentication frame with SEQ1
+ auth_request.channel = network_channel;
+ auth_request.data = GenerateAuthenticationFrame(AuthenticationSeq::SEQ1);
+ auth_request.destination_address = server;
+ auth_request.type = WifiPacket::PacketType::Authentication;
+ }
+
+ SendPacket(auth_request);
+}
+
+/// Sends an Association Response frame to the specified mac address
+void SendAssociationResponseFrame(const MacAddress& address) {
+ using Network::WifiPacket;
+ WifiPacket assoc_response;
+
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
+ LOG_ERROR(Service_NWM, "Connection sequence aborted, because connection status is %u",
+ connection_status.status);
+ return;
+ }
+
+ assoc_response.channel = network_channel;
+ // TODO(Subv): This will cause multiple clients to end up with the same association id, but
+ // we're not using that for anything.
+ u16 association_id = 1;
+ assoc_response.data = GenerateAssocResponseFrame(AssocStatus::Successful, association_id,
+ network_info.network_id);
+ assoc_response.destination_address = address;
+ assoc_response.type = WifiPacket::PacketType::AssociationResponse;
+ }
+
+ SendPacket(assoc_response);
+}
+
+/*
+ * Handles the authentication request frame and sends the authentication response and association
+ * response frames. Once an Authentication frame with SEQ1 is received by the server, it responds
+ * with an Authentication frame containing SEQ2, and immediately sends an Association response frame
+ * containing the details of the access point and the assigned association id for the new client.
+ */
+void HandleAuthenticationFrame(const Network::WifiPacket& packet) {
+ // Only the SEQ1 auth frame is handled here, the SEQ2 frame doesn't need any special behavior
+ if (GetAuthenticationSeqNumber(packet.data) == AuthenticationSeq::SEQ1) {
+ using Network::WifiPacket;
+ WifiPacket auth_request;
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
+ LOG_ERROR(Service_NWM,
+ "Connection sequence aborted, because connection status is %u",
+ connection_status.status);
+ return;
+ }
+
+ // Respond with an authentication response frame with SEQ2
+ auth_request.channel = network_channel;
+ auth_request.data = GenerateAuthenticationFrame(AuthenticationSeq::SEQ2);
+ auth_request.destination_address = packet.transmitter_address;
+ auth_request.type = WifiPacket::PacketType::Authentication;
+ }
+ SendPacket(auth_request);
+
+ SendAssociationResponseFrame(packet.transmitter_address);
+ }
+}
+
+static void HandleDataFrame(const Network::WifiPacket& packet) {
+ switch (GetFrameEtherType(packet.data)) {
+ case EtherType::EAPoL:
+ HandleEAPoLPacket(packet);
+ break;
+ case EtherType::SecureData:
+ // TODO(B3N30): Handle SecureData packets
+ break;
+ }
+}
+
+/// Callback to parse and handle a received wifi packet.
+void OnWifiPacketReceived(const Network::WifiPacket& packet) {
+ switch (packet.type) {
+ case Network::WifiPacket::PacketType::Beacon:
+ HandleBeaconFrame(packet);
+ break;
+ case Network::WifiPacket::PacketType::Authentication:
+ HandleAuthenticationFrame(packet);
+ break;
+ case Network::WifiPacket::PacketType::AssociationResponse:
+ HandleAssociationResponseFrame(packet);
+ break;
+ case Network::WifiPacket::PacketType::Data:
+ HandleDataFrame(packet);
+ break;
+ }
+}
+
/**
* NWM_UDS::Shutdown service function
* Inputs:
@@ -111,11 +412,10 @@ static void RecvBeaconBroadcastData(Interface* self) {
u32 total_size = sizeof(BeaconDataReplyHeader);
// Retrieve all beacon frames that were received from the desired mac address.
- std::deque<WifiPacket> beacons =
- GetReceivedPackets(WifiPacket::PacketType::Beacon, mac_address);
+ auto beacons = GetReceivedBeacons(mac_address);
BeaconDataReplyHeader data_reply_header{};
- data_reply_header.total_entries = beacons.size();
+ data_reply_header.total_entries = static_cast<u32>(beacons.size());
data_reply_header.max_output_size = out_buffer_size;
Memory::WriteBlock(current_buffer_pos, &data_reply_header, sizeof(BeaconDataReplyHeader));
@@ -125,8 +425,8 @@ static void RecvBeaconBroadcastData(Interface* self) {
for (const auto& beacon : beacons) {
BeaconEntryHeader entry{};
// TODO(Subv): Figure out what this size is used for.
- entry.unk_size = sizeof(BeaconEntryHeader) + beacon.data.size();
- entry.total_size = sizeof(BeaconEntryHeader) + beacon.data.size();
+ entry.unk_size = static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size());
+ entry.total_size = static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size());
entry.wifi_channel = beacon.channel;
entry.header_size = sizeof(BeaconEntryHeader);
entry.mac_address = beacon.transmitter_address;
@@ -137,9 +437,9 @@ static void RecvBeaconBroadcastData(Interface* self) {
current_buffer_pos += sizeof(BeaconEntryHeader);
Memory::WriteBlock(current_buffer_pos, beacon.data.data(), beacon.data.size());
- current_buffer_pos += beacon.data.size();
+ current_buffer_pos += static_cast<VAddr>(beacon.data.size());
- total_size += sizeof(BeaconEntryHeader) + beacon.data.size();
+ total_size += static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size());
}
// Update the total size in the structure and write it to the buffer again.
@@ -174,7 +474,7 @@ static void InitializeWithVersion(Interface* self) {
u32 sharedmem_size = rp.Pop<u32>();
// Update the node information with the data the game gave us.
- rp.PopRaw(node_info[0]);
+ rp.PopRaw(current_node);
u16 version = rp.Pop<u16>();
@@ -184,15 +484,22 @@ static void InitializeWithVersion(Interface* self) {
ASSERT_MSG(recv_buffer_memory->size == sharedmem_size, "Invalid shared memory size.");
- // Reset the connection status, it contains all zeros after initialization,
- // except for the actual status value.
- connection_status = {};
- connection_status.status = static_cast<u32>(NetworkStatus::NotConnected);
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+
+ // Reset the connection status, it contains all zeros after initialization,
+ // except for the actual status value.
+ connection_status = {};
+ connection_status.status = static_cast<u32>(NetworkStatus::NotConnected);
+ }
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
rb.Push(RESULT_SUCCESS);
rb.PushCopyHandles(Kernel::g_handle_table.Create(connection_status_event).Unwrap());
+ // TODO(Subv): Connect the OnWifiPacketReceived function to the wifi packet received callback of
+ // the room we're currently in.
+
LOG_DEBUG(Service_NWM, "called sharedmem_size=0x%08X, version=0x%08X, sharedmem_handle=0x%08X",
sharedmem_size, version, sharedmem_handle);
}
@@ -214,12 +521,16 @@ static void GetConnectionStatus(Interface* self) {
IPC::RequestBuilder rb = rp.MakeBuilder(13, 0);
rb.Push(RESULT_SUCCESS);
- rb.PushRaw(connection_status);
-
- // Reset the bitmask of changed nodes after each call to this
- // function to prevent falsely informing games of outstanding
- // changes in subsequent calls.
- connection_status.changed_nodes = 0;
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ rb.PushRaw(connection_status);
+
+ // Reset the bitmask of changed nodes after each call to this
+ // function to prevent falsely informing games of outstanding
+ // changes in subsequent calls.
+ // TODO(Subv): Find exactly where the NWM module resets this value.
+ connection_status.changed_nodes = 0;
+ }
LOG_DEBUG(Service_NWM, "called");
}
@@ -300,31 +611,36 @@ static void BeginHostingNetwork(Interface* self) {
// The real UDS module throws a fatal error if this assert fails.
ASSERT_MSG(network_info.max_nodes > 1, "Trying to host a network of only one member.");
- connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsHost);
-
- // Ensure the application data size is less than the maximum value.
- ASSERT_MSG(network_info.application_data_size <= ApplicationDataSize, "Data size is too big.");
-
- // Set up basic information for this network.
- network_info.oui_value = NintendoOUI;
- network_info.oui_type = static_cast<u8>(NintendoTagId::NetworkInfo);
-
- connection_status.max_nodes = network_info.max_nodes;
-
- // Resize the nodes list to hold max_nodes.
- node_info.resize(network_info.max_nodes);
-
- // There's currently only one node in the network (the host).
- connection_status.total_nodes = 1;
- network_info.total_nodes = 1;
- // The host is always the first node
- connection_status.network_node_id = 1;
- node_info[0].network_node_id = 1;
- connection_status.nodes[0] = connection_status.network_node_id;
- // Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken.
- connection_status.node_bitmask |= 1;
- // Notify the application that the first node was set.
- connection_status.changed_nodes |= 1;
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsHost);
+
+ // Ensure the application data size is less than the maximum value.
+ ASSERT_MSG(network_info.application_data_size <= ApplicationDataSize,
+ "Data size is too big.");
+
+ // Set up basic information for this network.
+ network_info.oui_value = NintendoOUI;
+ network_info.oui_type = static_cast<u8>(NintendoTagId::NetworkInfo);
+
+ connection_status.max_nodes = network_info.max_nodes;
+
+ // Resize the nodes list to hold max_nodes.
+ node_info.resize(network_info.max_nodes);
+
+ // There's currently only one node in the network (the host).
+ connection_status.total_nodes = 1;
+ network_info.total_nodes = 1;
+ // The host is always the first node
+ connection_status.network_node_id = 1;
+ current_node.network_node_id = 1;
+ connection_status.nodes[0] = connection_status.network_node_id;
+ // Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken.
+ connection_status.node_bitmask |= 1;
+ // Notify the application that the first node was set.
+ connection_status.changed_nodes |= 1;
+ node_info[0] = current_node;
+ }
// If the game has a preferred channel, use that instead.
if (network_info.channel != 0)
@@ -361,9 +677,13 @@ static void DestroyNetwork(Interface* self) {
// Unschedule the beacon broadcast event.
CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0);
- // TODO(Subv): Check if connection_status is indeed reset after this call.
- connection_status = {};
- connection_status.status = static_cast<u8>(NetworkStatus::NotConnected);
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+
+ // TODO(Subv): Check if connection_status is indeed reset after this call.
+ connection_status = {};
+ connection_status.status = static_cast<u8>(NetworkStatus::NotConnected);
+ }
connection_status_event->Signal();
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
@@ -406,17 +726,24 @@ static void SendTo(Interface* self) {
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
- if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsClient) &&
- connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
- rb.Push(ResultCode(ErrorDescription::NotAuthorized, ErrorModule::UDS,
- ErrorSummary::InvalidState, ErrorLevel::Status));
- return;
- }
+ u16 network_node_id;
- if (dest_node_id == connection_status.network_node_id) {
- rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::UDS,
- ErrorSummary::WrongArgument, ErrorLevel::Status));
- return;
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsClient) &&
+ connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
+ rb.Push(ResultCode(ErrorDescription::NotAuthorized, ErrorModule::UDS,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+ return;
+ }
+
+ if (dest_node_id == connection_status.network_node_id) {
+ rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::UDS,
+ ErrorSummary::WrongArgument, ErrorLevel::Status));
+ return;
+ }
+
+ network_node_id = connection_status.network_node_id;
}
// TODO(Subv): Do something with the flags.
@@ -433,8 +760,8 @@ static void SendTo(Interface* self) {
// TODO(Subv): Increment the sequence number after each sent packet.
u16 sequence_number = 0;
- std::vector<u8> data_payload = GenerateDataPayload(
- data, data_channel, dest_node_id, connection_status.network_node_id, sequence_number);
+ std::vector<u8> data_payload =
+ GenerateDataPayload(data, data_channel, dest_node_id, network_node_id, sequence_number);
// TODO(Subv): Retrieve the MAC address of the dest_node_id and our own to encrypt
// and encapsulate the payload.
@@ -461,6 +788,7 @@ static void GetChannel(Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1A, 0, 0);
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
bool is_connected = connection_status.status != static_cast<u32>(NetworkStatus::NotConnected);
u8 channel = is_connected ? network_channel : 0;
@@ -610,37 +938,29 @@ static void BeaconBroadcastCallback(u64 userdata, int cycles_late) {
if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost))
return;
- // TODO(Subv): Actually send the beacon.
std::vector<u8> frame = GenerateBeaconFrame(network_info, node_info);
+ using Network::WifiPacket;
+ WifiPacket packet;
+ packet.type = WifiPacket::PacketType::Beacon;
+ packet.data = std::move(frame);
+ packet.destination_address = Network::BroadcastMac;
+ packet.channel = network_channel;
+
+ SendPacket(packet);
+
// Start broadcasting the network, send a beacon frame every 102.4ms.
CoreTiming::ScheduleEvent(msToCycles(DefaultBeaconInterval * MillisecondsPerTU) - cycles_late,
beacon_broadcast_event, 0);
}
/*
- * Returns an available index in the nodes array for the
- * currently-hosted UDS network.
- */
-static u32 GetNextAvailableNodeId() {
- ASSERT_MSG(connection_status.status == static_cast<u32>(NetworkStatus::ConnectedAsHost),
- "Can not accept clients if we're not hosting a network");
-
- for (unsigned index = 0; index < connection_status.max_nodes; ++index) {
- if ((connection_status.node_bitmask & (1 << index)) == 0)
- return index;
- }
-
- // Any connection attempts to an already full network should have been refused.
- ASSERT_MSG(false, "No available connection slots in the network");
-}
-
-/*
* Called when a client connects to an UDS network we're hosting,
* updates the connection status and signals the update event.
* @param network_node_id Network Node Id of the connecting client.
*/
void OnClientConnected(u16 network_node_id) {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
ASSERT_MSG(connection_status.status == static_cast<u32>(NetworkStatus::ConnectedAsHost),
"Can not accept clients if we're not hosting a network");
ASSERT_MSG(connection_status.total_nodes < connection_status.max_nodes,
@@ -655,7 +975,7 @@ void OnClientConnected(u16 network_node_id) {
}
const Interface::FunctionInfo FunctionTable[] = {
- {0x00010442, nullptr, "Initialize (deprecated)"},
+ {0x000102C2, nullptr, "Initialize (deprecated)"},
{0x00020000, nullptr, "Scrap"},
{0x00030000, Shutdown, "Shutdown"},
{0x00040402, nullptr, "CreateNetwork (deprecated)"},
@@ -702,8 +1022,11 @@ NWM_UDS::~NWM_UDS() {
connection_status_event = nullptr;
recv_buffer_memory = nullptr;
- connection_status = {};
- connection_status.status = static_cast<u32>(NetworkStatus::NotConnected);
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ connection_status = {};
+ connection_status.status = static_cast<u32>(NetworkStatus::NotConnected);
+ }
CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0);
}
diff --git a/src/core/hle/service/nwm/nwm_uds.h b/src/core/hle/service/nwm/nwm_uds.h
index 141f49f9c..f1caaf974 100644
--- a/src/core/hle/service/nwm/nwm_uds.h
+++ b/src/core/hle/service/nwm/nwm_uds.h
@@ -42,6 +42,7 @@ using NodeList = std::vector<NodeInfo>;
enum class NetworkStatus {
NotConnected = 3,
ConnectedAsHost = 6,
+ Connecting = 7,
ConnectedAsClient = 9,
ConnectedAsSpectator = 10,
};
@@ -85,6 +86,17 @@ static_assert(offsetof(NetworkInfo, oui_value) == 0xC, "oui_value is at the wron
static_assert(offsetof(NetworkInfo, wlan_comm_id) == 0x10, "wlancommid is at the wrong offset.");
static_assert(sizeof(NetworkInfo) == 0x108, "NetworkInfo has incorrect size.");
+/// Additional block tag ids in the Beacon and Association Response frames
+enum class TagId : u8 {
+ SSID = 0,
+ SupportedRates = 1,
+ DSParameterSet = 2,
+ TrafficIndicationMap = 5,
+ CountryInformation = 7,
+ ERPInformation = 42,
+ VendorSpecific = 221
+};
+
class NWM_UDS final : public Interface {
public:
NWM_UDS();
diff --git a/src/core/hle/service/nwm/uds_beacon.cpp b/src/core/hle/service/nwm/uds_beacon.cpp
index 6332b404c..73a80d940 100644
--- a/src/core/hle/service/nwm/uds_beacon.cpp
+++ b/src/core/hle/service/nwm/uds_beacon.cpp
@@ -243,7 +243,7 @@ std::vector<u8> GenerateNintendoFirstEncryptedDataTag(const NetworkInfo& network
EncryptedDataTag tag{};
tag.header.tag_id = static_cast<u8>(TagId::VendorSpecific);
- tag.header.length = sizeof(tag) - sizeof(TagHeader) + payload_size;
+ tag.header.length = static_cast<u8>(sizeof(tag) - sizeof(TagHeader) + payload_size);
tag.oui_type = static_cast<u8>(NintendoTagId::EncryptedData0);
tag.oui = NintendoOUI;
@@ -279,7 +279,7 @@ std::vector<u8> GenerateNintendoSecondEncryptedDataTag(const NetworkInfo& networ
EncryptedDataTag tag{};
tag.header.tag_id = static_cast<u8>(TagId::VendorSpecific);
- tag.header.length = tag_length;
+ tag.header.length = static_cast<u8>(tag_length);
tag.oui_type = static_cast<u8>(NintendoTagId::EncryptedData1);
tag.oui = NintendoOUI;
@@ -325,8 +325,5 @@ std::vector<u8> GenerateBeaconFrame(const NetworkInfo& network_info, const NodeL
return buffer;
}
-std::deque<WifiPacket> GetReceivedPackets(WifiPacket::PacketType type, const MacAddress& sender) {
- return {};
-}
} // namespace NWM
} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_beacon.h b/src/core/hle/service/nwm/uds_beacon.h
index caacf4c6f..50cc76da2 100644
--- a/src/core/hle/service/nwm/uds_beacon.h
+++ b/src/core/hle/service/nwm/uds_beacon.h
@@ -17,17 +17,6 @@ namespace NWM {
using MacAddress = std::array<u8, 6>;
constexpr std::array<u8, 3> NintendoOUI = {0x00, 0x1F, 0x32};
-/// Additional block tag ids in the Beacon frames
-enum class TagId : u8 {
- SSID = 0,
- SupportedRates = 1,
- DSParameterSet = 2,
- TrafficIndicationMap = 5,
- CountryInformation = 7,
- ERPInformation = 42,
- VendorSpecific = 221
-};
-
/**
* Internal vendor-specific tag ids as stored inside
* VendorSpecific blocks in the Beacon frames.
@@ -135,20 +124,6 @@ struct BeaconData {
static_assert(sizeof(BeaconData) == 0x12, "BeaconData has incorrect size.");
-/// Information about a received WiFi packet.
-/// Acts as our own 802.11 header.
-struct WifiPacket {
- enum class PacketType { Beacon, Data };
-
- PacketType type; ///< The type of 802.11 frame, Beacon / Data.
-
- /// Raw 802.11 frame data, starting at the management frame header for management frames.
- std::vector<u8> data;
- MacAddress transmitter_address; ///< Mac address of the transmitter.
- MacAddress destination_address; ///< Mac address of the receiver.
- u8 channel; ///< WiFi channel where this frame was transmitted.
-};
-
/**
* Decrypts the beacon data buffer for the network described by `network_info`.
*/
@@ -161,10 +136,5 @@ void DecryptBeaconData(const NetworkInfo& network_info, std::vector<u8>& buffer)
*/
std::vector<u8> GenerateBeaconFrame(const NetworkInfo& network_info, const NodeList& nodes);
-/**
- * Returns a list of received 802.11 frames from the specified sender
- * matching the type since the last call.
- */
-std::deque<WifiPacket> GetReceivedPackets(WifiPacket::PacketType type, const MacAddress& sender);
} // namespace NWM
} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_connection.cpp b/src/core/hle/service/nwm/uds_connection.cpp
new file mode 100644
index 000000000..c74f51253
--- /dev/null
+++ b/src/core/hle/service/nwm/uds_connection.cpp
@@ -0,0 +1,88 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/nwm/nwm_uds.h"
+#include "core/hle/service/nwm/uds_connection.h"
+#include "fmt/format.h"
+
+namespace Service {
+namespace NWM {
+
+// Note: These values were taken from a packet capture of an o3DS XL
+// broadcasting a Super Smash Bros. 4 lobby.
+constexpr u16 DefaultExtraCapabilities = 0x0431;
+
+std::vector<u8> GenerateAuthenticationFrame(AuthenticationSeq seq) {
+ AuthenticationFrame frame{};
+ frame.auth_seq = static_cast<u16>(seq);
+
+ std::vector<u8> data(sizeof(frame));
+ std::memcpy(data.data(), &frame, sizeof(frame));
+
+ return data;
+}
+
+AuthenticationSeq GetAuthenticationSeqNumber(const std::vector<u8>& body) {
+ AuthenticationFrame frame;
+ std::memcpy(&frame, body.data(), sizeof(frame));
+
+ return static_cast<AuthenticationSeq>(frame.auth_seq);
+}
+
+/**
+ * Generates an SSID tag of an 802.11 Beacon frame with an 8-byte character representation of the
+ * specified network id as the SSID value.
+ * @param network_id The network id to use.
+ * @returns A buffer with the SSID tag.
+ */
+static std::vector<u8> GenerateSSIDTag(u32 network_id) {
+ constexpr u8 SSIDSize = 8;
+
+ struct {
+ u8 id = static_cast<u8>(TagId::SSID);
+ u8 size = SSIDSize;
+ } tag_header;
+
+ std::vector<u8> buffer(sizeof(tag_header) + SSIDSize);
+
+ std::memcpy(buffer.data(), &tag_header, sizeof(tag_header));
+
+ std::string network_name = fmt::format("{0:08X}", network_id);
+
+ std::memcpy(buffer.data() + sizeof(tag_header), network_name.c_str(), SSIDSize);
+
+ return buffer;
+}
+
+std::vector<u8> GenerateAssocResponseFrame(AssocStatus status, u16 association_id, u32 network_id) {
+ AssociationResponseFrame frame{};
+ frame.capabilities = DefaultExtraCapabilities;
+ frame.status_code = static_cast<u16>(status);
+ // The association id is ORed with this magic value (0xC000)
+ constexpr u16 AssociationIdMagic = 0xC000;
+ frame.assoc_id = association_id | AssociationIdMagic;
+
+ std::vector<u8> data(sizeof(frame));
+ std::memcpy(data.data(), &frame, sizeof(frame));
+
+ auto ssid_tag = GenerateSSIDTag(network_id);
+ data.insert(data.end(), ssid_tag.begin(), ssid_tag.end());
+
+ // TODO(Subv): Add the SupportedRates tag.
+ // TODO(Subv): Add the DSParameterSet tag.
+ // TODO(Subv): Add the ERPInformation tag.
+ return data;
+}
+
+std::tuple<AssocStatus, u16> GetAssociationResult(const std::vector<u8>& body) {
+ AssociationResponseFrame frame;
+ memcpy(&frame, body.data(), sizeof(frame));
+
+ constexpr u16 AssociationIdMask = 0x3FFF;
+ return std::make_tuple(static_cast<AssocStatus>(frame.status_code),
+ frame.assoc_id & AssociationIdMask);
+}
+
+} // namespace NWM
+} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_connection.h b/src/core/hle/service/nwm/uds_connection.h
new file mode 100644
index 000000000..a664f8471
--- /dev/null
+++ b/src/core/hle/service/nwm/uds_connection.h
@@ -0,0 +1,56 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <tuple>
+#include <vector>
+#include "common/common_types.h"
+#include "common/swap.h"
+#include "core/hle/service/service.h"
+
+namespace Service {
+namespace NWM {
+
+/// Sequence number of the 802.11 authentication frames.
+enum class AuthenticationSeq : u16 { SEQ1 = 1, SEQ2 = 2 };
+
+enum class AuthAlgorithm : u16 { OpenSystem = 0 };
+
+enum class AuthStatus : u16 { Successful = 0 };
+
+enum class AssocStatus : u16 { Successful = 0 };
+
+struct AuthenticationFrame {
+ u16_le auth_algorithm = static_cast<u16>(AuthAlgorithm::OpenSystem);
+ u16_le auth_seq;
+ u16_le status_code = static_cast<u16>(AuthStatus::Successful);
+};
+
+static_assert(sizeof(AuthenticationFrame) == 6, "AuthenticationFrame has wrong size");
+
+struct AssociationResponseFrame {
+ u16_le capabilities;
+ u16_le status_code;
+ u16_le assoc_id;
+};
+
+static_assert(sizeof(AssociationResponseFrame) == 6, "AssociationResponseFrame has wrong size");
+
+/// Generates an 802.11 authentication frame, starting at the frame body.
+std::vector<u8> GenerateAuthenticationFrame(AuthenticationSeq seq);
+
+/// Returns the sequence number from the body of an Authentication frame.
+AuthenticationSeq GetAuthenticationSeqNumber(const std::vector<u8>& body);
+
+/// Generates an 802.11 association response frame with the specified status, association id and
+/// network id, starting at the frame body.
+std::vector<u8> GenerateAssocResponseFrame(AssocStatus status, u16 association_id, u32 network_id);
+
+/// Returns a tuple of (association status, association id) from the body of an AssociationResponse
+/// frame.
+std::tuple<AssocStatus, u16> GetAssociationResult(const std::vector<u8>& body);
+
+} // namespace NWM
+} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_data.cpp b/src/core/hle/service/nwm/uds_data.cpp
index 8c6742dba..4b389710f 100644
--- a/src/core/hle/service/nwm/uds_data.cpp
+++ b/src/core/hle/service/nwm/uds_data.cpp
@@ -2,6 +2,7 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <algorithm>
#include <cstring>
#include <cryptopp/aes.h>
#include <cryptopp/ccm.h>
@@ -197,7 +198,7 @@ static std::vector<u8> DecryptDataFrame(const std::vector<u8>& encrypted_payload
df.ChannelMessageEnd(CryptoPP::DEFAULT_CHANNEL);
df.SetRetrievalChannel(CryptoPP::DEFAULT_CHANNEL);
- int size = df.MaxRetrievable();
+ size_t size = df.MaxRetrievable();
std::vector<u8> pdata(size);
df.Get(pdata.data(), size);
@@ -251,7 +252,7 @@ static std::vector<u8> EncryptDataFrame(const std::vector<u8>& payload,
df.SetRetrievalChannel(CryptoPP::DEFAULT_CHANNEL);
- int size = df.MaxRetrievable();
+ size_t size = df.MaxRetrievable();
std::vector<u8> cipher(size);
df.Get(cipher.data(), size);
@@ -266,13 +267,107 @@ static std::vector<u8> EncryptDataFrame(const std::vector<u8>& payload,
std::vector<u8> GenerateDataPayload(const std::vector<u8>& data, u8 channel, u16 dest_node,
u16 src_node, u16 sequence_number) {
std::vector<u8> buffer = GenerateLLCHeader(EtherType::SecureData);
- std::vector<u8> securedata_header =
- GenerateSecureDataHeader(data.size(), channel, dest_node, src_node, sequence_number);
+ std::vector<u8> securedata_header = GenerateSecureDataHeader(
+ static_cast<u16>(data.size()), channel, dest_node, src_node, sequence_number);
buffer.insert(buffer.end(), securedata_header.begin(), securedata_header.end());
buffer.insert(buffer.end(), data.begin(), data.end());
return buffer;
}
+std::vector<u8> GenerateEAPoLStartFrame(u16 association_id, const NodeInfo& node_info) {
+ EAPoLStartPacket eapol_start{};
+ eapol_start.association_id = association_id;
+ eapol_start.node.friend_code_seed = node_info.friend_code_seed;
+
+ std::copy(node_info.username.begin(), node_info.username.end(),
+ eapol_start.node.username.begin());
+
+ // Note: The network_node_id and unknown bytes seem to be uninitialized in the NWM module.
+ // TODO(B3N30): The last 8 bytes seem to have a fixed value of 07 88 15 00 04 e9 13 00 in
+ // EAPoL-Start packets from different 3DSs to the same host during a Super Smash Bros. 4 game.
+ // Find out what that means.
+
+ std::vector<u8> eapol_buffer(sizeof(EAPoLStartPacket));
+ std::memcpy(eapol_buffer.data(), &eapol_start, sizeof(eapol_start));
+
+ std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL);
+ buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end());
+ return buffer;
+}
+
+EtherType GetFrameEtherType(const std::vector<u8>& frame) {
+ LLCHeader header;
+ std::memcpy(&header, frame.data(), sizeof(header));
+
+ u16 ethertype = header.protocol;
+ return static_cast<EtherType>(ethertype);
+}
+
+u16 GetEAPoLFrameType(const std::vector<u8>& frame) {
+ // Ignore the LLC header
+ u16_be eapol_type;
+ std::memcpy(&eapol_type, frame.data() + sizeof(LLCHeader), sizeof(eapol_type));
+ return eapol_type;
+}
+
+NodeInfo DeserializeNodeInfoFromFrame(const std::vector<u8>& frame) {
+ EAPoLStartPacket eapol_start;
+
+ // Skip the LLC header
+ std::memcpy(&eapol_start, frame.data() + sizeof(LLCHeader), sizeof(eapol_start));
+
+ NodeInfo node{};
+ node.friend_code_seed = eapol_start.node.friend_code_seed;
+
+ std::copy(eapol_start.node.username.begin(), eapol_start.node.username.end(),
+ node.username.begin());
+
+ return node;
+}
+
+NodeInfo DeserializeNodeInfo(const EAPoLNodeInfo& node) {
+ NodeInfo node_info{};
+ node_info.friend_code_seed = node.friend_code_seed;
+ node_info.network_node_id = node.network_node_id;
+
+ std::copy(node.username.begin(), node.username.end(), node_info.username.begin());
+
+ return node_info;
+}
+
+std::vector<u8> GenerateEAPoLLogoffFrame(const MacAddress& mac_address, u16 network_node_id,
+ const NodeList& nodes, u8 max_nodes, u8 total_nodes) {
+ EAPoLLogoffPacket eapol_logoff{};
+ eapol_logoff.assigned_node_id = network_node_id;
+ eapol_logoff.connected_nodes = total_nodes;
+ eapol_logoff.max_nodes = max_nodes;
+
+ for (size_t index = 0; index < total_nodes; ++index) {
+ const auto& node_info = nodes[index];
+ auto& node = eapol_logoff.nodes[index];
+
+ node.friend_code_seed = node_info.friend_code_seed;
+ node.network_node_id = node_info.network_node_id;
+
+ std::copy(node_info.username.begin(), node_info.username.end(), node.username.begin());
+ }
+
+ std::vector<u8> eapol_buffer(sizeof(EAPoLLogoffPacket));
+ std::memcpy(eapol_buffer.data(), &eapol_logoff, sizeof(eapol_logoff));
+
+ std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL);
+ buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end());
+ return buffer;
+}
+
+EAPoLLogoffPacket ParseEAPoLLogoffFrame(const std::vector<u8>& frame) {
+ EAPoLLogoffPacket eapol_logoff;
+
+ // Skip the LLC header
+ std::memcpy(&eapol_logoff, frame.data() + sizeof(LLCHeader), sizeof(eapol_logoff));
+ return eapol_logoff;
+}
+
} // namespace NWM
} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_data.h b/src/core/hle/service/nwm/uds_data.h
index a23520a41..76bccb1bf 100644
--- a/src/core/hle/service/nwm/uds_data.h
+++ b/src/core/hle/service/nwm/uds_data.h
@@ -8,6 +8,7 @@
#include <vector>
#include "common/common_types.h"
#include "common/swap.h"
+#include "core/hle/service/nwm/uds_beacon.h"
#include "core/hle/service/service.h"
namespace Service {
@@ -67,6 +68,49 @@ struct DataFrameCryptoCTR {
static_assert(sizeof(DataFrameCryptoCTR) == 16, "DataFrameCryptoCTR has the wrong size");
+struct EAPoLNodeInfo {
+ u64_be friend_code_seed;
+ std::array<u16_be, 10> username;
+ INSERT_PADDING_BYTES(4);
+ u16_be network_node_id;
+ INSERT_PADDING_BYTES(6);
+};
+
+static_assert(sizeof(EAPoLNodeInfo) == 0x28, "EAPoLNodeInfo has the wrong size");
+
+constexpr u16 EAPoLStartMagic = 0x201;
+
+/*
+ * Nintendo EAPoLStartPacket, is used to initaliaze a connection between client and host
+ */
+struct EAPoLStartPacket {
+ u16_be magic = EAPoLStartMagic;
+ u16_be association_id;
+ // This value is hardcoded to 1 in the NWM module.
+ u16_be unknown = 1;
+ INSERT_PADDING_BYTES(2);
+ EAPoLNodeInfo node;
+};
+
+static_assert(sizeof(EAPoLStartPacket) == 0x30, "EAPoLStartPacket has the wrong size");
+
+constexpr u16 EAPoLLogoffMagic = 0x202;
+
+struct EAPoLLogoffPacket {
+ u16_be magic = EAPoLLogoffMagic;
+ INSERT_PADDING_BYTES(2);
+ u16_be assigned_node_id;
+ MacAddress client_mac_address;
+ INSERT_PADDING_BYTES(6);
+ u8 connected_nodes;
+ u8 max_nodes;
+ INSERT_PADDING_BYTES(4);
+
+ std::array<EAPoLNodeInfo, UDSMaxNodes> nodes;
+};
+
+static_assert(sizeof(EAPoLLogoffPacket) == 0x298, "EAPoLLogoffPacket has the wrong size");
+
/**
* Generates an unencrypted 802.11 data payload.
* @returns The generated frame payload.
@@ -74,5 +118,47 @@ static_assert(sizeof(DataFrameCryptoCTR) == 16, "DataFrameCryptoCTR has the wron
std::vector<u8> GenerateDataPayload(const std::vector<u8>& data, u8 channel, u16 dest_node,
u16 src_node, u16 sequence_number);
+/*
+ * Generates an unencrypted 802.11 data frame body with the EAPoL-Start format for UDS
+ * communication.
+ * @returns The generated frame body.
+ */
+std::vector<u8> GenerateEAPoLStartFrame(u16 association_id, const NodeInfo& node_info);
+
+/*
+ * Returns the EtherType of the specified 802.11 frame.
+ */
+EtherType GetFrameEtherType(const std::vector<u8>& frame);
+
+/*
+ * Returns the EAPoL type (Start / Logoff) of the specified 802.11 frame.
+ * Note: The frame *must* be an EAPoL frame.
+ */
+u16 GetEAPoLFrameType(const std::vector<u8>& frame);
+
+/*
+ * Returns a deserialized NodeInfo structure from the information inside an EAPoL-Start packet
+ * encapsulated in an 802.11 data frame.
+ */
+NodeInfo DeserializeNodeInfoFromFrame(const std::vector<u8>& frame);
+
+/*
+ * Returns a NodeInfo constructed from the data in the specified EAPoLNodeInfo.
+ */
+NodeInfo DeserializeNodeInfo(const EAPoLNodeInfo& node);
+
+/*
+ * Generates an unencrypted 802.11 data frame body with the EAPoL-Logoff format for UDS
+ * communication.
+ * @returns The generated frame body.
+ */
+std::vector<u8> GenerateEAPoLLogoffFrame(const MacAddress& mac_address, u16 network_node_id,
+ const NodeList& nodes, u8 max_nodes, u8 total_nodes);
+
+/*
+ * Returns a EAPoLLogoffPacket representing the specified 802.11-encapsulated data frame.
+ */
+EAPoLLogoffPacket ParseEAPoLLogoffFrame(const std::vector<u8>& frame);
+
} // namespace NWM
} // namespace Service
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index aad950e50..f267aad74 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -38,7 +38,7 @@
#include "core/hle/service/news/news.h"
#include "core/hle/service/nfc/nfc.h"
#include "core/hle/service/nim/nim.h"
-#include "core/hle/service/ns_s.h"
+#include "core/hle/service/ns/ns.h"
#include "core/hle/service/nwm/nwm.h"
#include "core/hle/service/pm_app.h"
#include "core/hle/service/ptm/ptm.h"
@@ -215,6 +215,8 @@ void Init() {
SM::g_service_manager = std::make_shared<SM::ServiceManager>();
SM::ServiceManager::InstallInterfaces(SM::g_service_manager);
+ NS::InstallInterfaces(*SM::g_service_manager);
+
AddNamedPort(new ERR::ERR_F);
FS::ArchiveInit();
@@ -246,7 +248,6 @@ void Init() {
AddService(new HTTP::HTTP_C);
AddService(new LDR::LDR_RO);
AddService(new MIC::MIC_U);
- AddService(new NS::NS_S);
AddService(new PM::PM_APP);
AddService(new SOC::SOC_U);
AddService(new SSL::SSL_C);
diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp
index 5e7fc68f9..854ab9a05 100644
--- a/src/core/hle/service/sm/sm.cpp
+++ b/src/core/hle/service/sm/sm.cpp
@@ -36,6 +36,10 @@ ResultVal<Kernel::SharedPtr<Kernel::ServerPort>> ServiceManager::RegisterService
std::string name, unsigned int max_sessions) {
CASCADE_CODE(ValidateServiceName(name));
+
+ if (registered_services.find(name) != registered_services.end())
+ return ERR_ALREADY_REGISTERED;
+
Kernel::SharedPtr<Kernel::ServerPort> server_port;
Kernel::SharedPtr<Kernel::ClientPort> client_port;
std::tie(server_port, client_port) = Kernel::ServerPort::CreatePortPair(max_sessions, name);
diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h
index 8f0dbf2db..9f60a7965 100644
--- a/src/core/hle/service/sm/sm.h
+++ b/src/core/hle/service/sm/sm.h
@@ -32,6 +32,9 @@ constexpr ResultCode ERR_ACCESS_DENIED(6, ErrorModule::SRV, ErrorSummary::Invali
ErrorLevel::Permanent); // 0xD8E06406
constexpr ResultCode ERR_NAME_CONTAINS_NUL(7, ErrorModule::SRV, ErrorSummary::WrongArgument,
ErrorLevel::Permanent); // 0xD9006407
+constexpr ResultCode ERR_ALREADY_REGISTERED(ErrorDescription::AlreadyExists, ErrorModule::OS,
+ ErrorSummary::WrongArgument,
+ ErrorLevel::Permanent); // 0xD9001BFC
class ServiceManager {
public:
diff --git a/src/core/hle/service/sm/srv.cpp b/src/core/hle/service/sm/srv.cpp
index 352941e69..fb873981c 100644
--- a/src/core/hle/service/sm/srv.cpp
+++ b/src/core/hle/service/sm/srv.cpp
@@ -13,6 +13,7 @@
#include "core/hle/kernel/errors.h"
#include "core/hle/kernel/hle_ipc.h"
#include "core/hle/kernel/semaphore.h"
+#include "core/hle/kernel/server_port.h"
#include "core/hle/kernel/server_session.h"
#include "core/hle/service/sm/sm.h"
#include "core/hle/service/sm/srv.h"
@@ -61,7 +62,7 @@ void SRV::EnableNotification(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx, 0x2, 0, 0);
notification_semaphore =
- Kernel::Semaphore::Create(0, MAX_PENDING_NOTIFICATIONS, "SRV:Notification").Unwrap();
+ Kernel::Semaphore::Create(0, MAX_PENDING_NOTIFICATIONS, 0, "SRV:Notification").Unwrap();
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
rb.Push(RESULT_SUCCESS);
@@ -184,12 +185,35 @@ void SRV::PublishToSubscriber(Kernel::HLERequestContext& ctx) {
flags);
}
+void SRV::RegisterService(Kernel::HLERequestContext& ctx) {
+ IPC::RequestParser rp(ctx, 0x3, 4, 0);
+
+ auto name_buf = rp.PopRaw<std::array<char, 8>>();
+ size_t name_len = rp.Pop<u32>();
+ u32 max_sessions = rp.Pop<u32>();
+
+ std::string name(name_buf.data(), std::min(name_len, name_buf.size()));
+
+ auto port = service_manager->RegisterService(name, max_sessions);
+
+ if (port.Failed()) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(port.Code());
+ LOG_ERROR(Service_SRV, "called service=%s -> error 0x%08X", name.c_str(), port.Code().raw);
+ return;
+ }
+
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
+ rb.Push(RESULT_SUCCESS);
+ rb.PushObjects(port.Unwrap());
+}
+
SRV::SRV(std::shared_ptr<ServiceManager> service_manager)
: ServiceFramework("srv:", 4), service_manager(std::move(service_manager)) {
static const FunctionInfo functions[] = {
{0x00010002, &SRV::RegisterClient, "RegisterClient"},
{0x00020000, &SRV::EnableNotification, "EnableNotification"},
- {0x00030100, nullptr, "RegisterService"},
+ {0x00030100, &SRV::RegisterService, "RegisterService"},
{0x000400C0, nullptr, "UnregisterService"},
{0x00050100, &SRV::GetServiceHandle, "GetServiceHandle"},
{0x000600C2, nullptr, "RegisterPort"},
diff --git a/src/core/hle/service/sm/srv.h b/src/core/hle/service/sm/srv.h
index 75cca5184..aad839563 100644
--- a/src/core/hle/service/sm/srv.h
+++ b/src/core/hle/service/sm/srv.h
@@ -28,6 +28,7 @@ private:
void Subscribe(Kernel::HLERequestContext& ctx);
void Unsubscribe(Kernel::HLERequestContext& ctx);
void PublishToSubscriber(Kernel::HLERequestContext& ctx);
+ void RegisterService(Kernel::HLERequestContext& ctx);
std::shared_ptr<ServiceManager> service_manager;
Kernel::SharedPtr<Kernel::Semaphore> notification_semaphore;
diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp
index 6838e449c..d1bfe51e6 100644
--- a/src/core/hw/gpu.cpp
+++ b/src/core/hw/gpu.cpp
@@ -29,7 +29,7 @@ namespace GPU {
Regs g_regs;
/// 268MHz CPU clocks / 60Hz frames per second
-const u64 frame_ticks = BASE_CLOCK_RATE_ARM11 / SCREEN_REFRESH_RATE;
+const u64 frame_ticks = static_cast<u64>(BASE_CLOCK_RATE_ARM11 / SCREEN_REFRESH_RATE);
/// Event id for CoreTiming
static int vblank_event;
@@ -515,15 +515,15 @@ template void Write<u8>(u32 addr, const u8 data);
/// Update hardware
static void VBlankCallback(u64 userdata, int cycles_late) {
- VideoCore::g_renderer->SwapBuffers();
-
- // Signal to GSP that GPU interrupt has occurred
- // TODO(yuriks): hwtest to determine if PDC0 is for the Top screen and PDC1 for the Sub
- // screen, or if both use the same interrupts and these two instead determine the
- // beginning and end of the VBlank period. If needed, split the interrupt firing into
- // two different intervals.
- Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC0);
- Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC1);
+ //VideoCore::g_renderer->SwapBuffers();
+
+ //// Signal to GSP that GPU interrupt has occurred
+ //// TODO(yuriks): hwtest to determine if PDC0 is for the Top screen and PDC1 for the Sub
+ //// screen, or if both use the same interrupts and these two instead determine the
+ //// beginning and end of the VBlank period. If needed, split the interrupt firing into
+ //// two different intervals.
+ //Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC0);
+ //Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC1);
// Reschedule recurrent event
CoreTiming::ScheduleEvent(frame_ticks - cycles_late, vblank_event);
diff --git a/src/core/hw/gpu.h b/src/core/hw/gpu.h
index 21b127fee..e3d0a0e08 100644
--- a/src/core/hw/gpu.h
+++ b/src/core/hw/gpu.h
@@ -74,9 +74,9 @@ struct Regs {
case PixelFormat::RGB5A1:
case PixelFormat::RGBA4:
return 2;
- default:
- UNIMPLEMENTED();
}
+
+ UNREACHABLE();
}
INSERT_PADDING_WORDS(0x4);
diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp
index 209328347..7b0342cc9 100644
--- a/src/core/loader/3dsx.cpp
+++ b/src/core/loader/3dsx.cpp
@@ -91,8 +91,8 @@ static u32 TranslateAddr(u32 addr, const THREEloadinfo* loadinfo, u32* offsets)
return loadinfo->seg_addrs[2] + addr - offsets[1];
}
-using Kernel::SharedPtr;
using Kernel::CodeSet;
+using Kernel::SharedPtr;
static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr,
SharedPtr<CodeSet>* out_codeset) {
@@ -255,7 +255,7 @@ FileType AppLoader_THREEDSX::IdentifyType(FileUtil::IOFile& file) {
return FileType::Error;
}
-ResultStatus AppLoader_THREEDSX::Load() {
+ResultStatus AppLoader_THREEDSX::Load(Kernel::SharedPtr<Kernel::Process>& process) {
if (is_loaded)
return ResultStatus::ErrorAlreadyLoaded;
@@ -267,19 +267,17 @@ ResultStatus AppLoader_THREEDSX::Load() {
return ResultStatus::Error;
codeset->name = filename;
- Kernel::g_current_process = Kernel::Process::Create("main");
- Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint);
- Kernel::g_current_process->svc_access_mask.set();
- Kernel::g_current_process->address_mappings = default_address_mappings;
+ process = Kernel::Process::Create("main");
+ process->LoadModule(codeset, codeset->entrypoint);
+ process->svc_access_mask.set();
+ process->address_mappings = default_address_mappings;
// Attach the default resource limit (APPLICATION) to the process
- Kernel::g_current_process->resource_limit =
+ process->resource_limit =
Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
+ process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE);
- Kernel::g_current_process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE);
-
- Service::FS::RegisterArchiveType(std::make_unique<FileSys::ArchiveFactory_SelfNCCH>(*this),
- Service::FS::ArchiveIdCode::SelfNCCH);
+ Service::FS::RegisterSelfNCCH(*this);
is_loaded = true;
return ResultStatus::Success;
diff --git a/src/core/loader/3dsx.h b/src/core/loader/3dsx.h
index 3f376778a..1e59bbb9d 100644
--- a/src/core/loader/3dsx.h
+++ b/src/core/loader/3dsx.h
@@ -31,7 +31,7 @@ public:
return IdentifyType(file);
}
- ResultStatus Load() override;
+ ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
ResultStatus ReadIcon(std::vector<u8>& buffer) override;
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 2efc67ff8..9969a8c39 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -13,8 +13,8 @@
#include "core/loader/elf.h"
#include "core/memory.h"
-using Kernel::SharedPtr;
using Kernel::CodeSet;
+using Kernel::SharedPtr;
////////////////////////////////////////////////////////////////////////////////////////////////////
// ELF Header Constants
@@ -382,7 +382,7 @@ FileType AppLoader_ELF::IdentifyType(FileUtil::IOFile& file) {
return FileType::Error;
}
-ResultStatus AppLoader_ELF::Load() {
+ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) {
if (is_loaded)
return ResultStatus::ErrorAlreadyLoaded;
@@ -401,16 +401,16 @@ ResultStatus AppLoader_ELF::Load() {
SharedPtr<CodeSet> codeset = elf_reader.LoadInto(Memory::PROCESS_IMAGE_VADDR);
codeset->name = filename;
- Kernel::g_current_process = Kernel::Process::Create("main");
- Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint);
- Kernel::g_current_process->svc_access_mask.set();
- Kernel::g_current_process->address_mappings = default_address_mappings;
+ process = Kernel::Process::Create("main");
+ process->LoadModule(codeset, codeset->entrypoint);
+ process->svc_access_mask.set();
+ process->address_mappings = default_address_mappings;
// Attach the default resource limit (APPLICATION) to the process
- Kernel::g_current_process->resource_limit =
+ process->resource_limit =
Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
- Kernel::g_current_process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE);
+ process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE);
is_loaded = true;
return ResultStatus::Success;
diff --git a/src/core/loader/elf.h b/src/core/loader/elf.h
index 862aa90d8..113da5917 100644
--- a/src/core/loader/elf.h
+++ b/src/core/loader/elf.h
@@ -30,7 +30,7 @@ public:
return IdentifyType(file);
}
- ResultStatus Load() override;
+ ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
private:
std::string filename;
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h
index ac26f31fa..311785d05 100644
--- a/src/core/loader/loader.h
+++ b/src/core/loader/loader.h
@@ -13,10 +13,12 @@
#include <boost/optional.hpp>
#include "common/common_types.h"
#include "common/file_util.h"
+#include "core/hle/kernel/kernel.h"
namespace Kernel {
struct AddressMapping;
-}
+class Process;
+} // namespace Kernel
////////////////////////////////////////////////////////////////////////////////////////////////////
// Loader namespace
@@ -94,10 +96,11 @@ public:
virtual FileType GetFileType() = 0;
/**
- * Load the application
- * @return ResultStatus result of function
+ * Load the application and return the created Process instance
+ * @param process The newly created process.
+ * @return The status result of the operation.
*/
- virtual ResultStatus Load() = 0;
+ virtual ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) = 0;
/**
* Loads the system mode that this application needs.
@@ -168,6 +171,28 @@ public:
return ResultStatus::ErrorNotImplemented;
}
+ /**
+ * Get the update RomFS of the application
+ * Since the RomFS can be huge, we return a file reference instead of copying to a buffer
+ * @param romfs_file The file containing the RomFS
+ * @param offset The offset the romfs begins on
+ * @param size The size of the romfs
+ * @return ResultStatus result of function
+ */
+ virtual ResultStatus ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
+ u64& size) {
+ return ResultStatus::ErrorNotImplemented;
+ }
+
+ /**
+ * Get the title of the application
+ * @param title Reference to store the application title into
+ * @return ResultStatus result of function
+ */
+ virtual ResultStatus ReadTitle(std::string& title) {
+ return ResultStatus::ErrorNotImplemented;
+ }
+
protected:
FileUtil::IOFile file;
bool is_loaded = false;
@@ -186,4 +211,4 @@ extern const std::initializer_list<Kernel::AddressMapping> default_address_mappi
*/
std::unique_ptr<AppLoader> GetLoader(const std::string& filename);
-} // namespace
+} // namespace Loader
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp
index 728886ea8..e33a37b2e 100644
--- a/src/core/loader/ncch.cpp
+++ b/src/core/loader/ncch.cpp
@@ -4,13 +4,17 @@
#include <algorithm>
#include <cinttypes>
+#include <codecvt>
#include <cstring>
+#include <locale>
#include <memory>
#include "common/logging/log.h"
#include "common/string_util.h"
#include "common/swap.h"
#include "core/core.h"
#include "core/file_sys/archive_selfncch.h"
+#include "core/file_sys/ncch_container.h"
+#include "core/file_sys/title_metadata.h"
#include "core/hle/kernel/process.h"
#include "core/hle/kernel/resource_limit.h"
#include "core/hle/service/cfg/cfg.h"
@@ -18,93 +22,14 @@
#include "core/loader/ncch.h"
#include "core/loader/smdh.h"
#include "core/memory.h"
+#include "network/network.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// Loader namespace
namespace Loader {
-static const int kMaxSections = 8; ///< Maximum number of sections (files) in an ExeFs
-static const int kBlockSize = 0x200; ///< Size of ExeFS blocks (in bytes)
-
-/**
- * Get the decompressed size of an LZSS compressed ExeFS file
- * @param buffer Buffer of compressed file
- * @param size Size of compressed buffer
- * @return Size of decompressed buffer
- */
-static u32 LZSS_GetDecompressedSize(const u8* buffer, u32 size) {
- u32 offset_size = *(u32*)(buffer + size - 4);
- return offset_size + size;
-}
-
-/**
- * Decompress ExeFS file (compressed with LZSS)
- * @param compressed Compressed buffer
- * @param compressed_size Size of compressed buffer
- * @param decompressed Decompressed buffer
- * @param decompressed_size Size of decompressed buffer
- * @return True on success, otherwise false
- */
-static bool LZSS_Decompress(const u8* compressed, u32 compressed_size, u8* decompressed,
- u32 decompressed_size) {
- const u8* footer = compressed + compressed_size - 8;
- u32 buffer_top_and_bottom = *reinterpret_cast<const u32*>(footer);
- u32 out = decompressed_size;
- u32 index = compressed_size - ((buffer_top_and_bottom >> 24) & 0xFF);
- u32 stop_index = compressed_size - (buffer_top_and_bottom & 0xFFFFFF);
-
- memset(decompressed, 0, decompressed_size);
- memcpy(decompressed, compressed, compressed_size);
-
- while (index > stop_index) {
- u8 control = compressed[--index];
-
- for (unsigned i = 0; i < 8; i++) {
- if (index <= stop_index)
- break;
- if (index <= 0)
- break;
- if (out <= 0)
- break;
-
- if (control & 0x80) {
- // Check if compression is out of bounds
- if (index < 2)
- return false;
- index -= 2;
-
- u32 segment_offset = compressed[index] | (compressed[index + 1] << 8);
- u32 segment_size = ((segment_offset >> 12) & 15) + 3;
- segment_offset &= 0x0FFF;
- segment_offset += 2;
-
- // Check if compression is out of bounds
- if (out < segment_size)
- return false;
-
- for (unsigned j = 0; j < segment_size; j++) {
- // Check if compression is out of bounds
- if (out + segment_offset >= decompressed_size)
- return false;
-
- u8 data = decompressed[out + segment_offset];
- decompressed[--out] = data;
- }
- } else {
- // Check if compression is out of bounds
- if (out < 1)
- return false;
- decompressed[--out] = compressed[--index];
- }
- control <<= 1;
- }
- }
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// AppLoader_NCCH class
+static const u64 UPDATE_MASK = 0x0000000e00000000;
FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) {
u32 magic;
@@ -121,203 +46,105 @@ FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) {
return FileType::Error;
}
+static std::string GetUpdateNCCHPath(u64_le program_id) {
+ u32 high = static_cast<u32>((program_id | UPDATE_MASK) >> 32);
+ u32 low = static_cast<u32>((program_id | UPDATE_MASK) & 0xFFFFFFFF);
+
+ // TODO(shinyquagsire23): Title database should be doing this path lookup
+ std::string content_path = Common::StringFromFormat(
+ "%sNintendo 3DS/%s/%s/title/%08x/%08x/content/", FileUtil::GetUserPath(D_SDMC_IDX).c_str(),
+ SYSTEM_ID, SDCARD_ID, high, low);
+ std::string tmd_path = content_path + "00000000.tmd";
+
+ u32 content_id = 0;
+ FileSys::TitleMetadata tmd(tmd_path);
+ if (tmd.Load() == ResultStatus::Success) {
+ content_id = tmd.GetBootContentID();
+ }
+
+ return Common::StringFromFormat("%s%08x.app", content_path.c_str(), content_id);
+}
+
std::pair<boost::optional<u32>, ResultStatus> AppLoader_NCCH::LoadKernelSystemMode() {
if (!is_loaded) {
- ResultStatus res = LoadExeFS();
+ ResultStatus res = base_ncch.Load();
if (res != ResultStatus::Success) {
return std::make_pair(boost::none, res);
}
}
+
// Set the system mode as the one from the exheader.
- return std::make_pair(exheader_header.arm11_system_local_caps.system_mode.Value(),
+ return std::make_pair(overlay_ncch->exheader_header.arm11_system_local_caps.system_mode.Value(),
ResultStatus::Success);
}
-ResultStatus AppLoader_NCCH::LoadExec() {
- using Kernel::SharedPtr;
+ResultStatus AppLoader_NCCH::LoadExec(Kernel::SharedPtr<Kernel::Process>& process) {
using Kernel::CodeSet;
+ using Kernel::SharedPtr;
if (!is_loaded)
return ResultStatus::ErrorNotLoaded;
std::vector<u8> code;
- if (ResultStatus::Success == ReadCode(code)) {
+ u64_le program_id;
+ if (ResultStatus::Success == ReadCode(code) &&
+ ResultStatus::Success == ReadProgramId(program_id)) {
std::string process_name = Common::StringFromFixedZeroTerminatedBuffer(
- (const char*)exheader_header.codeset_info.name, 8);
+ (const char*)overlay_ncch->exheader_header.codeset_info.name, 8);
- SharedPtr<CodeSet> codeset = CodeSet::Create(process_name, ncch_header.program_id);
+ SharedPtr<CodeSet> codeset = CodeSet::Create(process_name, program_id);
codeset->code.offset = 0;
- codeset->code.addr = exheader_header.codeset_info.text.address;
- codeset->code.size = exheader_header.codeset_info.text.num_max_pages * Memory::PAGE_SIZE;
+ codeset->code.addr = overlay_ncch->exheader_header.codeset_info.text.address;
+ codeset->code.size =
+ overlay_ncch->exheader_header.codeset_info.text.num_max_pages * Memory::PAGE_SIZE;
codeset->rodata.offset = codeset->code.offset + codeset->code.size;
- codeset->rodata.addr = exheader_header.codeset_info.ro.address;
- codeset->rodata.size = exheader_header.codeset_info.ro.num_max_pages * Memory::PAGE_SIZE;
+ codeset->rodata.addr = overlay_ncch->exheader_header.codeset_info.ro.address;
+ codeset->rodata.size =
+ overlay_ncch->exheader_header.codeset_info.ro.num_max_pages * Memory::PAGE_SIZE;
// TODO(yuriks): Not sure if the bss size is added to the page-aligned .data size or just
// to the regular size. Playing it safe for now.
- u32 bss_page_size = (exheader_header.codeset_info.bss_size + 0xFFF) & ~0xFFF;
+ u32 bss_page_size = (overlay_ncch->exheader_header.codeset_info.bss_size + 0xFFF) & ~0xFFF;
code.resize(code.size() + bss_page_size, 0);
codeset->data.offset = codeset->rodata.offset + codeset->rodata.size;
- codeset->data.addr = exheader_header.codeset_info.data.address;
+ codeset->data.addr = overlay_ncch->exheader_header.codeset_info.data.address;
codeset->data.size =
- exheader_header.codeset_info.data.num_max_pages * Memory::PAGE_SIZE + bss_page_size;
+ overlay_ncch->exheader_header.codeset_info.data.num_max_pages * Memory::PAGE_SIZE +
+ bss_page_size;
codeset->entrypoint = codeset->code.addr;
codeset->memory = std::make_shared<std::vector<u8>>(std::move(code));
- Kernel::g_current_process = Kernel::Process::Create("main");
- Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint);
+ process = Kernel::Process::Create("main");
+ process->LoadModule(codeset, codeset->entrypoint);
// Attach a resource limit to the process based on the resource limit category
- Kernel::g_current_process->resource_limit =
+ process->resource_limit =
Kernel::ResourceLimit::GetForCategory(static_cast<Kernel::ResourceLimitCategory>(
- exheader_header.arm11_system_local_caps.resource_limit_category));
+ overlay_ncch->exheader_header.arm11_system_local_caps.resource_limit_category));
// Set the default CPU core for this process
- Kernel::g_current_process->ideal_processor =
- exheader_header.arm11_system_local_caps.ideal_processor;
+ process->ideal_processor =
+ overlay_ncch->exheader_header.arm11_system_local_caps.ideal_processor;
// Copy data while converting endianness
- std::array<u32, ARRAY_SIZE(exheader_header.arm11_kernel_caps.descriptors)> kernel_caps;
- std::copy_n(exheader_header.arm11_kernel_caps.descriptors, kernel_caps.size(),
+ std::array<u32, ARRAY_SIZE(overlay_ncch->exheader_header.arm11_kernel_caps.descriptors)>
+ kernel_caps;
+ std::copy_n(overlay_ncch->exheader_header.arm11_kernel_caps.descriptors, kernel_caps.size(),
begin(kernel_caps));
- Kernel::g_current_process->ParseKernelCaps(kernel_caps.data(), kernel_caps.size());
+ process->ParseKernelCaps(kernel_caps.data(), kernel_caps.size());
- s32 priority = exheader_header.arm11_system_local_caps.priority;
- u32 stack_size = exheader_header.codeset_info.stack_size;
- Kernel::g_current_process->Run(codeset->entrypoint, priority, stack_size);
+ s32 priority = overlay_ncch->exheader_header.arm11_system_local_caps.priority;
+ u32 stack_size = overlay_ncch->exheader_header.codeset_info.stack_size;
+ process->Run(codeset->entrypoint, priority, stack_size);
return ResultStatus::Success;
}
return ResultStatus::Error;
}
-ResultStatus AppLoader_NCCH::LoadSectionExeFS(const char* name, std::vector<u8>& buffer) {
- if (!file.IsOpen())
- return ResultStatus::Error;
-
- ResultStatus result = LoadExeFS();
- if (result != ResultStatus::Success)
- return result;
-
- LOG_DEBUG(Loader, "%d sections:", kMaxSections);
- // Iterate through the ExeFs archive until we find a section with the specified name...
- for (unsigned section_number = 0; section_number < kMaxSections; section_number++) {
- const auto& section = exefs_header.section[section_number];
-
- // Load the specified section...
- if (strcmp(section.name, name) == 0) {
- LOG_DEBUG(Loader, "%d - offset: 0x%08X, size: 0x%08X, name: %s", section_number,
- section.offset, section.size, section.name);
-
- s64 section_offset =
- (section.offset + exefs_offset + sizeof(ExeFs_Header) + ncch_offset);
- file.Seek(section_offset, SEEK_SET);
-
- if (strcmp(section.name, ".code") == 0 && is_compressed) {
- // Section is compressed, read compressed .code section...
- std::unique_ptr<u8[]> temp_buffer;
- try {
- temp_buffer.reset(new u8[section.size]);
- } catch (std::bad_alloc&) {
- return ResultStatus::ErrorMemoryAllocationFailed;
- }
-
- if (file.ReadBytes(&temp_buffer[0], section.size) != section.size)
- return ResultStatus::Error;
-
- // Decompress .code section...
- u32 decompressed_size = LZSS_GetDecompressedSize(&temp_buffer[0], section.size);
- buffer.resize(decompressed_size);
- if (!LZSS_Decompress(&temp_buffer[0], section.size, &buffer[0], decompressed_size))
- return ResultStatus::ErrorInvalidFormat;
- } else {
- // Section is uncompressed...
- buffer.resize(section.size);
- if (file.ReadBytes(&buffer[0], section.size) != section.size)
- return ResultStatus::Error;
- }
- return ResultStatus::Success;
- }
- }
- return ResultStatus::ErrorNotUsed;
-}
-
-ResultStatus AppLoader_NCCH::LoadExeFS() {
- if (is_exefs_loaded)
- return ResultStatus::Success;
-
- if (!file.IsOpen())
- return ResultStatus::Error;
-
- // Reset read pointer in case this file has been read before.
- file.Seek(0, SEEK_SET);
-
- if (file.ReadBytes(&ncch_header, sizeof(NCCH_Header)) != sizeof(NCCH_Header))
- return ResultStatus::Error;
-
- // Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)...
- if (MakeMagic('N', 'C', 'S', 'D') == ncch_header.magic) {
- LOG_DEBUG(Loader, "Only loading the first (bootable) NCCH within the NCSD file!");
- ncch_offset = 0x4000;
- file.Seek(ncch_offset, SEEK_SET);
- file.ReadBytes(&ncch_header, sizeof(NCCH_Header));
- }
-
- // Verify we are loading the correct file type...
- if (MakeMagic('N', 'C', 'C', 'H') != ncch_header.magic)
- return ResultStatus::ErrorInvalidFormat;
-
- // Read ExHeader...
-
- if (file.ReadBytes(&exheader_header, sizeof(ExHeader_Header)) != sizeof(ExHeader_Header))
- return ResultStatus::Error;
-
- is_compressed = (exheader_header.codeset_info.flags.flag & 1) == 1;
- entry_point = exheader_header.codeset_info.text.address;
- code_size = exheader_header.codeset_info.text.code_size;
- stack_size = exheader_header.codeset_info.stack_size;
- bss_size = exheader_header.codeset_info.bss_size;
- core_version = exheader_header.arm11_system_local_caps.core_version;
- priority = exheader_header.arm11_system_local_caps.priority;
- resource_limit_category = exheader_header.arm11_system_local_caps.resource_limit_category;
-
- LOG_DEBUG(Loader, "Name: %s", exheader_header.codeset_info.name);
- LOG_DEBUG(Loader, "Program ID: %016" PRIX64, ncch_header.program_id);
- LOG_DEBUG(Loader, "Code compressed: %s", is_compressed ? "yes" : "no");
- LOG_DEBUG(Loader, "Entry point: 0x%08X", entry_point);
- LOG_DEBUG(Loader, "Code size: 0x%08X", code_size);
- LOG_DEBUG(Loader, "Stack size: 0x%08X", stack_size);
- LOG_DEBUG(Loader, "Bss size: 0x%08X", bss_size);
- LOG_DEBUG(Loader, "Core version: %d", core_version);
- LOG_DEBUG(Loader, "Thread priority: 0x%X", priority);
- LOG_DEBUG(Loader, "Resource limit category: %d", resource_limit_category);
- LOG_DEBUG(Loader, "System Mode: %d",
- static_cast<int>(exheader_header.arm11_system_local_caps.system_mode));
-
- if (exheader_header.arm11_system_local_caps.program_id != ncch_header.program_id) {
- LOG_ERROR(Loader, "ExHeader Program ID mismatch: the ROM is probably encrypted.");
- return ResultStatus::ErrorEncrypted;
- }
-
- // Read ExeFS...
-
- exefs_offset = ncch_header.exefs_offset * kBlockSize;
- u32 exefs_size = ncch_header.exefs_size * kBlockSize;
-
- LOG_DEBUG(Loader, "ExeFS offset: 0x%08X", exefs_offset);
- LOG_DEBUG(Loader, "ExeFS size: 0x%08X", exefs_size);
-
- file.Seek(exefs_offset + ncch_offset, SEEK_SET);
- if (file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) != sizeof(ExeFs_Header))
- return ResultStatus::Error;
-
- is_exefs_loaded = true;
- return ResultStatus::Success;
-}
-
void AppLoader_NCCH::ParseRegionLockoutInfo() {
std::vector<u8> smdh_buffer;
if (ReadIcon(smdh_buffer) == ResultStatus::Success && smdh_buffer.size() >= sizeof(SMDH)) {
@@ -335,28 +162,43 @@ void AppLoader_NCCH::ParseRegionLockoutInfo() {
}
}
-ResultStatus AppLoader_NCCH::Load() {
+ResultStatus AppLoader_NCCH::Load(Kernel::SharedPtr<Kernel::Process>& process) {
+ u64_le ncch_program_id;
+
if (is_loaded)
return ResultStatus::ErrorAlreadyLoaded;
- ResultStatus result = LoadExeFS();
+ ResultStatus result = base_ncch.Load();
if (result != ResultStatus::Success)
return result;
- std::string program_id{Common::StringFromFormat("%016" PRIX64, ncch_header.program_id)};
+ ReadProgramId(ncch_program_id);
+ std::string program_id{Common::StringFromFormat("%016" PRIX64, ncch_program_id)};
LOG_INFO(Loader, "Program ID: %s", program_id.c_str());
+ update_ncch.OpenFile(GetUpdateNCCHPath(ncch_program_id));
+ result = update_ncch.Load();
+ if (result == ResultStatus::Success) {
+ overlay_ncch = &update_ncch;
+ }
+
Core::Telemetry().AddField(Telemetry::FieldType::Session, "ProgramId", program_id);
+ if (auto room_member = Network::GetRoomMember().lock()) {
+ Network::GameInfo game_info;
+ ReadTitle(game_info.name);
+ game_info.id = ncch_program_id;
+ room_member->SendGameInfo(game_info);
+ }
+
is_loaded = true; // Set state to loaded
- result = LoadExec(); // Load the executable into memory for booting
+ result = LoadExec(process); // Load the executable into memory for booting
if (ResultStatus::Success != result)
return result;
- Service::FS::RegisterArchiveType(std::make_unique<FileSys::ArchiveFactory_SelfNCCH>(*this),
- Service::FS::ArchiveIdCode::SelfNCCH);
+ Service::FS::RegisterSelfNCCH(*this);
ParseRegionLockoutInfo();
@@ -364,61 +206,58 @@ ResultStatus AppLoader_NCCH::Load() {
}
ResultStatus AppLoader_NCCH::ReadCode(std::vector<u8>& buffer) {
- return LoadSectionExeFS(".code", buffer);
+ return overlay_ncch->LoadSectionExeFS(".code", buffer);
}
ResultStatus AppLoader_NCCH::ReadIcon(std::vector<u8>& buffer) {
- return LoadSectionExeFS("icon", buffer);
+ return overlay_ncch->LoadSectionExeFS("icon", buffer);
}
ResultStatus AppLoader_NCCH::ReadBanner(std::vector<u8>& buffer) {
- return LoadSectionExeFS("banner", buffer);
+ return overlay_ncch->LoadSectionExeFS("banner", buffer);
}
ResultStatus AppLoader_NCCH::ReadLogo(std::vector<u8>& buffer) {
- return LoadSectionExeFS("logo", buffer);
+ return overlay_ncch->LoadSectionExeFS("logo", buffer);
}
ResultStatus AppLoader_NCCH::ReadProgramId(u64& out_program_id) {
- if (!file.IsOpen())
- return ResultStatus::Error;
-
- ResultStatus result = LoadExeFS();
+ ResultStatus result = base_ncch.ReadProgramId(out_program_id);
if (result != ResultStatus::Success)
return result;
- out_program_id = ncch_header.program_id;
return ResultStatus::Success;
}
ResultStatus AppLoader_NCCH::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
u64& size) {
- if (!file.IsOpen())
- return ResultStatus::Error;
+ return base_ncch.ReadRomFS(romfs_file, offset, size);
+}
- // Check if the NCCH has a RomFS...
- if (ncch_header.romfs_offset != 0 && ncch_header.romfs_size != 0) {
- u32 romfs_offset = ncch_offset + (ncch_header.romfs_offset * kBlockSize) + 0x1000;
- u32 romfs_size = (ncch_header.romfs_size * kBlockSize) - 0x1000;
+ResultStatus AppLoader_NCCH::ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
+ u64& offset, u64& size) {
+ ResultStatus result = update_ncch.ReadRomFS(romfs_file, offset, size);
- LOG_DEBUG(Loader, "RomFS offset: 0x%08X", romfs_offset);
- LOG_DEBUG(Loader, "RomFS size: 0x%08X", romfs_size);
+ if (result != ResultStatus::Success)
+ return base_ncch.ReadRomFS(romfs_file, offset, size);
+}
- if (file.GetSize() < romfs_offset + romfs_size)
- return ResultStatus::Error;
+ResultStatus AppLoader_NCCH::ReadTitle(std::string& title) {
+ std::vector<u8> data;
+ Loader::SMDH smdh;
+ ReadIcon(data);
- // We reopen the file, to allow its position to be independent from file's
- romfs_file = std::make_shared<FileUtil::IOFile>(filepath, "rb");
- if (!romfs_file->IsOpen())
- return ResultStatus::Error;
+ if (!Loader::IsValidSMDH(data)) {
+ return ResultStatus::ErrorInvalidFormat;
+ }
- offset = romfs_offset;
- size = romfs_size;
+ memcpy(&smdh, data.data(), sizeof(Loader::SMDH));
- return ResultStatus::Success;
- }
- LOG_DEBUG(Loader, "NCCH has no RomFS");
- return ResultStatus::ErrorNotUsed;
+ const auto& short_title = smdh.GetShortTitle(SMDH::TitleLanguage::English);
+ auto title_end = std::find(short_title.begin(), short_title.end(), u'\0');
+ title = Common::UTF16ToUTF8(std::u16string{short_title.begin(), title_end});
+
+ return ResultStatus::Success;
}
} // namespace Loader
diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h
index 0ebd47fd5..09230ae33 100644
--- a/src/core/loader/ncch.h
+++ b/src/core/loader/ncch.h
@@ -5,155 +5,12 @@
#pragma once
#include <memory>
-#include "common/bit_field.h"
#include "common/common_types.h"
#include "common/swap.h"
+#include "core/file_sys/ncch_container.h"
#include "core/loader/loader.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
-/// NCCH header (Note: "NCCH" appears to be a publicly unknown acronym)
-
-struct NCCH_Header {
- u8 signature[0x100];
- u32_le magic;
- u32_le content_size;
- u8 partition_id[8];
- u16_le maker_code;
- u16_le version;
- u8 reserved_0[4];
- u64_le program_id;
- u8 reserved_1[0x10];
- u8 logo_region_hash[0x20];
- u8 product_code[0x10];
- u8 extended_header_hash[0x20];
- u32_le extended_header_size;
- u8 reserved_2[4];
- u8 flags[8];
- u32_le plain_region_offset;
- u32_le plain_region_size;
- u32_le logo_region_offset;
- u32_le logo_region_size;
- u32_le exefs_offset;
- u32_le exefs_size;
- u32_le exefs_hash_region_size;
- u8 reserved_3[4];
- u32_le romfs_offset;
- u32_le romfs_size;
- u32_le romfs_hash_region_size;
- u8 reserved_4[4];
- u8 exefs_super_block_hash[0x20];
- u8 romfs_super_block_hash[0x20];
-};
-
-static_assert(sizeof(NCCH_Header) == 0x200, "NCCH header structure size is wrong");
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// ExeFS (executable file system) headers
-
-struct ExeFs_SectionHeader {
- char name[8];
- u32 offset;
- u32 size;
-};
-
-struct ExeFs_Header {
- ExeFs_SectionHeader section[8];
- u8 reserved[0x80];
- u8 hashes[8][0x20];
-};
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// ExHeader (executable file system header) headers
-
-struct ExHeader_SystemInfoFlags {
- u8 reserved[5];
- u8 flag;
- u8 remaster_version[2];
-};
-
-struct ExHeader_CodeSegmentInfo {
- u32 address;
- u32 num_max_pages;
- u32 code_size;
-};
-
-struct ExHeader_CodeSetInfo {
- u8 name[8];
- ExHeader_SystemInfoFlags flags;
- ExHeader_CodeSegmentInfo text;
- u32 stack_size;
- ExHeader_CodeSegmentInfo ro;
- u8 reserved[4];
- ExHeader_CodeSegmentInfo data;
- u32 bss_size;
-};
-
-struct ExHeader_DependencyList {
- u8 program_id[0x30][8];
-};
-
-struct ExHeader_SystemInfo {
- u64 save_data_size;
- u8 jump_id[8];
- u8 reserved_2[0x30];
-};
-
-struct ExHeader_StorageInfo {
- u8 ext_save_data_id[8];
- u8 system_save_data_id[8];
- u8 reserved[8];
- u8 access_info[7];
- u8 other_attributes;
-};
-
-struct ExHeader_ARM11_SystemLocalCaps {
- u64_le program_id;
- u32_le core_version;
- u8 reserved_flags[2];
- union {
- u8 flags0;
- BitField<0, 2, u8> ideal_processor;
- BitField<2, 2, u8> affinity_mask;
- BitField<4, 4, u8> system_mode;
- };
- u8 priority;
- u8 resource_limit_descriptor[0x10][2];
- ExHeader_StorageInfo storage_info;
- u8 service_access_control[0x20][8];
- u8 ex_service_access_control[0x2][8];
- u8 reserved[0xf];
- u8 resource_limit_category;
-};
-
-struct ExHeader_ARM11_KernelCaps {
- u32_le descriptors[28];
- u8 reserved[0x10];
-};
-
-struct ExHeader_ARM9_AccessControl {
- u8 descriptors[15];
- u8 descversion;
-};
-
-struct ExHeader_Header {
- ExHeader_CodeSetInfo codeset_info;
- ExHeader_DependencyList dependency_list;
- ExHeader_SystemInfo system_info;
- ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
- ExHeader_ARM11_KernelCaps arm11_kernel_caps;
- ExHeader_ARM9_AccessControl arm9_access_control;
- struct {
- u8 signature[0x100];
- u8 ncch_public_key_modulus[0x100];
- ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
- ExHeader_ARM11_KernelCaps arm11_kernel_caps;
- ExHeader_ARM9_AccessControl arm9_access_control;
- } access_desc;
-};
-
-static_assert(sizeof(ExHeader_Header) == 0x800, "ExHeader structure size is wrong");
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
// Loader namespace
namespace Loader {
@@ -162,7 +19,8 @@ namespace Loader {
class AppLoader_NCCH final : public AppLoader {
public:
AppLoader_NCCH(FileUtil::IOFile&& file, const std::string& filepath)
- : AppLoader(std::move(file)), filepath(filepath) {}
+ : AppLoader(std::move(file)), filepath(filepath), base_ncch(filepath),
+ overlay_ncch(&base_ncch) {}
/**
* Returns the type of the file
@@ -175,7 +33,7 @@ public:
return IdentifyType(file);
}
- ResultStatus Load() override;
+ ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
/**
* Loads the Exheader and returns the system mode for this application.
@@ -191,63 +49,30 @@ public:
ResultStatus ReadLogo(std::vector<u8>& buffer) override;
- /**
- * Get the program id of the application
- * @param out_program_id Reference to store program id into
- * @return ResultStatus result of function
- */
ResultStatus ReadProgramId(u64& out_program_id) override;
- /**
- * Get the RomFS of the application
- * @param romfs_file Reference to buffer to store data
- * @param offset Offset in the file to the RomFS
- * @param size Size of the RomFS in bytes
- * @return ResultStatus result of function
- */
ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
u64& size) override;
-private:
- /**
- * Reads an application ExeFS section of an NCCH file into AppLoader (e.g. .code, .logo, etc.)
- * @param name Name of section to read out of NCCH file
- * @param buffer Vector to read data into
- * @return ResultStatus result of function
- */
- ResultStatus LoadSectionExeFS(const char* name, std::vector<u8>& buffer);
+ ResultStatus ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
+ u64& size) override;
- /**
- * Loads .code section into memory for booting
- * @return ResultStatus result of function
- */
- ResultStatus LoadExec();
+ ResultStatus ReadTitle(std::string& title) override;
+private:
/**
- * Ensure ExeFS is loaded and ready for reading sections
+ * Loads .code section into memory for booting
+ * @param process The newly created process
* @return ResultStatus result of function
*/
- ResultStatus LoadExeFS();
+ ResultStatus LoadExec(Kernel::SharedPtr<Kernel::Process>& process);
/// Reads the region lockout info in the SMDH and send it to CFG service
void ParseRegionLockoutInfo();
- bool is_exefs_loaded = false;
- bool is_compressed = false;
-
- u32 entry_point = 0;
- u32 code_size = 0;
- u32 stack_size = 0;
- u32 bss_size = 0;
- u32 core_version = 0;
- u8 priority = 0;
- u8 resource_limit_category = 0;
- u32 ncch_offset = 0; // Offset to NCCH header, can be 0 or after NCSD header
- u32 exefs_offset = 0;
-
- NCCH_Header ncch_header;
- ExeFs_Header exefs_header;
- ExHeader_Header exheader_header;
+ FileSys::NCCHContainer base_ncch;
+ FileSys::NCCHContainer update_ncch;
+ FileSys::NCCHContainer* overlay_ncch;
std::string filepath;
};
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index 753e7e08b..24c2c55a9 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -132,7 +132,7 @@ bool AppLoader_NRO::LoadNro(const std::string& path, VAddr load_base) {
return true;
}
-ResultStatus AppLoader_NRO::Load() {
+ResultStatus AppLoader_NRO::Load(Kernel::SharedPtr<Kernel::Process>& process) {
if (is_loaded) {
return ResultStatus::ErrorAlreadyLoaded;
}
@@ -142,16 +142,16 @@ ResultStatus AppLoader_NRO::Load() {
// Load and relocate "main" and "sdk" NSO
static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR};
- Kernel::g_current_process = Kernel::Process::Create("main");
+ process = Kernel::Process::Create("main");
if (!LoadNro(filepath, base_addr)) {
return ResultStatus::ErrorInvalidFormat;
}
- Kernel::g_current_process->svc_access_mask.set();
- Kernel::g_current_process->address_mappings = default_address_mappings;
- Kernel::g_current_process->resource_limit =
+ process->svc_access_mask.set();
+ process->address_mappings = default_address_mappings;
+ process->resource_limit =
Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
- Kernel::g_current_process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE);
+ process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE);
ResolveImports();
diff --git a/src/core/loader/nro.h b/src/core/loader/nro.h
index c3c7622fd..c85768c5b 100644
--- a/src/core/loader/nro.h
+++ b/src/core/loader/nro.h
@@ -31,7 +31,7 @@ public:
return IdentifyType(file);
}
- ResultStatus Load() override;
+ ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
private:
bool LoadNro(const std::string& path, VAddr load_base);
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index ac8d12ecc..b1b57d0c0 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -144,7 +144,7 @@ VAddr AppLoader_NSO::LoadNso(const std::string& path, VAddr load_base, bool relo
return load_base + image_size;
}
-ResultStatus AppLoader_NSO::Load() {
+ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) {
if (is_loaded) {
return ResultStatus::ErrorAlreadyLoaded;
}
@@ -154,7 +154,7 @@ ResultStatus AppLoader_NSO::Load() {
// Load and relocate "rtld" NSO
static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR};
- Kernel::g_current_process = Kernel::Process::Create("main");
+ process = Kernel::Process::Create("main");
VAddr next_base_addr{LoadNso(filepath, base_addr)};
if (!next_base_addr) {
return ResultStatus::ErrorInvalidFormat;
@@ -170,11 +170,11 @@ ResultStatus AppLoader_NSO::Load() {
}
}
- Kernel::g_current_process->svc_access_mask.set();
- Kernel::g_current_process->address_mappings = default_address_mappings;
- Kernel::g_current_process->resource_limit =
+ process->svc_access_mask.set();
+ process->address_mappings = default_address_mappings;
+ process->resource_limit =
Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
- Kernel::g_current_process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE);
+ process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE);
ResolveImports();
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h
index c29803d81..b6b86c209 100644
--- a/src/core/loader/nso.h
+++ b/src/core/loader/nso.h
@@ -32,7 +32,7 @@ public:
return IdentifyType(file);
}
- ResultStatus Load() override;
+ ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
private:
VAddr LoadNso(const std::string& path, VAddr load_base, bool relocate = false);
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index ebe16b030..462d68386 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -4,95 +4,53 @@
#include <array>
#include <cstring>
+#include "audio_core/audio_core.h"
#include "common/assert.h"
#include "common/common_types.h"
#include "common/logging/log.h"
#include "common/swap.h"
+#include "core/arm/arm_interface.h"
+#include "core/core.h"
+#include "core/hle/kernel/memory.h"
#include "core/hle/kernel/process.h"
+#include "core/hle/lock.h"
#include "core/memory.h"
#include "core/memory_setup.h"
-#include "core/mmio.h"
#include "video_core/renderer_base.h"
#include "video_core/video_core.h"
namespace Memory {
-enum class PageType {
- /// Page is unmapped and should cause an access error.
- Unmapped,
- /// Page is mapped to regular memory. This is the only type you can get pointers to.
- Memory,
- /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and
- /// invalidation
- RasterizerCachedMemory,
- /// Page is mapped to a I/O region. Writing and reading to this page is handled by functions.
- Special,
- /// Page is mapped to a I/O region, but also needs to check for rasterizer cache flushing and
- /// invalidation
- RasterizerCachedSpecial,
-};
-
-struct SpecialRegion {
- VAddr base;
- u64 size;
- MMIORegionPointer handler;
-};
+static std::array<u8, Memory::VRAM_SIZE> vram;
+static std::array<u8, Memory::N3DS_EXTRA_RAM_SIZE> n3ds_extra_ram;
-/**
- * A (reasonably) fast way of allowing switchable and remappable process address spaces. It loosely
- * mimics the way a real CPU page table works, but instead is optimized for minimal decoding and
- * fetching requirements when accessing. In the usual case of an access to regular memory, it only
- * requires an indexed fetch and a check for NULL.
- */
-struct PageTable {
- /**
- * Array of memory pointers backing each page. An entry can only be non-null if the
- * corresponding entry in the `attributes` array is of type `Memory`.
- */
- std::map<u64, u8*> pointers;
-
- /**
- * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of
- * type `Special`.
- */
- std::vector<SpecialRegion> special_regions;
-
- /**
- * Array of fine grained page attributes. If it is set to any value other than `Memory`, then
- * the corresponding entry in `pointers` MUST be set to null.
- */
- std::map<u64, PageType> attributes;
-
- /**
- * Indicates the number of externally cached resources touching a page that should be
- * flushed before the memory is accessed
- */
- std::map<u64, u8> cached_res_count;
-};
-
-/// Singular page table used for the singleton process
-static PageTable main_page_table;
-/// Currently active page table
-static PageTable* current_page_table = &main_page_table;
-
-//std::array<u8*, PAGE_TABLE_NUM_ENTRIES>* GetCurrentPageTablePointers() {
-// return &current_page_table->pointers;
-//}
-
-static void MapPages(u64 base, u64 size, u8* memory, PageType type) {
+static PageTable* current_page_table = nullptr;
+
+void SetCurrentPageTable(PageTable* page_table) {
+ current_page_table = page_table;
+ if (Core::System::GetInstance().IsPoweredOn()) {
+ Core::CPU().PageTableChanged();
+ }
+}
+
+PageTable* GetCurrentPageTable() {
+ return current_page_table;
+}
+
+static void MapPages(PageTable& page_table, VAddr base, u32 size, u8* memory, PageType type) {
LOG_DEBUG(HW_Memory, "Mapping %p onto %08X-%08X", memory, base * PAGE_SIZE,
(base + size) * PAGE_SIZE);
RasterizerFlushVirtualRegion(base << PAGE_BITS, size * PAGE_SIZE,
FlushMode::FlushAndInvalidate);
- u64 end = base + size;
+ VAddr end = base + size;
while (base != end) {
ASSERT_MSG(base < PAGE_TABLE_NUM_ENTRIES, "out of range mapping at %08X", base);
- current_page_table->attributes[base] = type;
- current_page_table->pointers[base] = memory;
- current_page_table->cached_res_count[base] = 0;
+ page_table.attributes[base] = type;
+ page_table.pointers[base] = memory;
+ page_table.cached_res_count[base] = 0;
base += 1;
if (memory != nullptr)
@@ -100,40 +58,34 @@ static void MapPages(u64 base, u64 size, u8* memory, PageType type) {
}
}
-void InitMemoryMap() {
- //main_page_table.pointers.fill(nullptr);
- //main_page_table.attributes.fill(PageType::Unmapped);
- //main_page_table.cached_res_count.fill(0);
-}
-
-void MapMemoryRegion(VAddr base, u64 size, u8* target) {
+void MapMemoryRegion(PageTable& page_table, VAddr base, u32 size, u8* target) {
ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size);
ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base);
- MapPages(base / PAGE_SIZE, size / PAGE_SIZE, target, PageType::Memory);
+ MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, target, PageType::Memory);
}
-void MapIoRegion(VAddr base, u64 size, MMIORegionPointer mmio_handler) {
+void MapIoRegion(PageTable& page_table, VAddr base, u32 size, MMIORegionPointer mmio_handler) {
ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size);
ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base);
- MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Special);
+ MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Special);
- current_page_table->special_regions.emplace_back(SpecialRegion{base, size, mmio_handler});
+ page_table.special_regions.emplace_back(SpecialRegion{base, size, mmio_handler});
}
-void UnmapRegion(VAddr base, u64 size) {
+void UnmapRegion(PageTable& page_table, VAddr base, u32 size) {
ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size);
ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base);
- MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Unmapped);
+ MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Unmapped);
}
/**
* Gets a pointer to the exact memory at the virtual address (i.e. not page aligned)
* using a VMA from the current process
*/
-static u8* GetPointerFromVMA(VAddr vaddr) {
+static u8* GetPointerFromVMA(const Kernel::Process& process, VAddr vaddr) {
u8* direct_pointer = nullptr;
- auto& vm_manager = Kernel::g_current_process->vm_manager;
+ auto& vm_manager = process.vm_manager;
auto it = vm_manager.FindVMA(vaddr);
ASSERT(it != vm_manager.vma_map.end());
@@ -156,10 +108,18 @@ static u8* GetPointerFromVMA(VAddr vaddr) {
}
/**
+ * Gets a pointer to the exact memory at the virtual address (i.e. not page aligned)
+ * using a VMA from the current process.
+ */
+static u8* GetPointerFromVMA(VAddr vaddr) {
+ return GetPointerFromVMA(*Kernel::g_current_process, vaddr);
+}
+
+/**
* This function should only be called for virtual addreses with attribute `PageType::Special`.
*/
-static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
- for (const auto& region : current_page_table->special_regions) {
+static MMIORegionPointer GetMMIOHandler(const PageTable& page_table, VAddr vaddr) {
+ for (const auto& region : page_table.special_regions) {
if (vaddr >= region.base && vaddr < (region.base + region.size)) {
return region.handler;
}
@@ -168,6 +128,11 @@ static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
return nullptr; // Should never happen
}
+static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
+ const PageTable& page_table = Kernel::g_current_process->vm_manager.page_table;
+ return GetMMIOHandler(page_table, vaddr);
+}
+
template <typename T>
T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr);
@@ -181,10 +146,13 @@ T Read(const VAddr vaddr) {
return value;
}
+ // The memory access might do an MMIO or cached access, so we have to lock the HLE kernel state
+ std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+
PageType type = current_page_table->attributes[vaddr >> PAGE_BITS];
switch (type) {
case PageType::Unmapped:
- LOG_ERROR(HW_Memory, "unmapped Read%lu @ 0x%llx", sizeof(T) * 8, vaddr);
+ LOG_ERROR(HW_Memory, "unmapped Read%lu @ 0x%08X", sizeof(T) * 8, vaddr);
return 0;
case PageType::Memory:
ASSERT_MSG(false, "Mapped memory page without a pointer @ %08X", vaddr);
@@ -219,10 +187,13 @@ void Write(const VAddr vaddr, const T data) {
return;
}
+ // The memory access might do an MMIO or cached access, so we have to lock the HLE kernel state
+ std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+
PageType type = current_page_table->attributes[vaddr >> PAGE_BITS];
switch (type) {
case PageType::Unmapped:
- LOG_ERROR(HW_Memory, "unmapped Write%lu 0x%llx @ 0x%llx", sizeof(data) * 8, (u64)data,
+ LOG_ERROR(HW_Memory, "unmapped Write%lu 0x%08X @ 0x%08X", sizeof(data) * 8, (u32)data,
vaddr);
return;
case PageType::Memory:
@@ -246,18 +217,20 @@ void Write(const VAddr vaddr, const T data) {
}
}
-bool IsValidVirtualAddress(const VAddr vaddr) {
- const u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS];
+bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr) {
+ auto& page_table = process.vm_manager.page_table;
+
+ const u8* page_pointer = page_table.pointers[vaddr >> PAGE_BITS];
if (page_pointer)
return true;
- if (current_page_table->attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory)
+ if (page_table.attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory)
return true;
- if (current_page_table->attributes[vaddr >> PAGE_BITS] != PageType::Special)
+ if (page_table.attributes[vaddr >> PAGE_BITS] != PageType::Special)
return false;
- MMIORegionPointer mmio_region = GetMMIOHandler(vaddr);
+ MMIORegionPointer mmio_region = GetMMIOHandler(page_table, vaddr);
if (mmio_region) {
return mmio_region->IsValidAddress(vaddr);
}
@@ -265,9 +238,12 @@ bool IsValidVirtualAddress(const VAddr vaddr) {
return false;
}
+bool IsValidVirtualAddress(const VAddr vaddr) {
+ return IsValidVirtualAddress(*Kernel::g_current_process, vaddr);
+}
+
bool IsValidPhysicalAddress(const PAddr paddr) {
- boost::optional<VAddr> vaddr = PhysicalToVirtualAddress(paddr);
- return vaddr && IsValidVirtualAddress(*vaddr);
+ return GetPhysicalPointer(paddr) != nullptr;
}
u8* GetPointer(const VAddr vaddr) {
@@ -280,7 +256,7 @@ u8* GetPointer(const VAddr vaddr) {
return GetPointerFromVMA(vaddr);
}
- LOG_ERROR(HW_Memory, "unknown GetPointer @ 0x%llx", vaddr);
+ LOG_ERROR(HW_Memory, "unknown GetPointer @ 0x%08x", vaddr);
return nullptr;
}
@@ -299,12 +275,66 @@ std::string ReadCString(VAddr vaddr, std::size_t max_length) {
}
u8* GetPhysicalPointer(PAddr address) {
- // TODO(Subv): This call should not go through the application's memory mapping.
- boost::optional<VAddr> vaddr = PhysicalToVirtualAddress(address);
- return vaddr ? GetPointer(*vaddr) : nullptr;
+ struct MemoryArea {
+ PAddr paddr_base;
+ u32 size;
+ };
+
+ static constexpr MemoryArea memory_areas[] = {
+ {VRAM_PADDR, VRAM_SIZE},
+ {IO_AREA_PADDR, IO_AREA_SIZE},
+ {DSP_RAM_PADDR, DSP_RAM_SIZE},
+ {FCRAM_PADDR, FCRAM_N3DS_SIZE},
+ {N3DS_EXTRA_RAM_PADDR, N3DS_EXTRA_RAM_SIZE},
+ };
+
+ const auto area =
+ std::find_if(std::begin(memory_areas), std::end(memory_areas), [&](const auto& area) {
+ return address >= area.paddr_base && address < area.paddr_base + area.size;
+ });
+
+ if (area == std::end(memory_areas)) {
+ LOG_ERROR(HW_Memory, "unknown GetPhysicalPointer @ 0x%08X", address);
+ return nullptr;
+ }
+
+ if (area->paddr_base == IO_AREA_PADDR) {
+ LOG_ERROR(HW_Memory, "MMIO mappings are not supported yet. phys_addr=0x%08X", address);
+ return nullptr;
+ }
+
+ u64 offset_into_region = address - area->paddr_base;
+
+ u8* target_pointer = nullptr;
+ switch (area->paddr_base) {
+ case VRAM_PADDR:
+ target_pointer = vram.data() + offset_into_region;
+ break;
+ case DSP_RAM_PADDR:
+ target_pointer = AudioCore::GetDspMemory().data() + offset_into_region;
+ break;
+ case FCRAM_PADDR:
+ for (const auto& region : Kernel::memory_regions) {
+ if (offset_into_region >= region.base &&
+ offset_into_region < region.base + region.size) {
+ target_pointer =
+ region.linear_heap_memory->data() + offset_into_region - region.base;
+ break;
+ }
+ }
+ ASSERT_MSG(target_pointer != nullptr, "Invalid FCRAM address");
+ break;
+ case N3DS_EXTRA_RAM_PADDR:
+ target_pointer = n3ds_extra_ram.data() + offset_into_region;
+ break;
+ default:
+ UNREACHABLE();
+ }
+
+ return target_pointer;
}
-void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
+void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta) {
if (start == 0) {
return;
}
@@ -314,8 +344,15 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
for (unsigned i = 0; i < num_pages; ++i, paddr += PAGE_SIZE) {
boost::optional<VAddr> maybe_vaddr = PhysicalToVirtualAddress(paddr);
- if (!maybe_vaddr)
+ // While the physical <-> virtual mapping is 1:1 for the regions supported by the cache,
+ // some games (like Pokemon Super Mystery Dungeon) will try to use textures that go beyond
+ // the end address of VRAM, causing the Virtual->Physical translation to fail when flushing
+ // parts of the texture.
+ if (!maybe_vaddr) {
+ LOG_ERROR(HW_Memory,
+ "Trying to flush a cached region to an invalid physical address %08X", paddr);
continue;
+ }
VAddr vaddr = *maybe_vaddr;
u8& res_count = current_page_table->cached_res_count[vaddr >> PAGE_BITS];
@@ -327,6 +364,10 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
if (res_count == 0) {
PageType& page_type = current_page_table->attributes[vaddr >> PAGE_BITS];
switch (page_type) {
+ case PageType::Unmapped:
+ // It is not necessary for a process to have this region mapped into its address
+ // space, for example, a system module need not have a VRAM mapping.
+ break;
case PageType::Memory:
page_type = PageType::RasterizerCachedMemory;
current_page_table->pointers[vaddr >> PAGE_BITS] = nullptr;
@@ -345,6 +386,10 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
if (res_count == 0) {
PageType& page_type = current_page_table->attributes[vaddr >> PAGE_BITS];
switch (page_type) {
+ case PageType::Unmapped:
+ // It is not necessary for a process to have this region mapped into its address
+ // space, for example, a system module need not have a VRAM mapping.
+ break;
case PageType::RasterizerCachedMemory: {
u8* pointer = GetPointerFromVMA(vaddr & ~PAGE_MASK);
if (pointer == nullptr) {
@@ -368,13 +413,13 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
}
}
-void RasterizerFlushRegion(PAddr start, u64 size) {
+void RasterizerFlushRegion(PAddr start, u32 size) {
if (VideoCore::g_renderer != nullptr) {
VideoCore::g_renderer->Rasterizer()->FlushRegion(start, size);
}
}
-void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size) {
+void RasterizerFlushAndInvalidateRegion(PAddr start, u32 size) {
// Since pages are unmapped on shutdown after video core is shutdown, the renderer may be
// null here
if (VideoCore::g_renderer != nullptr) {
@@ -382,7 +427,7 @@ void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size) {
}
}
-void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) {
+void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode) {
// Since pages are unmapped on shutdown after video core is shutdown, the renderer may be
// null here
if (VideoCore::g_renderer != nullptr) {
@@ -398,7 +443,7 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) {
VAddr overlap_end = std::min(end, region_end);
PAddr physical_start = TryVirtualToPhysicalAddress(overlap_start).value();
- u64 overlap_size = overlap_end - overlap_start;
+ u32 overlap_size = static_cast<u32>(overlap_end - overlap_start);
auto* rasterizer = VideoCore::g_renderer->Rasterizer();
switch (mode) {
@@ -433,44 +478,50 @@ u64 Read64(const VAddr addr) {
return Read<u64_le>(addr);
}
-void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
+void ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer,
+ const size_t size) {
+ auto& page_table = process.vm_manager.page_table;
+
size_t remaining_size = size;
size_t page_index = src_addr >> PAGE_BITS;
size_t page_offset = src_addr & PAGE_MASK;
while (remaining_size > 0) {
const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
- const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset;
+ const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
- switch (current_page_table->attributes[page_index]) {
+ switch (page_table.attributes[page_index]) {
case PageType::Unmapped: {
- LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%llx (start address = 0x%llx, size = %zu)",
+ LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
current_vaddr, src_addr, size);
std::memset(dest_buffer, 0, copy_amount);
break;
}
case PageType::Memory: {
- DEBUG_ASSERT(current_page_table->pointers[page_index]);
+ DEBUG_ASSERT(page_table.pointers[page_index]);
- const u8* src_ptr = current_page_table->pointers[page_index] + page_offset;
+ const u8* src_ptr = page_table.pointers[page_index] + page_offset;
std::memcpy(dest_buffer, src_ptr, copy_amount);
break;
}
case PageType::Special: {
- DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
-
- GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount);
+ MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
+ DEBUG_ASSERT(handler);
+ handler->ReadBlock(current_vaddr, dest_buffer, copy_amount);
break;
}
case PageType::RasterizerCachedMemory: {
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush);
- std::memcpy(dest_buffer, GetPointerFromVMA(current_vaddr), copy_amount);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::Flush);
+ std::memcpy(dest_buffer, GetPointerFromVMA(process, current_vaddr), copy_amount);
break;
}
case PageType::RasterizerCachedSpecial: {
- DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush);
- GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount);
+ MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
+ DEBUG_ASSERT(handler);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::Flush);
+ handler->ReadBlock(current_vaddr, dest_buffer, copy_amount);
break;
}
default:
@@ -484,6 +535,10 @@ void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
}
}
+void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
+ ReadBlock(*Kernel::g_current_process, src_addr, dest_buffer, size);
+}
+
void Write8(const VAddr addr, const u8 data) {
Write<u8>(addr, data);
}
@@ -500,44 +555,49 @@ void Write64(const VAddr addr, const u64 data) {
Write<u64_le>(addr, data);
}
-void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size) {
+void WriteBlock(const Kernel::Process& process, const VAddr dest_addr, const void* src_buffer,
+ const size_t size) {
+ auto& page_table = process.vm_manager.page_table;
size_t remaining_size = size;
size_t page_index = dest_addr >> PAGE_BITS;
size_t page_offset = dest_addr & PAGE_MASK;
while (remaining_size > 0) {
const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
- const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset;
+ const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
- switch (current_page_table->attributes[page_index]) {
+ switch (page_table.attributes[page_index]) {
case PageType::Unmapped: {
LOG_ERROR(HW_Memory,
- "unmapped WriteBlock @ 0x%llx (start address = 0x%llx, size = %zu)",
+ "unmapped WriteBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
current_vaddr, dest_addr, size);
break;
}
case PageType::Memory: {
- DEBUG_ASSERT(current_page_table->pointers[page_index]);
+ DEBUG_ASSERT(page_table.pointers[page_index]);
- u8* dest_ptr = current_page_table->pointers[page_index] + page_offset;
+ u8* dest_ptr = page_table.pointers[page_index] + page_offset;
std::memcpy(dest_ptr, src_buffer, copy_amount);
break;
}
case PageType::Special: {
- DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
-
- GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount);
+ MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
+ DEBUG_ASSERT(handler);
+ handler->WriteBlock(current_vaddr, src_buffer, copy_amount);
break;
}
case PageType::RasterizerCachedMemory: {
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate);
- std::memcpy(GetPointerFromVMA(current_vaddr), src_buffer, copy_amount);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::FlushAndInvalidate);
+ std::memcpy(GetPointerFromVMA(process, current_vaddr), src_buffer, copy_amount);
break;
}
case PageType::RasterizerCachedSpecial: {
- DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate);
- GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount);
+ MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
+ DEBUG_ASSERT(handler);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::FlushAndInvalidate);
+ handler->WriteBlock(current_vaddr, src_buffer, copy_amount);
break;
}
default:
@@ -551,6 +611,10 @@ void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size
}
}
+void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size) {
+ WriteBlock(*Kernel::g_current_process, dest_addr, src_buffer, size);
+}
+
void ZeroBlock(const VAddr dest_addr, const size_t size) {
size_t remaining_size = size;
size_t page_index = dest_addr >> PAGE_BITS;
@@ -560,11 +624,11 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
while (remaining_size > 0) {
const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
- const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset;
+ const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
switch (current_page_table->attributes[page_index]) {
case PageType::Unmapped: {
- LOG_ERROR(HW_Memory, "unmapped ZeroBlock @ 0x%llx (start address = 0x%llx, size = %zu)",
+ LOG_ERROR(HW_Memory, "unmapped ZeroBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
current_vaddr, dest_addr, size);
break;
}
@@ -582,13 +646,15 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
break;
}
case PageType::RasterizerCachedMemory: {
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::FlushAndInvalidate);
std::memset(GetPointerFromVMA(current_vaddr), 0, copy_amount);
break;
}
case PageType::RasterizerCachedSpecial: {
DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::FlushAndInvalidate);
GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, zeros.data(), copy_amount);
break;
}
@@ -609,11 +675,11 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
while (remaining_size > 0) {
const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
- const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset;
+ const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
switch (current_page_table->attributes[page_index]) {
case PageType::Unmapped: {
- LOG_ERROR(HW_Memory, "unmapped CopyBlock @ 0x%llx (start address = 0x%llx, size = %zu)",
+ LOG_ERROR(HW_Memory, "unmapped CopyBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
current_vaddr, src_addr, size);
ZeroBlock(dest_addr, copy_amount);
break;
@@ -633,13 +699,15 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
break;
}
case PageType::RasterizerCachedMemory: {
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::Flush);
WriteBlock(dest_addr, GetPointerFromVMA(current_vaddr), copy_amount);
break;
}
case PageType::RasterizerCachedSpecial: {
DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::Flush);
std::vector<u8> buffer(copy_amount);
GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, buffer.data(), buffer.size());
@@ -652,8 +720,8 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
page_index++;
page_offset = 0;
- dest_addr += copy_amount;
- src_addr += copy_amount;
+ dest_addr += static_cast<VAddr>(copy_amount);
+ src_addr += static_cast<VAddr>(copy_amount);
remaining_size -= copy_amount;
}
}
@@ -721,7 +789,7 @@ boost::optional<PAddr> TryVirtualToPhysicalAddress(const VAddr addr) {
PAddr VirtualToPhysicalAddress(const VAddr addr) {
auto paddr = TryVirtualToPhysicalAddress(addr);
if (!paddr) {
- LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%llx", addr);
+ LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08X", addr);
// To help with debugging, set bit on address so that it's obviously invalid.
return addr | 0x80000000;
}
@@ -746,4 +814,4 @@ boost::optional<VAddr> PhysicalToVirtualAddress(const PAddr addr) {
return boost::none;
}
-} // namespace
+} // namespace Memory
diff --git a/src/core/memory.h b/src/core/memory.h
index e14d68654..9a04b9a16 100644
--- a/src/core/memory.h
+++ b/src/core/memory.h
@@ -6,9 +6,16 @@
#include <array>
#include <cstddef>
+#include <map>
#include <string>
+#include <vector>
#include <boost/optional.hpp>
#include "common/common_types.h"
+#include "core/mmio.h"
+
+namespace Kernel {
+class Process;
+}
namespace Memory {
@@ -19,7 +26,60 @@ namespace Memory {
const int PAGE_BITS = 12;
const u64 PAGE_SIZE = 1 << PAGE_BITS;
const u64 PAGE_MASK = PAGE_SIZE - 1;
-const size_t PAGE_TABLE_NUM_ENTRIES = 1ULL << (64 - PAGE_BITS);
+const size_t PAGE_TABLE_NUM_ENTRIES = 1ULL << (32 - PAGE_BITS);
+
+enum class PageType {
+ /// Page is unmapped and should cause an access error.
+ Unmapped,
+ /// Page is mapped to regular memory. This is the only type you can get pointers to.
+ Memory,
+ /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and
+ /// invalidation
+ RasterizerCachedMemory,
+ /// Page is mapped to a I/O region. Writing and reading to this page is handled by functions.
+ Special,
+ /// Page is mapped to a I/O region, but also needs to check for rasterizer cache flushing and
+ /// invalidation
+ RasterizerCachedSpecial,
+};
+
+struct SpecialRegion {
+ VAddr base;
+ u32 size;
+ MMIORegionPointer handler;
+};
+
+/**
+ * A (reasonably) fast way of allowing switchable and remappable process address spaces. It loosely
+ * mimics the way a real CPU page table works, but instead is optimized for minimal decoding and
+ * fetching requirements when accessing. In the usual case of an access to regular memory, it only
+ * requires an indexed fetch and a check for NULL.
+ */
+struct PageTable {
+ /**
+ * Array of memory pointers backing each page. An entry can only be non-null if the
+ * corresponding entry in the `attributes` array is of type `Memory`.
+ */
+ std::array<u8*, PAGE_TABLE_NUM_ENTRIES> pointers;
+
+ /**
+ * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of
+ * type `Special`.
+ */
+ std::vector<SpecialRegion> special_regions;
+
+ /**
+ * Array of fine grained page attributes. If it is set to any value other than `Memory`, then
+ * the corresponding entry in `pointers` MUST be set to null.
+ */
+ std::array<PageType, PAGE_TABLE_NUM_ENTRIES> attributes;
+
+ /**
+ * Indicates the number of externally cached resources touching a page that should be
+ * flushed before the memory is accessed
+ */
+ std::array<u8, PAGE_TABLE_NUM_ENTRIES> cached_res_count;
+};
/// Physical memory regions as seen from the ARM11
enum : PAddr {
@@ -126,7 +186,14 @@ enum : VAddr {
NEW_LINEAR_HEAP_VADDR_END = NEW_LINEAR_HEAP_VADDR + NEW_LINEAR_HEAP_SIZE,
};
+/// Currently active page table
+void SetCurrentPageTable(PageTable* page_table);
+PageTable* GetCurrentPageTable();
+
+/// Determines if the given VAddr is valid for the specified process.
+bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr);
bool IsValidVirtualAddress(const VAddr addr);
+
bool IsValidPhysicalAddress(const PAddr addr);
u8 Read8(VAddr addr);
@@ -139,7 +206,11 @@ void Write16(VAddr addr, u16 data);
void Write32(VAddr addr, u32 data);
void Write64(VAddr addr, u64 data);
+void ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer,
+ size_t size);
void ReadBlock(const VAddr src_addr, void* dest_buffer, size_t size);
+void WriteBlock(const Kernel::Process& process, const VAddr dest_addr, const void* src_buffer,
+ size_t size);
void WriteBlock(const VAddr dest_addr, const void* src_buffer, size_t size);
void ZeroBlock(const VAddr dest_addr, const size_t size);
void CopyBlock(VAddr dest_addr, VAddr src_addr, size_t size);
@@ -169,8 +240,6 @@ boost::optional<VAddr> PhysicalToVirtualAddress(PAddr addr);
/**
* Gets a pointer to the memory region beginning at the specified physical address.
- *
- * @note This is currently implemented using PhysicalToVirtualAddress().
*/
u8* GetPhysicalPointer(PAddr address);
@@ -178,17 +247,17 @@ u8* GetPhysicalPointer(PAddr address);
* Adds the supplied value to the rasterizer resource cache counter of each
* page touching the region.
*/
-void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta);
+void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta);
/**
* Flushes any externally cached rasterizer resources touching the given region.
*/
-void RasterizerFlushRegion(PAddr start, u64 size);
+void RasterizerFlushRegion(PAddr start, u32 size);
/**
* Flushes and invalidates any externally cached rasterizer resources touching the given region.
*/
-void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size);
+void RasterizerFlushAndInvalidateRegion(PAddr start, u32 size);
enum class FlushMode {
/// Write back modified surfaces to RAM
@@ -201,12 +270,6 @@ enum class FlushMode {
* Flushes and invalidates any externally cached rasterizer resources touching the given virtual
* address region.
*/
-void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode);
+void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode);
-/**
- * Dynarmic has an optimization to memory accesses when the pointer to the page exists that
- * can be used by setting up the current page table as a callback. This function is used to
- * retrieve the current page table for that purpose.
- */
-//std::array<u8*, PAGE_TABLE_NUM_ENTRIES>* GetCurrentPageTablePointers();
-}
+} // namespace Memory
diff --git a/src/core/memory_setup.h b/src/core/memory_setup.h
index fc3fda466..c58baa50b 100644
--- a/src/core/memory_setup.h
+++ b/src/core/memory_setup.h
@@ -9,24 +9,24 @@
namespace Memory {
-void InitMemoryMap();
-
/**
* Maps an allocated buffer onto a region of the emulated process address space.
*
+ * @param page_table The page table of the emulated process.
* @param base The address to start mapping at. Must be page-aligned.
* @param size The amount of bytes to map. Must be page-aligned.
* @param target Buffer with the memory backing the mapping. Must be of length at least `size`.
*/
-void MapMemoryRegion(VAddr base, u64 size, u8* target);
+void MapMemoryRegion(PageTable& page_table, VAddr base, u32 size, u8* target);
/**
* Maps a region of the emulated process address space as a IO region.
+ * @param page_table The page table of the emulated process.
* @param base The address to start mapping at. Must be page-aligned.
* @param size The amount of bytes to map. Must be page-aligned.
* @param mmio_handler The handler that backs the mapping.
*/
-void MapIoRegion(VAddr base, u64 size, MMIORegionPointer mmio_handler);
+void MapIoRegion(PageTable& page_table, VAddr base, u32 size, MMIORegionPointer mmio_handler);
-void UnmapRegion(VAddr base, u64 size);
+void UnmapRegion(PageTable& page_table, VAddr base, u32 size);
}
diff --git a/src/core/settings.cpp b/src/core/settings.cpp
index d4f0429d1..efcf1267d 100644
--- a/src/core/settings.cpp
+++ b/src/core/settings.cpp
@@ -36,4 +36,4 @@ void Apply() {
Service::IR::ReloadInputDevices();
}
-} // namespace
+} // namespace Settings
diff --git a/src/core/settings.h b/src/core/settings.h
index ee16bb90a..8d78cb424 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -15,6 +15,7 @@ enum class LayoutOption {
Default,
SingleScreen,
LargeScreen,
+ SideScreen,
};
namespace NativeButton {
@@ -70,7 +71,7 @@ enum Values {
static const std::array<const char*, NumAnalogs> mapping = {{
"circle_pad", "c_stick",
}};
-} // namespace NumAnalog
+} // namespace NativeAnalog
struct Values {
// CheckNew3DS
@@ -79,6 +80,8 @@ struct Values {
// Controls
std::array<std::string, NativeButton::NumButtons> buttons;
std::array<std::string, NativeAnalog::NumAnalogs> analogs;
+ std::string motion_device;
+ std::string touch_device;
// Core
bool use_cpu_jit;
@@ -128,7 +131,11 @@ struct Values {
u16 gdbstub_port;
// WebService
+ bool enable_telemetry;
std::string telemetry_endpoint_url;
+ std::string verify_endpoint_url;
+ std::string citra_username;
+ std::string citra_token;
} extern values;
// a special value for Values::region_value indicating that citra will automatically select a region
@@ -136,4 +143,4 @@ struct Values {
static constexpr int REGION_VALUE_AUTO_SELECT = -1;
void Apply();
-}
+} // namespace Settings
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index 841d6cfa1..ca517ff44 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -3,15 +3,19 @@
// Refer to the license.txt file included.
#include <cstring>
+#include <cryptopp/osrng.h>
#include "common/assert.h"
+#include "common/file_util.h"
#include "common/scm_rev.h"
#include "common/x64/cpu_detect.h"
+#include "core/core.h"
#include "core/settings.h"
#include "core/telemetry_session.h"
#ifdef ENABLE_WEB_SERVICE
#include "web_service/telemetry_json.h"
+#include "web_service/verify_login.h"
#endif
namespace Core {
@@ -28,23 +32,94 @@ static const char* CpuVendorToStr(Common::CPUVendor vendor) {
UNREACHABLE();
}
+static u64 GenerateTelemetryId() {
+ u64 telemetry_id{};
+ CryptoPP::AutoSeededRandomPool rng;
+ rng.GenerateBlock(reinterpret_cast<CryptoPP::byte*>(&telemetry_id), sizeof(u64));
+ return telemetry_id;
+}
+
+u64 GetTelemetryId() {
+ u64 telemetry_id{};
+ static const std::string& filename{FileUtil::GetUserPath(D_CONFIG_IDX) + "telemetry_id"};
+
+ if (FileUtil::Exists(filename)) {
+ FileUtil::IOFile file(filename, "rb");
+ if (!file.IsOpen()) {
+ LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
+ return {};
+ }
+ file.ReadBytes(&telemetry_id, sizeof(u64));
+ } else {
+ FileUtil::IOFile file(filename, "wb");
+ if (!file.IsOpen()) {
+ LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
+ return {};
+ }
+ telemetry_id = GenerateTelemetryId();
+ file.WriteBytes(&telemetry_id, sizeof(u64));
+ }
+
+ return telemetry_id;
+}
+
+u64 RegenerateTelemetryId() {
+ const u64 new_telemetry_id{GenerateTelemetryId()};
+ static const std::string& filename{FileUtil::GetUserPath(D_CONFIG_IDX) + "telemetry_id"};
+
+ FileUtil::IOFile file(filename, "wb");
+ if (!file.IsOpen()) {
+ LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
+ return {};
+ }
+ file.WriteBytes(&new_telemetry_id, sizeof(u64));
+ return new_telemetry_id;
+}
+
+std::future<bool> VerifyLogin(std::string username, std::string token, std::function<void()> func) {
+#ifdef ENABLE_WEB_SERVICE
+ return WebService::VerifyLogin(username, token, Settings::values.verify_endpoint_url, func);
+#else
+ return std::async(std::launch::async, [func{std::move(func)}]() {
+ func();
+ return false;
+ });
+#endif
+}
+
TelemetrySession::TelemetrySession() {
#ifdef ENABLE_WEB_SERVICE
- backend = std::make_unique<WebService::TelemetryJson>();
+ if (Settings::values.enable_telemetry) {
+ backend = std::make_unique<WebService::TelemetryJson>(
+ Settings::values.telemetry_endpoint_url, Settings::values.citra_username,
+ Settings::values.citra_token);
+ } else {
+ backend = std::make_unique<Telemetry::NullVisitor>();
+ }
#else
backend = std::make_unique<Telemetry::NullVisitor>();
#endif
+ // Log one-time top-level information
+ AddField(Telemetry::FieldType::None, "TelemetryId", GetTelemetryId());
+
// Log one-time session start information
const s64 init_time{std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch())
.count()};
AddField(Telemetry::FieldType::Session, "Init_Time", init_time);
+ std::string program_name;
+ const Loader::ResultStatus res{System::GetInstance().GetAppLoader().ReadTitle(program_name)};
+ if (res == Loader::ResultStatus::Success) {
+ AddField(Telemetry::FieldType::Session, "ProgramName", program_name);
+ }
// Log application information
const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr};
AddField(Telemetry::FieldType::App, "Git_IsDirty", is_git_dirty);
AddField(Telemetry::FieldType::App, "Git_Branch", Common::g_scm_branch);
AddField(Telemetry::FieldType::App, "Git_Revision", Common::g_scm_rev);
+ AddField(Telemetry::FieldType::App, "BuildDate", Common::g_build_date);
+ AddField(Telemetry::FieldType::App, "BuildName", Common::g_build_name);
// Log user system information
AddField(Telemetry::FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string);
@@ -68,6 +143,15 @@ TelemetrySession::TelemetrySession() {
Common::GetCPUCaps().sse4_1);
AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE42",
Common::GetCPUCaps().sse4_2);
+#ifdef __APPLE__
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Apple");
+#elif defined(_WIN32)
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Windows");
+#elif defined(__linux__) || defined(linux) || defined(__linux)
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Linux");
+#else
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Unknown");
+#endif
// Log user configuration information
AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching",
diff --git a/src/core/telemetry_session.h b/src/core/telemetry_session.h
index cf53835c3..550c6ea2d 100644
--- a/src/core/telemetry_session.h
+++ b/src/core/telemetry_session.h
@@ -4,6 +4,7 @@
#pragma once
+#include <future>
#include <memory>
#include "common/telemetry.h"
@@ -35,4 +36,25 @@ private:
std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields
};
+/**
+ * Gets TelemetryId, a unique identifier used for the user's telemetry sessions.
+ * @returns The current TelemetryId for the session.
+ */
+u64 GetTelemetryId();
+
+/**
+ * Regenerates TelemetryId, a unique identifier used for the user's telemetry sessions.
+ * @returns The new TelemetryId that was generated.
+ */
+u64 RegenerateTelemetryId();
+
+/**
+ * Verifies the username and token.
+ * @param username Citra username to use for authentication.
+ * @param token Citra token to use for authentication.
+ * @param func A function that gets exectued when the verification is finished
+ * @returns Future with bool indicating whether the verification succeeded
+ */
+std::future<bool> VerifyLogin(std::string username, std::string token, std::function<void()> func);
+
} // namespace Core
diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt
index e3e36ada7..92792a702 100644
--- a/src/input_common/CMakeLists.txt
+++ b/src/input_common/CMakeLists.txt
@@ -2,12 +2,14 @@ set(SRCS
analog_from_button.cpp
keyboard.cpp
main.cpp
+ motion_emu.cpp
)
set(HEADERS
analog_from_button.h
keyboard.h
main.h
+ motion_emu.h
)
if(SDL2_FOUND)
diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp
index 699f41e6b..557353740 100644
--- a/src/input_common/main.cpp
+++ b/src/input_common/main.cpp
@@ -7,6 +7,7 @@
#include "input_common/analog_from_button.h"
#include "input_common/keyboard.h"
#include "input_common/main.h"
+#include "input_common/motion_emu.h"
#ifdef HAVE_SDL2
#include "input_common/sdl/sdl.h"
#endif
@@ -14,12 +15,16 @@
namespace InputCommon {
static std::shared_ptr<Keyboard> keyboard;
+static std::shared_ptr<MotionEmu> motion_emu;
void Init() {
- keyboard = std::make_shared<InputCommon::Keyboard>();
+ keyboard = std::make_shared<Keyboard>();
Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard);
Input::RegisterFactory<Input::AnalogDevice>("analog_from_button",
- std::make_shared<InputCommon::AnalogFromButton>());
+ std::make_shared<AnalogFromButton>());
+ motion_emu = std::make_shared<MotionEmu>();
+ Input::RegisterFactory<Input::MotionDevice>("motion_emu", motion_emu);
+
#ifdef HAVE_SDL2
SDL::Init();
#endif
@@ -29,6 +34,8 @@ void Shutdown() {
Input::UnregisterFactory<Input::ButtonDevice>("keyboard");
keyboard.reset();
Input::UnregisterFactory<Input::AnalogDevice>("analog_from_button");
+ Input::UnregisterFactory<Input::MotionDevice>("motion_emu");
+ motion_emu.reset();
#ifdef HAVE_SDL2
SDL::Shutdown();
@@ -39,6 +46,10 @@ Keyboard* GetKeyboard() {
return keyboard.get();
}
+MotionEmu* GetMotionEmu() {
+ return motion_emu.get();
+}
+
std::string GenerateKeyboardParam(int key_code) {
Common::ParamPackage param{
{"engine", "keyboard"}, {"code", std::to_string(key_code)},
diff --git a/src/input_common/main.h b/src/input_common/main.h
index 140bbd014..5604f0fa8 100644
--- a/src/input_common/main.h
+++ b/src/input_common/main.h
@@ -11,7 +11,7 @@ namespace InputCommon {
/// Initializes and registers all built-in input device factories.
void Init();
-/// Unresisters all build-in input device factories and shut them down.
+/// Deregisters all built-in input device factories and shuts them down.
void Shutdown();
class Keyboard;
@@ -19,6 +19,11 @@ class Keyboard;
/// Gets the keyboard button device factory.
Keyboard* GetKeyboard();
+class MotionEmu;
+
+/// Gets the motion emulation factory.
+MotionEmu* GetMotionEmu();
+
/// Generates a serialized param package for creating a keyboard button device
std::string GenerateKeyboardParam(int key_code);
diff --git a/src/input_common/motion_emu.cpp b/src/input_common/motion_emu.cpp
new file mode 100644
index 000000000..59a035e70
--- /dev/null
+++ b/src/input_common/motion_emu.cpp
@@ -0,0 +1,168 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <chrono>
+#include <mutex>
+#include <thread>
+#include <tuple>
+#include "common/math_util.h"
+#include "common/quaternion.h"
+#include "common/thread.h"
+#include "common/vector_math.h"
+#include "input_common/motion_emu.h"
+
+namespace InputCommon {
+
+// Implementation class of the motion emulation device
+class MotionEmuDevice {
+public:
+ MotionEmuDevice(int update_millisecond, float sensitivity)
+ : update_millisecond(update_millisecond),
+ update_duration(std::chrono::duration_cast<std::chrono::steady_clock::duration>(
+ std::chrono::milliseconds(update_millisecond))),
+ sensitivity(sensitivity), motion_emu_thread(&MotionEmuDevice::MotionEmuThread, this) {}
+
+ ~MotionEmuDevice() {
+ if (motion_emu_thread.joinable()) {
+ shutdown_event.Set();
+ motion_emu_thread.join();
+ }
+ }
+
+ void BeginTilt(int x, int y) {
+ mouse_origin = Math::MakeVec(x, y);
+ is_tilting = true;
+ }
+
+ void Tilt(int x, int y) {
+ auto mouse_move = Math::MakeVec(x, y) - mouse_origin;
+ if (is_tilting) {
+ std::lock_guard<std::mutex> guard(tilt_mutex);
+ if (mouse_move.x == 0 && mouse_move.y == 0) {
+ tilt_angle = 0;
+ } else {
+ tilt_direction = mouse_move.Cast<float>();
+ tilt_angle = MathUtil::Clamp(tilt_direction.Normalize() * sensitivity, 0.0f,
+ MathUtil::PI * 0.5f);
+ }
+ }
+ }
+
+ void EndTilt() {
+ std::lock_guard<std::mutex> guard(tilt_mutex);
+ tilt_angle = 0;
+ is_tilting = false;
+ }
+
+ std::tuple<Math::Vec3<float>, Math::Vec3<float>> GetStatus() {
+ std::lock_guard<std::mutex> guard(status_mutex);
+ return status;
+ }
+
+private:
+ const int update_millisecond;
+ const std::chrono::steady_clock::duration update_duration;
+ const float sensitivity;
+
+ Math::Vec2<int> mouse_origin;
+
+ std::mutex tilt_mutex;
+ Math::Vec2<float> tilt_direction;
+ float tilt_angle = 0;
+
+ bool is_tilting = false;
+
+ Common::Event shutdown_event;
+
+ std::tuple<Math::Vec3<float>, Math::Vec3<float>> status;
+ std::mutex status_mutex;
+
+ // Note: always keep the thread declaration at the end so that other objects are initialized
+ // before this!
+ std::thread motion_emu_thread;
+
+ void MotionEmuThread() {
+ auto update_time = std::chrono::steady_clock::now();
+ Math::Quaternion<float> q = MakeQuaternion(Math::Vec3<float>(), 0);
+ Math::Quaternion<float> old_q;
+
+ while (!shutdown_event.WaitUntil(update_time)) {
+ update_time += update_duration;
+ old_q = q;
+
+ {
+ std::lock_guard<std::mutex> guard(tilt_mutex);
+
+ // Find the quaternion describing current 3DS tilting
+ q = MakeQuaternion(Math::MakeVec(-tilt_direction.y, 0.0f, tilt_direction.x),
+ tilt_angle);
+ }
+
+ auto inv_q = q.Inverse();
+
+ // Set the gravity vector in world space
+ auto gravity = Math::MakeVec(0.0f, -1.0f, 0.0f);
+
+ // Find the angular rate vector in world space
+ auto angular_rate = ((q - old_q) * inv_q).xyz * 2;
+ angular_rate *= 1000 / update_millisecond / MathUtil::PI * 180;
+
+ // Transform the two vectors from world space to 3DS space
+ gravity = QuaternionRotate(inv_q, gravity);
+ angular_rate = QuaternionRotate(inv_q, angular_rate);
+
+ // Update the sensor state
+ {
+ std::lock_guard<std::mutex> guard(status_mutex);
+ status = std::make_tuple(gravity, angular_rate);
+ }
+ }
+ }
+};
+
+// Interface wrapper held by input receiver as a unique_ptr. It holds the implementation class as
+// a shared_ptr, which is also observed by the factory class as a weak_ptr. In this way the factory
+// can forward all the inputs to the implementation only when it is valid.
+class MotionEmuDeviceWrapper : public Input::MotionDevice {
+public:
+ MotionEmuDeviceWrapper(int update_millisecond, float sensitivity) {
+ device = std::make_shared<MotionEmuDevice>(update_millisecond, sensitivity);
+ }
+
+ std::tuple<Math::Vec3<float>, Math::Vec3<float>> GetStatus() const {
+ return device->GetStatus();
+ }
+
+ std::shared_ptr<MotionEmuDevice> device;
+};
+
+std::unique_ptr<Input::MotionDevice> MotionEmu::Create(const Common::ParamPackage& params) {
+ int update_period = params.Get("update_period", 100);
+ float sensitivity = params.Get("sensitivity", 0.01f);
+ auto device_wrapper = std::make_unique<MotionEmuDeviceWrapper>(update_period, sensitivity);
+ // Previously created device is disconnected here. Having two motion devices for 3DS is not
+ // expected.
+ current_device = device_wrapper->device;
+ return std::move(device_wrapper);
+}
+
+void MotionEmu::BeginTilt(int x, int y) {
+ if (auto ptr = current_device.lock()) {
+ ptr->BeginTilt(x, y);
+ }
+}
+
+void MotionEmu::Tilt(int x, int y) {
+ if (auto ptr = current_device.lock()) {
+ ptr->Tilt(x, y);
+ }
+}
+
+void MotionEmu::EndTilt() {
+ if (auto ptr = current_device.lock()) {
+ ptr->EndTilt();
+ }
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/motion_emu.h b/src/input_common/motion_emu.h
new file mode 100644
index 000000000..7a7e22467
--- /dev/null
+++ b/src/input_common/motion_emu.h
@@ -0,0 +1,46 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "core/frontend/input.h"
+
+namespace InputCommon {
+
+class MotionEmuDevice;
+
+class MotionEmu : public Input::Factory<Input::MotionDevice> {
+public:
+ /**
+ * Creates a motion device emulated from mouse input
+ * @param params contains parameters for creating the device:
+ * - "update_period": update period in milliseconds
+ * - "sensitivity": the coefficient converting mouse movement to tilting angle
+ */
+ std::unique_ptr<Input::MotionDevice> Create(const Common::ParamPackage& params) override;
+
+ /**
+ * Signals that a motion sensor tilt has begun.
+ * @param x the x-coordinate of the cursor
+ * @param y the y-coordinate of the cursor
+ */
+ void BeginTilt(int x, int y);
+
+ /**
+ * Signals that a motion sensor tilt is occurring.
+ * @param x the x-coordinate of the cursor
+ * @param y the y-coordinate of the cursor
+ */
+ void Tilt(int x, int y);
+
+ /**
+ * Signals that a motion sensor tilt has ended.
+ */
+ void EndTilt();
+
+private:
+ std::weak_ptr<MotionEmuDevice> current_device;
+};
+
+} // namespace InputCommon
diff --git a/src/input_common/sdl/sdl.cpp b/src/input_common/sdl/sdl.cpp
index 756ee58b7..d404afa89 100644
--- a/src/input_common/sdl/sdl.cpp
+++ b/src/input_common/sdl/sdl.cpp
@@ -159,7 +159,7 @@ public:
* - "axis"(optional): the index of the axis to bind
* - "direction"(only used for hat): the direction name of the hat to bind. Can be "up",
* "down", "left" or "right"
- * - "threshould"(only used for axis): a float value in (-1.0, 1.0) which the button is
+ * - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is
* triggered if the axis value crosses
* - "direction"(only used for axis): "+" means the button is triggered when the axis value
* is greater than the threshold; "-" means the button is triggered when the axis value
diff --git a/src/network/packet.cpp b/src/network/packet.cpp
index 660e92c0d..7e1a812f3 100644
--- a/src/network/packet.cpp
+++ b/src/network/packet.cpp
@@ -13,6 +13,18 @@
namespace Network {
+#ifndef htonll
+u64 htonll(u64 x) {
+ return ((1 == htonl(1)) ? (x) : ((uint64_t)htonl((x)&0xFFFFFFFF) << 32) | htonl((x) >> 32));
+}
+#endif
+
+#ifndef ntohll
+u64 ntohll(u64 x) {
+ return ((1 == ntohl(1)) ? (x) : ((uint64_t)ntohl((x)&0xFFFFFFFF) << 32) | ntohl((x) >> 32));
+}
+#endif
+
void Packet::Append(const void* in_data, std::size_t size_in_bytes) {
if (in_data && (size_in_bytes > 0)) {
std::size_t start = data.size();
@@ -100,6 +112,20 @@ Packet& Packet::operator>>(u32& out_data) {
return *this;
}
+Packet& Packet::operator>>(s64& out_data) {
+ s64 value;
+ Read(&value, sizeof(value));
+ out_data = ntohll(value);
+ return *this;
+}
+
+Packet& Packet::operator>>(u64& out_data) {
+ u64 value;
+ Read(&value, sizeof(value));
+ out_data = ntohll(value);
+ return *this;
+}
+
Packet& Packet::operator>>(float& out_data) {
Read(&out_data, sizeof(out_data));
return *this;
@@ -183,6 +209,18 @@ Packet& Packet::operator<<(u32 in_data) {
return *this;
}
+Packet& Packet::operator<<(s64 in_data) {
+ s64 toWrite = htonll(in_data);
+ Append(&toWrite, sizeof(toWrite));
+ return *this;
+}
+
+Packet& Packet::operator<<(u64 in_data) {
+ u64 toWrite = htonll(in_data);
+ Append(&toWrite, sizeof(toWrite));
+ return *this;
+}
+
Packet& Packet::operator<<(float in_data) {
Append(&in_data, sizeof(in_data));
return *this;
@@ -195,7 +233,7 @@ Packet& Packet::operator<<(double in_data) {
Packet& Packet::operator<<(const char* in_data) {
// First insert string length
- u32 length = std::strlen(in_data);
+ u32 length = static_cast<u32>(std::strlen(in_data));
*this << length;
// Then insert characters
diff --git a/src/network/packet.h b/src/network/packet.h
index 94b351ab1..5a2e58dc2 100644
--- a/src/network/packet.h
+++ b/src/network/packet.h
@@ -72,6 +72,8 @@ public:
Packet& operator>>(u16& out_data);
Packet& operator>>(s32& out_data);
Packet& operator>>(u32& out_data);
+ Packet& operator>>(s64& out_data);
+ Packet& operator>>(u64& out_data);
Packet& operator>>(float& out_data);
Packet& operator>>(double& out_data);
Packet& operator>>(char* out_data);
@@ -89,6 +91,8 @@ public:
Packet& operator<<(u16 in_data);
Packet& operator<<(s32 in_data);
Packet& operator<<(u32 in_data);
+ Packet& operator<<(s64 in_data);
+ Packet& operator<<(u64 in_data);
Packet& operator<<(float in_data);
Packet& operator<<(double in_data);
Packet& operator<<(const char* in_data);
diff --git a/src/network/room.cpp b/src/network/room.cpp
index 8b7915bb7..261049ab0 100644
--- a/src/network/room.cpp
+++ b/src/network/room.cpp
@@ -4,9 +4,9 @@
#include <algorithm>
#include <atomic>
+#include <mutex>
#include <random>
#include <thread>
-#include <vector>
#include "enet/enet.h"
#include "network/packet.h"
#include "network/room.h"
@@ -19,7 +19,7 @@ static constexpr u32 MaxConcurrentConnections = 10;
class Room::RoomImpl {
public:
// This MAC address is used to generate a 'Nintendo' like Mac address.
- const MacAddress NintendoOUI = {0x00, 0x1F, 0x32, 0x00, 0x00, 0x00};
+ const MacAddress NintendoOUI;
std::mt19937 random_gen; ///< Random number generator. Used for GenerateMacAddress
ENetHost* server = nullptr; ///< Network interface.
@@ -29,14 +29,17 @@ public:
struct Member {
std::string nickname; ///< The nickname of the member.
- std::string game_name; ///< The current game of the member
+ GameInfo game_info; ///< The current game of the member
MacAddress mac_address; ///< The assigned mac address of the member.
ENetPeer* peer; ///< The remote peer.
};
using MemberList = std::vector<Member>;
- MemberList members; ///< Information about the members of this room.
+ MemberList members; ///< Information about the members of this room
+ mutable std::mutex member_mutex; ///< Mutex for locking the members list
+ /// This should be a std::shared_mutex as soon as C++17 is supported
- RoomImpl() : random_gen(std::random_device()()) {}
+ RoomImpl()
+ : random_gen(std::random_device()()), NintendoOUI{0x00, 0x1F, 0x32, 0x00, 0x00, 0x00} {}
/// Thread that receives and dispatches network packets
std::unique_ptr<std::thread> room_thread;
@@ -146,7 +149,7 @@ void Room::RoomImpl::ServerLoop() {
case IdJoinRequest:
HandleJoinRequest(&event);
break;
- case IdSetGameName:
+ case IdSetGameInfo:
HandleGameNamePacket(&event);
break;
case IdWifiPacket:
@@ -212,7 +215,10 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) {
member.nickname = nickname;
member.peer = event->peer;
- members.push_back(std::move(member));
+ {
+ std::lock_guard<std::mutex> lock(member_mutex);
+ members.push_back(std::move(member));
+ }
// Notify everyone that the room information has changed.
BroadcastRoomInformation();
@@ -222,12 +228,14 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) {
bool Room::RoomImpl::IsValidNickname(const std::string& nickname) const {
// A nickname is valid if it is not already taken by anybody else in the room.
// TODO(B3N30): Check for empty names, spaces, etc.
+ std::lock_guard<std::mutex> lock(member_mutex);
return std::all_of(members.begin(), members.end(),
[&nickname](const auto& member) { return member.nickname != nickname; });
}
bool Room::RoomImpl::IsValidMacAddress(const MacAddress& address) const {
// A MAC address is valid if it is not already taken by anybody else in the room.
+ std::lock_guard<std::mutex> lock(member_mutex);
return std::all_of(members.begin(), members.end(),
[&address](const auto& member) { return member.mac_address != address; });
}
@@ -278,6 +286,7 @@ void Room::RoomImpl::SendCloseMessage() {
packet << static_cast<u8>(IdCloseRoom);
ENetPacket* enet_packet =
enet_packet_create(packet.GetData(), packet.GetDataSize(), ENET_PACKET_FLAG_RELIABLE);
+ std::lock_guard<std::mutex> lock(member_mutex);
for (auto& member : members) {
enet_peer_send(member.peer, 0, enet_packet);
}
@@ -294,10 +303,14 @@ void Room::RoomImpl::BroadcastRoomInformation() {
packet << room_information.member_slots;
packet << static_cast<u32>(members.size());
- for (const auto& member : members) {
- packet << member.nickname;
- packet << member.mac_address;
- packet << member.game_name;
+ {
+ std::lock_guard<std::mutex> lock(member_mutex);
+ for (const auto& member : members) {
+ packet << member.nickname;
+ packet << member.mac_address;
+ packet << member.game_info.name;
+ packet << member.game_info.id;
+ }
}
ENetPacket* enet_packet =
@@ -334,11 +347,13 @@ void Room::RoomImpl::HandleWifiPacket(const ENetEvent* event) {
ENET_PACKET_FLAG_RELIABLE);
if (destination_address == BroadcastMac) { // Send the data to everyone except the sender
+ std::lock_guard<std::mutex> lock(member_mutex);
for (const auto& member : members) {
if (member.peer != event->peer)
enet_peer_send(member.peer, 0, enet_packet);
}
} else { // Send the data only to the destination client
+ std::lock_guard<std::mutex> lock(member_mutex);
auto member = std::find_if(members.begin(), members.end(),
[destination_address](const Member& member) -> bool {
return member.mac_address == destination_address;
@@ -360,6 +375,8 @@ void Room::RoomImpl::HandleChatPacket(const ENetEvent* event) {
auto CompareNetworkAddress = [event](const Member member) -> bool {
return member.peer == event->peer;
};
+
+ std::lock_guard<std::mutex> lock(member_mutex);
const auto sending_member = std::find_if(members.begin(), members.end(), CompareNetworkAddress);
if (sending_member == members.end()) {
return; // Received a chat message from a unknown sender
@@ -384,22 +401,32 @@ void Room::RoomImpl::HandleGameNamePacket(const ENetEvent* event) {
in_packet.Append(event->packet->data, event->packet->dataLength);
in_packet.IgnoreBytes(sizeof(u8)); // Igonore the message type
- std::string game_name;
- in_packet >> game_name;
- auto member =
- std::find_if(members.begin(), members.end(),
- [event](const Member& member) -> bool { return member.peer == event->peer; });
- if (member != members.end()) {
- member->game_name = game_name;
- BroadcastRoomInformation();
+ GameInfo game_info;
+ in_packet >> game_info.name;
+ in_packet >> game_info.id;
+
+ {
+ std::lock_guard<std::mutex> lock(member_mutex);
+ auto member =
+ std::find_if(members.begin(), members.end(), [event](const Member& member) -> bool {
+ return member.peer == event->peer;
+ });
+ if (member != members.end()) {
+ member->game_info = game_info;
+ }
}
+ BroadcastRoomInformation();
}
void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) {
// Remove the client from the members list.
- members.erase(std::remove_if(members.begin(), members.end(),
- [client](const Member& member) { return member.peer == client; }),
- members.end());
+ {
+ std::lock_guard<std::mutex> lock(member_mutex);
+ members.erase(
+ std::remove_if(members.begin(), members.end(),
+ [client](const Member& member) { return member.peer == client; }),
+ members.end());
+ }
// Announce the change to all clients.
enet_peer_disconnect(client, 0);
@@ -436,6 +463,19 @@ const RoomInformation& Room::GetRoomInformation() const {
return room_impl->room_information;
}
+std::vector<Room::Member> Room::GetRoomMemberList() const {
+ std::vector<Room::Member> member_list;
+ std::lock_guard<std::mutex> lock(room_impl->member_mutex);
+ for (const auto& member_impl : room_impl->members) {
+ Member member;
+ member.nickname = member_impl.nickname;
+ member.mac_address = member_impl.mac_address;
+ member.game_info = member_impl.game_info;
+ member_list.push_back(member);
+ }
+ return member_list;
+};
+
void Room::Destroy() {
room_impl->state = State::Closed;
room_impl->room_thread->join();
@@ -446,7 +486,10 @@ void Room::Destroy() {
}
room_impl->room_information = {};
room_impl->server = nullptr;
- room_impl->members.clear();
+ {
+ std::lock_guard<std::mutex> lock(room_impl->member_mutex);
+ room_impl->members.clear();
+ }
room_impl->room_information.member_slots = 0;
room_impl->room_information.name.clear();
}
diff --git a/src/network/room.h b/src/network/room.h
index 54cccf0ae..8285a4d0c 100644
--- a/src/network/room.h
+++ b/src/network/room.h
@@ -7,6 +7,7 @@
#include <array>
#include <memory>
#include <string>
+#include <vector>
#include "common/common_types.h"
namespace Network {
@@ -21,10 +22,15 @@ struct RoomInformation {
u32 member_slots; ///< Maximum number of members in this room
};
+struct GameInfo {
+ std::string name{""};
+ u64 id{0};
+};
+
using MacAddress = std::array<u8, 6>;
/// A special MAC address that tells the room we're joining to assign us a MAC address
/// automatically.
-const MacAddress NoPreferredMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
+constexpr MacAddress NoPreferredMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
// 802.11 broadcast MAC address
constexpr MacAddress BroadcastMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
@@ -34,7 +40,7 @@ enum RoomMessageTypes : u8 {
IdJoinRequest = 1,
IdJoinSuccess,
IdRoomInformation,
- IdSetGameName,
+ IdSetGameInfo,
IdWifiPacket,
IdChatMessage,
IdNameCollision,
@@ -51,6 +57,12 @@ public:
Closed, ///< The room is not opened and can not accept connections.
};
+ struct Member {
+ std::string nickname; ///< The nickname of the member.
+ GameInfo game_info; ///< The current game of the member
+ MacAddress mac_address; ///< The assigned mac address of the member.
+ };
+
Room();
~Room();
@@ -65,6 +77,11 @@ public:
const RoomInformation& GetRoomInformation() const;
/**
+ * Gets a list of the mbmers connected to the room.
+ */
+ std::vector<Member> GetRoomMemberList() const;
+
+ /**
* Creates the socket for this room. Will bind to default address if
* server is empty string.
*/
diff --git a/src/network/room_member.cpp b/src/network/room_member.cpp
index dac9bacae..f229ec6fd 100644
--- a/src/network/room_member.cpp
+++ b/src/network/room_member.cpp
@@ -5,6 +5,7 @@
#include <atomic>
#include <list>
#include <mutex>
+#include <set>
#include <thread>
#include "common/assert.h"
#include "enet/enet.h"
@@ -25,6 +26,9 @@ public:
/// Information about the room we're connected to.
RoomInformation room_information;
+ /// The current game name, id and version
+ GameInfo current_game_info;
+
std::atomic<State> state{State::Idle}; ///< Current state of the RoomMember.
void SetState(const State new_state);
bool IsConnected() const;
@@ -37,6 +41,24 @@ public:
std::unique_ptr<std::thread> loop_thread;
std::mutex send_list_mutex; ///< Mutex that controls access to the `send_list` variable.
std::list<Packet> send_list; ///< A list that stores all packets to send the async
+
+ template <typename T>
+ using CallbackSet = std::set<CallbackHandle<T>>;
+ std::mutex callback_mutex; ///< The mutex used for handling callbacks
+
+ class Callbacks {
+ public:
+ template <typename T>
+ CallbackSet<T>& Get();
+
+ private:
+ CallbackSet<WifiPacket> callback_set_wifi_packet;
+ CallbackSet<ChatEntry> callback_set_chat_messages;
+ CallbackSet<RoomInformation> callback_set_room_information;
+ CallbackSet<State> callback_set_state;
+ };
+ Callbacks callbacks; ///< All CallbackSets to all events
+
void MemberLoop();
void StartLoop();
@@ -84,12 +106,20 @@ public:
* Disconnects the RoomMember from the Room
*/
void Disconnect();
+
+ template <typename T>
+ void Invoke(const T& data);
+
+ template <typename T>
+ CallbackHandle<T> Bind(std::function<void(const T&)> callback);
};
// RoomMemberImpl
void RoomMember::RoomMemberImpl::SetState(const State new_state) {
- state = new_state;
- // TODO(B3N30): Invoke the callback functions
+ if (state != new_state) {
+ state = new_state;
+ Invoke<State>(state);
+ }
}
bool RoomMember::RoomMemberImpl::IsConnected() const {
@@ -195,9 +225,10 @@ void RoomMember::RoomMemberImpl::HandleRoomInformationPacket(const ENetEvent* ev
for (auto& member : member_information) {
packet >> member.nickname;
packet >> member.mac_address;
- packet >> member.game_name;
+ packet >> member.game_info.name;
+ packet >> member.game_info.id;
}
- // TODO(B3N30): Invoke callbacks
+ Invoke(room_information);
}
void RoomMember::RoomMemberImpl::HandleJoinPacket(const ENetEvent* event) {
@@ -209,7 +240,7 @@ void RoomMember::RoomMemberImpl::HandleJoinPacket(const ENetEvent* event) {
// Parse the MAC Address from the packet
packet >> mac_address;
- // TODO(B3N30): Invoke callbacks
+ SetState(State::Joined);
}
void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) {
@@ -235,7 +266,7 @@ void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) {
packet >> wifi_packet.data;
- // TODO(B3N30): Invoke callbacks
+ Invoke<WifiPacket>(wifi_packet);
}
void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) {
@@ -248,7 +279,7 @@ void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) {
ChatEntry chat_entry{};
packet >> chat_entry.nickname;
packet >> chat_entry.message;
- // TODO(B3N30): Invoke callbacks
+ Invoke<ChatEntry>(chat_entry);
}
void RoomMember::RoomMemberImpl::Disconnect() {
@@ -276,6 +307,46 @@ void RoomMember::RoomMemberImpl::Disconnect() {
server = nullptr;
}
+template <>
+RoomMember::RoomMemberImpl::CallbackSet<WifiPacket>& RoomMember::RoomMemberImpl::Callbacks::Get() {
+ return callback_set_wifi_packet;
+}
+
+template <>
+RoomMember::RoomMemberImpl::CallbackSet<RoomMember::State>&
+RoomMember::RoomMemberImpl::Callbacks::Get() {
+ return callback_set_state;
+}
+
+template <>
+RoomMember::RoomMemberImpl::CallbackSet<RoomInformation>&
+RoomMember::RoomMemberImpl::Callbacks::Get() {
+ return callback_set_room_information;
+}
+
+template <>
+RoomMember::RoomMemberImpl::CallbackSet<ChatEntry>& RoomMember::RoomMemberImpl::Callbacks::Get() {
+ return callback_set_chat_messages;
+}
+
+template <typename T>
+void RoomMember::RoomMemberImpl::Invoke(const T& data) {
+ std::lock_guard<std::mutex> lock(callback_mutex);
+ CallbackSet<T> callback_set = callbacks.Get<T>();
+ for (auto const& callback : callback_set)
+ (*callback)(data);
+}
+
+template <typename T>
+RoomMember::CallbackHandle<T> RoomMember::RoomMemberImpl::Bind(
+ std::function<void(const T&)> callback) {
+ std::lock_guard<std::mutex> lock(callback_mutex);
+ CallbackHandle<T> handle;
+ handle = std::make_shared<std::function<void(const T&)>>(callback);
+ callbacks.Get<T>().insert(handle);
+ return handle;
+}
+
// RoomMember
RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} {
room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0);
@@ -339,6 +410,7 @@ void RoomMember::Join(const std::string& nick, const char* server_addr, u16 serv
room_member_impl->SetState(State::Joining);
room_member_impl->StartLoop();
room_member_impl->SendJoinRequest(nick, preferred_mac);
+ SendGameInfo(room_member_impl->current_game_info);
} else {
room_member_impl->SetState(State::CouldNotConnect);
}
@@ -366,17 +438,53 @@ void RoomMember::SendChatMessage(const std::string& message) {
room_member_impl->Send(std::move(packet));
}
-void RoomMember::SendGameName(const std::string& game_name) {
+void RoomMember::SendGameInfo(const GameInfo& game_info) {
+ room_member_impl->current_game_info = game_info;
+ if (!IsConnected())
+ return;
+
Packet packet;
- packet << static_cast<u8>(IdSetGameName);
- packet << game_name;
+ packet << static_cast<u8>(IdSetGameInfo);
+ packet << game_info.name;
+ packet << game_info.id;
room_member_impl->Send(std::move(packet));
}
+RoomMember::CallbackHandle<RoomMember::State> RoomMember::BindOnStateChanged(
+ std::function<void(const RoomMember::State&)> callback) {
+ return room_member_impl->Bind(callback);
+}
+
+RoomMember::CallbackHandle<WifiPacket> RoomMember::BindOnWifiPacketReceived(
+ std::function<void(const WifiPacket&)> callback) {
+ return room_member_impl->Bind(callback);
+}
+
+RoomMember::CallbackHandle<RoomInformation> RoomMember::BindOnRoomInformationChanged(
+ std::function<void(const RoomInformation&)> callback) {
+ return room_member_impl->Bind(callback);
+}
+
+RoomMember::CallbackHandle<ChatEntry> RoomMember::BindOnChatMessageRecieved(
+ std::function<void(const ChatEntry&)> callback) {
+ return room_member_impl->Bind(callback);
+}
+
+template <typename T>
+void RoomMember::Unbind(CallbackHandle<T> handle) {
+ std::lock_guard<std::mutex> lock(room_member_impl->callback_mutex);
+ room_member_impl->callbacks.Get<T>().erase(handle);
+}
+
void RoomMember::Leave() {
room_member_impl->SetState(State::Idle);
room_member_impl->loop_thread->join();
room_member_impl->loop_thread.reset();
}
+template void RoomMember::Unbind(CallbackHandle<WifiPacket>);
+template void RoomMember::Unbind(CallbackHandle<RoomMember::State>);
+template void RoomMember::Unbind(CallbackHandle<RoomInformation>);
+template void RoomMember::Unbind(CallbackHandle<ChatEntry>);
+
} // namespace Network
diff --git a/src/network/room_member.h b/src/network/room_member.h
index bc1af3a7e..98770a234 100644
--- a/src/network/room_member.h
+++ b/src/network/room_member.h
@@ -4,6 +4,7 @@
#pragma once
+#include <functional>
#include <memory>
#include <string>
#include <vector>
@@ -53,12 +54,23 @@ public:
struct MemberInformation {
std::string nickname; ///< Nickname of the member.
- std::string game_name; ///< Name of the game they're currently playing, or empty if they're
+ GameInfo game_info; ///< Name of the game they're currently playing, or empty if they're
/// not playing anything.
MacAddress mac_address; ///< MAC address associated with this member.
};
using MemberList = std::vector<MemberInformation>;
+ // The handle for the callback functions
+ template <typename T>
+ using CallbackHandle = std::shared_ptr<std::function<void(const T&)>>;
+
+ /**
+ * Unbinds a callback function from the events.
+ * @param handle The connection handle to disconnect
+ */
+ template <typename T>
+ void Unbind(CallbackHandle<T> handle);
+
RoomMember();
~RoomMember();
@@ -113,10 +125,49 @@ public:
void SendChatMessage(const std::string& message);
/**
- * Sends the current game name to the room.
- * @param game_name The game name.
+ * Sends the current game info to the room.
+ * @param game_info The game information.
+ */
+ void SendGameInfo(const GameInfo& game_info);
+
+ /**
+ * Binds a function to an event that will be triggered every time the State of the member
+ * changed. The function wil be called every time the event is triggered. The callback function
+ * must not bind or unbind a function. Doing so will cause a deadlock
+ * @param callback The function to call
+ * @return A handle used for removing the function from the registered list
+ */
+ CallbackHandle<State> BindOnStateChanged(std::function<void(const State&)> callback);
+
+ /**
+ * Binds a function to an event that will be triggered every time a WifiPacket is received.
+ * The function wil be called everytime the event is triggered.
+ * The callback function must not bind or unbind a function. Doing so will cause a deadlock
+ * @param callback The function to call
+ * @return A handle used for removing the function from the registered list
+ */
+ CallbackHandle<WifiPacket> BindOnWifiPacketReceived(
+ std::function<void(const WifiPacket&)> callback);
+
+ /**
+ * Binds a function to an event that will be triggered every time the RoomInformation changes.
+ * The function wil be called every time the event is triggered.
+ * The callback function must not bind or unbind a function. Doing so will cause a deadlock
+ * @param callback The function to call
+ * @return A handle used for removing the function from the registered list
+ */
+ CallbackHandle<RoomInformation> BindOnRoomInformationChanged(
+ std::function<void(const RoomInformation&)> callback);
+
+ /**
+ * Binds a function to an event that will be triggered every time a ChatMessage is received.
+ * The function wil be called every time the event is triggered.
+ * The callback function must not bind or unbind a function. Doing so will cause a deadlock
+ * @param callback The function to call
+ * @return A handle used for removing the function from the registered list
*/
- void SendGameName(const std::string& game_name);
+ CallbackHandle<ChatEntry> BindOnChatMessageRecieved(
+ std::function<void(const ChatEntry&)> callback);
/**
* Leaves the current room.
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index a14df325a..1aac0daa2 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -1,12 +1,16 @@
set(SRCS
common/param_package.cpp
+ core/arm/arm_test_common.cpp
+ core/arm/dyncom/arm_dyncom_vfp_tests.cpp
core/file_sys/path_parser.cpp
core/hle/kernel/hle_ipc.cpp
+ core/memory/memory.cpp
glad.cpp
tests.cpp
)
set(HEADERS
+ core/arm/arm_test_common.h
)
create_directory_groups(${SRCS} ${HEADERS})
diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp
new file mode 100644
index 000000000..2339bdfb8
--- /dev/null
+++ b/src/tests/core/arm/arm_test_common.cpp
@@ -0,0 +1,137 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/core.h"
+#include "core/hle/kernel/process.h"
+#include "core/memory.h"
+#include "core/memory_setup.h"
+#include "tests/core/arm/arm_test_common.h"
+
+namespace ArmTests {
+
+static Memory::PageTable* page_table = nullptr;
+
+TestEnvironment::TestEnvironment(bool mutable_memory_)
+ : mutable_memory(mutable_memory_), test_memory(std::make_shared<TestMemory>(this)) {
+
+ Kernel::g_current_process = Kernel::Process::Create("");
+ page_table = &Kernel::g_current_process->vm_manager.page_table;
+
+ page_table->pointers.fill(nullptr);
+ page_table->attributes.fill(Memory::PageType::Unmapped);
+ page_table->cached_res_count.fill(0);
+
+ Memory::MapIoRegion(*page_table, 0x00000000, 0x80000000, test_memory);
+ Memory::MapIoRegion(*page_table, 0x80000000, 0x80000000, test_memory);
+
+ Memory::SetCurrentPageTable(page_table);
+}
+
+TestEnvironment::~TestEnvironment() {
+ Memory::UnmapRegion(*page_table, 0x80000000, 0x80000000);
+ Memory::UnmapRegion(*page_table, 0x00000000, 0x80000000);
+}
+
+void TestEnvironment::SetMemory64(VAddr vaddr, u64 value) {
+ SetMemory32(vaddr + 0, static_cast<u32>(value));
+ SetMemory32(vaddr + 4, static_cast<u32>(value >> 32));
+}
+
+void TestEnvironment::SetMemory32(VAddr vaddr, u32 value) {
+ SetMemory16(vaddr + 0, static_cast<u16>(value));
+ SetMemory16(vaddr + 2, static_cast<u16>(value >> 16));
+}
+
+void TestEnvironment::SetMemory16(VAddr vaddr, u16 value) {
+ SetMemory8(vaddr + 0, static_cast<u8>(value));
+ SetMemory8(vaddr + 1, static_cast<u8>(value >> 8));
+}
+
+void TestEnvironment::SetMemory8(VAddr vaddr, u8 value) {
+ test_memory->data[vaddr] = value;
+}
+
+std::vector<WriteRecord> TestEnvironment::GetWriteRecords() const {
+ return write_records;
+}
+
+void TestEnvironment::ClearWriteRecords() {
+ write_records.clear();
+}
+
+TestEnvironment::TestMemory::~TestMemory() {}
+
+bool TestEnvironment::TestMemory::IsValidAddress(VAddr addr) {
+ return true;
+}
+
+u8 TestEnvironment::TestMemory::Read8(VAddr addr) {
+ auto iter = data.find(addr);
+ if (iter == data.end()) {
+ return addr; // Some arbitrary data
+ }
+ return iter->second;
+}
+
+u16 TestEnvironment::TestMemory::Read16(VAddr addr) {
+ return Read8(addr) | static_cast<u16>(Read8(addr + 1)) << 8;
+}
+
+u32 TestEnvironment::TestMemory::Read32(VAddr addr) {
+ return Read16(addr) | static_cast<u32>(Read16(addr + 2)) << 16;
+}
+
+u64 TestEnvironment::TestMemory::Read64(VAddr addr) {
+ return Read32(addr) | static_cast<u64>(Read32(addr + 4)) << 32;
+}
+
+bool TestEnvironment::TestMemory::ReadBlock(VAddr src_addr, void* dest_buffer, size_t size) {
+ VAddr addr = src_addr;
+ u8* data = static_cast<u8*>(dest_buffer);
+
+ for (size_t i = 0; i < size; i++, addr++, data++) {
+ *data = Read8(addr);
+ }
+
+ return true;
+}
+
+void TestEnvironment::TestMemory::Write8(VAddr addr, u8 data) {
+ env->write_records.emplace_back(8, addr, data);
+ if (env->mutable_memory)
+ env->SetMemory8(addr, data);
+}
+
+void TestEnvironment::TestMemory::Write16(VAddr addr, u16 data) {
+ env->write_records.emplace_back(16, addr, data);
+ if (env->mutable_memory)
+ env->SetMemory16(addr, data);
+}
+
+void TestEnvironment::TestMemory::Write32(VAddr addr, u32 data) {
+ env->write_records.emplace_back(32, addr, data);
+ if (env->mutable_memory)
+ env->SetMemory32(addr, data);
+}
+
+void TestEnvironment::TestMemory::Write64(VAddr addr, u64 data) {
+ env->write_records.emplace_back(64, addr, data);
+ if (env->mutable_memory)
+ env->SetMemory64(addr, data);
+}
+
+bool TestEnvironment::TestMemory::WriteBlock(VAddr dest_addr, const void* src_buffer, size_t size) {
+ VAddr addr = dest_addr;
+ const u8* data = static_cast<const u8*>(src_buffer);
+
+ for (size_t i = 0; i < size; i++, addr++, data++) {
+ env->write_records.emplace_back(8, addr, *data);
+ if (env->mutable_memory)
+ env->SetMemory8(addr, *data);
+ }
+
+ return true;
+}
+
+} // namespace ArmTests
diff --git a/src/tests/core/arm/arm_test_common.h b/src/tests/core/arm/arm_test_common.h
new file mode 100644
index 000000000..592c28594
--- /dev/null
+++ b/src/tests/core/arm/arm_test_common.h
@@ -0,0 +1,84 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <tuple>
+#include <unordered_map>
+#include <vector>
+
+#include "common/common_types.h"
+#include "core/mmio.h"
+
+namespace ArmTests {
+
+struct WriteRecord {
+ WriteRecord(size_t size, VAddr addr, u64 data) : size(size), addr(addr), data(data) {}
+ size_t size;
+ VAddr addr;
+ u64 data;
+ bool operator==(const WriteRecord& o) const {
+ return std::tie(size, addr, data) == std::tie(o.size, o.addr, o.data);
+ }
+};
+
+class TestEnvironment final {
+public:
+ /*
+ * Inititalise test environment
+ * @param mutable_memory If false, writes to memory can never be read back.
+ * (Memory is immutable.)
+ */
+ explicit TestEnvironment(bool mutable_memory = false);
+
+ /// Shutdown test environment
+ ~TestEnvironment();
+
+ /// Sets value at memory location vaddr.
+ void SetMemory8(VAddr vaddr, u8 value);
+ void SetMemory16(VAddr vaddr, u16 value);
+ void SetMemory32(VAddr vaddr, u32 value);
+ void SetMemory64(VAddr vaddr, u64 value);
+
+ /**
+ * Whenever Memory::Write{8,16,32,64} is called within the test environment,
+ * a new write-record is made.
+ * @returns A vector of write records made since they were last cleared.
+ */
+ std::vector<WriteRecord> GetWriteRecords() const;
+
+ /// Empties the internal write-record store.
+ void ClearWriteRecords();
+
+private:
+ friend struct TestMemory;
+ struct TestMemory final : Memory::MMIORegion {
+ explicit TestMemory(TestEnvironment* env_) : env(env_) {}
+ TestEnvironment* env;
+
+ ~TestMemory() override;
+
+ bool IsValidAddress(VAddr addr) override;
+
+ u8 Read8(VAddr addr) override;
+ u16 Read16(VAddr addr) override;
+ u32 Read32(VAddr addr) override;
+ u64 Read64(VAddr addr) override;
+
+ bool ReadBlock(VAddr src_addr, void* dest_buffer, size_t size) override;
+
+ void Write8(VAddr addr, u8 data) override;
+ void Write16(VAddr addr, u16 data) override;
+ void Write32(VAddr addr, u32 data) override;
+ void Write64(VAddr addr, u64 data) override;
+
+ bool WriteBlock(VAddr dest_addr, const void* src_buffer, size_t size) override;
+
+ std::unordered_map<VAddr, u8> data;
+ };
+
+ bool mutable_memory;
+ std::shared_ptr<TestMemory> test_memory;
+ std::vector<WriteRecord> write_records;
+};
+
+} // namespace ArmTests
diff --git a/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp b/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp
new file mode 100644
index 000000000..83719a58e
--- /dev/null
+++ b/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp
@@ -0,0 +1,50 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <catch.hpp>
+
+#include "core/arm/dyncom/arm_dyncom.h"
+#include "core/core_timing.h"
+#include "tests/core/arm/arm_test_common.h"
+
+namespace ArmTests {
+
+struct VfpTestCase {
+ u32 initial_fpscr;
+ u32 a;
+ u32 b;
+ u32 result;
+ u32 final_fpscr;
+};
+
+TEST_CASE("ARM_DynCom (vfp): vadd", "[arm_dyncom]") {
+ TestEnvironment test_env(false);
+ test_env.SetMemory32(0, 0xEE321A03); // vadd.f32 s2, s4, s6
+ test_env.SetMemory32(4, 0xEAFFFFFE); // b +#0
+
+ ARM_DynCom dyncom(USER32MODE);
+
+ std::vector<VfpTestCase> test_cases{{
+#include "vfp_vadd_f32.inc"
+ }};
+
+ for (const auto& test_case : test_cases) {
+ dyncom.SetPC(0);
+ dyncom.SetVFPSystemReg(VFP_FPSCR, test_case.initial_fpscr);
+ dyncom.SetVFPReg(4, test_case.a);
+ dyncom.SetVFPReg(6, test_case.b);
+ dyncom.ExecuteInstructions(1);
+ if (dyncom.GetVFPReg(2) != test_case.result ||
+ dyncom.GetVFPSystemReg(VFP_FPSCR) != test_case.final_fpscr) {
+ printf("f: %x\n", test_case.initial_fpscr);
+ printf("a: %x\n", test_case.a);
+ printf("b: %x\n", test_case.b);
+ printf("c: %x (%x)\n", dyncom.GetVFPReg(2), test_case.result);
+ printf("f: %x (%x)\n", dyncom.GetVFPSystemReg(VFP_FPSCR), test_case.final_fpscr);
+ FAIL();
+ }
+ }
+}
+
+} // namespace ArmTests \ No newline at end of file
diff --git a/src/tests/core/arm/dyncom/vfp_vadd_f32.inc b/src/tests/core/arm/dyncom/vfp_vadd_f32.inc
new file mode 100644
index 000000000..d0032c2e6
--- /dev/null
+++ b/src/tests/core/arm/dyncom/vfp_vadd_f32.inc
@@ -0,0 +1,13456 @@
+{0x3c00000, 0x0, 0x0, 0x0, 0x3c00000},
+{0x3c00000, 0x0, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x800000, 0x800000, 0x3c00000},
+{0x3c00000, 0x0, 0x800002, 0x800002, 0x3c00000},
+{0x3c00000, 0x0, 0x1398437, 0x1398437, 0x3c00000},
+{0x3c00000, 0x0, 0xba98d27, 0xba98d27, 0x3c00000},
+{0x3c00000, 0x0, 0xba98d7a, 0xba98d7a, 0x3c00000},
+{0x3c00000, 0x0, 0x751f853a, 0x751f853a, 0x3c00000},
+{0x3c00000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3c00000},
+{0x3c00000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3c00000},
+{0x3c00000, 0x0, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x0, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0x80000000, 0x0, 0x3c00000},
+{0x3c00000, 0x0, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x80800000, 0x80800000, 0x3c00000},
+{0x3c00000, 0x0, 0x80800002, 0x80800002, 0x3c00000},
+{0x3c00000, 0x0, 0x81398437, 0x81398437, 0x3c00000},
+{0x3c00000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3c00000},
+{0x3c00000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3c00000},
+{0x3c00000, 0x0, 0xf51f853a, 0xf51f853a, 0x3c00000},
+{0x3c00000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3c00000},
+{0x3c00000, 0x0, 0xff7fffff, 0xff7fffff, 0x3c00000},
+{0x3c00000, 0x0, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x0, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3c00000},
+{0x3c00000, 0x0, 0xe73a5134, 0xe73a5134, 0x3c00000},
+{0x3c00000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3c00000},
+{0x3c00000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3c00000},
+{0x3c00000, 0x0, 0x9503366, 0x9503366, 0x3c00000},
+{0x3c00000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3c00000},
+{0x3c00000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3c00000},
+{0x3c00000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3c00000},
+{0x3c00000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3c00000},
+{0x3c00000, 0x0, 0x966320b, 0x966320b, 0x3c00000},
+{0x3c00000, 0x0, 0xb26bddee, 0xb26bddee, 0x3c00000},
+{0x3c00000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00000},
+{0x3c00000, 0x0, 0x317285d3, 0x317285d3, 0x3c00000},
+{0x3c00000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3c00000},
+{0x3c00000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3c00000},
+{0x3c00000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3c00000},
+{0x3c00000, 0x1, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x1, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x1, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x1, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x1, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x1, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x1, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x1, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x1, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x1, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x1, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x1, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x1, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x1, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x1, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x1, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x1, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x1, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x76, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x76, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x76, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x76, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x76, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x76, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x76, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x76, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x76, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x76, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x76, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x76, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x76, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x76, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x76, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x76, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x76, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x76, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x76, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x2b94, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x2b94, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x2b94, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x2b94, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x2b94, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x2b94, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x2b94, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x2b94, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x2b94, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x2b94, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x636d24, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x636d24, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x636d24, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x636d24, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x636d24, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x636d24, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x636d24, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x636d24, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x636d24, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x636d24, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x800000, 0x0, 0x800000, 0x3c00000},
+{0x3c00000, 0x800000, 0x1, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x76, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x2b94, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x636d24, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x7fffff, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x800000, 0x1000000, 0x3c00000},
+{0x3c00000, 0x800000, 0x800002, 0x1000001, 0x3c00000},
+{0x3c00000, 0x800000, 0x1398437, 0x1798437, 0x3c00000},
+{0x3c00000, 0x800000, 0xba98d27, 0xba98d29, 0x3c00000},
+{0x3c00000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3c00000},
+{0x3c00000, 0x800000, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x800000, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x800000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0x80000000, 0x800000, 0x3c00000},
+{0x3c00000, 0x800000, 0x80000001, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x80000076, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x80002b94, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x80636d24, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x807fffff, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x80800000, 0x0, 0x3c00000},
+{0x3c00000, 0x800000, 0x80800002, 0x0, 0x3c00008},
+{0x3c00000, 0x800000, 0x81398437, 0x80f3086e, 0x3c00000},
+{0x3c00000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3c00000},
+{0x3c00000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3c00000},
+{0x3c00000, 0x800000, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x800000, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x800000, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x800000, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x800000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x800000, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x800000, 0x9503366, 0x95033a6, 0x3c00000},
+{0x3c00000, 0x800000, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x800000, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x800000, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0x800000, 0x966320b, 0x966324b, 0x3c00000},
+{0x3c00000, 0x800000, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0x800000, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x800002, 0x0, 0x800002, 0x3c00000},
+{0x3c00000, 0x800002, 0x1, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x76, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x2b94, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x636d24, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x7fffff, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x800000, 0x1000001, 0x3c00000},
+{0x3c00000, 0x800002, 0x800002, 0x1000002, 0x3c00000},
+{0x3c00000, 0x800002, 0x1398437, 0x1798438, 0x3c00000},
+{0x3c00000, 0x800002, 0xba98d27, 0xba98d29, 0x3c00010},
+{0x3c00000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3c00010},
+{0x3c00000, 0x800002, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x800002, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x800002, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0x80000000, 0x800002, 0x3c00000},
+{0x3c00000, 0x800002, 0x80000001, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x80000076, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x80002b94, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x80636d24, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x807fffff, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x80800000, 0x0, 0x3c00008},
+{0x3c00000, 0x800002, 0x80800002, 0x0, 0x3c00000},
+{0x3c00000, 0x800002, 0x81398437, 0x80f3086c, 0x3c00000},
+{0x3c00000, 0x800002, 0x8ba98d27, 0x8ba98d24, 0x3c00010},
+{0x3c00000, 0x800002, 0x8ba98d7a, 0x8ba98d77, 0x3c00010},
+{0x3c00000, 0x800002, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x800002, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x800002, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x800002, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x800002, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x800002, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x800002, 0x9503366, 0x95033a6, 0x3c00010},
+{0x3c00000, 0x800002, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x800002, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x800002, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0x800002, 0x966320b, 0x966324b, 0x3c00010},
+{0x3c00000, 0x800002, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0x800002, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x1398437, 0x0, 0x1398437, 0x3c00000},
+{0x3c00000, 0x1398437, 0x1, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x76, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x2b94, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x636d24, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x7fffff, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x800000, 0x1798437, 0x3c00000},
+{0x3c00000, 0x1398437, 0x800002, 0x1798438, 0x3c00000},
+{0x3c00000, 0x1398437, 0x1398437, 0x1b98437, 0x3c00000},
+{0x3c00000, 0x1398437, 0xba98d27, 0xba98d2c, 0x3c00010},
+{0x3c00000, 0x1398437, 0xba98d7a, 0xba98d7f, 0x3c00010},
+{0x3c00000, 0x1398437, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x1398437, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0x80000000, 0x1398437, 0x3c00000},
+{0x3c00000, 0x1398437, 0x80000001, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x80000076, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x80002b94, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x80636d24, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x807fffff, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x80800000, 0xf3086e, 0x3c00000},
+{0x3c00000, 0x1398437, 0x80800002, 0xf3086c, 0x3c00000},
+{0x3c00000, 0x1398437, 0x81398437, 0x0, 0x3c00000},
+{0x3c00000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3c00010},
+{0x3c00000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3c00010},
+{0x3c00000, 0x1398437, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x1398437, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x1398437, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x1398437, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x1398437, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x1398437, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x1398437, 0x9503366, 0x950341f, 0x3c00010},
+{0x3c00000, 0x1398437, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x1398437, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x1398437, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0x1398437, 0x966320b, 0x96632c4, 0x3c00010},
+{0x3c00000, 0x1398437, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0x1398437, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x0, 0xba98d27, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x1, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x76, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x2b94, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x636d24, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x800000, 0xba98d29, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x800002, 0xba98d29, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x1398437, 0xba98d2c, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3c00000},
+{0x3c00000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x80000000, 0xba98d27, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x80000001, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x80000076, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x80800000, 0xba98d25, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x80800002, 0xba98d24, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x81398437, 0xba98d21, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x8ba98d27, 0x0, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x0, 0xba98d7a, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x1, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x76, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x1398437, 0xba98d7f, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x80800002, 0xba98d77, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x0, 0x751f853a, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x1, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x76, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x2b94, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x636d24, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x800000, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x800002, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x1398437, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x7f7ffff0, 0x7f7ffff9, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x80000000, 0x751f853a, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x80000001, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x80000076, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x80800000, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x80800002, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x81398437, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x8ba98d27, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x8ba98d7a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xf51f853a, 0x0, 0x3c00000},
+{0x3c00000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xe73a5134, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x9503366, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xbf5a97c9, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xe6ff1a14, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x77f31e2f, 0x77f81a58, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xaab4d7d8, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x966320b, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xb26bddee, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xb5c8e5d3, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x751f853a, 0x7f7ffff9, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7ffff0, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x80800000, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x80800002, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x81398437, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x8ba98d27, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xe73a5134, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x7c994e9e, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x77f31e2f, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xb26bddee, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x7b906a6c, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x751f853a, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x80800000, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x80800002, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x81398437, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x8ba98d27, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x8ba98d7a, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xe73a5134, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x7c994e9e, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xbf5a97c9, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xe6ff1a14, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x77f31e2f, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0xaab4d7d8, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xb26bddee, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x7b906a6c, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f800000, 0x0, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x1, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x76, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x2b94, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x636d24, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x800002, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x1398437, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x80000000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x80000001, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x80000076, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x80800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x80800002, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x81398437, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x9503366, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x966320b, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800001, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x0, 0x0, 0x3c00000},
+{0x3c00000, 0x80000000, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x800000, 0x800000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x800002, 0x800002, 0x3c00000},
+{0x3c00000, 0x80000000, 0x1398437, 0x1398437, 0x3c00000},
+{0x3c00000, 0x80000000, 0xba98d27, 0xba98d27, 0x3c00000},
+{0x3c00000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3c00000},
+{0x3c00000, 0x80000000, 0x751f853a, 0x751f853a, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x80000000, 0x80000000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x80800000, 0x80800000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x80800002, 0x80800002, 0x3c00000},
+{0x3c00000, 0x80000000, 0x81398437, 0x81398437, 0x3c00000},
+{0x3c00000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3c00000},
+{0x3c00000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3c00000},
+{0x3c00000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3c00000},
+{0x3c00000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3c00000},
+{0x3c00000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3c00000},
+{0x3c00000, 0x80000000, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x80000000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3c00000},
+{0x3c00000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3c00000},
+{0x3c00000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3c00000},
+{0x3c00000, 0x80000000, 0x9503366, 0x9503366, 0x3c00000},
+{0x3c00000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3c00000},
+{0x3c00000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3c00000},
+{0x3c00000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3c00000},
+{0x3c00000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3c00000},
+{0x3c00000, 0x80000000, 0x966320b, 0x966320b, 0x3c00000},
+{0x3c00000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3c00000},
+{0x3c00000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00000},
+{0x3c00000, 0x80000000, 0x317285d3, 0x317285d3, 0x3c00000},
+{0x3c00000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3c00000},
+{0x3c00000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3c00000},
+{0x3c00000, 0x80000001, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x80000001, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x80000001, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x80000001, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80000001, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x80000001, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x80000001, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x80000001, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x80000001, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x80000001, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x80000076, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x80000076, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x80000076, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x80000076, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80000076, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x80000076, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x80000076, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x80000076, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x80000076, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x80000076, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x80800000, 0x0, 0x80800000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x1, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x76, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x2b94, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x636d24, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x7fffff, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x800000, 0x0, 0x3c00000},
+{0x3c00000, 0x80800000, 0x800002, 0x0, 0x3c00008},
+{0x3c00000, 0x80800000, 0x1398437, 0xf3086e, 0x3c00000},
+{0x3c00000, 0x80800000, 0xba98d27, 0xba98d25, 0x3c00000},
+{0x3c00000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3c00000},
+{0x3c00000, 0x80800000, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x80800000, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x80800000, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x80800000, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x80000000, 0x80800000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x80000001, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x80000076, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x80002b94, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x80636d24, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x807fffff, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x80800000, 0x81000000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x80800002, 0x81000001, 0x3c00000},
+{0x3c00000, 0x80800000, 0x81398437, 0x81798437, 0x3c00000},
+{0x3c00000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3c00000},
+{0x3c00000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3c00000},
+{0x3c00000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0x80800000, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x80800000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0x80800000, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x80800000, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x80800000, 0x9503366, 0x9503326, 0x3c00000},
+{0x3c00000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0x80800000, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0x80800000, 0x966320b, 0x96631cb, 0x3c00000},
+{0x3c00000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0x80800000, 0x317285d3, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x80800000, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x80800000, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x80800000, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x80800002, 0x0, 0x80800002, 0x3c00000},
+{0x3c00000, 0x80800002, 0x1, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x76, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x2b94, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x636d24, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x7fffff, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x800000, 0x0, 0x3c00008},
+{0x3c00000, 0x80800002, 0x800002, 0x0, 0x3c00000},
+{0x3c00000, 0x80800002, 0x1398437, 0xf3086c, 0x3c00000},
+{0x3c00000, 0x80800002, 0xba98d27, 0xba98d24, 0x3c00010},
+{0x3c00000, 0x80800002, 0xba98d7a, 0xba98d77, 0x3c00010},
+{0x3c00000, 0x80800002, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x80800002, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x80800002, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x80800002, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0x80000000, 0x80800002, 0x3c00000},
+{0x3c00000, 0x80800002, 0x80000001, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x80000076, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x80002b94, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x80636d24, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x807fffff, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x80800000, 0x81000001, 0x3c00000},
+{0x3c00000, 0x80800002, 0x80800002, 0x81000002, 0x3c00000},
+{0x3c00000, 0x80800002, 0x81398437, 0x81798438, 0x3c00000},
+{0x3c00000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3c00010},
+{0x3c00000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3c00010},
+{0x3c00000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0x80800002, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x80800002, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0x80800002, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x80800002, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x80800002, 0x9503366, 0x9503325, 0x3c00010},
+{0x3c00000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0x80800002, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0x80800002, 0x966320b, 0x96631ca, 0x3c00010},
+{0x3c00000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0x80800002, 0x317285d3, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x80800002, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x80800002, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x80800002, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x81398437, 0x0, 0x81398437, 0x3c00000},
+{0x3c00000, 0x81398437, 0x1, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x76, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x2b94, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x636d24, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x7fffff, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x800000, 0x80f3086e, 0x3c00000},
+{0x3c00000, 0x81398437, 0x800002, 0x80f3086c, 0x3c00000},
+{0x3c00000, 0x81398437, 0x1398437, 0x0, 0x3c00000},
+{0x3c00000, 0x81398437, 0xba98d27, 0xba98d21, 0x3c00010},
+{0x3c00000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3c00010},
+{0x3c00000, 0x81398437, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x81398437, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x81398437, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x81398437, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0x80000000, 0x81398437, 0x3c00000},
+{0x3c00000, 0x81398437, 0x80000001, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x80000076, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x80002b94, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x80636d24, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x807fffff, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x80800000, 0x81798437, 0x3c00000},
+{0x3c00000, 0x81398437, 0x80800002, 0x81798438, 0x3c00000},
+{0x3c00000, 0x81398437, 0x81398437, 0x81b98437, 0x3c00000},
+{0x3c00000, 0x81398437, 0x8ba98d27, 0x8ba98d2c, 0x3c00010},
+{0x3c00000, 0x81398437, 0x8ba98d7a, 0x8ba98d7f, 0x3c00010},
+{0x3c00000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0x81398437, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x81398437, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0x81398437, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x81398437, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x81398437, 0x9503366, 0x95032ac, 0x3c00010},
+{0x3c00000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0x81398437, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0x81398437, 0x966320b, 0x9663151, 0x3c00010},
+{0x3c00000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0x81398437, 0x317285d3, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x81398437, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x81398437, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x81398437, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x800002, 0x8ba98d24, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xba98d27, 0x0, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x81398437, 0x8ba98d2c, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x9503366, 0x8ba30b8b, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x966320b, 0x8ba25b96, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x317285d3, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x800002, 0x8ba98d77, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x81398437, 0x8ba98d7f, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x9503366, 0x8ba30bde, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x966320b, 0x8ba25be9, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x317285d3, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x0, 0xf51f853a, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x1, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x76, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x800000, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x800002, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x1398437, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xba98d27, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xba98d7a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x751f853a, 0x0, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0xff7ffff0, 0xff7ffff9, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xff7fffff, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xf51f853a, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x4f3495cb, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x7c994e9e, 0x7c994d5e, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x6164bd6c, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x9503366, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x966320b, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x317285d3, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x3c9623b1, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x51fd2c7c, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x7b906a6c, 0x7b90656f, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x800000, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x800002, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x1398437, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xba98d27, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xba98d7a, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xf51f853a, 0xff7ffff9, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xff7ffff0, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xff7ffff0, 0xff7fffff, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x4f3495cb, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x6164bd6c, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x9503366, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe09, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x966320b, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x317285d3, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x3c9623b1, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x51fd2c7c, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x0, 0xff7fffff, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x1, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x76, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x800000, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x800002, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x1398437, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xba98d27, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xba98d7a, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xf51f853a, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xff7fffff, 0xff7ffff0, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xff7fffff, 0xff7fffff, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xff7fffff, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x4f3495cb, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x6164bd6c, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x9503366, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x77f31e2f, 0xff7ffe18, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x966320b, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x317285d3, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x3c9623b1, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x51fd2c7c, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3c00010},
+{0x3c00000, 0xff800000, 0x0, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x1, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x76, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x2b94, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x636d24, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x7fffff, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x800002, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x1398437, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xba98d27, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xba98d7a, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x751f853a, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x80000000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x80000001, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x80000076, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x80002b94, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x80636d24, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x807fffff, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x80800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x80800002, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x81398437, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xf51f853a, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xff7fffff, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xe73a5134, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x9503366, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x966320b, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xb26bddee, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x317285d3, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800001, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x80800000, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x80800002, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x81398437, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x8ba98d27, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xb26bddee, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x0, 0xe73a5134, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x1, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x76, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x800000, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x800002, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x1398437, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xba98d27, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xba98d7a, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x4f3495cb, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x9503366, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x966320b, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x317285d3, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x3c9623b1, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x51fd2c7c, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7c994e9e, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x80800000, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x80800002, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x81398437, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xf51f853a, 0x7c994d5e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xe73a5134, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x77f31e2f, 0x7c998b65, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xb26bddee, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x80800000, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x80800002, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x81398437, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xb26bddee, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x9503366, 0x0, 0x9503366, 0x3c00000},
+{0x3c00000, 0x9503366, 0x1, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x76, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x2b94, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x636d24, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x7fffff, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x800000, 0x95033a6, 0x3c00000},
+{0x3c00000, 0x9503366, 0x800002, 0x95033a6, 0x3c00010},
+{0x3c00000, 0x9503366, 0x1398437, 0x950341f, 0x3c00010},
+{0x3c00000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3c00010},
+{0x3c00000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3c00010},
+{0x3c00000, 0x9503366, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x9503366, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0x80000000, 0x9503366, 0x3c00000},
+{0x3c00000, 0x9503366, 0x80000001, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x80000076, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x80002b94, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x80636d24, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x807fffff, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x80800000, 0x9503326, 0x3c00000},
+{0x3c00000, 0x9503366, 0x80800002, 0x9503325, 0x3c00010},
+{0x3c00000, 0x9503366, 0x81398437, 0x95032ac, 0x3c00010},
+{0x3c00000, 0x9503366, 0x8ba98d27, 0x8ba30b8b, 0x3c00010},
+{0x3c00000, 0x9503366, 0x8ba98d7a, 0x8ba30bde, 0x3c00010},
+{0x3c00000, 0x9503366, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x9503366, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x9503366, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x9503366, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x9503366, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x9503366, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x9503366, 0x9503366, 0x9d03366, 0x3c00000},
+{0x3c00000, 0x9503366, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x9503366, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x9503366, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0x9503366, 0x966320b, 0x9db32b8, 0x3c00010},
+{0x3c00000, 0x9503366, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0x9503366, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x800000, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x800002, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x1398437, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x9503366, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x966320b, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x800000, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x800002, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x1398437, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x9503366, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x966320b, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x751f853a, 0x77f81a58, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x77f31e2f, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x80800000, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x80800002, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x81398437, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe09, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xff7fffff, 0xff7ffe18, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xe73a5134, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x7c994e9e, 0x7c998b65, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xb26bddee, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x800000, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x800002, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x1398437, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x9503366, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x966320b, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf57, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d5, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x966320b, 0x0, 0x966320b, 0x3c00000},
+{0x3c00000, 0x966320b, 0x1, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x76, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x2b94, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x636d24, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x7fffff, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x800000, 0x966324b, 0x3c00000},
+{0x3c00000, 0x966320b, 0x800002, 0x966324b, 0x3c00010},
+{0x3c00000, 0x966320b, 0x1398437, 0x96632c4, 0x3c00010},
+{0x3c00000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3c00010},
+{0x3c00000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3c00010},
+{0x3c00000, 0x966320b, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x966320b, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0x80000000, 0x966320b, 0x3c00000},
+{0x3c00000, 0x966320b, 0x80000001, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x80000076, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x80002b94, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x80636d24, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x807fffff, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x80800000, 0x96631cb, 0x3c00000},
+{0x3c00000, 0x966320b, 0x80800002, 0x96631ca, 0x3c00010},
+{0x3c00000, 0x966320b, 0x81398437, 0x9663151, 0x3c00010},
+{0x3c00000, 0x966320b, 0x8ba98d27, 0x8ba25b96, 0x3c00010},
+{0x3c00000, 0x966320b, 0x8ba98d7a, 0x8ba25be9, 0x3c00010},
+{0x3c00000, 0x966320b, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x966320b, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x966320b, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x966320b, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x966320b, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x966320b, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x966320b, 0x9503366, 0x9db32b8, 0x3c00010},
+{0x3c00000, 0x966320b, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x966320b, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x966320b, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0x966320b, 0x966320b, 0x9e6320b, 0x3c00000},
+{0x3c00000, 0x966320b, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0x966320b, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x0, 0xb26bddee, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x1, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x76, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x800000, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x800002, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x1398437, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xba98d27, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xba98d7a, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x9503366, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf57, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x966320b, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8e, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x3c9623b1, 0x3c9623a9, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d5, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8e, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x0, 0x317285d3, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x1, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x76, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x2b94, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x636d24, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x800000, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x800002, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x1398437, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x80000000, 0x317285d3, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x80000001, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x80000076, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x80800000, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x80800002, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x81398437, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x8ba98d27, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x8ba98d7a, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x9503366, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x966320b, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x3c9623b1, 0x3c9623b2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x80800000, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x80800002, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x81398437, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xb26bddee, 0x3c9623a9, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x317285d3, 0x3c9623b2, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x80800000, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x80800002, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x81398437, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7b906a6c, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x80800000, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x80800002, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x81398437, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xf51f853a, 0x7b90656f, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xe73a5134, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xb26bddee, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3c00000},
+{0x3800000, 0x0, 0x0, 0x0, 0x3800000},
+{0x3800000, 0x0, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x800000, 0x800000, 0x3800000},
+{0x3800000, 0x0, 0x800002, 0x800002, 0x3800000},
+{0x3800000, 0x0, 0x1398437, 0x1398437, 0x3800000},
+{0x3800000, 0x0, 0xba98d27, 0xba98d27, 0x3800000},
+{0x3800000, 0x0, 0xba98d7a, 0xba98d7a, 0x3800000},
+{0x3800000, 0x0, 0x751f853a, 0x751f853a, 0x3800000},
+{0x3800000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3800000},
+{0x3800000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3800000},
+{0x3800000, 0x0, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x0, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0x80000000, 0x80000000, 0x3800000},
+{0x3800000, 0x0, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x80800000, 0x80800000, 0x3800000},
+{0x3800000, 0x0, 0x80800002, 0x80800002, 0x3800000},
+{0x3800000, 0x0, 0x81398437, 0x81398437, 0x3800000},
+{0x3800000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3800000},
+{0x3800000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3800000},
+{0x3800000, 0x0, 0xf51f853a, 0xf51f853a, 0x3800000},
+{0x3800000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3800000},
+{0x3800000, 0x0, 0xff7fffff, 0xff7fffff, 0x3800000},
+{0x3800000, 0x0, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x0, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3800000},
+{0x3800000, 0x0, 0xe73a5134, 0xe73a5134, 0x3800000},
+{0x3800000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3800000},
+{0x3800000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3800000},
+{0x3800000, 0x0, 0x9503366, 0x9503366, 0x3800000},
+{0x3800000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3800000},
+{0x3800000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3800000},
+{0x3800000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3800000},
+{0x3800000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3800000},
+{0x3800000, 0x0, 0x966320b, 0x966320b, 0x3800000},
+{0x3800000, 0x0, 0xb26bddee, 0xb26bddee, 0x3800000},
+{0x3800000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800000},
+{0x3800000, 0x0, 0x317285d3, 0x317285d3, 0x3800000},
+{0x3800000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3800000},
+{0x3800000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3800000},
+{0x3800000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3800000},
+{0x3800000, 0x1, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x1, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x1, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x1, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x1, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x1, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x1, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x1, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x1, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x1, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x1, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x1, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x1, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x1, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x1, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x1, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x1, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x1, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x1, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x1, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x76, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x76, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x76, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x76, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x76, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x76, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x76, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x76, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x76, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x76, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x76, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x76, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x76, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x76, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x76, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x76, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x76, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x76, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x76, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x76, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x2b94, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x2b94, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x2b94, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x2b94, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x2b94, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x2b94, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x2b94, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x2b94, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x2b94, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x2b94, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x2b94, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x2b94, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x2b94, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x2b94, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x636d24, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x636d24, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x636d24, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x636d24, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x636d24, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x636d24, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x636d24, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x636d24, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x636d24, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x636d24, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x636d24, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x636d24, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x636d24, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x636d24, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7fffff, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x7fffff, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x7fffff, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x7fffff, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x7fffff, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x7fffff, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x7fffff, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x7fffff, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x7fffff, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x800000, 0x0, 0x800000, 0x3800000},
+{0x3800000, 0x800000, 0x1, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x76, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x2b94, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x636d24, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x7fffff, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x800000, 0x1000000, 0x3800000},
+{0x3800000, 0x800000, 0x800002, 0x1000001, 0x3800000},
+{0x3800000, 0x800000, 0x1398437, 0x1798437, 0x3800000},
+{0x3800000, 0x800000, 0xba98d27, 0xba98d29, 0x3800000},
+{0x3800000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3800000},
+{0x3800000, 0x800000, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x800000, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x800000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0x80000000, 0x800000, 0x3800000},
+{0x3800000, 0x800000, 0x80000001, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x80000076, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x80002b94, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x80636d24, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x807fffff, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x80800000, 0x80000000, 0x3800000},
+{0x3800000, 0x800000, 0x80800002, 0x0, 0x3800008},
+{0x3800000, 0x800000, 0x81398437, 0x80f3086e, 0x3800000},
+{0x3800000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3800000},
+{0x3800000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3800000},
+{0x3800000, 0x800000, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x800000, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x800000, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x800000, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x800000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x800000, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x800000, 0x9503366, 0x95033a6, 0x3800000},
+{0x3800000, 0x800000, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x800000, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x800000, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0x800000, 0x966320b, 0x966324b, 0x3800000},
+{0x3800000, 0x800000, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0x800000, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x800002, 0x0, 0x800002, 0x3800000},
+{0x3800000, 0x800002, 0x1, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x76, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x2b94, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x636d24, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x7fffff, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x800000, 0x1000001, 0x3800000},
+{0x3800000, 0x800002, 0x800002, 0x1000002, 0x3800000},
+{0x3800000, 0x800002, 0x1398437, 0x1798438, 0x3800000},
+{0x3800000, 0x800002, 0xba98d27, 0xba98d29, 0x3800010},
+{0x3800000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3800010},
+{0x3800000, 0x800002, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x800002, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x800002, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0x80000000, 0x800002, 0x3800000},
+{0x3800000, 0x800002, 0x80000001, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x80000076, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x80002b94, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x80636d24, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x807fffff, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x80800000, 0x0, 0x3800008},
+{0x3800000, 0x800002, 0x80800002, 0x80000000, 0x3800000},
+{0x3800000, 0x800002, 0x81398437, 0x80f3086c, 0x3800000},
+{0x3800000, 0x800002, 0x8ba98d27, 0x8ba98d25, 0x3800010},
+{0x3800000, 0x800002, 0x8ba98d7a, 0x8ba98d78, 0x3800010},
+{0x3800000, 0x800002, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x800002, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x800002, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x800002, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x800002, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x800002, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x800002, 0x9503366, 0x95033a6, 0x3800010},
+{0x3800000, 0x800002, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x800002, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x800002, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0x800002, 0x966320b, 0x966324b, 0x3800010},
+{0x3800000, 0x800002, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0x800002, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x1398437, 0x0, 0x1398437, 0x3800000},
+{0x3800000, 0x1398437, 0x1, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x76, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x2b94, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x636d24, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x7fffff, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x800000, 0x1798437, 0x3800000},
+{0x3800000, 0x1398437, 0x800002, 0x1798438, 0x3800000},
+{0x3800000, 0x1398437, 0x1398437, 0x1b98437, 0x3800000},
+{0x3800000, 0x1398437, 0xba98d27, 0xba98d2c, 0x3800010},
+{0x3800000, 0x1398437, 0xba98d7a, 0xba98d7f, 0x3800010},
+{0x3800000, 0x1398437, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x1398437, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0x80000000, 0x1398437, 0x3800000},
+{0x3800000, 0x1398437, 0x80000001, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x80000076, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x80002b94, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x80636d24, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x807fffff, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x80800000, 0xf3086e, 0x3800000},
+{0x3800000, 0x1398437, 0x80800002, 0xf3086c, 0x3800000},
+{0x3800000, 0x1398437, 0x81398437, 0x80000000, 0x3800000},
+{0x3800000, 0x1398437, 0x8ba98d27, 0x8ba98d22, 0x3800010},
+{0x3800000, 0x1398437, 0x8ba98d7a, 0x8ba98d75, 0x3800010},
+{0x3800000, 0x1398437, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x1398437, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x1398437, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x1398437, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x1398437, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x1398437, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x1398437, 0x9503366, 0x950341f, 0x3800010},
+{0x3800000, 0x1398437, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x1398437, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x1398437, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0x1398437, 0x966320b, 0x96632c4, 0x3800010},
+{0x3800000, 0x1398437, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0x1398437, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0xba98d27, 0x0, 0xba98d27, 0x3800000},
+{0x3800000, 0xba98d27, 0x1, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x76, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x2b94, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x636d24, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x800000, 0xba98d29, 0x3800000},
+{0x3800000, 0xba98d27, 0x800002, 0xba98d29, 0x3800010},
+{0x3800000, 0xba98d27, 0x1398437, 0xba98d2c, 0x3800010},
+{0x3800000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3800000},
+{0x3800000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3800010},
+{0x3800000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0x80000000, 0xba98d27, 0x3800000},
+{0x3800000, 0xba98d27, 0x80000001, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x80000076, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x80800000, 0xba98d25, 0x3800000},
+{0x3800000, 0xba98d27, 0x80800002, 0xba98d24, 0x3800010},
+{0x3800000, 0xba98d27, 0x81398437, 0xba98d21, 0x3800010},
+{0x3800000, 0xba98d27, 0x8ba98d27, 0x80000000, 0x3800000},
+{0x3800000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3800000},
+{0x3800000, 0xba98d27, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0xba98d27, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xba98d27, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0xba98d27, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0xba98d27, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3800010},
+{0x3800000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3800010},
+{0x3800000, 0xba98d27, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0xba98d7a, 0x0, 0xba98d7a, 0x3800000},
+{0x3800000, 0xba98d7a, 0x1, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x76, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3800000},
+{0x3800000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3800010},
+{0x3800000, 0xba98d7a, 0x1398437, 0xba98d7f, 0x3800010},
+{0x3800000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3800010},
+{0x3800000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3800000},
+{0x3800000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3800000},
+{0x3800000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3800000},
+{0x3800000, 0xba98d7a, 0x80800002, 0xba98d77, 0x3800010},
+{0x3800000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3800010},
+{0x3800000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x8ba98d7a, 0x80000000, 0x3800000},
+{0x3800000, 0xba98d7a, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0xba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xba98d7a, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0xba98d7a, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0xba98d7a, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3800010},
+{0x3800000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3800010},
+{0x3800000, 0xba98d7a, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x751f853a, 0x0, 0x751f853a, 0x3800000},
+{0x3800000, 0x751f853a, 0x1, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x76, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x2b94, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x636d24, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x800000, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x800002, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x1398437, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3800000},
+{0x3800000, 0x751f853a, 0x7f7ffff0, 0x7f7ffff9, 0x3800010},
+{0x3800000, 0x751f853a, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0x80000000, 0x751f853a, 0x3800000},
+{0x3800000, 0x751f853a, 0x80000001, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x80000076, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x80800000, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x80800002, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x81398437, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x8ba98d27, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x8ba98d7a, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0xf51f853a, 0x80000000, 0x3800000},
+{0x3800000, 0x751f853a, 0xff7ffff0, 0xff7fffe7, 0x3800010},
+{0x3800000, 0x751f853a, 0xff7fffff, 0xff7ffff6, 0x3800010},
+{0x3800000, 0x751f853a, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0xe73a5134, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3800010},
+{0x3800000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x9503366, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0xbf5a97c9, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0xe6ff1a14, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x77f31e2f, 0x77f81a58, 0x3800010},
+{0x3800000, 0x751f853a, 0xaab4d7d8, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x966320b, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0xb26bddee, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0xb5c8e5d3, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x751f853a, 0x7f7ffff9, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7ffff0, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x80800000, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x80800002, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x81398437, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x8ba98d27, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xff7ffff0, 0x80000000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xe73a5134, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x7c994e9e, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x77f31e2f, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xb26bddee, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x7b906a6c, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x751f853a, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x80800000, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x80800002, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x81398437, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x8ba98d27, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x8ba98d7a, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0xff7fffff, 0x80000000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xe73a5134, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x7c994e9e, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xbf5a97c9, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xe6ff1a14, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x77f31e2f, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0xaab4d7d8, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xb26bddee, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x7b906a6c, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f800000, 0x0, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x1, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x76, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x2b94, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x636d24, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x800002, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x1398437, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0x80000000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x80000001, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x80000076, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x80800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x80800002, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x81398437, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x9503366, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x966320b, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800001, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0x0, 0x80000000, 0x3800000},
+{0x3800000, 0x80000000, 0x1, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x76, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x2b94, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x636d24, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x7fffff, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x800000, 0x800000, 0x3800000},
+{0x3800000, 0x80000000, 0x800002, 0x800002, 0x3800000},
+{0x3800000, 0x80000000, 0x1398437, 0x1398437, 0x3800000},
+{0x3800000, 0x80000000, 0xba98d27, 0xba98d27, 0x3800000},
+{0x3800000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3800000},
+{0x3800000, 0x80000000, 0x751f853a, 0x751f853a, 0x3800000},
+{0x3800000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3800000},
+{0x3800000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3800000},
+{0x3800000, 0x80000000, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0x80000000, 0x80000000, 0x3800000},
+{0x3800000, 0x80000000, 0x80000001, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x80000076, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x80002b94, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x80636d24, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x807fffff, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x80800000, 0x80800000, 0x3800000},
+{0x3800000, 0x80000000, 0x80800002, 0x80800002, 0x3800000},
+{0x3800000, 0x80000000, 0x81398437, 0x81398437, 0x3800000},
+{0x3800000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3800000},
+{0x3800000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3800000},
+{0x3800000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3800000},
+{0x3800000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3800000},
+{0x3800000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3800000},
+{0x3800000, 0x80000000, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x80000000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3800000},
+{0x3800000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3800000},
+{0x3800000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3800000},
+{0x3800000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3800000},
+{0x3800000, 0x80000000, 0x9503366, 0x9503366, 0x3800000},
+{0x3800000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3800000},
+{0x3800000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3800000},
+{0x3800000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3800000},
+{0x3800000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3800000},
+{0x3800000, 0x80000000, 0x966320b, 0x966320b, 0x3800000},
+{0x3800000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3800000},
+{0x3800000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800000},
+{0x3800000, 0x80000000, 0x317285d3, 0x317285d3, 0x3800000},
+{0x3800000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3800000},
+{0x3800000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3800000},
+{0x3800000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3800000},
+{0x3800000, 0x80000001, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x80000001, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x80000001, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x80000001, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x80000001, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x80000001, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x80000001, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x80000001, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x80000001, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x80000001, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x80000001, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x80000001, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x80000001, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x80000001, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x80000076, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x80000076, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x80000076, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x80000076, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x80000076, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x80000076, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x80000076, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x80000076, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x80000076, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x80000076, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x80000076, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x80000076, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x80000076, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x80000076, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x80002b94, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x80002b94, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x80002b94, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x80002b94, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x80002b94, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x80002b94, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x80002b94, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x80002b94, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x80002b94, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x80636d24, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x80636d24, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x80636d24, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x80636d24, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x80636d24, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x80636d24, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x80636d24, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x80636d24, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x80636d24, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x807fffff, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x807fffff, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x807fffff, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x807fffff, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x807fffff, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x807fffff, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x807fffff, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x807fffff, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x807fffff, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x80800000, 0x0, 0x80800000, 0x3800000},
+{0x3800000, 0x80800000, 0x1, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x76, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x2b94, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x636d24, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x7fffff, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x800000, 0x80000000, 0x3800000},
+{0x3800000, 0x80800000, 0x800002, 0x0, 0x3800008},
+{0x3800000, 0x80800000, 0x1398437, 0xf3086e, 0x3800000},
+{0x3800000, 0x80800000, 0xba98d27, 0xba98d25, 0x3800000},
+{0x3800000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3800000},
+{0x3800000, 0x80800000, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0x80800000, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x80800000, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x80800000, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0x80000000, 0x80800000, 0x3800000},
+{0x3800000, 0x80800000, 0x80000001, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x80000076, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x80002b94, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x80636d24, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x807fffff, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x80800000, 0x81000000, 0x3800000},
+{0x3800000, 0x80800000, 0x80800002, 0x81000001, 0x3800000},
+{0x3800000, 0x80800000, 0x81398437, 0x81798437, 0x3800000},
+{0x3800000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3800000},
+{0x3800000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3800000},
+{0x3800000, 0x80800000, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0x80800000, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0x80800000, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0x80800000, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x80800000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x80800000, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0x80800000, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x80800000, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x80800000, 0x9503366, 0x9503326, 0x3800000},
+{0x3800000, 0x80800000, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0x80800000, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0x80800000, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x80800000, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0x80800000, 0x966320b, 0x96631cb, 0x3800000},
+{0x3800000, 0x80800000, 0xb26bddee, 0xb26bddef, 0x3800010},
+{0x3800000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0x80800000, 0x317285d3, 0x317285d2, 0x3800010},
+{0x3800000, 0x80800000, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x80800000, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x80800000, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x80800002, 0x0, 0x80800002, 0x3800000},
+{0x3800000, 0x80800002, 0x1, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x76, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x2b94, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x636d24, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x7fffff, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x800000, 0x0, 0x3800008},
+{0x3800000, 0x80800002, 0x800002, 0x80000000, 0x3800000},
+{0x3800000, 0x80800002, 0x1398437, 0xf3086c, 0x3800000},
+{0x3800000, 0x80800002, 0xba98d27, 0xba98d24, 0x3800010},
+{0x3800000, 0x80800002, 0xba98d7a, 0xba98d77, 0x3800010},
+{0x3800000, 0x80800002, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0x80800002, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x80800002, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x80800002, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0x80000000, 0x80800002, 0x3800000},
+{0x3800000, 0x80800002, 0x80000001, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x80000076, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x80002b94, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x80636d24, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x807fffff, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x80800000, 0x81000001, 0x3800000},
+{0x3800000, 0x80800002, 0x80800002, 0x81000002, 0x3800000},
+{0x3800000, 0x80800002, 0x81398437, 0x81798438, 0x3800000},
+{0x3800000, 0x80800002, 0x8ba98d27, 0x8ba98d2a, 0x3800010},
+{0x3800000, 0x80800002, 0x8ba98d7a, 0x8ba98d7d, 0x3800010},
+{0x3800000, 0x80800002, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0x80800002, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0x80800002, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0x80800002, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x80800002, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x80800002, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0x80800002, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x80800002, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x80800002, 0x9503366, 0x9503325, 0x3800010},
+{0x3800000, 0x80800002, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0x80800002, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0x80800002, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x80800002, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0x80800002, 0x966320b, 0x96631ca, 0x3800010},
+{0x3800000, 0x80800002, 0xb26bddee, 0xb26bddef, 0x3800010},
+{0x3800000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0x80800002, 0x317285d3, 0x317285d2, 0x3800010},
+{0x3800000, 0x80800002, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x80800002, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x80800002, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x81398437, 0x0, 0x81398437, 0x3800000},
+{0x3800000, 0x81398437, 0x1, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x76, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x2b94, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x636d24, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x7fffff, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x800000, 0x80f3086e, 0x3800000},
+{0x3800000, 0x81398437, 0x800002, 0x80f3086c, 0x3800000},
+{0x3800000, 0x81398437, 0x1398437, 0x80000000, 0x3800000},
+{0x3800000, 0x81398437, 0xba98d27, 0xba98d21, 0x3800010},
+{0x3800000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3800010},
+{0x3800000, 0x81398437, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0x81398437, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x81398437, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x81398437, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0x80000000, 0x81398437, 0x3800000},
+{0x3800000, 0x81398437, 0x80000001, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x80000076, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x80002b94, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x80636d24, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x807fffff, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x80800000, 0x81798437, 0x3800000},
+{0x3800000, 0x81398437, 0x80800002, 0x81798438, 0x3800000},
+{0x3800000, 0x81398437, 0x81398437, 0x81b98437, 0x3800000},
+{0x3800000, 0x81398437, 0x8ba98d27, 0x8ba98d2d, 0x3800010},
+{0x3800000, 0x81398437, 0x8ba98d7a, 0x8ba98d80, 0x3800010},
+{0x3800000, 0x81398437, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0x81398437, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0x81398437, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0x81398437, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x81398437, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x81398437, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0x81398437, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x81398437, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x81398437, 0x9503366, 0x95032ac, 0x3800010},
+{0x3800000, 0x81398437, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0x81398437, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0x81398437, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x81398437, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0x81398437, 0x966320b, 0x9663151, 0x3800010},
+{0x3800000, 0x81398437, 0xb26bddee, 0xb26bddef, 0x3800010},
+{0x3800000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0x81398437, 0x317285d3, 0x317285d2, 0x3800010},
+{0x3800000, 0x81398437, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x81398437, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x81398437, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x800002, 0x8ba98d25, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x1398437, 0x8ba98d22, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xba98d27, 0x80000000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x80800002, 0x8ba98d2a, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x81398437, 0x8ba98d2d, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d51, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x9503366, 0x8ba30b8c, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x966320b, 0x8ba25b97, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xb26bddee, 0xb26bddef, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x317285d3, 0x317285d2, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x800002, 0x8ba98d78, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x1398437, 0x8ba98d75, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0xba98d7a, 0x80000000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x80800002, 0x8ba98d7d, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x81398437, 0x8ba98d80, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d51, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x9503366, 0x8ba30bdf, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x966320b, 0x8ba25bea, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xb26bddee, 0xb26bddef, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x317285d3, 0x317285d2, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x0, 0xf51f853a, 0x3800000},
+{0x3800000, 0xf51f853a, 0x1, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x76, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x800000, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x800002, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x1398437, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0xba98d27, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0xba98d7a, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x751f853a, 0x80000000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3800010},
+{0x3800000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3800010},
+{0x3800000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3800000},
+{0x3800000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x80800000, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x80800002, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x81398437, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x8ba98d27, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x8ba98d7a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3800000},
+{0x3800000, 0xf51f853a, 0xff7ffff0, 0xff7ffffa, 0x3800010},
+{0x3800000, 0xf51f853a, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xf51f853a, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x4f3495cb, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0xe73a5134, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x7c994e9e, 0x7c994d5e, 0x3800010},
+{0x3800000, 0xf51f853a, 0x6164bd6c, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x9503366, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0xbf5a97c9, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0xe6ff1a14, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3800010},
+{0x3800000, 0xf51f853a, 0xaab4d7d8, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x966320b, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0xb26bddee, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x317285d3, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x3c9623b1, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x51fd2c7c, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x7b906a6c, 0x7b90656f, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x800000, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x800002, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x1398437, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xba98d27, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xba98d7a, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x751f853a, 0xff7fffe7, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x7f7ffff0, 0x80000000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x80800000, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x80800002, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x81398437, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xf51f853a, 0xff7ffffa, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xff7ffff0, 0xff800000, 0x3800014},
+{0x3800000, 0xff7ffff0, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x4f3495cb, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xe73a5134, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x7c994e9e, 0xff7b357c, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x6164bd6c, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x9503366, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe0a, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x966320b, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xb26bddee, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x317285d3, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x3c9623b1, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x51fd2c7c, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1c, 0x3800010},
+{0x3800000, 0xff7fffff, 0x0, 0xff7fffff, 0x3800000},
+{0x3800000, 0xff7fffff, 0x1, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x76, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x800000, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x800002, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x1398437, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0xba98d27, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0xba98d7a, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x751f853a, 0xff7ffff6, 0x3800010},
+{0x3800000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x7f7fffff, 0x80000000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3800000},
+{0x3800000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x80800000, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x80800002, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x81398437, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x8ba98d27, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x8ba98d7a, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xf51f853a, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xff7ffff0, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x4f3495cb, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0xe73a5134, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x7c994e9e, 0xff7b358b, 0x3800010},
+{0x3800000, 0xff7fffff, 0x6164bd6c, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x9503366, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0xbf5a97c9, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xe6ff1a14, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x77f31e2f, 0xff7ffe19, 0x3800010},
+{0x3800000, 0xff7fffff, 0xaab4d7d8, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x966320b, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0xb26bddee, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xb5c8e5d3, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x317285d3, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x3c9623b1, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x51fd2c7c, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x7b906a6c, 0xff7edf2b, 0x3800010},
+{0x3800000, 0xff800000, 0x0, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x1, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x76, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x2b94, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x636d24, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x7fffff, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x800000, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x800002, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x1398437, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xba98d27, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xba98d7a, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x751f853a, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0x80000000, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x80000001, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x80000076, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x80002b94, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x80636d24, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x807fffff, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x80800000, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x80800002, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x81398437, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xf51f853a, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xff7fffff, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xe73a5134, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x9503366, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x966320b, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xb26bddee, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x317285d3, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3800000},
+{0x3800000, 0xff800001, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x80800000, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x80800002, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x81398437, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x8ba98d27, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3800000},
+{0x3800000, 0x4f3495cb, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xb26bddee, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0xe73a5134, 0x0, 0xe73a5134, 0x3800000},
+{0x3800000, 0xe73a5134, 0x1, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x76, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x800000, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x800002, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x1398437, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0xba98d27, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0xba98d7a, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xe73a5134, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xe73a5134, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3800000},
+{0x3800000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x80800000, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x80800002, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x81398437, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x8ba98d27, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x8ba98d7a, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xe73a5134, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xe73a5134, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xe73a5134, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0x4f3495cb, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3800000},
+{0x3800000, 0xe73a5134, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xe73a5134, 0x6164bd6c, 0xe73a42e9, 0x3800010},
+{0x3800000, 0xe73a5134, 0x9503366, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0xbf5a97c9, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3800000},
+{0x3800000, 0xe73a5134, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xe73a5134, 0xaab4d7d8, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x966320b, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0xb26bddee, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x317285d3, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x3c9623b1, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x51fd2c7c, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7c994e9e, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x80800000, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x80800002, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x81398437, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xf51f853a, 0x7c994d5e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xff7ffff0, 0xff7b357c, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xff7fffff, 0xff7b358b, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xe73a5134, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x77f31e2f, 0x7c998b65, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xb26bddee, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x80800000, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x80800002, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x81398437, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xe73a5134, 0xe73a42e9, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7d, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xb26bddee, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x9503366, 0x0, 0x9503366, 0x3800000},
+{0x3800000, 0x9503366, 0x1, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x76, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x2b94, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x636d24, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x7fffff, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x800000, 0x95033a6, 0x3800000},
+{0x3800000, 0x9503366, 0x800002, 0x95033a6, 0x3800010},
+{0x3800000, 0x9503366, 0x1398437, 0x950341f, 0x3800010},
+{0x3800000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3800010},
+{0x3800000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3800010},
+{0x3800000, 0x9503366, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x9503366, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0x80000000, 0x9503366, 0x3800000},
+{0x3800000, 0x9503366, 0x80000001, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x80000076, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x80002b94, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x80636d24, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x807fffff, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x80800000, 0x9503326, 0x3800000},
+{0x3800000, 0x9503366, 0x80800002, 0x9503325, 0x3800010},
+{0x3800000, 0x9503366, 0x81398437, 0x95032ac, 0x3800010},
+{0x3800000, 0x9503366, 0x8ba98d27, 0x8ba30b8c, 0x3800010},
+{0x3800000, 0x9503366, 0x8ba98d7a, 0x8ba30bdf, 0x3800010},
+{0x3800000, 0x9503366, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x9503366, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x9503366, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x9503366, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x9503366, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x9503366, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x9503366, 0x9503366, 0x9d03366, 0x3800000},
+{0x3800000, 0x9503366, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x9503366, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x9503366, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0x9503366, 0x966320b, 0x9db32b8, 0x3800010},
+{0x3800000, 0x9503366, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0x9503366, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x800000, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x800002, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x1398437, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x80800000, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x80800002, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x81398437, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x9503366, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x966320b, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e3, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ac, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x800000, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x800002, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x1398437, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x80800000, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x80800002, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x81398437, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7d, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x9503366, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x966320b, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x751f853a, 0x77f81a58, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x77f31e2f, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x80800000, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x80800002, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x81398437, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe0a, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xff7fffff, 0xff7ffe19, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xe73a5134, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x7c994e9e, 0x7c998b65, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3800000},
+{0x3800000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xb26bddee, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x800000, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x800002, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x1398437, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x80800000, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x80800002, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x81398437, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x9503366, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x966320b, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf58, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d6, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x966320b, 0x0, 0x966320b, 0x3800000},
+{0x3800000, 0x966320b, 0x1, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x76, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x2b94, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x636d24, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x7fffff, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x800000, 0x966324b, 0x3800000},
+{0x3800000, 0x966320b, 0x800002, 0x966324b, 0x3800010},
+{0x3800000, 0x966320b, 0x1398437, 0x96632c4, 0x3800010},
+{0x3800000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3800010},
+{0x3800000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3800010},
+{0x3800000, 0x966320b, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x966320b, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0x80000000, 0x966320b, 0x3800000},
+{0x3800000, 0x966320b, 0x80000001, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x80000076, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x80002b94, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x80636d24, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x807fffff, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x80800000, 0x96631cb, 0x3800000},
+{0x3800000, 0x966320b, 0x80800002, 0x96631ca, 0x3800010},
+{0x3800000, 0x966320b, 0x81398437, 0x9663151, 0x3800010},
+{0x3800000, 0x966320b, 0x8ba98d27, 0x8ba25b97, 0x3800010},
+{0x3800000, 0x966320b, 0x8ba98d7a, 0x8ba25bea, 0x3800010},
+{0x3800000, 0x966320b, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x966320b, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x966320b, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x966320b, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x966320b, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x966320b, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x966320b, 0x9503366, 0x9db32b8, 0x3800010},
+{0x3800000, 0x966320b, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x966320b, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x966320b, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0x966320b, 0x966320b, 0x9e6320b, 0x3800000},
+{0x3800000, 0x966320b, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0x966320b, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0xb26bddee, 0x0, 0xb26bddee, 0x3800000},
+{0x3800000, 0xb26bddee, 0x1, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x76, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x800000, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0x800002, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0x1398437, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0xba98d27, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0xba98d7a, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xb26bddee, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xb26bddee, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3800000},
+{0x3800000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x80800000, 0xb26bddef, 0x3800010},
+{0x3800000, 0xb26bddee, 0x80800002, 0xb26bddef, 0x3800010},
+{0x3800000, 0xb26bddee, 0x81398437, 0xb26bddef, 0x3800010},
+{0x3800000, 0xb26bddee, 0x8ba98d27, 0xb26bddef, 0x3800010},
+{0x3800000, 0xb26bddee, 0x8ba98d7a, 0xb26bddef, 0x3800010},
+{0x3800000, 0xb26bddee, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xb26bddee, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xb26bddee, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xb26bddee, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0xb26bddee, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0xb26bddee, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xb26bddee, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0xb26bddee, 0x9503366, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xb26bddee, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf58, 0x3800010},
+{0x3800000, 0xb26bddee, 0x966320b, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3800000},
+{0x3800000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8f, 0x3800010},
+{0x3800000, 0xb26bddee, 0x317285d3, 0xb22f3c7a, 0x3800010},
+{0x3800000, 0xb26bddee, 0x3c9623b1, 0x3c9623a9, 0x3800010},
+{0x3800000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0xb26bddee, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d6, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8f, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c91, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x317285d3, 0x0, 0x317285d3, 0x3800000},
+{0x3800000, 0x317285d3, 0x1, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x76, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x2b94, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x636d24, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x800000, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0x800002, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0x1398437, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0x80000000, 0x317285d3, 0x3800000},
+{0x3800000, 0x317285d3, 0x80000001, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x80000076, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x80800000, 0x317285d2, 0x3800010},
+{0x3800000, 0x317285d3, 0x80800002, 0x317285d2, 0x3800010},
+{0x3800000, 0x317285d3, 0x81398437, 0x317285d2, 0x3800010},
+{0x3800000, 0x317285d3, 0x8ba98d27, 0x317285d2, 0x3800010},
+{0x3800000, 0x317285d3, 0x8ba98d7a, 0x317285d2, 0x3800010},
+{0x3800000, 0x317285d3, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x317285d3, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x317285d3, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x317285d3, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x317285d3, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x317285d3, 0x9503366, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3800010},
+{0x3800000, 0x317285d3, 0x966320b, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0xb26bddee, 0xb22f3c7a, 0x3800010},
+{0x3800000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c91, 0x3800010},
+{0x3800000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3800000},
+{0x3800000, 0x317285d3, 0x3c9623b1, 0x3c9623b2, 0x3800010},
+{0x3800000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x80800000, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x80800002, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x81398437, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ac, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xb26bddee, 0x3c9623a9, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x317285d3, 0x3c9623b2, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x80800000, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x80800002, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x81398437, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7b906a6c, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x80800000, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x80800002, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x81398437, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xf51f853a, 0x7b90656f, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xff7fffff, 0xff7edf2b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xe73a5134, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xb26bddee, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3800000},
+{0x3400000, 0x0, 0x0, 0x0, 0x3400000},
+{0x3400000, 0x0, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x800000, 0x800000, 0x3400000},
+{0x3400000, 0x0, 0x800002, 0x800002, 0x3400000},
+{0x3400000, 0x0, 0x1398437, 0x1398437, 0x3400000},
+{0x3400000, 0x0, 0xba98d27, 0xba98d27, 0x3400000},
+{0x3400000, 0x0, 0xba98d7a, 0xba98d7a, 0x3400000},
+{0x3400000, 0x0, 0x751f853a, 0x751f853a, 0x3400000},
+{0x3400000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3400000},
+{0x3400000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3400000},
+{0x3400000, 0x0, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x0, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0x80000000, 0x0, 0x3400000},
+{0x3400000, 0x0, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x80800000, 0x80800000, 0x3400000},
+{0x3400000, 0x0, 0x80800002, 0x80800002, 0x3400000},
+{0x3400000, 0x0, 0x81398437, 0x81398437, 0x3400000},
+{0x3400000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3400000},
+{0x3400000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3400000},
+{0x3400000, 0x0, 0xf51f853a, 0xf51f853a, 0x3400000},
+{0x3400000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3400000},
+{0x3400000, 0x0, 0xff7fffff, 0xff7fffff, 0x3400000},
+{0x3400000, 0x0, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x0, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3400000},
+{0x3400000, 0x0, 0xe73a5134, 0xe73a5134, 0x3400000},
+{0x3400000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3400000},
+{0x3400000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3400000},
+{0x3400000, 0x0, 0x9503366, 0x9503366, 0x3400000},
+{0x3400000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3400000},
+{0x3400000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3400000},
+{0x3400000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3400000},
+{0x3400000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3400000},
+{0x3400000, 0x0, 0x966320b, 0x966320b, 0x3400000},
+{0x3400000, 0x0, 0xb26bddee, 0xb26bddee, 0x3400000},
+{0x3400000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400000},
+{0x3400000, 0x0, 0x317285d3, 0x317285d3, 0x3400000},
+{0x3400000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3400000},
+{0x3400000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3400000},
+{0x3400000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3400000},
+{0x3400000, 0x1, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x1, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x1, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x1, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x1, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x1, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x1, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x1, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x1, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x1, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x1, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x1, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x1, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x1, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x1, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x1, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x1, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x1, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x1, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x76, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x76, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x76, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x76, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x76, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x76, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x76, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x76, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x76, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x76, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x76, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x76, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x76, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x76, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x76, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x76, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x76, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x76, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x76, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x2b94, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x2b94, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x2b94, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x2b94, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x2b94, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x2b94, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x2b94, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x2b94, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x2b94, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x2b94, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x2b94, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x2b94, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x2b94, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x636d24, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x636d24, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x636d24, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x636d24, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x636d24, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x636d24, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x636d24, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x636d24, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x636d24, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x636d24, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x636d24, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x636d24, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x636d24, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7fffff, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x7fffff, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x7fffff, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x7fffff, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x7fffff, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x7fffff, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x7fffff, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x7fffff, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x800000, 0x0, 0x800000, 0x3400000},
+{0x3400000, 0x800000, 0x1, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x76, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x2b94, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x636d24, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x7fffff, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x800000, 0x1000000, 0x3400000},
+{0x3400000, 0x800000, 0x800002, 0x1000001, 0x3400000},
+{0x3400000, 0x800000, 0x1398437, 0x1798437, 0x3400000},
+{0x3400000, 0x800000, 0xba98d27, 0xba98d29, 0x3400000},
+{0x3400000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3400000},
+{0x3400000, 0x800000, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x800000, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x800000, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x800000, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x800000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0x80000000, 0x800000, 0x3400000},
+{0x3400000, 0x800000, 0x80000001, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x80000076, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x80002b94, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x80636d24, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x807fffff, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x80800000, 0x0, 0x3400000},
+{0x3400000, 0x800000, 0x80800002, 0x0, 0x3400008},
+{0x3400000, 0x800000, 0x81398437, 0x80f3086e, 0x3400000},
+{0x3400000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3400000},
+{0x3400000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3400000},
+{0x3400000, 0x800000, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x800000, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x800000, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x800000, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x800000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x800000, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x800000, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x800000, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x800000, 0x9503366, 0x95033a6, 0x3400000},
+{0x3400000, 0x800000, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x800000, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x800000, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x800000, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0x800000, 0x966320b, 0x966324b, 0x3400000},
+{0x3400000, 0x800000, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0x800000, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0x800000, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x800000, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x800000, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x800002, 0x0, 0x800002, 0x3400000},
+{0x3400000, 0x800002, 0x1, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x76, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x2b94, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x636d24, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x7fffff, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x800000, 0x1000001, 0x3400000},
+{0x3400000, 0x800002, 0x800002, 0x1000002, 0x3400000},
+{0x3400000, 0x800002, 0x1398437, 0x1798438, 0x3400000},
+{0x3400000, 0x800002, 0xba98d27, 0xba98d2a, 0x3400010},
+{0x3400000, 0x800002, 0xba98d7a, 0xba98d7d, 0x3400010},
+{0x3400000, 0x800002, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x800002, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x800002, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x800002, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x800002, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0x80000000, 0x800002, 0x3400000},
+{0x3400000, 0x800002, 0x80000001, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x80000076, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x80002b94, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x80636d24, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x807fffff, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x80800000, 0x0, 0x3400008},
+{0x3400000, 0x800002, 0x80800002, 0x0, 0x3400000},
+{0x3400000, 0x800002, 0x81398437, 0x80f3086c, 0x3400000},
+{0x3400000, 0x800002, 0x8ba98d27, 0x8ba98d24, 0x3400010},
+{0x3400000, 0x800002, 0x8ba98d7a, 0x8ba98d77, 0x3400010},
+{0x3400000, 0x800002, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x800002, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x800002, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x800002, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x800002, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x800002, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x800002, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x800002, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x800002, 0x9503366, 0x95033a7, 0x3400010},
+{0x3400000, 0x800002, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x800002, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x800002, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x800002, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0x800002, 0x966320b, 0x966324c, 0x3400010},
+{0x3400000, 0x800002, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0x800002, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0x800002, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x800002, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x800002, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x1398437, 0x0, 0x1398437, 0x3400000},
+{0x3400000, 0x1398437, 0x1, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x76, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x2b94, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x636d24, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x7fffff, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x800000, 0x1798437, 0x3400000},
+{0x3400000, 0x1398437, 0x800002, 0x1798438, 0x3400000},
+{0x3400000, 0x1398437, 0x1398437, 0x1b98437, 0x3400000},
+{0x3400000, 0x1398437, 0xba98d27, 0xba98d2d, 0x3400010},
+{0x3400000, 0x1398437, 0xba98d7a, 0xba98d80, 0x3400010},
+{0x3400000, 0x1398437, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x1398437, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x1398437, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x1398437, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0x80000000, 0x1398437, 0x3400000},
+{0x3400000, 0x1398437, 0x80000001, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x80000076, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x80002b94, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x80636d24, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x807fffff, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x80800000, 0xf3086e, 0x3400000},
+{0x3400000, 0x1398437, 0x80800002, 0xf3086c, 0x3400000},
+{0x3400000, 0x1398437, 0x81398437, 0x0, 0x3400000},
+{0x3400000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3400010},
+{0x3400000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3400010},
+{0x3400000, 0x1398437, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x1398437, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x1398437, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x1398437, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x1398437, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x1398437, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x1398437, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x1398437, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x1398437, 0x9503366, 0x9503420, 0x3400010},
+{0x3400000, 0x1398437, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x1398437, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x1398437, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x1398437, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0x1398437, 0x966320b, 0x96632c5, 0x3400010},
+{0x3400000, 0x1398437, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0x1398437, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0x1398437, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x1398437, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x1398437, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0xba98d27, 0x0, 0xba98d27, 0x3400000},
+{0x3400000, 0xba98d27, 0x1, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x76, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x2b94, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x636d24, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x800000, 0xba98d29, 0x3400000},
+{0x3400000, 0xba98d27, 0x800002, 0xba98d2a, 0x3400010},
+{0x3400000, 0xba98d27, 0x1398437, 0xba98d2d, 0x3400010},
+{0x3400000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3400000},
+{0x3400000, 0xba98d27, 0xba98d7a, 0xc298d51, 0x3400010},
+{0x3400000, 0xba98d27, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0xba98d27, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0x80000000, 0xba98d27, 0x3400000},
+{0x3400000, 0xba98d27, 0x80000001, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x80000076, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x80800000, 0xba98d25, 0x3400000},
+{0x3400000, 0xba98d27, 0x80800002, 0xba98d25, 0x3400010},
+{0x3400000, 0xba98d27, 0x81398437, 0xba98d22, 0x3400010},
+{0x3400000, 0xba98d27, 0x8ba98d27, 0x0, 0x3400000},
+{0x3400000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3400000},
+{0x3400000, 0xba98d27, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0xba98d27, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0xba98d27, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xba98d27, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0xba98d27, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0xba98d27, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0xba98d27, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0xba98d27, 0x9503366, 0xbb00ec3, 0x3400010},
+{0x3400000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xba98d27, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xba98d27, 0x966320b, 0xbb0beb8, 0x3400010},
+{0x3400000, 0xba98d27, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xba98d27, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0xba98d27, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0xba98d27, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0xba98d7a, 0x0, 0xba98d7a, 0x3400000},
+{0x3400000, 0xba98d7a, 0x1, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x76, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3400000},
+{0x3400000, 0xba98d7a, 0x800002, 0xba98d7d, 0x3400010},
+{0x3400000, 0xba98d7a, 0x1398437, 0xba98d80, 0x3400010},
+{0x3400000, 0xba98d7a, 0xba98d27, 0xc298d51, 0x3400010},
+{0x3400000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3400000},
+{0x3400000, 0xba98d7a, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0xba98d7a, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3400000},
+{0x3400000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3400000},
+{0x3400000, 0xba98d7a, 0x80800002, 0xba98d78, 0x3400010},
+{0x3400000, 0xba98d7a, 0x81398437, 0xba98d75, 0x3400010},
+{0x3400000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3400000},
+{0x3400000, 0xba98d7a, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0xba98d7a, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0xba98d7a, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xba98d7a, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0xba98d7a, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0xba98d7a, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0xba98d7a, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0xba98d7a, 0x9503366, 0xbb00f16, 0x3400010},
+{0x3400000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xba98d7a, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xba98d7a, 0x966320b, 0xbb0bf0b, 0x3400010},
+{0x3400000, 0xba98d7a, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xba98d7a, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0xba98d7a, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0xba98d7a, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x751f853a, 0x0, 0x751f853a, 0x3400000},
+{0x3400000, 0x751f853a, 0x1, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x76, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x2b94, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x636d24, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x800000, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x800002, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x1398437, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0xba98d27, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0xba98d7a, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3400000},
+{0x3400000, 0x751f853a, 0x7f7ffff0, 0x7f7ffffa, 0x3400010},
+{0x3400000, 0x751f853a, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0x80000000, 0x751f853a, 0x3400000},
+{0x3400000, 0x751f853a, 0x80000001, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x80000076, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x80800000, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x80800002, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x81398437, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x8ba98d27, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x8ba98d7a, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0xf51f853a, 0x0, 0x3400000},
+{0x3400000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3400010},
+{0x3400000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3400010},
+{0x3400000, 0x751f853a, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0x4f3495cb, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0xe73a5134, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x7c994e9e, 0x7c994fde, 0x3400010},
+{0x3400000, 0x751f853a, 0x6164bd6c, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x9503366, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0xbf5a97c9, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0xe6ff1a14, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x77f31e2f, 0x77f81a59, 0x3400010},
+{0x3400000, 0x751f853a, 0xaab4d7d8, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x966320b, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0xb26bddee, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0xb5c8e5d3, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x317285d3, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x3c9623b1, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x51fd2c7c, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x7b906a6c, 0x7b906f69, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x800000, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x800002, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x1398437, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x751f853a, 0x7f7ffffa, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x7f7ffff0, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7ffff0, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x80800000, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x80800002, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x81398437, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x8ba98d27, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe7, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xe73a5134, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x7c994e9e, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x9503366, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x77f31e2f, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x966320b, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xb26bddee, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x7b906a6c, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x800000, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x800002, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x1398437, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xba98d27, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xba98d7a, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x751f853a, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x7f7ffff0, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x80800000, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x80800002, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x81398437, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x8ba98d27, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x8ba98d7a, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff6, 0x3400010},
+{0x3400000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3400000},
+{0x3400000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x4f3495cb, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xe73a5134, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x7c994e9e, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x6164bd6c, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x9503366, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xbf5a97c9, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0xe6ff1a14, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x77f31e2f, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xaab4d7d8, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x966320b, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xb26bddee, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x317285d3, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x3c9623b1, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x51fd2c7c, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x7b906a6c, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f800000, 0x0, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x1, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x76, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x2b94, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x636d24, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x800002, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x1398437, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0x80000000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x80000001, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x80000076, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x80800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x80800002, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x81398437, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x9503366, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x966320b, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800001, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0x0, 0x0, 0x3400000},
+{0x3400000, 0x80000000, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x800000, 0x800000, 0x3400000},
+{0x3400000, 0x80000000, 0x800002, 0x800002, 0x3400000},
+{0x3400000, 0x80000000, 0x1398437, 0x1398437, 0x3400000},
+{0x3400000, 0x80000000, 0xba98d27, 0xba98d27, 0x3400000},
+{0x3400000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3400000},
+{0x3400000, 0x80000000, 0x751f853a, 0x751f853a, 0x3400000},
+{0x3400000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3400000},
+{0x3400000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3400000},
+{0x3400000, 0x80000000, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0x80000000, 0x80000000, 0x3400000},
+{0x3400000, 0x80000000, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x80800000, 0x80800000, 0x3400000},
+{0x3400000, 0x80000000, 0x80800002, 0x80800002, 0x3400000},
+{0x3400000, 0x80000000, 0x81398437, 0x81398437, 0x3400000},
+{0x3400000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3400000},
+{0x3400000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3400000},
+{0x3400000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3400000},
+{0x3400000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3400000},
+{0x3400000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3400000},
+{0x3400000, 0x80000000, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x80000000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3400000},
+{0x3400000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3400000},
+{0x3400000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3400000},
+{0x3400000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3400000},
+{0x3400000, 0x80000000, 0x9503366, 0x9503366, 0x3400000},
+{0x3400000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3400000},
+{0x3400000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3400000},
+{0x3400000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3400000},
+{0x3400000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3400000},
+{0x3400000, 0x80000000, 0x966320b, 0x966320b, 0x3400000},
+{0x3400000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3400000},
+{0x3400000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400000},
+{0x3400000, 0x80000000, 0x317285d3, 0x317285d3, 0x3400000},
+{0x3400000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3400000},
+{0x3400000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3400000},
+{0x3400000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3400000},
+{0x3400000, 0x80000001, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x80000001, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x80000001, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x80000001, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x80000001, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x80000001, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x80000001, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x80000001, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x80000001, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x80000001, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x80000001, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x80000001, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x80000001, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x80000076, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x80000076, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x80000076, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x80000076, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x80000076, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x80000076, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x80000076, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x80000076, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x80000076, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x80000076, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x80000076, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x80000076, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x80000076, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x80002b94, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x80002b94, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x80002b94, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x80002b94, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x80002b94, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x80002b94, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x80002b94, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x80002b94, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x80636d24, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x80636d24, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x80636d24, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x80636d24, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x80636d24, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x80636d24, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x80636d24, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x80636d24, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x807fffff, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x807fffff, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x807fffff, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x807fffff, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x807fffff, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x807fffff, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x807fffff, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x807fffff, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x80800000, 0x0, 0x80800000, 0x3400000},
+{0x3400000, 0x80800000, 0x1, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x76, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x2b94, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x636d24, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x7fffff, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x800000, 0x0, 0x3400000},
+{0x3400000, 0x80800000, 0x800002, 0x0, 0x3400008},
+{0x3400000, 0x80800000, 0x1398437, 0xf3086e, 0x3400000},
+{0x3400000, 0x80800000, 0xba98d27, 0xba98d25, 0x3400000},
+{0x3400000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3400000},
+{0x3400000, 0x80800000, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0x80800000, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x80800000, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x80800000, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0x80000000, 0x80800000, 0x3400000},
+{0x3400000, 0x80800000, 0x80000001, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x80000076, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x80002b94, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x80636d24, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x807fffff, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x80800000, 0x81000000, 0x3400000},
+{0x3400000, 0x80800000, 0x80800002, 0x81000001, 0x3400000},
+{0x3400000, 0x80800000, 0x81398437, 0x81798437, 0x3400000},
+{0x3400000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3400000},
+{0x3400000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3400000},
+{0x3400000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0x80800000, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x80800000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0x80800000, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x80800000, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x80800000, 0x9503366, 0x9503326, 0x3400000},
+{0x3400000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0x80800000, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0x80800000, 0x966320b, 0x96631cb, 0x3400000},
+{0x3400000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3400010},
+{0x3400000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0x80800000, 0x317285d3, 0x317285d3, 0x3400010},
+{0x3400000, 0x80800000, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x80800000, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x80800000, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x80800002, 0x0, 0x80800002, 0x3400000},
+{0x3400000, 0x80800002, 0x1, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x76, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x2b94, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x636d24, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x7fffff, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x800000, 0x0, 0x3400008},
+{0x3400000, 0x80800002, 0x800002, 0x0, 0x3400000},
+{0x3400000, 0x80800002, 0x1398437, 0xf3086c, 0x3400000},
+{0x3400000, 0x80800002, 0xba98d27, 0xba98d25, 0x3400010},
+{0x3400000, 0x80800002, 0xba98d7a, 0xba98d78, 0x3400010},
+{0x3400000, 0x80800002, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0x80800002, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x80800002, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x80800002, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0x80000000, 0x80800002, 0x3400000},
+{0x3400000, 0x80800002, 0x80000001, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x80000076, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x80002b94, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x80636d24, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x807fffff, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x80800000, 0x81000001, 0x3400000},
+{0x3400000, 0x80800002, 0x80800002, 0x81000002, 0x3400000},
+{0x3400000, 0x80800002, 0x81398437, 0x81798438, 0x3400000},
+{0x3400000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3400010},
+{0x3400000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3400010},
+{0x3400000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0x80800002, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x80800002, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0x80800002, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x80800002, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x80800002, 0x9503366, 0x9503326, 0x3400010},
+{0x3400000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0x80800002, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0x80800002, 0x966320b, 0x96631cb, 0x3400010},
+{0x3400000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3400010},
+{0x3400000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0x80800002, 0x317285d3, 0x317285d3, 0x3400010},
+{0x3400000, 0x80800002, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x80800002, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x80800002, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x81398437, 0x0, 0x81398437, 0x3400000},
+{0x3400000, 0x81398437, 0x1, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x76, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x2b94, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x636d24, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x7fffff, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x800000, 0x80f3086e, 0x3400000},
+{0x3400000, 0x81398437, 0x800002, 0x80f3086c, 0x3400000},
+{0x3400000, 0x81398437, 0x1398437, 0x0, 0x3400000},
+{0x3400000, 0x81398437, 0xba98d27, 0xba98d22, 0x3400010},
+{0x3400000, 0x81398437, 0xba98d7a, 0xba98d75, 0x3400010},
+{0x3400000, 0x81398437, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0x81398437, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x81398437, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x81398437, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0x80000000, 0x81398437, 0x3400000},
+{0x3400000, 0x81398437, 0x80000001, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x80000076, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x80002b94, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x80636d24, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x807fffff, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x80800000, 0x81798437, 0x3400000},
+{0x3400000, 0x81398437, 0x80800002, 0x81798438, 0x3400000},
+{0x3400000, 0x81398437, 0x81398437, 0x81b98437, 0x3400000},
+{0x3400000, 0x81398437, 0x8ba98d27, 0x8ba98d2c, 0x3400010},
+{0x3400000, 0x81398437, 0x8ba98d7a, 0x8ba98d7f, 0x3400010},
+{0x3400000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0x81398437, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x81398437, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0x81398437, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x81398437, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x81398437, 0x9503366, 0x95032ad, 0x3400010},
+{0x3400000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0x81398437, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0x81398437, 0x966320b, 0x9663152, 0x3400010},
+{0x3400000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3400010},
+{0x3400000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0x81398437, 0x317285d3, 0x317285d3, 0x3400010},
+{0x3400000, 0x81398437, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x81398437, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x81398437, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x800002, 0x8ba98d24, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xba98d27, 0x0, 0x3400000},
+{0x3400000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x81398437, 0x8ba98d2c, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x9503366, 0x8ba30b8b, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x966320b, 0x8ba25b96, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x317285d3, 0x317285d3, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x800002, 0x8ba98d77, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x81398437, 0x8ba98d7f, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x9503366, 0x8ba30bde, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x966320b, 0x8ba25be9, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x317285d3, 0x317285d3, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0xf51f853a, 0x0, 0xf51f853a, 0x3400000},
+{0x3400000, 0xf51f853a, 0x1, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x76, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x800000, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x800002, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x1398437, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0xba98d27, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0xba98d7a, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x751f853a, 0x0, 0x3400000},
+{0x3400000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe7, 0x3400010},
+{0x3400000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff6, 0x3400010},
+{0x3400000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3400000},
+{0x3400000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3400000},
+{0x3400000, 0xf51f853a, 0xff7ffff0, 0xff7ffff9, 0x3400010},
+{0x3400000, 0xf51f853a, 0xff7fffff, 0xff7fffff, 0x3400014},
+{0x3400000, 0xf51f853a, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0x4f3495cb, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x7c994e9e, 0x7c994d5f, 0x3400010},
+{0x3400000, 0xf51f853a, 0x6164bd6c, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x9503366, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x77f31e2f, 0x77ee2206, 0x3400010},
+{0x3400000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x966320b, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x317285d3, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x3c9623b1, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x51fd2c7c, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x7b906a6c, 0x7b906570, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x800000, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x800002, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x1398437, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xba98d27, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xba98d7a, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xf51f853a, 0xff7ffff9, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xff7ffff0, 0xff7fffff, 0x3400014},
+{0x3400000, 0xff7ffff0, 0xff7fffff, 0xff7fffff, 0x3400014},
+{0x3400000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x4f3495cb, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x6164bd6c, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x9503366, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe09, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x966320b, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x317285d3, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x3c9623b1, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x51fd2c7c, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3400010},
+{0x3400000, 0xff7fffff, 0x0, 0xff7fffff, 0x3400000},
+{0x3400000, 0xff7fffff, 0x1, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x76, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x800000, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x800002, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x1398437, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0xba98d27, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0xba98d7a, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3400010},
+{0x3400000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3400000},
+{0x3400000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3400000},
+{0x3400000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0xf51f853a, 0xff7fffff, 0x3400014},
+{0x3400000, 0xff7fffff, 0xff7ffff0, 0xff7fffff, 0x3400014},
+{0x3400000, 0xff7fffff, 0xff7fffff, 0xff7fffff, 0x3400014},
+{0x3400000, 0xff7fffff, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x4f3495cb, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3400010},
+{0x3400000, 0xff7fffff, 0x6164bd6c, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x9503366, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x77f31e2f, 0xff7ffe18, 0x3400010},
+{0x3400000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x966320b, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x317285d3, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x3c9623b1, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x51fd2c7c, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3400010},
+{0x3400000, 0xff800000, 0x0, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x1, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x76, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x2b94, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x636d24, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x7fffff, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x800000, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x800002, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x1398437, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xba98d27, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xba98d7a, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x751f853a, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0x80000000, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x80000001, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x80000076, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x80002b94, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x80636d24, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x807fffff, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x80800000, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x80800002, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x81398437, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xf51f853a, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xff7fffff, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xe73a5134, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x9503366, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x966320b, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xb26bddee, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x317285d3, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3400000},
+{0x3400000, 0xff800001, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x800000, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x800002, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x1398437, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xba98d27, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xba98d7a, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x80800000, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x80800002, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x81398437, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x8ba98d27, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3400000},
+{0x3400000, 0x4f3495cb, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x9503366, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x966320b, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xb26bddee, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x317285d3, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x51fd2c7c, 0x52016896, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0xe73a5134, 0x0, 0xe73a5134, 0x3400000},
+{0x3400000, 0xe73a5134, 0x1, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x76, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x800000, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x800002, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x1398437, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0xba98d27, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0xba98d7a, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xe73a5134, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xe73a5134, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3400000},
+{0x3400000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xe73a5134, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0x4f3495cb, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3400000},
+{0x3400000, 0xe73a5134, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3400010},
+{0x3400000, 0xe73a5134, 0x9503366, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3400000},
+{0x3400000, 0xe73a5134, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x966320b, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x317285d3, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x3c9623b1, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x51fd2c7c, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x800000, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x800002, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x1398437, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xba98d27, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xba98d7a, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x751f853a, 0x7c994fde, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x7f7ffff0, 0x7f800000, 0x3400014},
+{0x3400000, 0x7c994e9e, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x80800000, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x80800002, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x81398437, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xf51f853a, 0x7c994d5f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xe73a5134, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x9503366, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x77f31e2f, 0x7c998b66, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x966320b, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xb26bddee, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x317285d3, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x800000, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x800002, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x1398437, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xba98d27, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xba98d7a, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x80800000, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x80800002, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x81398437, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x9503366, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x966320b, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xb26bddee, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x317285d3, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x9503366, 0x0, 0x9503366, 0x3400000},
+{0x3400000, 0x9503366, 0x1, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x76, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x2b94, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x636d24, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x7fffff, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x800000, 0x95033a6, 0x3400000},
+{0x3400000, 0x9503366, 0x800002, 0x95033a7, 0x3400010},
+{0x3400000, 0x9503366, 0x1398437, 0x9503420, 0x3400010},
+{0x3400000, 0x9503366, 0xba98d27, 0xbb00ec3, 0x3400010},
+{0x3400000, 0x9503366, 0xba98d7a, 0xbb00f16, 0x3400010},
+{0x3400000, 0x9503366, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x9503366, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x9503366, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x9503366, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0x80000000, 0x9503366, 0x3400000},
+{0x3400000, 0x9503366, 0x80000001, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x80000076, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x80002b94, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x80636d24, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x807fffff, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x80800000, 0x9503326, 0x3400000},
+{0x3400000, 0x9503366, 0x80800002, 0x9503326, 0x3400010},
+{0x3400000, 0x9503366, 0x81398437, 0x95032ad, 0x3400010},
+{0x3400000, 0x9503366, 0x8ba98d27, 0x8ba30b8b, 0x3400010},
+{0x3400000, 0x9503366, 0x8ba98d7a, 0x8ba30bde, 0x3400010},
+{0x3400000, 0x9503366, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x9503366, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x9503366, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x9503366, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x9503366, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x9503366, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x9503366, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x9503366, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x9503366, 0x9503366, 0x9d03366, 0x3400000},
+{0x3400000, 0x9503366, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x9503366, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x9503366, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x9503366, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0x9503366, 0x966320b, 0x9db32b9, 0x3400010},
+{0x3400000, 0x9503366, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0x9503366, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0x9503366, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x9503366, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x9503366, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x800000, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x800002, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x1398437, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x9503366, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x966320b, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x800000, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x800002, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x1398437, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x9503366, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x966320b, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x800000, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x800002, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x1398437, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xba98d27, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xba98d7a, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x751f853a, 0x77f81a59, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x7f7ffff0, 0x7f800000, 0x3400014},
+{0x3400000, 0x77f31e2f, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x80800000, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x80800002, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x81398437, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xf51f853a, 0x77ee2206, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe09, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xff7fffff, 0xff7ffe18, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x4f3495cb, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xe73a5134, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x7c994e9e, 0x7c998b66, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x6164bd6c, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x9503366, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3400000},
+{0x3400000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x966320b, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xb26bddee, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x317285d3, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x3c9623b1, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8b, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x800000, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x800002, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x1398437, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x9503366, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x966320b, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf57, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d5, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x317285d3, 0x3172802d, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x966320b, 0x0, 0x966320b, 0x3400000},
+{0x3400000, 0x966320b, 0x1, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x76, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x2b94, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x636d24, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x7fffff, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x800000, 0x966324b, 0x3400000},
+{0x3400000, 0x966320b, 0x800002, 0x966324c, 0x3400010},
+{0x3400000, 0x966320b, 0x1398437, 0x96632c5, 0x3400010},
+{0x3400000, 0x966320b, 0xba98d27, 0xbb0beb8, 0x3400010},
+{0x3400000, 0x966320b, 0xba98d7a, 0xbb0bf0b, 0x3400010},
+{0x3400000, 0x966320b, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x966320b, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x966320b, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x966320b, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0x80000000, 0x966320b, 0x3400000},
+{0x3400000, 0x966320b, 0x80000001, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x80000076, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x80002b94, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x80636d24, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x807fffff, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x80800000, 0x96631cb, 0x3400000},
+{0x3400000, 0x966320b, 0x80800002, 0x96631cb, 0x3400010},
+{0x3400000, 0x966320b, 0x81398437, 0x9663152, 0x3400010},
+{0x3400000, 0x966320b, 0x8ba98d27, 0x8ba25b96, 0x3400010},
+{0x3400000, 0x966320b, 0x8ba98d7a, 0x8ba25be9, 0x3400010},
+{0x3400000, 0x966320b, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x966320b, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x966320b, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x966320b, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x966320b, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x966320b, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x966320b, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x966320b, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x966320b, 0x9503366, 0x9db32b9, 0x3400010},
+{0x3400000, 0x966320b, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x966320b, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x966320b, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x966320b, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0x966320b, 0x966320b, 0x9e6320b, 0x3400000},
+{0x3400000, 0x966320b, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0x966320b, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0x966320b, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x966320b, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x966320b, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0xb26bddee, 0x0, 0xb26bddee, 0x3400000},
+{0x3400000, 0xb26bddee, 0x1, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x76, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x800000, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0x800002, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0x1398437, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0xba98d27, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0xba98d7a, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xb26bddee, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xb26bddee, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3400000},
+{0x3400000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3400010},
+{0x3400000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3400010},
+{0x3400000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3400010},
+{0x3400000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3400010},
+{0x3400000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3400010},
+{0x3400000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xb26bddee, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0xb26bddee, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xb26bddee, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0xb26bddee, 0x9503366, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xb26bddee, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf57, 0x3400010},
+{0x3400000, 0xb26bddee, 0x966320b, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3400000},
+{0x3400000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8e, 0x3400010},
+{0x3400000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3400010},
+{0x3400000, 0xb26bddee, 0x3c9623b1, 0x3c9623aa, 0x3400010},
+{0x3400000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0xb26bddee, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d5, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8e, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208e, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x317285d3, 0x0, 0x317285d3, 0x3400000},
+{0x3400000, 0x317285d3, 0x1, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x76, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x2b94, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x636d24, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x800000, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0x800002, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0x1398437, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0xba98d27, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0xba98d7a, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x317285d3, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0x80000000, 0x317285d3, 0x3400000},
+{0x3400000, 0x317285d3, 0x80000001, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x80000076, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x80800000, 0x317285d3, 0x3400010},
+{0x3400000, 0x317285d3, 0x80800002, 0x317285d3, 0x3400010},
+{0x3400000, 0x317285d3, 0x81398437, 0x317285d3, 0x3400010},
+{0x3400000, 0x317285d3, 0x8ba98d27, 0x317285d3, 0x3400010},
+{0x3400000, 0x317285d3, 0x8ba98d7a, 0x317285d3, 0x3400010},
+{0x3400000, 0x317285d3, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x317285d3, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x317285d3, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x317285d3, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x317285d3, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x317285d3, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x317285d3, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x317285d3, 0x9503366, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x317285d3, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x317285d3, 0xaab4d7d8, 0x3172802d, 0x3400010},
+{0x3400000, 0x317285d3, 0x966320b, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3400010},
+{0x3400000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3400010},
+{0x3400000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3400000},
+{0x3400000, 0x317285d3, 0x3c9623b1, 0x3c9623b3, 0x3400010},
+{0x3400000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x317285d3, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x800000, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x800002, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x1398437, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xba98d27, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xba98d7a, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x80800000, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x80800002, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x81398437, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x9503366, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x966320b, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xb26bddee, 0x3c9623aa, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208e, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x317285d3, 0x3c9623b3, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x800000, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x800002, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x1398437, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x80800000, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x80800002, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x81398437, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x4f3495cb, 0x52016896, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x9503366, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x966320b, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x800000, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x800002, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x1398437, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xba98d27, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xba98d7a, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x751f853a, 0x7b906f69, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x7f7ffff0, 0x7f800000, 0x3400014},
+{0x3400000, 0x7b906a6c, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x80800000, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x80800002, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x81398437, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xf51f853a, 0x7b906570, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xe73a5134, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x9503366, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8b, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x966320b, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xb26bddee, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x317285d3, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3400000},
+{0x3000000, 0x0, 0x0, 0x0, 0x3000000},
+{0x3000000, 0x0, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x800000, 0x800000, 0x3000000},
+{0x3000000, 0x0, 0x800002, 0x800002, 0x3000000},
+{0x3000000, 0x0, 0x1398437, 0x1398437, 0x3000000},
+{0x3000000, 0x0, 0xba98d27, 0xba98d27, 0x3000000},
+{0x3000000, 0x0, 0xba98d7a, 0xba98d7a, 0x3000000},
+{0x3000000, 0x0, 0x751f853a, 0x751f853a, 0x3000000},
+{0x3000000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3000000},
+{0x3000000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3000000},
+{0x3000000, 0x0, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x0, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0x80000000, 0x0, 0x3000000},
+{0x3000000, 0x0, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x80800000, 0x80800000, 0x3000000},
+{0x3000000, 0x0, 0x80800002, 0x80800002, 0x3000000},
+{0x3000000, 0x0, 0x81398437, 0x81398437, 0x3000000},
+{0x3000000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3000000},
+{0x3000000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3000000},
+{0x3000000, 0x0, 0xf51f853a, 0xf51f853a, 0x3000000},
+{0x3000000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3000000},
+{0x3000000, 0x0, 0xff7fffff, 0xff7fffff, 0x3000000},
+{0x3000000, 0x0, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x0, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3000000},
+{0x3000000, 0x0, 0xe73a5134, 0xe73a5134, 0x3000000},
+{0x3000000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3000000},
+{0x3000000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3000000},
+{0x3000000, 0x0, 0x9503366, 0x9503366, 0x3000000},
+{0x3000000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3000000},
+{0x3000000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3000000},
+{0x3000000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3000000},
+{0x3000000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3000000},
+{0x3000000, 0x0, 0x966320b, 0x966320b, 0x3000000},
+{0x3000000, 0x0, 0xb26bddee, 0xb26bddee, 0x3000000},
+{0x3000000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000000},
+{0x3000000, 0x0, 0x317285d3, 0x317285d3, 0x3000000},
+{0x3000000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3000000},
+{0x3000000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3000000},
+{0x3000000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3000000},
+{0x3000000, 0x1, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x1, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x1, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x1, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x1, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x1, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x1, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x1, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x1, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x1, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x1, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x1, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x1, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x1, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x1, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x1, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x1, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x1, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x1, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x76, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x76, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x76, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x76, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x76, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x76, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x76, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x76, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x76, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x76, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x76, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x76, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x76, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x76, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x76, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x76, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x76, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x76, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x76, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x2b94, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x2b94, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x2b94, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x2b94, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x2b94, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x2b94, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x2b94, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x2b94, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x2b94, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x2b94, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x2b94, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x2b94, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x2b94, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x636d24, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x636d24, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x636d24, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x636d24, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x636d24, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x636d24, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x636d24, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x636d24, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x636d24, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x636d24, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x636d24, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x636d24, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x636d24, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7fffff, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x7fffff, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x7fffff, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x7fffff, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x7fffff, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x7fffff, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x7fffff, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x7fffff, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x800000, 0x0, 0x800000, 0x3000000},
+{0x3000000, 0x800000, 0x1, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x76, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x2b94, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x636d24, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x7fffff, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x800000, 0x1000000, 0x3000000},
+{0x3000000, 0x800000, 0x800002, 0x1000001, 0x3000000},
+{0x3000000, 0x800000, 0x1398437, 0x1798437, 0x3000000},
+{0x3000000, 0x800000, 0xba98d27, 0xba98d29, 0x3000000},
+{0x3000000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3000000},
+{0x3000000, 0x800000, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x800000, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x800000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0x80000000, 0x800000, 0x3000000},
+{0x3000000, 0x800000, 0x80000001, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x80000076, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x80002b94, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x80636d24, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x807fffff, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x80800000, 0x0, 0x3000000},
+{0x3000000, 0x800000, 0x80800002, 0x0, 0x3000008},
+{0x3000000, 0x800000, 0x81398437, 0x80f3086e, 0x3000000},
+{0x3000000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3000000},
+{0x3000000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3000000},
+{0x3000000, 0x800000, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x800000, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x800000, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x800000, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x800000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x800000, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x800000, 0x9503366, 0x95033a6, 0x3000000},
+{0x3000000, 0x800000, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x800000, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x800000, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x800000, 0x966320b, 0x966324b, 0x3000000},
+{0x3000000, 0x800000, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x800000, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x800002, 0x0, 0x800002, 0x3000000},
+{0x3000000, 0x800002, 0x1, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x76, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x2b94, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x636d24, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x7fffff, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x800000, 0x1000001, 0x3000000},
+{0x3000000, 0x800002, 0x800002, 0x1000002, 0x3000000},
+{0x3000000, 0x800002, 0x1398437, 0x1798438, 0x3000000},
+{0x3000000, 0x800002, 0xba98d27, 0xba98d29, 0x3000010},
+{0x3000000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3000010},
+{0x3000000, 0x800002, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x800002, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x800002, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0x80000000, 0x800002, 0x3000000},
+{0x3000000, 0x800002, 0x80000001, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x80000076, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x80002b94, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x80636d24, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x807fffff, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x80800000, 0x0, 0x3000008},
+{0x3000000, 0x800002, 0x80800002, 0x0, 0x3000000},
+{0x3000000, 0x800002, 0x81398437, 0x80f3086c, 0x3000000},
+{0x3000000, 0x800002, 0x8ba98d27, 0x8ba98d25, 0x3000010},
+{0x3000000, 0x800002, 0x8ba98d7a, 0x8ba98d78, 0x3000010},
+{0x3000000, 0x800002, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x800002, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x800002, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x800002, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x800002, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x800002, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x800002, 0x9503366, 0x95033a6, 0x3000010},
+{0x3000000, 0x800002, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x800002, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x800002, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x800002, 0x966320b, 0x966324b, 0x3000010},
+{0x3000000, 0x800002, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x800002, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x1398437, 0x0, 0x1398437, 0x3000000},
+{0x3000000, 0x1398437, 0x1, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x76, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x2b94, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x636d24, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x7fffff, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x800000, 0x1798437, 0x3000000},
+{0x3000000, 0x1398437, 0x800002, 0x1798438, 0x3000000},
+{0x3000000, 0x1398437, 0x1398437, 0x1b98437, 0x3000000},
+{0x3000000, 0x1398437, 0xba98d27, 0xba98d2d, 0x3000010},
+{0x3000000, 0x1398437, 0xba98d7a, 0xba98d80, 0x3000010},
+{0x3000000, 0x1398437, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x1398437, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0x80000000, 0x1398437, 0x3000000},
+{0x3000000, 0x1398437, 0x80000001, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x80000076, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x80002b94, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x80636d24, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x807fffff, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x80800000, 0xf3086e, 0x3000000},
+{0x3000000, 0x1398437, 0x80800002, 0xf3086c, 0x3000000},
+{0x3000000, 0x1398437, 0x81398437, 0x0, 0x3000000},
+{0x3000000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3000010},
+{0x3000000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3000010},
+{0x3000000, 0x1398437, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x1398437, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x1398437, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x1398437, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x1398437, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x1398437, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x1398437, 0x9503366, 0x9503420, 0x3000010},
+{0x3000000, 0x1398437, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x1398437, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x1398437, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x1398437, 0x966320b, 0x96632c5, 0x3000010},
+{0x3000000, 0x1398437, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x1398437, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xba98d27, 0x0, 0xba98d27, 0x3000000},
+{0x3000000, 0xba98d27, 0x1, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x76, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x2b94, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x636d24, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x800000, 0xba98d29, 0x3000000},
+{0x3000000, 0xba98d27, 0x800002, 0xba98d29, 0x3000010},
+{0x3000000, 0xba98d27, 0x1398437, 0xba98d2d, 0x3000010},
+{0x3000000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3000000},
+{0x3000000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3000010},
+{0x3000000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0x80000000, 0xba98d27, 0x3000000},
+{0x3000000, 0xba98d27, 0x80000001, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x80000076, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x80800000, 0xba98d25, 0x3000000},
+{0x3000000, 0xba98d27, 0x80800002, 0xba98d25, 0x3000010},
+{0x3000000, 0xba98d27, 0x81398437, 0xba98d21, 0x3000010},
+{0x3000000, 0xba98d27, 0x8ba98d27, 0x0, 0x3000000},
+{0x3000000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3000000},
+{0x3000000, 0xba98d27, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xba98d27, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xba98d27, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xba98d27, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xba98d27, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3000010},
+{0x3000000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3000010},
+{0x3000000, 0xba98d27, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xba98d7a, 0x0, 0xba98d7a, 0x3000000},
+{0x3000000, 0xba98d7a, 0x1, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x76, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3000000},
+{0x3000000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3000010},
+{0x3000000, 0xba98d7a, 0x1398437, 0xba98d80, 0x3000010},
+{0x3000000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3000010},
+{0x3000000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3000000},
+{0x3000000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3000000},
+{0x3000000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3000000},
+{0x3000000, 0xba98d7a, 0x80800002, 0xba98d78, 0x3000010},
+{0x3000000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3000010},
+{0x3000000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3000000},
+{0x3000000, 0xba98d7a, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xba98d7a, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xba98d7a, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xba98d7a, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3000010},
+{0x3000000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3000010},
+{0x3000000, 0xba98d7a, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x751f853a, 0x0, 0x751f853a, 0x3000000},
+{0x3000000, 0x751f853a, 0x1, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x76, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x2b94, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x636d24, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x800000, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x800002, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x1398437, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3000000},
+{0x3000000, 0x751f853a, 0x7f7ffff0, 0x7f7ffffa, 0x3000010},
+{0x3000000, 0x751f853a, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0x80000000, 0x751f853a, 0x3000000},
+{0x3000000, 0x751f853a, 0x80000001, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x80000076, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x80800000, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x80800002, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x81398437, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x8ba98d27, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x8ba98d7a, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xf51f853a, 0x0, 0x3000000},
+{0x3000000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3000010},
+{0x3000000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3000010},
+{0x3000000, 0x751f853a, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xe73a5134, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3000010},
+{0x3000000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x9503366, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xbf5a97c9, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xe6ff1a14, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x77f31e2f, 0x77f81a59, 0x3000010},
+{0x3000000, 0x751f853a, 0xaab4d7d8, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x966320b, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xb26bddee, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xb5c8e5d3, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x751f853a, 0x7f7ffffa, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x7f7ffff0, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7ffff0, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x80800000, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x80800002, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x81398437, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x8ba98d27, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xe73a5134, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x7c994e9e, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x77f31e2f, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xb26bddee, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x7b906a6c, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x751f853a, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0x7f7ffff0, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x80800000, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x80800002, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x81398437, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x8ba98d27, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x8ba98d7a, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3000000},
+{0x3000000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xe73a5134, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x7c994e9e, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xbf5a97c9, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xe6ff1a14, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x77f31e2f, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0xaab4d7d8, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xb26bddee, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x7b906a6c, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f800000, 0x0, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x1, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x76, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x2b94, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x636d24, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x800002, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x1398437, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0x80000000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x80000001, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x80000076, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x80800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x80800002, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x81398437, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x9503366, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x966320b, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800001, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0x0, 0x0, 0x3000000},
+{0x3000000, 0x80000000, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x800000, 0x800000, 0x3000000},
+{0x3000000, 0x80000000, 0x800002, 0x800002, 0x3000000},
+{0x3000000, 0x80000000, 0x1398437, 0x1398437, 0x3000000},
+{0x3000000, 0x80000000, 0xba98d27, 0xba98d27, 0x3000000},
+{0x3000000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3000000},
+{0x3000000, 0x80000000, 0x751f853a, 0x751f853a, 0x3000000},
+{0x3000000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3000000},
+{0x3000000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3000000},
+{0x3000000, 0x80000000, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0x80000000, 0x80000000, 0x3000000},
+{0x3000000, 0x80000000, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x80800000, 0x80800000, 0x3000000},
+{0x3000000, 0x80000000, 0x80800002, 0x80800002, 0x3000000},
+{0x3000000, 0x80000000, 0x81398437, 0x81398437, 0x3000000},
+{0x3000000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3000000},
+{0x3000000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3000000},
+{0x3000000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3000000},
+{0x3000000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3000000},
+{0x3000000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3000000},
+{0x3000000, 0x80000000, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x80000000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3000000},
+{0x3000000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3000000},
+{0x3000000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3000000},
+{0x3000000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3000000},
+{0x3000000, 0x80000000, 0x9503366, 0x9503366, 0x3000000},
+{0x3000000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3000000},
+{0x3000000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3000000},
+{0x3000000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3000000},
+{0x3000000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3000000},
+{0x3000000, 0x80000000, 0x966320b, 0x966320b, 0x3000000},
+{0x3000000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3000000},
+{0x3000000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000000},
+{0x3000000, 0x80000000, 0x317285d3, 0x317285d3, 0x3000000},
+{0x3000000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3000000},
+{0x3000000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3000000},
+{0x3000000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3000000},
+{0x3000000, 0x80000001, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x80000001, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x80000001, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x80000001, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x80000001, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x80000001, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x80000001, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x80000001, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x80000001, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x80000001, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x80000001, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x80000001, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x80000001, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x80000076, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x80000076, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x80000076, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x80000076, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x80000076, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x80000076, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x80000076, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x80000076, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x80000076, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x80000076, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x80000076, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x80000076, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x80000076, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x80002b94, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x80002b94, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x80002b94, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x80002b94, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x80002b94, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x80002b94, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x80002b94, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x80002b94, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x80636d24, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x80636d24, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x80636d24, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x80636d24, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x80636d24, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x80636d24, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x80636d24, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x80636d24, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x807fffff, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x807fffff, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x807fffff, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x807fffff, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x807fffff, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x807fffff, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x807fffff, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x807fffff, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x80800000, 0x0, 0x80800000, 0x3000000},
+{0x3000000, 0x80800000, 0x1, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x76, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x2b94, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x636d24, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x7fffff, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x800000, 0x0, 0x3000000},
+{0x3000000, 0x80800000, 0x800002, 0x0, 0x3000008},
+{0x3000000, 0x80800000, 0x1398437, 0xf3086e, 0x3000000},
+{0x3000000, 0x80800000, 0xba98d27, 0xba98d25, 0x3000000},
+{0x3000000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3000000},
+{0x3000000, 0x80800000, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x80800000, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x80800000, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x80800000, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0x80000000, 0x80800000, 0x3000000},
+{0x3000000, 0x80800000, 0x80000001, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x80000076, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x80002b94, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x80636d24, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x807fffff, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x80800000, 0x81000000, 0x3000000},
+{0x3000000, 0x80800000, 0x80800002, 0x81000001, 0x3000000},
+{0x3000000, 0x80800000, 0x81398437, 0x81798437, 0x3000000},
+{0x3000000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3000000},
+{0x3000000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3000000},
+{0x3000000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x80800000, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x80800000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x80800000, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x80800000, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x80800000, 0x9503366, 0x9503326, 0x3000000},
+{0x3000000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x80800000, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x80800000, 0x966320b, 0x96631cb, 0x3000000},
+{0x3000000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x80800000, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x80800000, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x80800000, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x80800000, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x80800002, 0x0, 0x80800002, 0x3000000},
+{0x3000000, 0x80800002, 0x1, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x76, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x2b94, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x636d24, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x7fffff, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x800000, 0x0, 0x3000008},
+{0x3000000, 0x80800002, 0x800002, 0x0, 0x3000000},
+{0x3000000, 0x80800002, 0x1398437, 0xf3086c, 0x3000000},
+{0x3000000, 0x80800002, 0xba98d27, 0xba98d25, 0x3000010},
+{0x3000000, 0x80800002, 0xba98d7a, 0xba98d78, 0x3000010},
+{0x3000000, 0x80800002, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x80800002, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x80800002, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x80800002, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0x80000000, 0x80800002, 0x3000000},
+{0x3000000, 0x80800002, 0x80000001, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x80000076, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x80002b94, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x80636d24, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x807fffff, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x80800000, 0x81000001, 0x3000000},
+{0x3000000, 0x80800002, 0x80800002, 0x81000002, 0x3000000},
+{0x3000000, 0x80800002, 0x81398437, 0x81798438, 0x3000000},
+{0x3000000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3000010},
+{0x3000000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3000010},
+{0x3000000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x80800002, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x80800002, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x80800002, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x80800002, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x80800002, 0x9503366, 0x9503326, 0x3000010},
+{0x3000000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x80800002, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x80800002, 0x966320b, 0x96631cb, 0x3000010},
+{0x3000000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x80800002, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x80800002, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x80800002, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x80800002, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x81398437, 0x0, 0x81398437, 0x3000000},
+{0x3000000, 0x81398437, 0x1, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x76, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x2b94, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x636d24, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x7fffff, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x800000, 0x80f3086e, 0x3000000},
+{0x3000000, 0x81398437, 0x800002, 0x80f3086c, 0x3000000},
+{0x3000000, 0x81398437, 0x1398437, 0x0, 0x3000000},
+{0x3000000, 0x81398437, 0xba98d27, 0xba98d21, 0x3000010},
+{0x3000000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3000010},
+{0x3000000, 0x81398437, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x81398437, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x81398437, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x81398437, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0x80000000, 0x81398437, 0x3000000},
+{0x3000000, 0x81398437, 0x80000001, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x80000076, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x80002b94, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x80636d24, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x807fffff, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x80800000, 0x81798437, 0x3000000},
+{0x3000000, 0x81398437, 0x80800002, 0x81798438, 0x3000000},
+{0x3000000, 0x81398437, 0x81398437, 0x81b98437, 0x3000000},
+{0x3000000, 0x81398437, 0x8ba98d27, 0x8ba98d2d, 0x3000010},
+{0x3000000, 0x81398437, 0x8ba98d7a, 0x8ba98d80, 0x3000010},
+{0x3000000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x81398437, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x81398437, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x81398437, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x81398437, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x81398437, 0x9503366, 0x95032ac, 0x3000010},
+{0x3000000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x81398437, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x81398437, 0x966320b, 0x9663151, 0x3000010},
+{0x3000000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x81398437, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x81398437, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x81398437, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x81398437, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x800002, 0x8ba98d25, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xba98d27, 0x0, 0x3000000},
+{0x3000000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x81398437, 0x8ba98d2d, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x9503366, 0x8ba30b8c, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x966320b, 0x8ba25b97, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x800002, 0x8ba98d78, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x81398437, 0x8ba98d80, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x9503366, 0x8ba30bdf, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x966320b, 0x8ba25bea, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xf51f853a, 0x0, 0xf51f853a, 0x3000000},
+{0x3000000, 0xf51f853a, 0x1, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x76, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x800000, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x800002, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x1398437, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xba98d27, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xba98d7a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x751f853a, 0x0, 0x3000000},
+{0x3000000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3000010},
+{0x3000000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3000010},
+{0x3000000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3000000},
+{0x3000000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3000000},
+{0x3000000, 0xf51f853a, 0xff7ffff0, 0xff7ffffa, 0x3000010},
+{0x3000000, 0xf51f853a, 0xff7fffff, 0xff800000, 0x3000014},
+{0x3000000, 0xf51f853a, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0x4f3495cb, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x7c994e9e, 0x7c994d5f, 0x3000010},
+{0x3000000, 0xf51f853a, 0x6164bd6c, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x9503366, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3000010},
+{0x3000000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x966320b, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x317285d3, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x3c9623b1, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x51fd2c7c, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x7b906a6c, 0x7b906570, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x800000, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x800002, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x1398437, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xba98d27, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xba98d7a, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xf51f853a, 0xff7ffffa, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xff7ffff0, 0xff800000, 0x3000014},
+{0x3000000, 0xff7ffff0, 0xff7fffff, 0xff800000, 0x3000014},
+{0x3000000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x4f3495cb, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x6164bd6c, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x9503366, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe0a, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x966320b, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x317285d3, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x3c9623b1, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x51fd2c7c, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3000010},
+{0x3000000, 0xff7fffff, 0x0, 0xff7fffff, 0x3000000},
+{0x3000000, 0xff7fffff, 0x1, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x76, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x800000, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x800002, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x1398437, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xba98d27, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xba98d7a, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3000010},
+{0x3000000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3000000},
+{0x3000000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3000000},
+{0x3000000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xf51f853a, 0xff800000, 0x3000014},
+{0x3000000, 0xff7fffff, 0xff7ffff0, 0xff800000, 0x3000014},
+{0x3000000, 0xff7fffff, 0xff7fffff, 0xff800000, 0x3000014},
+{0x3000000, 0xff7fffff, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x4f3495cb, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3000010},
+{0x3000000, 0xff7fffff, 0x6164bd6c, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x9503366, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x77f31e2f, 0xff7ffe19, 0x3000010},
+{0x3000000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x966320b, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x317285d3, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x3c9623b1, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x51fd2c7c, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3000010},
+{0x3000000, 0xff800000, 0x0, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x1, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x76, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x2b94, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x636d24, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x7fffff, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x800000, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x800002, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x1398437, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xba98d27, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xba98d7a, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x751f853a, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0x80000000, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x80000001, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x80000076, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x80002b94, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x80636d24, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x807fffff, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x80800000, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x80800002, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x81398437, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xf51f853a, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xff7fffff, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xe73a5134, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x9503366, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x966320b, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xb26bddee, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x317285d3, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3000000},
+{0x3000000, 0xff800001, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x80800000, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x80800002, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x81398437, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x8ba98d27, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3000000},
+{0x3000000, 0x4f3495cb, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xb26bddee, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xe73a5134, 0x0, 0xe73a5134, 0x3000000},
+{0x3000000, 0xe73a5134, 0x1, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x76, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x800000, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x800002, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x1398437, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xba98d27, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xba98d7a, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xe73a5134, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xe73a5134, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3000000},
+{0x3000000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xe73a5134, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0x4f3495cb, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3000000},
+{0x3000000, 0xe73a5134, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3000010},
+{0x3000000, 0xe73a5134, 0x9503366, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3000000},
+{0x3000000, 0xe73a5134, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x966320b, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x317285d3, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x3c9623b1, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x51fd2c7c, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x7f7ffff0, 0x7f800000, 0x3000014},
+{0x3000000, 0x7c994e9e, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x80800000, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x80800002, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x81398437, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xf51f853a, 0x7c994d5f, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xe73a5134, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x77f31e2f, 0x7c998b66, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xb26bddee, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x80800000, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x80800002, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x81398437, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xb26bddee, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x9503366, 0x0, 0x9503366, 0x3000000},
+{0x3000000, 0x9503366, 0x1, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x76, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x2b94, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x636d24, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x7fffff, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x800000, 0x95033a6, 0x3000000},
+{0x3000000, 0x9503366, 0x800002, 0x95033a6, 0x3000010},
+{0x3000000, 0x9503366, 0x1398437, 0x9503420, 0x3000010},
+{0x3000000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3000010},
+{0x3000000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3000010},
+{0x3000000, 0x9503366, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x9503366, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0x80000000, 0x9503366, 0x3000000},
+{0x3000000, 0x9503366, 0x80000001, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x80000076, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x80002b94, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x80636d24, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x807fffff, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x80800000, 0x9503326, 0x3000000},
+{0x3000000, 0x9503366, 0x80800002, 0x9503326, 0x3000010},
+{0x3000000, 0x9503366, 0x81398437, 0x95032ac, 0x3000010},
+{0x3000000, 0x9503366, 0x8ba98d27, 0x8ba30b8c, 0x3000010},
+{0x3000000, 0x9503366, 0x8ba98d7a, 0x8ba30bdf, 0x3000010},
+{0x3000000, 0x9503366, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x9503366, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x9503366, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x9503366, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x9503366, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x9503366, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x9503366, 0x9503366, 0x9d03366, 0x3000000},
+{0x3000000, 0x9503366, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x9503366, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x9503366, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x9503366, 0x966320b, 0x9db32b8, 0x3000010},
+{0x3000000, 0x9503366, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x9503366, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x800000, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x800002, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x1398437, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x9503366, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x966320b, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x800000, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x800002, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x1398437, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x9503366, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x966320b, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x751f853a, 0x77f81a59, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x7f7ffff0, 0x7f800000, 0x3000014},
+{0x3000000, 0x77f31e2f, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x80800000, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x80800002, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x81398437, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe0a, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xff7fffff, 0xff7ffe19, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xe73a5134, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x7c994e9e, 0x7c998b66, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3000000},
+{0x3000000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xb26bddee, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x800000, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x800002, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x1398437, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x9503366, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x966320b, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf58, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d6, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x966320b, 0x0, 0x966320b, 0x3000000},
+{0x3000000, 0x966320b, 0x1, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x76, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x2b94, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x636d24, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x7fffff, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x800000, 0x966324b, 0x3000000},
+{0x3000000, 0x966320b, 0x800002, 0x966324b, 0x3000010},
+{0x3000000, 0x966320b, 0x1398437, 0x96632c5, 0x3000010},
+{0x3000000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3000010},
+{0x3000000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3000010},
+{0x3000000, 0x966320b, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x966320b, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0x80000000, 0x966320b, 0x3000000},
+{0x3000000, 0x966320b, 0x80000001, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x80000076, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x80002b94, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x80636d24, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x807fffff, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x80800000, 0x96631cb, 0x3000000},
+{0x3000000, 0x966320b, 0x80800002, 0x96631cb, 0x3000010},
+{0x3000000, 0x966320b, 0x81398437, 0x9663151, 0x3000010},
+{0x3000000, 0x966320b, 0x8ba98d27, 0x8ba25b97, 0x3000010},
+{0x3000000, 0x966320b, 0x8ba98d7a, 0x8ba25bea, 0x3000010},
+{0x3000000, 0x966320b, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x966320b, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x966320b, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x966320b, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x966320b, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x966320b, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x966320b, 0x9503366, 0x9db32b8, 0x3000010},
+{0x3000000, 0x966320b, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x966320b, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x966320b, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x966320b, 0x966320b, 0x9e6320b, 0x3000000},
+{0x3000000, 0x966320b, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x966320b, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xb26bddee, 0x0, 0xb26bddee, 0x3000000},
+{0x3000000, 0xb26bddee, 0x1, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x76, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x800000, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x800002, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x1398437, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0xba98d27, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0xba98d7a, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xb26bddee, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xb26bddee, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3000000},
+{0x3000000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xb26bddee, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xb26bddee, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xb26bddee, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xb26bddee, 0x9503366, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xb26bddee, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf58, 0x3000010},
+{0x3000000, 0xb26bddee, 0x966320b, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3000000},
+{0x3000000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8f, 0x3000010},
+{0x3000000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3000010},
+{0x3000000, 0xb26bddee, 0x3c9623b1, 0x3c9623aa, 0x3000010},
+{0x3000000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xb26bddee, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d6, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8f, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x317285d3, 0x0, 0x317285d3, 0x3000000},
+{0x3000000, 0x317285d3, 0x1, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x76, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x2b94, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x636d24, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x800000, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x800002, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x1398437, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0x80000000, 0x317285d3, 0x3000000},
+{0x3000000, 0x317285d3, 0x80000001, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x80000076, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x80800000, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x80800002, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x81398437, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x8ba98d27, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x8ba98d7a, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x317285d3, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x317285d3, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x317285d3, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x317285d3, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x317285d3, 0x9503366, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3000010},
+{0x3000000, 0x317285d3, 0x966320b, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3000010},
+{0x3000000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3000010},
+{0x3000000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3000000},
+{0x3000000, 0x317285d3, 0x3c9623b1, 0x3c9623b3, 0x3000010},
+{0x3000000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x80800000, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x80800002, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x81398437, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xb26bddee, 0x3c9623aa, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x317285d3, 0x3c9623b3, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x80800000, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x80800002, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x81398437, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x7f7ffff0, 0x7f800000, 0x3000014},
+{0x3000000, 0x7b906a6c, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x80800000, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x80800002, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x81398437, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xf51f853a, 0x7b906570, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xe73a5134, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xb26bddee, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3000000},
diff --git a/src/tests/core/memory/memory.cpp b/src/tests/core/memory/memory.cpp
new file mode 100644
index 000000000..671afb702
--- /dev/null
+++ b/src/tests/core/memory/memory.cpp
@@ -0,0 +1,56 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <catch.hpp>
+#include "core/hle/kernel/memory.h"
+#include "core/hle/kernel/process.h"
+#include "core/memory.h"
+
+TEST_CASE("Memory::IsValidVirtualAddress", "[core][memory]") {
+ SECTION("these regions should not be mapped on an empty process") {
+ auto process = Kernel::Process::Create("");
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::PROCESS_IMAGE_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::HEAP_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::LINEAR_HEAP_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::VRAM_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::SHARED_PAGE_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::TLS_AREA_VADDR) == false);
+ }
+
+ SECTION("CONFIG_MEMORY_VADDR and SHARED_PAGE_VADDR should be valid after mapping them") {
+ auto process = Kernel::Process::Create("");
+ Kernel::MapSharedPages(process->vm_manager);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == true);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::SHARED_PAGE_VADDR) == true);
+ }
+
+ SECTION("special regions should be valid after mapping them") {
+ auto process = Kernel::Process::Create("");
+ SECTION("VRAM") {
+ Kernel::HandleSpecialMapping(process->vm_manager,
+ {Memory::VRAM_VADDR, Memory::VRAM_SIZE, false, false});
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::VRAM_VADDR) == true);
+ }
+
+ SECTION("IO (Not yet implemented)") {
+ Kernel::HandleSpecialMapping(
+ process->vm_manager, {Memory::IO_AREA_VADDR, Memory::IO_AREA_SIZE, false, false});
+ CHECK_FALSE(Memory::IsValidVirtualAddress(*process, Memory::IO_AREA_VADDR) == true);
+ }
+
+ SECTION("DSP") {
+ Kernel::HandleSpecialMapping(
+ process->vm_manager, {Memory::DSP_RAM_VADDR, Memory::DSP_RAM_SIZE, false, false});
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::DSP_RAM_VADDR) == true);
+ }
+ }
+
+ SECTION("Unmapping a VAddr should make it invalid") {
+ auto process = Kernel::Process::Create("");
+ Kernel::MapSharedPages(process->vm_manager);
+ process->vm_manager.UnmapRange(Memory::CONFIG_MEMORY_VADDR, Memory::CONFIG_MEMORY_SIZE);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == false);
+ }
+}
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index 0961a3251..82f47d8a9 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -1,6 +1,7 @@
set(SRCS
command_processor.cpp
debug_utils/debug_utils.cpp
+ geometry_pipeline.cpp
pica.cpp
primitive_assembly.cpp
regs.cpp
@@ -15,6 +16,7 @@ set(SRCS
shader/shader_interpreter.cpp
swrasterizer/clipper.cpp
swrasterizer/framebuffer.cpp
+ swrasterizer/lighting.cpp
swrasterizer/proctex.cpp
swrasterizer/rasterizer.cpp
swrasterizer/swrasterizer.cpp
@@ -28,6 +30,7 @@ set(SRCS
set(HEADERS
command_processor.h
debug_utils/debug_utils.h
+ geometry_pipeline.h
gpu_debugger.h
pica.h
pica_state.h
@@ -55,6 +58,7 @@ set(HEADERS
shader/shader_interpreter.h
swrasterizer/clipper.h
swrasterizer/framebuffer.h
+ swrasterizer/lighting.h
swrasterizer/proctex.h
swrasterizer/rasterizer.h
swrasterizer/swrasterizer.h
diff --git a/src/video_core/command_processor.cpp b/src/video_core/command_processor.cpp
index 4633a1df1..caf9f7a06 100644
--- a/src/video_core/command_processor.cpp
+++ b/src/video_core/command_processor.cpp
@@ -119,24 +119,221 @@ static void WriteUniformFloatReg(ShaderRegs& config, Shader::ShaderSetup& setup,
}
}
-static void WriteProgramCode(ShaderRegs& config, Shader::ShaderSetup& setup,
- unsigned max_program_code_length, u32 value) {
- if (config.program.offset >= max_program_code_length) {
- LOG_ERROR(HW_GPU, "Invalid %s program offset %d", GetShaderSetupTypeName(setup),
- (int)config.program.offset);
- } else {
- setup.program_code[config.program.offset] = value;
- config.program.offset++;
+static void LoadDefaultVertexAttributes(u32 register_value) {
+ auto& regs = g_state.regs;
+
+ // TODO: Does actual hardware indeed keep an intermediate buffer or does
+ // it directly write the values?
+ default_attr_write_buffer[default_attr_counter++] = register_value;
+
+ // Default attributes are written in a packed format such that four float24 values are encoded
+ // in three 32-bit numbers.
+ // We write to internal memory once a full such vector is written.
+ if (default_attr_counter >= 3) {
+ default_attr_counter = 0;
+
+ auto& setup = regs.pipeline.vs_default_attributes_setup;
+
+ if (setup.index >= 16) {
+ LOG_ERROR(HW_GPU, "Invalid VS default attribute index %d", (int)setup.index);
+ return;
+ }
+
+ Math::Vec4<float24> attribute;
+
+ // NOTE: The destination component order indeed is "backwards"
+ attribute.w = float24::FromRaw(default_attr_write_buffer[0] >> 8);
+ attribute.z = float24::FromRaw(((default_attr_write_buffer[0] & 0xFF) << 16) |
+ ((default_attr_write_buffer[1] >> 16) & 0xFFFF));
+ attribute.y = float24::FromRaw(((default_attr_write_buffer[1] & 0xFFFF) << 8) |
+ ((default_attr_write_buffer[2] >> 24) & 0xFF));
+ attribute.x = float24::FromRaw(default_attr_write_buffer[2] & 0xFFFFFF);
+
+ LOG_TRACE(HW_GPU, "Set default VS attribute %x to (%f %f %f %f)", (int)setup.index,
+ attribute.x.ToFloat32(), attribute.y.ToFloat32(), attribute.z.ToFloat32(),
+ attribute.w.ToFloat32());
+
+ // TODO: Verify that this actually modifies the register!
+ if (setup.index < 15) {
+ g_state.input_default_attributes.attr[setup.index] = attribute;
+ setup.index++;
+ } else {
+ // Put each attribute into an immediate input buffer. When all specified immediate
+ // attributes are present, the Vertex Shader is invoked and everything is sent to
+ // the primitive assembler.
+
+ auto& immediate_input = g_state.immediate.input_vertex;
+ auto& immediate_attribute_id = g_state.immediate.current_attribute;
+
+ immediate_input.attr[immediate_attribute_id] = attribute;
+
+ if (immediate_attribute_id < regs.pipeline.max_input_attrib_index) {
+ immediate_attribute_id += 1;
+ } else {
+ MICROPROFILE_SCOPE(GPU_Drawing);
+ immediate_attribute_id = 0;
+
+ auto* shader_engine = Shader::GetEngine();
+ shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
+
+ // Send to vertex shader
+ if (g_debug_context)
+ g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
+ static_cast<void*>(&immediate_input));
+ Shader::UnitState shader_unit;
+ Shader::AttributeBuffer output{};
+
+ shader_unit.LoadInput(regs.vs, immediate_input);
+ shader_engine->Run(g_state.vs, shader_unit);
+ shader_unit.WriteOutput(regs.vs, output);
+
+ // Send to geometry pipeline
+ if (g_state.immediate.reset_geometry_pipeline) {
+ g_state.geometry_pipeline.Reconfigure();
+ g_state.immediate.reset_geometry_pipeline = false;
+ }
+ ASSERT(!g_state.geometry_pipeline.NeedIndexInput());
+ g_state.geometry_pipeline.Setup(shader_engine);
+ g_state.geometry_pipeline.SubmitVertex(output);
+
+ // TODO: If drawing after every immediate mode triangle kills performance,
+ // change it to flush triangles whenever a drawing config register changes
+ // See: https://github.com/citra-emu/citra/pull/2866#issuecomment-327011550
+ VideoCore::g_renderer->Rasterizer()->DrawTriangles();
+ if (g_debug_context) {
+ g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr);
+ }
+ }
+ }
}
}
-static void WriteSwizzlePatterns(ShaderRegs& config, Shader::ShaderSetup& setup, u32 value) {
- if (config.swizzle_patterns.offset >= setup.swizzle_data.size()) {
- LOG_ERROR(HW_GPU, "Invalid %s swizzle pattern offset %d", GetShaderSetupTypeName(setup),
- (int)config.swizzle_patterns.offset);
- } else {
- setup.swizzle_data[config.swizzle_patterns.offset] = value;
- config.swizzle_patterns.offset++;
+static void Draw(u32 command_id) {
+ MICROPROFILE_SCOPE(GPU_Drawing);
+ auto& regs = g_state.regs;
+
+#if PICA_LOG_TEV
+ DebugUtils::DumpTevStageConfig(regs.GetTevStages());
+#endif
+ if (g_debug_context)
+ g_debug_context->OnEvent(DebugContext::Event::IncomingPrimitiveBatch, nullptr);
+
+ // Processes information about internal vertex attributes to figure out how a vertex is
+ // loaded.
+ // Later, these can be compiled and cached.
+ const u32 base_address = regs.pipeline.vertex_attributes.GetPhysicalBaseAddress();
+ VertexLoader loader(regs.pipeline);
+
+ // Load vertices
+ bool is_indexed = (command_id == PICA_REG_INDEX(pipeline.trigger_draw_indexed));
+
+ const auto& index_info = regs.pipeline.index_array;
+ const u8* index_address_8 = Memory::GetPhysicalPointer(base_address + index_info.offset);
+ const u16* index_address_16 = reinterpret_cast<const u16*>(index_address_8);
+ bool index_u16 = index_info.format != 0;
+
+ PrimitiveAssembler<Shader::OutputVertex>& primitive_assembler = g_state.primitive_assembler;
+
+ if (g_debug_context && g_debug_context->recorder) {
+ for (int i = 0; i < 3; ++i) {
+ const auto texture = regs.texturing.GetTextures()[i];
+ if (!texture.enabled)
+ continue;
+
+ u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress());
+ g_debug_context->recorder->MemoryAccessed(
+ texture_data, Pica::TexturingRegs::NibblesPerPixel(texture.format) *
+ texture.config.width / 2 * texture.config.height,
+ texture.config.GetPhysicalAddress());
+ }
+ }
+
+ DebugUtils::MemoryAccessTracker memory_accesses;
+
+ // Simple circular-replacement vertex cache
+ // The size has been tuned for optimal balance between hit-rate and the cost of lookup
+ const size_t VERTEX_CACHE_SIZE = 32;
+ std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids;
+ std::array<Shader::AttributeBuffer, VERTEX_CACHE_SIZE> vertex_cache;
+ Shader::AttributeBuffer vs_output;
+
+ unsigned int vertex_cache_pos = 0;
+ vertex_cache_ids.fill(-1);
+
+ auto* shader_engine = Shader::GetEngine();
+ Shader::UnitState shader_unit;
+
+ shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
+
+ g_state.geometry_pipeline.Reconfigure();
+ g_state.geometry_pipeline.Setup(shader_engine);
+ if (g_state.geometry_pipeline.NeedIndexInput())
+ ASSERT(is_indexed);
+
+ for (unsigned int index = 0; index < regs.pipeline.num_vertices; ++index) {
+ // Indexed rendering doesn't use the start offset
+ unsigned int vertex = is_indexed
+ ? (index_u16 ? index_address_16[index] : index_address_8[index])
+ : (index + regs.pipeline.vertex_offset);
+
+ // -1 is a common special value used for primitive restart. Since it's unknown if
+ // the PICA supports it, and it would mess up the caching, guard against it here.
+ ASSERT(vertex != -1);
+
+ bool vertex_cache_hit = false;
+
+ if (is_indexed) {
+ if (g_state.geometry_pipeline.NeedIndexInput()) {
+ g_state.geometry_pipeline.SubmitIndex(vertex);
+ continue;
+ }
+
+ if (g_debug_context && Pica::g_debug_context->recorder) {
+ int size = index_u16 ? 2 : 1;
+ memory_accesses.AddAccess(base_address + index_info.offset + size * index, size);
+ }
+
+ for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) {
+ if (vertex == vertex_cache_ids[i]) {
+ vs_output = vertex_cache[i];
+ vertex_cache_hit = true;
+ break;
+ }
+ }
+ }
+
+ if (!vertex_cache_hit) {
+ // Initialize data for the current vertex
+ Shader::AttributeBuffer input;
+ loader.LoadVertex(base_address, index, vertex, input, memory_accesses);
+
+ // Send to vertex shader
+ if (g_debug_context)
+ g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
+ (void*)&input);
+ shader_unit.LoadInput(regs.vs, input);
+ shader_engine->Run(g_state.vs, shader_unit);
+ shader_unit.WriteOutput(regs.vs, vs_output);
+
+ if (is_indexed) {
+ vertex_cache[vertex_cache_pos] = vs_output;
+ vertex_cache_ids[vertex_cache_pos] = vertex;
+ vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE;
+ }
+ }
+
+ // Send to geometry pipeline
+ g_state.geometry_pipeline.SubmitVertex(vs_output);
+ }
+
+ for (auto& range : memory_accesses.ranges) {
+ g_debug_context->recorder->MemoryAccessed(Memory::GetPhysicalPointer(range.first),
+ range.second, range.first);
+ }
+
+ VideoCore::g_renderer->Rasterizer()->DrawTriangles();
+ if (g_debug_context) {
+ g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr);
}
}
@@ -182,106 +379,19 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX(pipeline.vs_default_attributes_setup.index):
g_state.immediate.current_attribute = 0;
+ g_state.immediate.reset_geometry_pipeline = true;
default_attr_counter = 0;
break;
// Load default vertex input attributes
case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[0], 0x233):
case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[1], 0x234):
- case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[2], 0x235): {
- // TODO: Does actual hardware indeed keep an intermediate buffer or does
- // it directly write the values?
- default_attr_write_buffer[default_attr_counter++] = value;
-
- // Default attributes are written in a packed format such that four float24 values are
- // encoded in
- // three 32-bit numbers. We write to internal memory once a full such vector is
- // written.
- if (default_attr_counter >= 3) {
- default_attr_counter = 0;
-
- auto& setup = regs.pipeline.vs_default_attributes_setup;
-
- if (setup.index >= 16) {
- LOG_ERROR(HW_GPU, "Invalid VS default attribute index %d", (int)setup.index);
- break;
- }
-
- Math::Vec4<float24> attribute;
-
- // NOTE: The destination component order indeed is "backwards"
- attribute.w = float24::FromRaw(default_attr_write_buffer[0] >> 8);
- attribute.z = float24::FromRaw(((default_attr_write_buffer[0] & 0xFF) << 16) |
- ((default_attr_write_buffer[1] >> 16) & 0xFFFF));
- attribute.y = float24::FromRaw(((default_attr_write_buffer[1] & 0xFFFF) << 8) |
- ((default_attr_write_buffer[2] >> 24) & 0xFF));
- attribute.x = float24::FromRaw(default_attr_write_buffer[2] & 0xFFFFFF);
-
- LOG_TRACE(HW_GPU, "Set default VS attribute %x to (%f %f %f %f)", (int)setup.index,
- attribute.x.ToFloat32(), attribute.y.ToFloat32(), attribute.z.ToFloat32(),
- attribute.w.ToFloat32());
-
- // TODO: Verify that this actually modifies the register!
- if (setup.index < 15) {
- g_state.input_default_attributes.attr[setup.index] = attribute;
- setup.index++;
- } else {
- // Put each attribute into an immediate input buffer. When all specified immediate
- // attributes are present, the Vertex Shader is invoked and everything is sent to
- // the primitive assembler.
-
- auto& immediate_input = g_state.immediate.input_vertex;
- auto& immediate_attribute_id = g_state.immediate.current_attribute;
-
- immediate_input.attr[immediate_attribute_id] = attribute;
-
- if (immediate_attribute_id < regs.pipeline.max_input_attrib_index) {
- immediate_attribute_id += 1;
- } else {
- MICROPROFILE_SCOPE(GPU_Drawing);
- immediate_attribute_id = 0;
-
- auto* shader_engine = Shader::GetEngine();
- shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
-
- // Send to vertex shader
- if (g_debug_context)
- g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
- static_cast<void*>(&immediate_input));
- Shader::UnitState shader_unit;
- Shader::AttributeBuffer output{};
-
- shader_unit.LoadInput(regs.vs, immediate_input);
- shader_engine->Run(g_state.vs, shader_unit);
- shader_unit.WriteOutput(regs.vs, output);
-
- // Send to renderer
- using Pica::Shader::OutputVertex;
- auto AddTriangle = [](const OutputVertex& v0, const OutputVertex& v1,
- const OutputVertex& v2) {
- VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2);
- };
-
- g_state.primitive_assembler.SubmitVertex(
- Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, output),
- AddTriangle);
- }
- }
- }
+ case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[2], 0x235):
+ LoadDefaultVertexAttributes(value);
break;
- }
case PICA_REG_INDEX(pipeline.gpu_mode):
- if (regs.pipeline.gpu_mode == PipelineRegs::GPUMode::Configuring) {
- MICROPROFILE_SCOPE(GPU_Drawing);
-
- // Draw immediate mode triangles when GPU Mode is set to GPUMode::Configuring
- VideoCore::g_renderer->Rasterizer()->DrawTriangles();
-
- if (g_debug_context) {
- g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr);
- }
- }
+ // This register likely just enables vertex processing and doesn't need any special handling
break;
case PICA_REG_INDEX_WORKAROUND(pipeline.command_buffer.trigger[0], 0x23c):
@@ -297,130 +407,9 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
// It seems like these trigger vertex rendering
case PICA_REG_INDEX(pipeline.trigger_draw):
- case PICA_REG_INDEX(pipeline.trigger_draw_indexed): {
- MICROPROFILE_SCOPE(GPU_Drawing);
-
-#if PICA_LOG_TEV
- DebugUtils::DumpTevStageConfig(regs.GetTevStages());
-#endif
- if (g_debug_context)
- g_debug_context->OnEvent(DebugContext::Event::IncomingPrimitiveBatch, nullptr);
-
- // Processes information about internal vertex attributes to figure out how a vertex is
- // loaded.
- // Later, these can be compiled and cached.
- const u32 base_address = regs.pipeline.vertex_attributes.GetPhysicalBaseAddress();
- VertexLoader loader(regs.pipeline);
-
- // Load vertices
- bool is_indexed = (id == PICA_REG_INDEX(pipeline.trigger_draw_indexed));
-
- const auto& index_info = regs.pipeline.index_array;
- const u8* index_address_8 = Memory::GetPhysicalPointer(base_address + index_info.offset);
- const u16* index_address_16 = reinterpret_cast<const u16*>(index_address_8);
- bool index_u16 = index_info.format != 0;
-
- PrimitiveAssembler<Shader::OutputVertex>& primitive_assembler = g_state.primitive_assembler;
-
- if (g_debug_context && g_debug_context->recorder) {
- for (int i = 0; i < 3; ++i) {
- const auto texture = regs.texturing.GetTextures()[i];
- if (!texture.enabled)
- continue;
-
- u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress());
- g_debug_context->recorder->MemoryAccessed(
- texture_data, Pica::TexturingRegs::NibblesPerPixel(texture.format) *
- texture.config.width / 2 * texture.config.height,
- texture.config.GetPhysicalAddress());
- }
- }
-
- DebugUtils::MemoryAccessTracker memory_accesses;
-
- // Simple circular-replacement vertex cache
- // The size has been tuned for optimal balance between hit-rate and the cost of lookup
- const size_t VERTEX_CACHE_SIZE = 32;
- std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids;
- std::array<Shader::OutputVertex, VERTEX_CACHE_SIZE> vertex_cache;
- Shader::OutputVertex output_vertex;
-
- unsigned int vertex_cache_pos = 0;
- vertex_cache_ids.fill(-1);
-
- auto* shader_engine = Shader::GetEngine();
- Shader::UnitState shader_unit;
-
- shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
-
- for (unsigned int index = 0; index < regs.pipeline.num_vertices; ++index) {
- // Indexed rendering doesn't use the start offset
- unsigned int vertex =
- is_indexed ? (index_u16 ? index_address_16[index] : index_address_8[index])
- : (index + regs.pipeline.vertex_offset);
-
- // -1 is a common special value used for primitive restart. Since it's unknown if
- // the PICA supports it, and it would mess up the caching, guard against it here.
- ASSERT(vertex != -1);
-
- bool vertex_cache_hit = false;
-
- if (is_indexed) {
- if (g_debug_context && Pica::g_debug_context->recorder) {
- int size = index_u16 ? 2 : 1;
- memory_accesses.AddAccess(base_address + index_info.offset + size * index,
- size);
- }
-
- for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) {
- if (vertex == vertex_cache_ids[i]) {
- output_vertex = vertex_cache[i];
- vertex_cache_hit = true;
- break;
- }
- }
- }
-
- if (!vertex_cache_hit) {
- // Initialize data for the current vertex
- Shader::AttributeBuffer input, output{};
- loader.LoadVertex(base_address, index, vertex, input, memory_accesses);
-
- // Send to vertex shader
- if (g_debug_context)
- g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
- (void*)&input);
- shader_unit.LoadInput(regs.vs, input);
- shader_engine->Run(g_state.vs, shader_unit);
- shader_unit.WriteOutput(regs.vs, output);
-
- // Retrieve vertex from register data
- output_vertex = Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, output);
-
- if (is_indexed) {
- vertex_cache[vertex_cache_pos] = output_vertex;
- vertex_cache_ids[vertex_cache_pos] = vertex;
- vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE;
- }
- }
-
- // Send to renderer
- using Pica::Shader::OutputVertex;
- auto AddTriangle = [](const OutputVertex& v0, const OutputVertex& v1,
- const OutputVertex& v2) {
- VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2);
- };
-
- primitive_assembler.SubmitVertex(output_vertex, AddTriangle);
- }
-
- for (auto& range : memory_accesses.ranges) {
- g_debug_context->recorder->MemoryAccessed(Memory::GetPhysicalPointer(range.first),
- range.second, range.first);
- }
-
+ case PICA_REG_INDEX(pipeline.trigger_draw_indexed):
+ Draw(id);
break;
- }
case PICA_REG_INDEX(gs.bool_uniforms):
WriteUniformBoolReg(g_state.gs, g_state.regs.gs.bool_uniforms.Value());
@@ -458,7 +447,13 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[5], 0x2a1):
case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[6], 0x2a2):
case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[7], 0x2a3): {
- WriteProgramCode(g_state.regs.gs, g_state.gs, 4096, value);
+ u32& offset = g_state.regs.gs.program.offset;
+ if (offset >= 4096) {
+ LOG_ERROR(HW_GPU, "Invalid GS program offset %u", offset);
+ } else {
+ g_state.gs.program_code[offset] = value;
+ offset++;
+ }
break;
}
@@ -470,11 +465,18 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[5], 0x2ab):
case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[6], 0x2ac):
case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[7], 0x2ad): {
- WriteSwizzlePatterns(g_state.regs.gs, g_state.gs, value);
+ u32& offset = g_state.regs.gs.swizzle_patterns.offset;
+ if (offset >= g_state.gs.swizzle_data.size()) {
+ LOG_ERROR(HW_GPU, "Invalid GS swizzle pattern offset %u", offset);
+ } else {
+ g_state.gs.swizzle_data[offset] = value;
+ offset++;
+ }
break;
}
case PICA_REG_INDEX(vs.bool_uniforms):
+ // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this?
WriteUniformBoolReg(g_state.vs, g_state.regs.vs.bool_uniforms.Value());
break;
@@ -482,6 +484,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[1], 0x2b2):
case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[2], 0x2b3):
case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[3], 0x2b4): {
+ // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this?
unsigned index = (id - PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[0], 0x2b1));
auto values = regs.vs.int_uniforms[index];
WriteUniformIntReg(g_state.vs, index,
@@ -497,6 +500,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[5], 0x2c6):
case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[6], 0x2c7):
case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[7], 0x2c8): {
+ // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this?
WriteUniformFloatReg(g_state.regs.vs, g_state.vs, vs_float_regs_counter,
vs_uniform_write_buffer, value);
break;
@@ -510,7 +514,16 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[5], 0x2d1):
case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[6], 0x2d2):
case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[7], 0x2d3): {
- WriteProgramCode(g_state.regs.vs, g_state.vs, 512, value);
+ u32& offset = g_state.regs.vs.program.offset;
+ if (offset >= 512) {
+ LOG_ERROR(HW_GPU, "Invalid VS program offset %u", offset);
+ } else {
+ g_state.vs.program_code[offset] = value;
+ if (!g_state.regs.pipeline.gs_unit_exclusive_configuration) {
+ g_state.gs.program_code[offset] = value;
+ }
+ offset++;
+ }
break;
}
@@ -522,7 +535,16 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[5], 0x2db):
case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[6], 0x2dc):
case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[7], 0x2dd): {
- WriteSwizzlePatterns(g_state.regs.vs, g_state.vs, value);
+ u32& offset = g_state.regs.vs.swizzle_patterns.offset;
+ if (offset >= g_state.vs.swizzle_data.size()) {
+ LOG_ERROR(HW_GPU, "Invalid VS swizzle pattern offset %u", offset);
+ } else {
+ g_state.vs.swizzle_data[offset] = value;
+ if (!g_state.regs.pipeline.gs_unit_exclusive_configuration) {
+ g_state.gs.swizzle_data[offset] = value;
+ }
+ offset++;
+ }
break;
}
@@ -620,6 +642,6 @@ void ProcessCommandList(const u32* list, u32 size) {
}
}
-} // namespace
+} // namespace CommandProcessor
-} // namespace
+} // namespace Pica
diff --git a/src/video_core/geometry_pipeline.cpp b/src/video_core/geometry_pipeline.cpp
new file mode 100644
index 000000000..98ff2ccd3
--- /dev/null
+++ b/src/video_core/geometry_pipeline.cpp
@@ -0,0 +1,274 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "video_core/geometry_pipeline.h"
+#include "video_core/pica_state.h"
+#include "video_core/regs.h"
+#include "video_core/renderer_base.h"
+#include "video_core/video_core.h"
+
+namespace Pica {
+
+/// An attribute buffering interface for different pipeline modes
+class GeometryPipelineBackend {
+public:
+ virtual ~GeometryPipelineBackend() = default;
+
+ /// Checks if there is no incomplete data transfer
+ virtual bool IsEmpty() const = 0;
+
+ /// Checks if the pipeline needs a direct input from index buffer
+ virtual bool NeedIndexInput() const = 0;
+
+ /// Submits an index from index buffer
+ virtual void SubmitIndex(unsigned int val) = 0;
+
+ /**
+ * Submits vertex attributes
+ * @param input attributes of a vertex output from vertex shader
+ * @return if the buffer is full and the geometry shader should be invoked
+ */
+ virtual bool SubmitVertex(const Shader::AttributeBuffer& input) = 0;
+};
+
+// In the Point mode, vertex attributes are sent to the input registers in the geometry shader unit.
+// The size of vertex shader outputs and geometry shader inputs are constants. Geometry shader is
+// invoked upon inputs buffer filled up by vertex shader outputs. For example, if we have a geometry
+// shader that takes 6 inputs, and the vertex shader outputs 2 attributes, it would take 3 vertices
+// for one geometry shader invocation.
+// TODO: what happens when the input size is not divisible by the output size?
+class GeometryPipeline_Point : public GeometryPipelineBackend {
+public:
+ GeometryPipeline_Point(const Regs& regs, Shader::GSUnitState& unit) : regs(regs), unit(unit) {
+ ASSERT(regs.pipeline.variable_primitive == 0);
+ ASSERT(regs.gs.input_to_uniform == 0);
+ vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
+ size_t gs_input_num = regs.gs.max_input_attribute_index + 1;
+ ASSERT(gs_input_num % vs_output_num == 0);
+ buffer_cur = attribute_buffer.attr;
+ buffer_end = attribute_buffer.attr + gs_input_num;
+ }
+
+ bool IsEmpty() const override {
+ return buffer_cur == attribute_buffer.attr;
+ }
+
+ bool NeedIndexInput() const override {
+ return false;
+ }
+
+ void SubmitIndex(unsigned int val) override {
+ UNREACHABLE();
+ }
+
+ bool SubmitVertex(const Shader::AttributeBuffer& input) override {
+ buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur);
+ if (buffer_cur == buffer_end) {
+ buffer_cur = attribute_buffer.attr;
+ unit.LoadInput(regs.gs, attribute_buffer);
+ return true;
+ }
+ return false;
+ }
+
+private:
+ const Regs& regs;
+ Shader::GSUnitState& unit;
+ Shader::AttributeBuffer attribute_buffer;
+ Math::Vec4<float24>* buffer_cur;
+ Math::Vec4<float24>* buffer_end;
+ unsigned int vs_output_num;
+};
+
+// In VariablePrimitive mode, vertex attributes are buffered into the uniform registers in the
+// geometry shader unit. The number of vertex is variable, which is specified by the first index
+// value in the batch. This mode is usually used for subdivision.
+class GeometryPipeline_VariablePrimitive : public GeometryPipelineBackend {
+public:
+ GeometryPipeline_VariablePrimitive(const Regs& regs, Shader::ShaderSetup& setup)
+ : regs(regs), setup(setup) {
+ ASSERT(regs.pipeline.variable_primitive == 1);
+ ASSERT(regs.gs.input_to_uniform == 1);
+ vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
+ }
+
+ bool IsEmpty() const override {
+ return need_index;
+ }
+
+ bool NeedIndexInput() const override {
+ return need_index;
+ }
+
+ void SubmitIndex(unsigned int val) override {
+ DEBUG_ASSERT(need_index);
+
+ // The number of vertex input is put to the uniform register
+ float24 vertex_num = float24::FromFloat32(static_cast<float>(val));
+ setup.uniforms.f[0] = Math::MakeVec(vertex_num, vertex_num, vertex_num, vertex_num);
+
+ // The second uniform register and so on are used for receiving input vertices
+ buffer_cur = setup.uniforms.f + 1;
+
+ main_vertex_num = regs.pipeline.variable_vertex_main_num_minus_1 + 1;
+ total_vertex_num = val;
+ need_index = false;
+ }
+
+ bool SubmitVertex(const Shader::AttributeBuffer& input) override {
+ DEBUG_ASSERT(!need_index);
+ if (main_vertex_num != 0) {
+ // For main vertices, receive all attributes
+ buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur);
+ --main_vertex_num;
+ } else {
+ // For other vertices, only receive the first attribute (usually the position)
+ *(buffer_cur++) = input.attr[0];
+ }
+ --total_vertex_num;
+
+ if (total_vertex_num == 0) {
+ need_index = true;
+ return true;
+ }
+
+ return false;
+ }
+
+private:
+ bool need_index = true;
+ const Regs& regs;
+ Shader::ShaderSetup& setup;
+ unsigned int main_vertex_num;
+ unsigned int total_vertex_num;
+ Math::Vec4<float24>* buffer_cur;
+ unsigned int vs_output_num;
+};
+
+// In FixedPrimitive mode, vertex attributes are buffered into the uniform registers in the geometry
+// shader unit. The number of vertex per shader invocation is constant. This is usually used for
+// particle system.
+class GeometryPipeline_FixedPrimitive : public GeometryPipelineBackend {
+public:
+ GeometryPipeline_FixedPrimitive(const Regs& regs, Shader::ShaderSetup& setup)
+ : regs(regs), setup(setup) {
+ ASSERT(regs.pipeline.variable_primitive == 0);
+ ASSERT(regs.gs.input_to_uniform == 1);
+ vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
+ ASSERT(vs_output_num == regs.pipeline.gs_config.stride_minus_1 + 1);
+ size_t vertex_num = regs.pipeline.gs_config.fixed_vertex_num_minus_1 + 1;
+ buffer_cur = buffer_begin = setup.uniforms.f + regs.pipeline.gs_config.start_index;
+ buffer_end = buffer_begin + vs_output_num * vertex_num;
+ }
+
+ bool IsEmpty() const override {
+ return buffer_cur == buffer_begin;
+ }
+
+ bool NeedIndexInput() const override {
+ return false;
+ }
+
+ void SubmitIndex(unsigned int val) override {
+ UNREACHABLE();
+ }
+
+ bool SubmitVertex(const Shader::AttributeBuffer& input) override {
+ buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur);
+ if (buffer_cur == buffer_end) {
+ buffer_cur = buffer_begin;
+ return true;
+ }
+ return false;
+ }
+
+private:
+ const Regs& regs;
+ Shader::ShaderSetup& setup;
+ Math::Vec4<float24>* buffer_begin;
+ Math::Vec4<float24>* buffer_cur;
+ Math::Vec4<float24>* buffer_end;
+ unsigned int vs_output_num;
+};
+
+GeometryPipeline::GeometryPipeline(State& state) : state(state) {}
+
+GeometryPipeline::~GeometryPipeline() = default;
+
+void GeometryPipeline::SetVertexHandler(Shader::VertexHandler vertex_handler) {
+ this->vertex_handler = vertex_handler;
+}
+
+void GeometryPipeline::Setup(Shader::ShaderEngine* shader_engine) {
+ if (!backend)
+ return;
+
+ this->shader_engine = shader_engine;
+ shader_engine->SetupBatch(state.gs, state.regs.gs.main_offset);
+}
+
+void GeometryPipeline::Reconfigure() {
+ ASSERT(!backend || backend->IsEmpty());
+
+ if (state.regs.pipeline.use_gs == PipelineRegs::UseGS::No) {
+ backend = nullptr;
+ return;
+ }
+
+ ASSERT(state.regs.pipeline.use_gs == PipelineRegs::UseGS::Yes);
+
+ // The following assumes that when geometry shader is in use, the shader unit 3 is configured as
+ // a geometry shader unit.
+ // TODO: what happens if this is not true?
+ ASSERT(state.regs.pipeline.gs_unit_exclusive_configuration == 1);
+ ASSERT(state.regs.gs.shader_mode == ShaderRegs::ShaderMode::GS);
+
+ state.gs_unit.ConfigOutput(state.regs.gs);
+
+ ASSERT(state.regs.pipeline.vs_outmap_total_minus_1_a ==
+ state.regs.pipeline.vs_outmap_total_minus_1_b);
+
+ switch (state.regs.pipeline.gs_config.mode) {
+ case PipelineRegs::GSMode::Point:
+ backend = std::make_unique<GeometryPipeline_Point>(state.regs, state.gs_unit);
+ break;
+ case PipelineRegs::GSMode::VariablePrimitive:
+ backend = std::make_unique<GeometryPipeline_VariablePrimitive>(state.regs, state.gs);
+ break;
+ case PipelineRegs::GSMode::FixedPrimitive:
+ backend = std::make_unique<GeometryPipeline_FixedPrimitive>(state.regs, state.gs);
+ break;
+ default:
+ UNREACHABLE();
+ }
+}
+
+bool GeometryPipeline::NeedIndexInput() const {
+ if (!backend)
+ return false;
+ return backend->NeedIndexInput();
+}
+
+void GeometryPipeline::SubmitIndex(unsigned int val) {
+ backend->SubmitIndex(val);
+}
+
+void GeometryPipeline::SubmitVertex(const Shader::AttributeBuffer& input) {
+ if (!backend) {
+ // No backend means the geometry shader is disabled, so we send the vertex shader output
+ // directly to the primitive assembler.
+ vertex_handler(input);
+ } else {
+ if (backend->SubmitVertex(input)) {
+ shader_engine->Run(state.gs, state.gs_unit);
+
+ // The uniform b15 is set to true after every geometry shader invocation. This is useful
+ // for the shader to know if this is the first invocation in a batch, if the program set
+ // b15 to false first.
+ state.gs.uniforms.b[15] = true;
+ }
+ }
+}
+
+} // namespace Pica
diff --git a/src/video_core/geometry_pipeline.h b/src/video_core/geometry_pipeline.h
new file mode 100644
index 000000000..91fdd3192
--- /dev/null
+++ b/src/video_core/geometry_pipeline.h
@@ -0,0 +1,49 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <memory>
+#include "video_core/shader/shader.h"
+
+namespace Pica {
+
+struct State;
+
+class GeometryPipelineBackend;
+
+/// A pipeline receiving from vertex shader and sending to geometry shader and primitive assembler
+class GeometryPipeline {
+public:
+ explicit GeometryPipeline(State& state);
+ ~GeometryPipeline();
+
+ /// Sets the handler for receiving vertex outputs from vertex shader
+ void SetVertexHandler(Shader::VertexHandler vertex_handler);
+
+ /**
+ * Setup the geometry shader unit if it is in use
+ * @param shader_engine the shader engine for the geometry shader to run
+ */
+ void Setup(Shader::ShaderEngine* shader_engine);
+
+ /// Reconfigures the pipeline according to current register settings
+ void Reconfigure();
+
+ /// Checks if the pipeline needs a direct input from index buffer
+ bool NeedIndexInput() const;
+
+ /// Submits an index from index buffer. Call this only when NeedIndexInput returns true
+ void SubmitIndex(unsigned int val);
+
+ /// Submits vertex attributes output from vertex shader
+ void SubmitVertex(const Shader::AttributeBuffer& input);
+
+private:
+ Shader::VertexHandler vertex_handler;
+ Shader::ShaderEngine* shader_engine;
+ std::unique_ptr<GeometryPipelineBackend> backend;
+ State& state;
+};
+} // namespace Pica
diff --git a/src/video_core/pica.cpp b/src/video_core/pica.cpp
index b95148a6a..218e06883 100644
--- a/src/video_core/pica.cpp
+++ b/src/video_core/pica.cpp
@@ -3,9 +3,11 @@
// Refer to the license.txt file included.
#include <cstring>
+#include "video_core/geometry_pipeline.h"
#include "video_core/pica.h"
#include "video_core/pica_state.h"
-#include "video_core/regs_pipeline.h"
+#include "video_core/renderer_base.h"
+#include "video_core/video_core.h"
namespace Pica {
@@ -24,6 +26,23 @@ void Zero(T& o) {
memset(&o, 0, sizeof(o));
}
+State::State() : geometry_pipeline(*this) {
+ auto SubmitVertex = [this](const Shader::AttributeBuffer& vertex) {
+ using Pica::Shader::OutputVertex;
+ auto AddTriangle = [this](const OutputVertex& v0, const OutputVertex& v1,
+ const OutputVertex& v2) {
+ VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2);
+ };
+ primitive_assembler.SubmitVertex(
+ Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, vertex), AddTriangle);
+ };
+
+ auto SetWinding = [this]() { primitive_assembler.SetWinding(); };
+
+ g_state.gs_unit.SetVertexHandler(SubmitVertex, SetWinding);
+ g_state.geometry_pipeline.SetVertexHandler(SubmitVertex);
+}
+
void State::Reset() {
Zero(regs);
Zero(vs);
diff --git a/src/video_core/pica_state.h b/src/video_core/pica_state.h
index 2d23d34e6..c6634a0bc 100644
--- a/src/video_core/pica_state.h
+++ b/src/video_core/pica_state.h
@@ -8,6 +8,7 @@
#include "common/bit_field.h"
#include "common/common_types.h"
#include "common/vector_math.h"
+#include "video_core/geometry_pipeline.h"
#include "video_core/primitive_assembly.h"
#include "video_core/regs.h"
#include "video_core/shader/shader.h"
@@ -16,6 +17,7 @@ namespace Pica {
/// Struct used to describe current Pica state
struct State {
+ State();
void Reset();
/// Pica registers
@@ -79,7 +81,7 @@ struct State {
std::array<ColorDifferenceEntry, 256> color_diff_table;
} proctex;
- struct {
+ struct Lighting {
union LutEntry {
// Used for raw access
u32 raw;
@@ -137,8 +139,17 @@ struct State {
Shader::AttributeBuffer input_vertex;
// Index of the next attribute to be loaded into `input_vertex`.
u32 current_attribute = 0;
+ // Indicates the immediate mode just started and the geometry pipeline needs to reconfigure
+ bool reset_geometry_pipeline = true;
} immediate;
+ // the geometry shader needs to be kept in the global state because some shaders relie on
+ // preserved register value across shader invocation.
+ // TODO: also bring the three vertex shader units here and implement the shader scheduler.
+ Shader::GSUnitState gs_unit;
+
+ GeometryPipeline geometry_pipeline;
+
// This is constructed with a dummy triangle topology
PrimitiveAssembler<Shader::OutputVertex> primitive_assembler;
};
diff --git a/src/video_core/pica_types.h b/src/video_core/pica_types.h
index 5d7e10066..2eafa7e9e 100644
--- a/src/video_core/pica_types.h
+++ b/src/video_core/pica_types.h
@@ -58,11 +58,12 @@ public:
}
Float<M, E> operator*(const Float<M, E>& flt) const {
- if ((this->value == 0.f && !std::isnan(flt.value)) ||
- (flt.value == 0.f && !std::isnan(this->value)))
- // PICA gives 0 instead of NaN when multiplying by inf
- return Zero();
- return Float<M, E>::FromFloat32(ToFloat32() * flt.ToFloat32());
+ float result = value * flt.ToFloat32();
+ // PICA gives 0 instead of NaN when multiplying by inf
+ if (!std::isnan(value) && !std::isnan(flt.ToFloat32()))
+ if (std::isnan(result))
+ result = 0.f;
+ return Float<M, E>::FromFloat32(result);
}
Float<M, E> operator/(const Float<M, E>& flt) const {
@@ -78,12 +79,7 @@ public:
}
Float<M, E>& operator*=(const Float<M, E>& flt) {
- if ((this->value == 0.f && !std::isnan(flt.value)) ||
- (flt.value == 0.f && !std::isnan(this->value)))
- // PICA gives 0 instead of NaN when multiplying by inf
- *this = Zero();
- else
- value *= flt.ToFloat32();
+ value = operator*(flt).value;
return *this;
}
diff --git a/src/video_core/primitive_assembly.cpp b/src/video_core/primitive_assembly.cpp
index acd2ac5e2..9c3dd4cab 100644
--- a/src/video_core/primitive_assembly.cpp
+++ b/src/video_core/primitive_assembly.cpp
@@ -17,15 +17,18 @@ template <typename VertexType>
void PrimitiveAssembler<VertexType>::SubmitVertex(const VertexType& vtx,
TriangleHandler triangle_handler) {
switch (topology) {
- // TODO: Figure out what's different with TriangleTopology::Shader.
case PipelineRegs::TriangleTopology::List:
case PipelineRegs::TriangleTopology::Shader:
if (buffer_index < 2) {
buffer[buffer_index++] = vtx;
} else {
buffer_index = 0;
-
- triangle_handler(buffer[0], buffer[1], vtx);
+ if (topology == PipelineRegs::TriangleTopology::Shader && winding) {
+ triangle_handler(buffer[1], buffer[0], vtx);
+ winding = false;
+ } else {
+ triangle_handler(buffer[0], buffer[1], vtx);
+ }
}
break;
@@ -51,9 +54,15 @@ void PrimitiveAssembler<VertexType>::SubmitVertex(const VertexType& vtx,
}
template <typename VertexType>
+void PrimitiveAssembler<VertexType>::SetWinding() {
+ winding = true;
+}
+
+template <typename VertexType>
void PrimitiveAssembler<VertexType>::Reset() {
buffer_index = 0;
strip_ready = false;
+ winding = false;
}
template <typename VertexType>
diff --git a/src/video_core/primitive_assembly.h b/src/video_core/primitive_assembly.h
index e8eccdf27..12de8e3b9 100644
--- a/src/video_core/primitive_assembly.h
+++ b/src/video_core/primitive_assembly.h
@@ -30,6 +30,12 @@ struct PrimitiveAssembler {
void SubmitVertex(const VertexType& vtx, TriangleHandler triangle_handler);
/**
+ * Invert the vertex order of the next triangle. Called by geometry shader emitter.
+ * This only takes effect for TriangleTopology::Shader.
+ */
+ void SetWinding();
+
+ /**
* Resets the internal state of the PrimitiveAssembler.
*/
void Reset();
@@ -45,6 +51,7 @@ private:
int buffer_index;
VertexType buffer[2];
bool strip_ready = false;
+ bool winding = false;
};
} // namespace
diff --git a/src/video_core/regs_framebuffer.h b/src/video_core/regs_framebuffer.h
index a50bd4111..7b565f911 100644
--- a/src/video_core/regs_framebuffer.h
+++ b/src/video_core/regs_framebuffer.h
@@ -256,10 +256,9 @@ struct FramebufferRegs {
return 3;
case DepthFormat::D24S8:
return 4;
- default:
- LOG_CRITICAL(HW_GPU, "Unknown depth format %u", format);
- UNIMPLEMENTED();
}
+
+ ASSERT_MSG(false, "Unknown depth format %u", format);
}
// Returns the number of bits per depth component of the specified depth format
@@ -270,10 +269,9 @@ struct FramebufferRegs {
case DepthFormat::D24:
case DepthFormat::D24S8:
return 24;
- default:
- LOG_CRITICAL(HW_GPU, "Unknown depth format %u", format);
- UNIMPLEMENTED();
}
+
+ ASSERT_MSG(false, "Unknown depth format %u", format);
}
INSERT_PADDING_WORDS(0x20);
diff --git a/src/video_core/regs_pipeline.h b/src/video_core/regs_pipeline.h
index 31c747d77..e78c3e331 100644
--- a/src/video_core/regs_pipeline.h
+++ b/src/video_core/regs_pipeline.h
@@ -147,7 +147,15 @@ struct PipelineRegs {
// Number of vertices to render
u32 num_vertices;
- INSERT_PADDING_WORDS(0x1);
+ enum class UseGS : u32 {
+ No = 0,
+ Yes = 2,
+ };
+
+ union {
+ BitField<0, 2, UseGS> use_gs;
+ BitField<31, 1, u32> variable_primitive;
+ };
// The index of the first vertex to render
u32 vertex_offset;
@@ -202,7 +210,14 @@ struct PipelineRegs {
/// Number of input attributes to the vertex shader minus 1
BitField<0, 4, u32> max_input_attrib_index;
- INSERT_PADDING_WORDS(2);
+ INSERT_PADDING_WORDS(1);
+
+ // The shader unit 3, which can be used for both vertex and geometry shader, gets its
+ // configuration depending on this register. If this is not set, unit 3 will share some
+ // configuration with other units. It is known that program code and swizzle pattern uploaded
+ // via regs.vs will be also uploaded to unit 3 if this is not set. Although very likely, it is
+ // still unclear whether uniforms and other configuration can be also shared.
+ BitField<0, 1, u32> gs_unit_exclusive_configuration;
enum class GPUMode : u32 {
Drawing = 0,
@@ -211,7 +226,29 @@ struct PipelineRegs {
GPUMode gpu_mode;
- INSERT_PADDING_WORDS(0x18);
+ INSERT_PADDING_WORDS(0x4);
+ BitField<0, 4, u32> vs_outmap_total_minus_1_a;
+ INSERT_PADDING_WORDS(0x6);
+ BitField<0, 4, u32> vs_outmap_total_minus_1_b;
+
+ enum class GSMode : u32 {
+ Point = 0,
+ VariablePrimitive = 1,
+ FixedPrimitive = 2,
+ };
+
+ union {
+ BitField<0, 8, GSMode> mode;
+ BitField<8, 4, u32> fixed_vertex_num_minus_1;
+ BitField<12, 4, u32> stride_minus_1;
+ BitField<16, 4, u32> start_index;
+ } gs_config;
+
+ INSERT_PADDING_WORDS(0x1);
+
+ u32 variable_vertex_main_num_minus_1;
+
+ INSERT_PADDING_WORDS(0x9);
enum class TriangleTopology : u32 {
List = 0,
diff --git a/src/video_core/regs_rasterizer.h b/src/video_core/regs_rasterizer.h
index 2874fd127..4fef00d76 100644
--- a/src/video_core/regs_rasterizer.h
+++ b/src/video_core/regs_rasterizer.h
@@ -5,10 +5,10 @@
#pragma once
#include <array>
-
#include "common/bit_field.h"
#include "common/common_funcs.h"
#include "common/common_types.h"
+#include "video_core/pica_types.h"
namespace Pica {
@@ -31,7 +31,17 @@ struct RasterizerRegs {
BitField<0, 24, u32> viewport_size_y;
- INSERT_PADDING_WORDS(0x9);
+ INSERT_PADDING_WORDS(0x3);
+
+ BitField<0, 1, u32> clip_enable;
+ BitField<0, 24, u32> clip_coef[4]; // float24
+
+ Math::Vec4<float24> GetClipCoef() const {
+ return {float24::FromRaw(clip_coef[0]), float24::FromRaw(clip_coef[1]),
+ float24::FromRaw(clip_coef[2]), float24::FromRaw(clip_coef[3])};
+ }
+
+ INSERT_PADDING_WORDS(0x1);
BitField<0, 24, u32> viewport_depth_range; // float24
BitField<0, 24, u32> viewport_depth_near_plane; // float24
diff --git a/src/video_core/regs_shader.h b/src/video_core/regs_shader.h
index ddb1ee451..c15d4d162 100644
--- a/src/video_core/regs_shader.h
+++ b/src/video_core/regs_shader.h
@@ -24,9 +24,16 @@ struct ShaderRegs {
INSERT_PADDING_WORDS(0x4);
+ enum ShaderMode {
+ GS = 0x08,
+ VS = 0xA0,
+ };
+
union {
// Number of input attributes to shader unit - 1
BitField<0, 4, u32> max_input_attribute_index;
+ BitField<8, 8, u32> input_to_uniform;
+ BitField<24, 8, ShaderMode> shader_mode;
};
// Offset to shader program entry point (in words)
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 1c6c15a58..7e09e4712 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -28,6 +28,9 @@ MICROPROFILE_DEFINE(OpenGL_Blits, "OpenGL", "Blits", MP_RGB(100, 100, 255));
MICROPROFILE_DEFINE(OpenGL_CacheManagement, "OpenGL", "Cache Mgmt", MP_RGB(100, 255, 100));
RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) {
+ // Clipping plane 0 is always enabled for PICA fixed clip plane z <= 0
+ state.clip_distance[0] = true;
+
// Create sampler objects
for (size_t i = 0; i < texture_samplers.size(); ++i) {
texture_samplers[i].Create();
@@ -166,6 +169,8 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) {
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, proctex_diff_lut_buffer.handle);
// Sync fixed function OpenGL state
+ SyncClipEnabled();
+ SyncClipCoef();
SyncCullMode();
SyncBlendEnabled();
SyncBlendFuncs();
@@ -232,13 +237,24 @@ void RasterizerOpenGL::DrawTriangles() {
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
color_surface != nullptr ? color_surface->texture.handle : 0, 0);
- glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
- depth_surface != nullptr ? depth_surface->texture.handle : 0, 0);
- bool has_stencil =
- regs.framebuffer.framebuffer.depth_format == Pica::FramebufferRegs::DepthFormat::D24S8;
- glFramebufferTexture2D(
- GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
- (has_stencil && depth_surface != nullptr) ? depth_surface->texture.handle : 0, 0);
+ if (depth_surface != nullptr) {
+ if (regs.framebuffer.framebuffer.depth_format ==
+ Pica::FramebufferRegs::DepthFormat::D24S8) {
+ // attach both depth and stencil
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
+ depth_surface->texture.handle, 0);
+ } else {
+ // attach depth
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
+ depth_surface->texture.handle, 0);
+ // clear stencil attachment
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
+ }
+ } else {
+ // clear both depth and stencil attachment
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0,
+ 0);
+ }
// Sync the viewport
// These registers hold half-width and half-height, so must be multiplied by 2
@@ -398,6 +414,18 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
SyncCullMode();
break;
+ // Clipping plane
+ case PICA_REG_INDEX(rasterizer.clip_enable):
+ SyncClipEnabled();
+ break;
+
+ case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[0], 0x48):
+ case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[1], 0x49):
+ case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[2], 0x4a):
+ case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[3], 0x4b):
+ SyncClipCoef();
+ break;
+
// Depth modifiers
case PICA_REG_INDEX(rasterizer.viewport_depth_range):
SyncDepthScale();
@@ -1277,6 +1305,20 @@ void RasterizerOpenGL::SetShader() {
}
}
+void RasterizerOpenGL::SyncClipEnabled() {
+ state.clip_distance[1] = Pica::g_state.regs.rasterizer.clip_enable != 0;
+}
+
+void RasterizerOpenGL::SyncClipCoef() {
+ const auto raw_clip_coef = Pica::g_state.regs.rasterizer.GetClipCoef();
+ const GLvec4 new_clip_coef = {raw_clip_coef.x.ToFloat32(), raw_clip_coef.y.ToFloat32(),
+ raw_clip_coef.z.ToFloat32(), raw_clip_coef.w.ToFloat32()};
+ if (new_clip_coef != uniform_block_data.data.clip_coef) {
+ uniform_block_data.data.clip_coef = new_clip_coef;
+ uniform_block_data.dirty = true;
+ }
+}
+
void RasterizerOpenGL::SyncCullMode() {
const auto& regs = Pica::g_state.regs;
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 78e218efe..46c62961c 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -151,14 +151,21 @@ private:
LightSrc light_src[8];
alignas(16) GLvec4 const_color[6]; // A vec4 color for each of the six tev stages
alignas(16) GLvec4 tev_combiner_buffer_color;
+ alignas(16) GLvec4 clip_coef;
};
static_assert(
- sizeof(UniformData) == 0x460,
+ sizeof(UniformData) == 0x470,
"The size of the UniformData structure has changed, update the structure in the shader");
static_assert(sizeof(UniformData) < 16384,
"UniformData structure must be less than 16kb as per the OpenGL spec");
+ /// Syncs the clip enabled status to match the PICA register
+ void SyncClipEnabled();
+
+ /// Syncs the clip coefficients to match the PICA register
+ void SyncClipCoef();
+
/// Sets the OpenGL shader in accordance with the current PICA register state
void SetShader();
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp
index bb192affd..9fe183944 100644
--- a/src/video_core/renderer_opengl/gl_shader_gen.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp
@@ -8,6 +8,7 @@
#include "common/assert.h"
#include "common/bit_field.h"
#include "common/logging/log.h"
+#include "core/core.h"
#include "video_core/regs_framebuffer.h"
#include "video_core/regs_lighting.h"
#include "video_core/regs_rasterizer.h"
@@ -24,6 +25,42 @@ using TevStageConfig = TexturingRegs::TevStageConfig;
namespace GLShader {
+static const std::string UniformBlockDef = R"(
+#define NUM_TEV_STAGES 6
+#define NUM_LIGHTS 8
+
+struct LightSrc {
+ vec3 specular_0;
+ vec3 specular_1;
+ vec3 diffuse;
+ vec3 ambient;
+ vec3 position;
+ vec3 spot_direction;
+ float dist_atten_bias;
+ float dist_atten_scale;
+};
+
+layout (std140) uniform shader_data {
+ vec2 framebuffer_scale;
+ int alphatest_ref;
+ float depth_scale;
+ float depth_offset;
+ int scissor_x1;
+ int scissor_y1;
+ int scissor_x2;
+ int scissor_y2;
+ vec3 fog_color;
+ vec2 proctex_noise_f;
+ vec2 proctex_noise_a;
+ vec2 proctex_noise_p;
+ vec3 lighting_global_ambient;
+ LightSrc light_src[NUM_LIGHTS];
+ vec4 const_color[NUM_TEV_STAGES];
+ vec4 tev_combiner_buffer_color;
+ vec4 clip_coef;
+};
+)";
+
PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) {
PicaShaderConfig res;
@@ -525,11 +562,12 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
"float geo_factor = 1.0;\n";
// Compute fragment normals and tangents
- const std::string pertubation =
- "2.0 * (" + SampleTexture(config, lighting.bump_selector) + ").rgb - 1.0";
+ auto Perturbation = [&]() {
+ return "2.0 * (" + SampleTexture(config, lighting.bump_selector) + ").rgb - 1.0";
+ };
if (lighting.bump_mode == LightingRegs::LightingBumpMode::NormalMap) {
// Bump mapping is enabled using a normal map
- out += "vec3 surface_normal = " + pertubation + ";\n";
+ out += "vec3 surface_normal = " + Perturbation() + ";\n";
// Recompute Z-component of perturbation if 'renorm' is enabled, this provides a higher
// precision result
@@ -543,7 +581,7 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
out += "vec3 surface_tangent = vec3(1.0, 0.0, 0.0);\n";
} else if (lighting.bump_mode == LightingRegs::LightingBumpMode::TangentMap) {
// Bump mapping is enabled using a tangent map
- out += "vec3 surface_tangent = " + pertubation + ";\n";
+ out += "vec3 surface_tangent = " + Perturbation() + ";\n";
// Mathematically, recomputing Z-component of the tangent vector won't affect the relevant
// computation below, which is also confirmed on 3DS. So we don't bother recomputing here
// even if 'renorm' is enabled.
@@ -593,8 +631,8 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
// Note: even if the normal vector is modified by normal map, which is not the
// normal of the tangent plane anymore, the half angle vector is still projected
// using the modified normal vector.
- std::string half_angle_proj = "normalize(half_vector) - normal / dot(normal, "
- "normal) * dot(normal, normalize(half_vector))";
+ std::string half_angle_proj =
+ "normalize(half_vector) - normal * dot(normal, normalize(half_vector))";
// Note: the half angle vector projection is confirmed not normalized before the dot
// product. The result is in fact not cos(phi) as the name suggested.
index = "dot(" + half_angle_proj + ", tangent)";
@@ -749,7 +787,8 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
}
// Fresnel
- if (lighting.lut_fr.enable &&
+ // Note: only the last entry in the light slots applies the Fresnel factor
+ if (light_index == lighting.src_num - 1 && lighting.lut_fr.enable &&
LightingRegs::IsLightingSamplerSupported(lighting.config,
LightingRegs::LightingSampler::Fresnel)) {
// Lookup fresnel LUT value
@@ -758,17 +797,17 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
lighting.lut_fr.type, lighting.lut_fr.abs_input);
value = "(" + std::to_string(lighting.lut_fr.scale) + " * " + value + ")";
- // Enabled for difffuse lighting alpha component
+ // Enabled for diffuse lighting alpha component
if (lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::PrimaryAlpha ||
lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
- out += "diffuse_sum.a *= " + value + ";\n";
+ out += "diffuse_sum.a = " + value + ";\n";
}
// Enabled for the specular lighting alpha component
if (lighting.fresnel_selector ==
LightingRegs::LightingFresnelSelector::SecondaryAlpha ||
lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
- out += "specular_sum.a *= " + value + ";\n";
+ out += "specular_sum.a = " + value + ";\n";
}
}
@@ -1007,8 +1046,6 @@ std::string GenerateFragmentShader(const PicaShaderConfig& config) {
std::string out = R"(
#version 330 core
-#define NUM_TEV_STAGES 6
-#define NUM_LIGHTS 8
in vec4 primary_color;
in vec2 texcoord[3];
@@ -1020,36 +1057,6 @@ in vec4 gl_FragCoord;
out vec4 color;
-struct LightSrc {
- vec3 specular_0;
- vec3 specular_1;
- vec3 diffuse;
- vec3 ambient;
- vec3 position;
- vec3 spot_direction;
- float dist_atten_bias;
- float dist_atten_scale;
-};
-
-layout (std140) uniform shader_data {
- vec2 framebuffer_scale;
- int alphatest_ref;
- float depth_scale;
- float depth_offset;
- int scissor_x1;
- int scissor_y1;
- int scissor_x2;
- int scissor_y2;
- vec3 fog_color;
- vec2 proctex_noise_f;
- vec2 proctex_noise_a;
- vec2 proctex_noise_p;
- vec3 lighting_global_ambient;
- LightSrc light_src[NUM_LIGHTS];
- vec4 const_color[NUM_TEV_STAGES];
- vec4 tev_combiner_buffer_color;
-};
-
uniform sampler2D tex[3];
uniform samplerBuffer lighting_lut;
uniform samplerBuffer fog_lut;
@@ -1058,7 +1065,11 @@ uniform samplerBuffer proctex_color_map;
uniform samplerBuffer proctex_alpha_map;
uniform samplerBuffer proctex_lut;
uniform samplerBuffer proctex_diff_lut;
+)";
+
+ out += UniformBlockDef;
+ out += R"(
// Rotate the vector v by the quaternion q
vec3 quaternion_rotate(vec4 q, vec3 v) {
return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);
@@ -1111,7 +1122,10 @@ vec4 secondary_fragment_color = vec4(0.0);
"gl_FragCoord.y < scissor_y2)) discard;\n";
}
- out += "float z_over_w = 1.0 - gl_FragCoord.z * 2.0;\n";
+ // After perspective divide, OpenGL transform z_over_w from [-1, 1] to [near, far]. Here we use
+ // default near = 0 and far = 1, and undo the transformation to get the original z_over_w, then
+ // do our own transformation according to PICA specification.
+ out += "float z_over_w = 2.0 * gl_FragCoord.z - 1.0;\n";
out += "float depth = z_over_w * depth_scale + depth_offset;\n";
if (state.depthmap_enable == RasterizerRegs::DepthBuffering::WBuffering) {
out += "depth /= gl_FragCoord.w;\n";
@@ -1151,6 +1165,11 @@ vec4 secondary_fragment_color = vec4(0.0);
// Blend the fog
out += "last_tex_env_out.rgb = mix(fog_color.rgb, last_tex_env_out.rgb, fog_factor);\n";
+ } else if (state.fog_mode == TexturingRegs::FogMode::Gas) {
+ Core::Telemetry().AddField(Telemetry::FieldType::Session, "VideoCore_Pica_UseGasMode",
+ true);
+ LOG_CRITICAL(Render_OpenGL, "Unimplemented gas mode");
+ UNIMPLEMENTED();
}
out += "gl_FragDepth = depth;\n";
@@ -1186,6 +1205,12 @@ out float texcoord0_w;
out vec4 normquat;
out vec3 view;
+)";
+
+ out += UniformBlockDef;
+
+ out += R"(
+
void main() {
primary_color = vert_color;
texcoord[0] = vert_texcoord0;
@@ -1194,7 +1219,9 @@ void main() {
texcoord0_w = vert_texcoord0_w;
normquat = vert_normquat;
view = vert_view;
- gl_Position = vec4(vert_position.x, vert_position.y, -vert_position.z, vert_position.w);
+ gl_Position = vert_position;
+ gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0
+ gl_ClipDistance[1] = dot(clip_coef, vert_position);
}
)";
diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp
index bc9d34b84..5770ae08f 100644
--- a/src/video_core/renderer_opengl/gl_state.cpp
+++ b/src/video_core/renderer_opengl/gl_state.cpp
@@ -68,6 +68,8 @@ OpenGLState::OpenGLState() {
draw.vertex_buffer = 0;
draw.uniform_buffer = 0;
draw.shader_program = 0;
+
+ clip_distance = {};
}
void OpenGLState::Apply() const {
@@ -261,6 +263,17 @@ void OpenGLState::Apply() const {
glUseProgram(draw.shader_program);
}
+ // Clip distance
+ for (size_t i = 0; i < clip_distance.size(); ++i) {
+ if (clip_distance[i] != cur_state.clip_distance[i]) {
+ if (clip_distance[i]) {
+ glEnable(GL_CLIP_DISTANCE0 + static_cast<GLenum>(i));
+ } else {
+ glDisable(GL_CLIP_DISTANCE0 + static_cast<GLenum>(i));
+ }
+ }
+ }
+
cur_state = *this;
}
diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h
index 745a74479..437fe34c4 100644
--- a/src/video_core/renderer_opengl/gl_state.h
+++ b/src/video_core/renderer_opengl/gl_state.h
@@ -4,6 +4,7 @@
#pragma once
+#include <array>
#include <glad/glad.h>
namespace TextureUnits {
@@ -123,6 +124,8 @@ public:
GLuint shader_program; // GL_CURRENT_PROGRAM
} draw;
+ std::array<bool, 2> clip_distance; // GL_CLIP_DISTANCE
+
OpenGLState();
/// Get the currently active OpenGL state
diff --git a/src/video_core/shader/shader.cpp b/src/video_core/shader/shader.cpp
index 67ed19ba8..2857d2829 100644
--- a/src/video_core/shader/shader.cpp
+++ b/src/video_core/shader/shader.cpp
@@ -21,7 +21,8 @@ namespace Pica {
namespace Shader {
-OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs, AttributeBuffer& input) {
+OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs,
+ const AttributeBuffer& input) {
// Setup output data
union {
OutputVertex ret{};
@@ -51,7 +52,8 @@ OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs, Attri
// The hardware takes the absolute and saturates vertex colors like this, *before* doing
// interpolation
for (unsigned i = 0; i < 4; ++i) {
- ret.color[i] = float24::FromFloat32(std::fmin(std::fabs(ret.color[i].ToFloat32()), 1.0f));
+ float c = std::fabs(ret.color[i].ToFloat32());
+ ret.color[i] = float24::FromFloat32(c < 1.0f ? c : 1.0f);
}
LOG_TRACE(HW_GPU, "Output vertex: pos(%.2f, %.2f, %.2f, %.2f), quat(%.2f, %.2f, %.2f, %.2f), "
@@ -82,6 +84,44 @@ void UnitState::WriteOutput(const ShaderRegs& config, AttributeBuffer& output) {
}
}
+UnitState::UnitState(GSEmitter* emitter) : emitter_ptr(emitter) {}
+
+GSEmitter::GSEmitter() {
+ handlers = new Handlers;
+}
+
+GSEmitter::~GSEmitter() {
+ delete handlers;
+}
+
+void GSEmitter::Emit(Math::Vec4<float24> (&vertex)[16]) {
+ ASSERT(vertex_id < 3);
+ std::copy(std::begin(vertex), std::end(vertex), buffer[vertex_id].begin());
+ if (prim_emit) {
+ if (winding)
+ handlers->winding_setter();
+ for (size_t i = 0; i < buffer.size(); ++i) {
+ AttributeBuffer output;
+ unsigned int output_i = 0;
+ for (unsigned int reg : Common::BitSet<u32>(output_mask)) {
+ output.attr[output_i++] = buffer[i][reg];
+ }
+ handlers->vertex_handler(output);
+ }
+ }
+}
+
+GSUnitState::GSUnitState() : UnitState(&emitter) {}
+
+void GSUnitState::SetVertexHandler(VertexHandler vertex_handler, WindingSetter winding_setter) {
+ emitter.handlers->vertex_handler = std::move(vertex_handler);
+ emitter.handlers->winding_setter = std::move(winding_setter);
+}
+
+void GSUnitState::ConfigOutput(const ShaderRegs& config) {
+ emitter.output_mask = config.output_mask;
+}
+
MICROPROFILE_DEFINE(GPU_Shader, "GPU", "Shader", MP_RGB(50, 50, 240));
#ifdef ARCHITECTURE_x86_64
diff --git a/src/video_core/shader/shader.h b/src/video_core/shader/shader.h
index e156f6aef..a3789da01 100644
--- a/src/video_core/shader/shader.h
+++ b/src/video_core/shader/shader.h
@@ -6,6 +6,7 @@
#include <array>
#include <cstddef>
+#include <functional>
#include <type_traits>
#include <nihstro/shader_bytecode.h>
#include "common/assert.h"
@@ -31,6 +32,12 @@ struct AttributeBuffer {
alignas(16) Math::Vec4<float24> attr[16];
};
+/// Handler type for receiving vertex outputs from vertex shader or geometry shader
+using VertexHandler = std::function<void(const AttributeBuffer&)>;
+
+/// Handler type for signaling to invert the vertex order of the next triangle
+using WindingSetter = std::function<void()>;
+
struct OutputVertex {
Math::Vec4<float24> pos;
Math::Vec4<float24> quat;
@@ -43,7 +50,8 @@ struct OutputVertex {
INSERT_PADDING_WORDS(1);
Math::Vec2<float24> tc2;
- static OutputVertex FromAttributeBuffer(const RasterizerRegs& regs, AttributeBuffer& output);
+ static OutputVertex FromAttributeBuffer(const RasterizerRegs& regs,
+ const AttributeBuffer& output);
};
#define ASSERT_POS(var, pos) \
static_assert(offsetof(OutputVertex, var) == pos * sizeof(float24), "Semantic at wrong " \
@@ -61,12 +69,36 @@ static_assert(std::is_pod<OutputVertex>::value, "Structure is not POD");
static_assert(sizeof(OutputVertex) == 24 * sizeof(float), "OutputVertex has invalid size");
/**
+ * This structure contains state information for primitive emitting in geometry shader.
+ */
+struct GSEmitter {
+ std::array<std::array<Math::Vec4<float24>, 16>, 3> buffer;
+ u8 vertex_id;
+ bool prim_emit;
+ bool winding;
+ u32 output_mask;
+
+ // Function objects are hidden behind a raw pointer to make the structure standard layout type,
+ // for JIT to use offsetof to access other members.
+ struct Handlers {
+ VertexHandler vertex_handler;
+ WindingSetter winding_setter;
+ } * handlers;
+
+ GSEmitter();
+ ~GSEmitter();
+ void Emit(Math::Vec4<float24> (&vertex)[16]);
+};
+static_assert(std::is_standard_layout<GSEmitter>::value, "GSEmitter is not standard layout type");
+
+/**
* This structure contains the state information that needs to be unique for a shader unit. The 3DS
* has four shader units that process shaders in parallel. At the present, Citra only implements a
* single shader unit that processes all shaders serially. Putting the state information in a struct
* here will make it easier for us to parallelize the shader processing later.
*/
struct UnitState {
+ explicit UnitState(GSEmitter* emitter = nullptr);
struct Registers {
// The registers are accessed by the shader JIT using SSE instructions, and are therefore
// required to be 16-byte aligned.
@@ -82,6 +114,8 @@ struct UnitState {
// TODO: How many bits do these actually have?
s32 address_registers[3];
+ GSEmitter* emitter_ptr;
+
static size_t InputOffset(const SourceRegister& reg) {
switch (reg.GetRegisterType()) {
case RegisterType::Input:
@@ -125,6 +159,19 @@ struct UnitState {
void WriteOutput(const ShaderRegs& config, AttributeBuffer& output);
};
+/**
+ * This is an extended shader unit state that represents the special unit that can run both vertex
+ * shader and geometry shader. It contains an additional primitive emitter and utilities for
+ * geometry shader.
+ */
+struct GSUnitState : public UnitState {
+ GSUnitState();
+ void SetVertexHandler(VertexHandler vertex_handler, WindingSetter winding_setter);
+ void ConfigOutput(const ShaderRegs& config);
+
+ GSEmitter emitter;
+};
+
struct ShaderSetup {
struct {
// The float uniforms are accessed by the shader JIT using SSE instructions, and are
diff --git a/src/video_core/shader/shader_interpreter.cpp b/src/video_core/shader/shader_interpreter.cpp
index aa1cec81f..9d4da4904 100644
--- a/src/video_core/shader/shader_interpreter.cpp
+++ b/src/video_core/shader/shader_interpreter.cpp
@@ -631,11 +631,27 @@ static void RunInterpreter(const ShaderSetup& setup, UnitState& state, DebugData
state.address_registers[2] = loop_param.y;
Record<DebugDataRecord::LOOP_INT_IN>(debug_data, iteration, loop_param);
- call(program_counter + 1, instr.flow_control.dest_offset - program_counter + 1,
+ call(program_counter + 1, instr.flow_control.dest_offset - program_counter,
instr.flow_control.dest_offset + 1, loop_param.x, loop_param.z);
break;
}
+ case OpCode::Id::EMIT: {
+ GSEmitter* emitter = state.emitter_ptr;
+ ASSERT_MSG(emitter, "Execute EMIT on VS");
+ emitter->Emit(state.registers.output);
+ break;
+ }
+
+ case OpCode::Id::SETEMIT: {
+ GSEmitter* emitter = state.emitter_ptr;
+ ASSERT_MSG(emitter, "Execute SETEMIT on VS");
+ emitter->vertex_id = instr.setemit.vertex_id;
+ emitter->prim_emit = instr.setemit.prim_emit != 0;
+ emitter->winding = instr.setemit.winding != 0;
+ break;
+ }
+
default:
LOG_ERROR(HW_GPU, "Unhandled instruction: 0x%02x (%s): 0x%08x",
(int)instr.opcode.Value().EffectiveOpCode(),
diff --git a/src/video_core/shader/shader_jit_x64_compiler.cpp b/src/video_core/shader/shader_jit_x64_compiler.cpp
index 42a57aab1..1b31623bd 100644
--- a/src/video_core/shader/shader_jit_x64_compiler.cpp
+++ b/src/video_core/shader/shader_jit_x64_compiler.cpp
@@ -75,8 +75,8 @@ const JitFunction instr_table[64] = {
&JitShader::Compile_IF, // ifu
&JitShader::Compile_IF, // ifc
&JitShader::Compile_LOOP, // loop
- nullptr, // emit
- nullptr, // sete
+ &JitShader::Compile_EMIT, // emit
+ &JitShader::Compile_SETE, // sete
&JitShader::Compile_JMP, // jmpc
&JitShader::Compile_JMP, // jmpu
&JitShader::Compile_CMP, // cmp
@@ -772,6 +772,51 @@ void JitShader::Compile_JMP(Instruction instr) {
}
}
+static void Emit(GSEmitter* emitter, Math::Vec4<float24> (*output)[16]) {
+ emitter->Emit(*output);
+}
+
+void JitShader::Compile_EMIT(Instruction instr) {
+ Label have_emitter, end;
+ mov(rax, qword[STATE + offsetof(UnitState, emitter_ptr)]);
+ test(rax, rax);
+ jnz(have_emitter);
+
+ ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ mov(ABI_PARAM1, reinterpret_cast<size_t>("Execute EMIT on VS"));
+ CallFarFunction(*this, LogCritical);
+ ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ jmp(end);
+
+ L(have_emitter);
+ ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ mov(ABI_PARAM1, rax);
+ mov(ABI_PARAM2, STATE);
+ add(ABI_PARAM2, static_cast<Xbyak::uint32>(offsetof(UnitState, registers.output)));
+ CallFarFunction(*this, Emit);
+ ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ L(end);
+}
+
+void JitShader::Compile_SETE(Instruction instr) {
+ Label have_emitter, end;
+ mov(rax, qword[STATE + offsetof(UnitState, emitter_ptr)]);
+ test(rax, rax);
+ jnz(have_emitter);
+
+ ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ mov(ABI_PARAM1, reinterpret_cast<size_t>("Execute SETEMIT on VS"));
+ CallFarFunction(*this, LogCritical);
+ ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ jmp(end);
+
+ L(have_emitter);
+ mov(byte[rax + offsetof(GSEmitter, vertex_id)], instr.setemit.vertex_id);
+ mov(byte[rax + offsetof(GSEmitter, prim_emit)], instr.setemit.prim_emit);
+ mov(byte[rax + offsetof(GSEmitter, winding)], instr.setemit.winding);
+ L(end);
+}
+
void JitShader::Compile_Block(unsigned end) {
while (program_counter < end) {
Compile_NextInstr();
diff --git a/src/video_core/shader/shader_jit_x64_compiler.h b/src/video_core/shader/shader_jit_x64_compiler.h
index 31af0ca48..4aee56b1d 100644
--- a/src/video_core/shader/shader_jit_x64_compiler.h
+++ b/src/video_core/shader/shader_jit_x64_compiler.h
@@ -66,6 +66,8 @@ public:
void Compile_JMP(Instruction instr);
void Compile_CMP(Instruction instr);
void Compile_MAD(Instruction instr);
+ void Compile_EMIT(Instruction instr);
+ void Compile_SETE(Instruction instr);
private:
void Compile_Block(unsigned end);
diff --git a/src/video_core/swrasterizer/clipper.cpp b/src/video_core/swrasterizer/clipper.cpp
index 6fb923756..c1ed48398 100644
--- a/src/video_core/swrasterizer/clipper.cpp
+++ b/src/video_core/swrasterizer/clipper.cpp
@@ -31,7 +31,7 @@ public:
: coeffs(coeffs), bias(bias) {}
bool IsInside(const Vertex& vertex) const {
- return Math::Dot(vertex.pos + bias, coeffs) <= float24::FromFloat32(0);
+ return Math::Dot(vertex.pos + bias, coeffs) >= float24::FromFloat32(0);
}
bool IsOutSide(const Vertex& vertex) const {
@@ -95,6 +95,17 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu
static const size_t MAX_VERTICES = 9;
static_vector<Vertex, MAX_VERTICES> buffer_a = {v0, v1, v2};
static_vector<Vertex, MAX_VERTICES> buffer_b;
+
+ auto FlipQuaternionIfOpposite = [](auto& a, const auto& b) {
+ if (Math::Dot(a, b) < float24::Zero())
+ a = a * float24::FromFloat32(-1.0f);
+ };
+
+ // Flip the quaternions if they are opposite to prevent interpolating them over the wrong
+ // direction.
+ FlipQuaternionIfOpposite(buffer_a[1].quat, buffer_a[0].quat);
+ FlipQuaternionIfOpposite(buffer_a[2].quat, buffer_a[0].quat);
+
auto* output_list = &buffer_a;
auto* input_list = &buffer_b;
@@ -105,23 +116,18 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu
static const float24 f0 = float24::FromFloat32(0.0);
static const float24 f1 = float24::FromFloat32(1.0);
static const std::array<ClippingEdge, 7> clipping_edges = {{
- {Math::MakeVec(f1, f0, f0, -f1)}, // x = +w
- {Math::MakeVec(-f1, f0, f0, -f1)}, // x = -w
- {Math::MakeVec(f0, f1, f0, -f1)}, // y = +w
- {Math::MakeVec(f0, -f1, f0, -f1)}, // y = -w
- {Math::MakeVec(f0, f0, f1, f0)}, // z = 0
- {Math::MakeVec(f0, f0, -f1, -f1)}, // z = -w
- {Math::MakeVec(f0, f0, f0, -f1), Math::Vec4<float24>(f0, f0, f0, EPSILON)}, // w = EPSILON
+ {Math::MakeVec(-f1, f0, f0, f1)}, // x = +w
+ {Math::MakeVec(f1, f0, f0, f1)}, // x = -w
+ {Math::MakeVec(f0, -f1, f0, f1)}, // y = +w
+ {Math::MakeVec(f0, f1, f0, f1)}, // y = -w
+ {Math::MakeVec(f0, f0, -f1, f0)}, // z = 0
+ {Math::MakeVec(f0, f0, f1, f1)}, // z = -w
+ {Math::MakeVec(f0, f0, f0, f1), Math::Vec4<float24>(f0, f0, f0, EPSILON)}, // w = EPSILON
}};
- // TODO: If one vertex lies outside one of the depth clipping planes, some platforms (e.g. Wii)
- // drop the whole primitive instead of clipping the primitive properly. We should test if
- // this happens on the 3DS, too.
-
// Simple implementation of the Sutherland-Hodgman clipping algorithm.
// TODO: Make this less inefficient (currently lots of useless buffering overhead happens here)
- for (auto edge : clipping_edges) {
-
+ auto Clip = [&](const ClippingEdge& edge) {
std::swap(input_list, output_list);
output_list->clear();
@@ -140,12 +146,24 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu
}
reference_vertex = &vertex;
}
+ };
+
+ for (auto edge : clipping_edges) {
+ Clip(edge);
// Need to have at least a full triangle to continue...
if (output_list->size() < 3)
return;
}
+ if (g_state.regs.rasterizer.clip_enable) {
+ ClippingEdge custom_edge{g_state.regs.rasterizer.GetClipCoef()};
+ Clip(custom_edge);
+
+ if (output_list->size() < 3)
+ return;
+ }
+
InitScreenCoordinates((*output_list)[0]);
InitScreenCoordinates((*output_list)[1]);
diff --git a/src/video_core/swrasterizer/framebuffer.cpp b/src/video_core/swrasterizer/framebuffer.cpp
index 7de3aac75..f34eab6cf 100644
--- a/src/video_core/swrasterizer/framebuffer.cpp
+++ b/src/video_core/swrasterizer/framebuffer.cpp
@@ -352,6 +352,8 @@ u8 LogicOp(u8 src, u8 dest, FramebufferRegs::LogicOp op) {
case FramebufferRegs::LogicOp::OrInverted:
return ~src | dest;
}
+
+ UNREACHABLE();
};
} // namespace Rasterizer
diff --git a/src/video_core/swrasterizer/lighting.cpp b/src/video_core/swrasterizer/lighting.cpp
new file mode 100644
index 000000000..5fa748611
--- /dev/null
+++ b/src/video_core/swrasterizer/lighting.cpp
@@ -0,0 +1,308 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "common/math_util.h"
+#include "video_core/swrasterizer/lighting.h"
+
+namespace Pica {
+
+static float LookupLightingLut(const Pica::State::Lighting& lighting, size_t lut_index, u8 index,
+ float delta) {
+ ASSERT_MSG(lut_index < lighting.luts.size(), "Out of range lut");
+ ASSERT_MSG(index < lighting.luts[lut_index].size(), "Out of range index");
+
+ const auto& lut = lighting.luts[lut_index][index];
+
+ float lut_value = lut.ToFloat();
+ float lut_diff = lut.DiffToFloat();
+
+ return lut_value + lut_diff * delta;
+}
+
+std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
+ const Pica::LightingRegs& lighting, const Pica::State::Lighting& lighting_state,
+ const Math::Quaternion<float>& normquat, const Math::Vec3<float>& view,
+ const Math::Vec4<u8> (&texture_color)[4]) {
+
+ Math::Vec3<float> surface_normal;
+ Math::Vec3<float> surface_tangent;
+
+ if (lighting.config0.bump_mode != LightingRegs::LightingBumpMode::None) {
+ Math::Vec3<float> perturbation =
+ texture_color[lighting.config0.bump_selector].xyz().Cast<float>() / 127.5f -
+ Math::MakeVec(1.0f, 1.0f, 1.0f);
+ if (lighting.config0.bump_mode == LightingRegs::LightingBumpMode::NormalMap) {
+ if (!lighting.config0.disable_bump_renorm) {
+ const float z_square = 1 - perturbation.xy().Length2();
+ perturbation.z = std::sqrt(std::max(z_square, 0.0f));
+ }
+ surface_normal = perturbation;
+ surface_tangent = Math::MakeVec(1.0f, 0.0f, 0.0f);
+ } else if (lighting.config0.bump_mode == LightingRegs::LightingBumpMode::TangentMap) {
+ surface_normal = Math::MakeVec(0.0f, 0.0f, 1.0f);
+ surface_tangent = perturbation;
+ } else {
+ LOG_ERROR(HW_GPU, "Unknown bump mode %u", lighting.config0.bump_mode.Value());
+ }
+ } else {
+ surface_normal = Math::MakeVec(0.0f, 0.0f, 1.0f);
+ surface_tangent = Math::MakeVec(1.0f, 0.0f, 0.0f);
+ }
+
+ // Use the normalized the quaternion when performing the rotation
+ auto normal = Math::QuaternionRotate(normquat, surface_normal);
+ auto tangent = Math::QuaternionRotate(normquat, surface_tangent);
+
+ Math::Vec4<float> diffuse_sum = {0.0f, 0.0f, 0.0f, 1.0f};
+ Math::Vec4<float> specular_sum = {0.0f, 0.0f, 0.0f, 1.0f};
+
+ for (unsigned light_index = 0; light_index <= lighting.max_light_index; ++light_index) {
+ unsigned num = lighting.light_enable.GetNum(light_index);
+ const auto& light_config = lighting.light[num];
+
+ Math::Vec3<float> refl_value = {};
+ Math::Vec3<float> position = {float16::FromRaw(light_config.x).ToFloat32(),
+ float16::FromRaw(light_config.y).ToFloat32(),
+ float16::FromRaw(light_config.z).ToFloat32()};
+ Math::Vec3<float> light_vector;
+
+ if (light_config.config.directional)
+ light_vector = position;
+ else
+ light_vector = position + view;
+
+ light_vector.Normalize();
+
+ Math::Vec3<float> norm_view = view.Normalized();
+ Math::Vec3<float> half_vector = norm_view + light_vector;
+
+ float dist_atten = 1.0f;
+ if (!lighting.IsDistAttenDisabled(num)) {
+ auto distance = (-view - position).Length();
+ float scale = Pica::float20::FromRaw(light_config.dist_atten_scale).ToFloat32();
+ float bias = Pica::float20::FromRaw(light_config.dist_atten_bias).ToFloat32();
+ size_t lut =
+ static_cast<size_t>(LightingRegs::LightingSampler::DistanceAttenuation) + num;
+
+ float sample_loc = MathUtil::Clamp(scale * distance + bias, 0.0f, 1.0f);
+
+ u8 lutindex =
+ static_cast<u8>(MathUtil::Clamp(std::floor(sample_loc * 256.0f), 0.0f, 255.0f));
+ float delta = sample_loc * 256 - lutindex;
+ dist_atten = LookupLightingLut(lighting_state, lut, lutindex, delta);
+ }
+
+ auto GetLutValue = [&](LightingRegs::LightingLutInput input, bool abs,
+ LightingRegs::LightingScale scale_enum,
+ LightingRegs::LightingSampler sampler) {
+ float result = 0.0f;
+
+ switch (input) {
+ case LightingRegs::LightingLutInput::NH:
+ result = Math::Dot(normal, half_vector.Normalized());
+ break;
+
+ case LightingRegs::LightingLutInput::VH:
+ result = Math::Dot(norm_view, half_vector.Normalized());
+ break;
+
+ case LightingRegs::LightingLutInput::NV:
+ result = Math::Dot(normal, norm_view);
+ break;
+
+ case LightingRegs::LightingLutInput::LN:
+ result = Math::Dot(light_vector, normal);
+ break;
+
+ case LightingRegs::LightingLutInput::SP: {
+ Math::Vec3<s32> spot_dir{light_config.spot_x.Value(), light_config.spot_y.Value(),
+ light_config.spot_z.Value()};
+ result = Math::Dot(light_vector, spot_dir.Cast<float>() / 2047.0f);
+ break;
+ }
+ case LightingRegs::LightingLutInput::CP:
+ if (lighting.config0.config == LightingRegs::LightingConfig::Config7) {
+ const Math::Vec3<float> norm_half_vector = half_vector.Normalized();
+ const Math::Vec3<float> half_vector_proj =
+ norm_half_vector - normal * Math::Dot(normal, norm_half_vector);
+ result = Math::Dot(half_vector_proj, tangent);
+ } else {
+ result = 0.0f;
+ }
+ break;
+ default:
+ LOG_CRITICAL(HW_GPU, "Unknown lighting LUT input %u\n", static_cast<u32>(input));
+ UNIMPLEMENTED();
+ result = 0.0f;
+ }
+
+ u8 index;
+ float delta;
+
+ if (abs) {
+ if (light_config.config.two_sided_diffuse)
+ result = std::abs(result);
+ else
+ result = std::max(result, 0.0f);
+
+ float flr = std::floor(result * 256.0f);
+ index = static_cast<u8>(MathUtil::Clamp(flr, 0.0f, 255.0f));
+ delta = result * 256 - index;
+ } else {
+ float flr = std::floor(result * 128.0f);
+ s8 signed_index = static_cast<s8>(MathUtil::Clamp(flr, -128.0f, 127.0f));
+ delta = result * 128.0f - signed_index;
+ index = static_cast<u8>(signed_index);
+ }
+
+ float scale = lighting.lut_scale.GetScale(scale_enum);
+ return scale *
+ LookupLightingLut(lighting_state, static_cast<size_t>(sampler), index, delta);
+ };
+
+ // If enabled, compute spot light attenuation value
+ float spot_atten = 1.0f;
+ if (!lighting.IsSpotAttenDisabled(num) &&
+ LightingRegs::IsLightingSamplerSupported(
+ lighting.config0.config, LightingRegs::LightingSampler::SpotlightAttenuation)) {
+ auto lut = LightingRegs::SpotlightAttenuationSampler(num);
+ spot_atten = GetLutValue(lighting.lut_input.sp, lighting.abs_lut_input.disable_sp == 0,
+ lighting.lut_scale.sp, lut);
+ }
+
+ // Specular 0 component
+ float d0_lut_value = 1.0f;
+ if (lighting.config1.disable_lut_d0 == 0 &&
+ LightingRegs::IsLightingSamplerSupported(
+ lighting.config0.config, LightingRegs::LightingSampler::Distribution0)) {
+ d0_lut_value =
+ GetLutValue(lighting.lut_input.d0, lighting.abs_lut_input.disable_d0 == 0,
+ lighting.lut_scale.d0, LightingRegs::LightingSampler::Distribution0);
+ }
+
+ Math::Vec3<float> specular_0 = d0_lut_value * light_config.specular_0.ToVec3f();
+
+ // If enabled, lookup ReflectRed value, otherwise, 1.0 is used
+ if (lighting.config1.disable_lut_rr == 0 &&
+ LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
+ LightingRegs::LightingSampler::ReflectRed)) {
+ refl_value.x =
+ GetLutValue(lighting.lut_input.rr, lighting.abs_lut_input.disable_rr == 0,
+ lighting.lut_scale.rr, LightingRegs::LightingSampler::ReflectRed);
+ } else {
+ refl_value.x = 1.0f;
+ }
+
+ // If enabled, lookup ReflectGreen value, otherwise, ReflectRed value is used
+ if (lighting.config1.disable_lut_rg == 0 &&
+ LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
+ LightingRegs::LightingSampler::ReflectGreen)) {
+ refl_value.y =
+ GetLutValue(lighting.lut_input.rg, lighting.abs_lut_input.disable_rg == 0,
+ lighting.lut_scale.rg, LightingRegs::LightingSampler::ReflectGreen);
+ } else {
+ refl_value.y = refl_value.x;
+ }
+
+ // If enabled, lookup ReflectBlue value, otherwise, ReflectRed value is used
+ if (lighting.config1.disable_lut_rb == 0 &&
+ LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
+ LightingRegs::LightingSampler::ReflectBlue)) {
+ refl_value.z =
+ GetLutValue(lighting.lut_input.rb, lighting.abs_lut_input.disable_rb == 0,
+ lighting.lut_scale.rb, LightingRegs::LightingSampler::ReflectBlue);
+ } else {
+ refl_value.z = refl_value.x;
+ }
+
+ // Specular 1 component
+ float d1_lut_value = 1.0f;
+ if (lighting.config1.disable_lut_d1 == 0 &&
+ LightingRegs::IsLightingSamplerSupported(
+ lighting.config0.config, LightingRegs::LightingSampler::Distribution1)) {
+ d1_lut_value =
+ GetLutValue(lighting.lut_input.d1, lighting.abs_lut_input.disable_d1 == 0,
+ lighting.lut_scale.d1, LightingRegs::LightingSampler::Distribution1);
+ }
+
+ Math::Vec3<float> specular_1 =
+ d1_lut_value * refl_value * light_config.specular_1.ToVec3f();
+
+ // Fresnel
+ // Note: only the last entry in the light slots applies the Fresnel factor
+ if (light_index == lighting.max_light_index && lighting.config1.disable_lut_fr == 0 &&
+ LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
+ LightingRegs::LightingSampler::Fresnel)) {
+
+ float lut_value =
+ GetLutValue(lighting.lut_input.fr, lighting.abs_lut_input.disable_fr == 0,
+ lighting.lut_scale.fr, LightingRegs::LightingSampler::Fresnel);
+
+ // Enabled for diffuse lighting alpha component
+ if (lighting.config0.fresnel_selector ==
+ LightingRegs::LightingFresnelSelector::PrimaryAlpha ||
+ lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
+ diffuse_sum.a() = lut_value;
+ }
+
+ // Enabled for the specular lighting alpha component
+ if (lighting.config0.fresnel_selector ==
+ LightingRegs::LightingFresnelSelector::SecondaryAlpha ||
+ lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
+ specular_sum.a() = lut_value;
+ }
+ }
+
+ auto dot_product = Math::Dot(light_vector, normal);
+
+ // Calculate clamp highlights before applying the two-sided diffuse configuration to the dot
+ // product.
+ float clamp_highlights = 1.0f;
+ if (lighting.config0.clamp_highlights) {
+ if (dot_product <= 0.0f)
+ clamp_highlights = 0.0f;
+ else
+ clamp_highlights = 1.0f;
+ }
+
+ if (light_config.config.two_sided_diffuse)
+ dot_product = std::abs(dot_product);
+ else
+ dot_product = std::max(dot_product, 0.0f);
+
+ if (light_config.config.geometric_factor_0 || light_config.config.geometric_factor_1) {
+ float geo_factor = half_vector.Length2();
+ geo_factor = geo_factor == 0.0f ? 0.0f : std::min(dot_product / geo_factor, 1.0f);
+ if (light_config.config.geometric_factor_0) {
+ specular_0 *= geo_factor;
+ }
+ if (light_config.config.geometric_factor_1) {
+ specular_1 *= geo_factor;
+ }
+ }
+
+ auto diffuse =
+ light_config.diffuse.ToVec3f() * dot_product + light_config.ambient.ToVec3f();
+ diffuse_sum += Math::MakeVec(diffuse * dist_atten * spot_atten, 0.0f);
+
+ specular_sum += Math::MakeVec(
+ (specular_0 + specular_1) * clamp_highlights * dist_atten * spot_atten, 0.0f);
+ }
+
+ diffuse_sum += Math::MakeVec(lighting.global_ambient.ToVec3f(), 0.0f);
+
+ auto diffuse = Math::MakeVec<float>(MathUtil::Clamp(diffuse_sum.x, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(diffuse_sum.y, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(diffuse_sum.z, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(diffuse_sum.w, 0.0f, 1.0f) * 255)
+ .Cast<u8>();
+ auto specular = Math::MakeVec<float>(MathUtil::Clamp(specular_sum.x, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(specular_sum.y, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(specular_sum.z, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(specular_sum.w, 0.0f, 1.0f) * 255)
+ .Cast<u8>();
+ return std::make_tuple(diffuse, specular);
+}
+
+} // namespace Pica
diff --git a/src/video_core/swrasterizer/lighting.h b/src/video_core/swrasterizer/lighting.h
new file mode 100644
index 000000000..d807a3d94
--- /dev/null
+++ b/src/video_core/swrasterizer/lighting.h
@@ -0,0 +1,19 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <tuple>
+#include "common/quaternion.h"
+#include "common/vector_math.h"
+#include "video_core/pica_state.h"
+
+namespace Pica {
+
+std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
+ const Pica::LightingRegs& lighting, const Pica::State::Lighting& lighting_state,
+ const Math::Quaternion<float>& normquat, const Math::Vec3<float>& view,
+ const Math::Vec4<u8> (&texture_color)[4]);
+
+} // namespace Pica
diff --git a/src/video_core/swrasterizer/rasterizer.cpp b/src/video_core/swrasterizer/rasterizer.cpp
index 512e81c08..862135614 100644
--- a/src/video_core/swrasterizer/rasterizer.cpp
+++ b/src/video_core/swrasterizer/rasterizer.cpp
@@ -13,6 +13,7 @@
#include "common/logging/log.h"
#include "common/math_util.h"
#include "common/microprofile.h"
+#include "common/quaternion.h"
#include "common/vector_math.h"
#include "core/hw/gpu.h"
#include "core/memory.h"
@@ -24,6 +25,7 @@
#include "video_core/regs_texturing.h"
#include "video_core/shader/shader.h"
#include "video_core/swrasterizer/framebuffer.h"
+#include "video_core/swrasterizer/lighting.h"
#include "video_core/swrasterizer/proctex.h"
#include "video_core/swrasterizer/rasterizer.h"
#include "video_core/swrasterizer/texturing.h"
@@ -419,6 +421,26 @@ static void ProcessTriangleInternal(const Vertex& v0, const Vertex& v1, const Ve
regs.texturing.tev_combiner_buffer_color.a,
};
+ Math::Vec4<u8> primary_fragment_color = {0, 0, 0, 0};
+ Math::Vec4<u8> secondary_fragment_color = {0, 0, 0, 0};
+
+ if (!g_state.regs.lighting.disable) {
+ Math::Quaternion<float> normquat = Math::Quaternion<float>{
+ {GetInterpolatedAttribute(v0.quat.x, v1.quat.x, v2.quat.x).ToFloat32(),
+ GetInterpolatedAttribute(v0.quat.y, v1.quat.y, v2.quat.y).ToFloat32(),
+ GetInterpolatedAttribute(v0.quat.z, v1.quat.z, v2.quat.z).ToFloat32()},
+ GetInterpolatedAttribute(v0.quat.w, v1.quat.w, v2.quat.w).ToFloat32(),
+ }.Normalized();
+
+ Math::Vec3<float> view{
+ GetInterpolatedAttribute(v0.view.x, v1.view.x, v2.view.x).ToFloat32(),
+ GetInterpolatedAttribute(v0.view.y, v1.view.y, v2.view.y).ToFloat32(),
+ GetInterpolatedAttribute(v0.view.z, v1.view.z, v2.view.z).ToFloat32(),
+ };
+ std::tie(primary_fragment_color, secondary_fragment_color) = ComputeFragmentsColors(
+ g_state.regs.lighting, g_state.lighting, normquat, view, texture_color);
+ }
+
for (unsigned tev_stage_index = 0; tev_stage_index < tev_stages.size();
++tev_stage_index) {
const auto& tev_stage = tev_stages[tev_stage_index];
@@ -427,14 +449,13 @@ static void ProcessTriangleInternal(const Vertex& v0, const Vertex& v1, const Ve
auto GetSource = [&](Source source) -> Math::Vec4<u8> {
switch (source) {
case Source::PrimaryColor:
+ return primary_color;
- // HACK: Until we implement fragment lighting, use primary_color
case Source::PrimaryFragmentColor:
- return primary_color;
+ return primary_fragment_color;
- // HACK: Until we implement fragment lighting, use zero
case Source::SecondaryFragmentColor:
- return {0, 0, 0, 0};
+ return secondary_fragment_color;
case Source::Texture0:
return texture_color[0];
diff --git a/src/video_core/swrasterizer/rasterizer.h b/src/video_core/swrasterizer/rasterizer.h
index 2f0877581..66cd6cfd4 100644
--- a/src/video_core/swrasterizer/rasterizer.h
+++ b/src/video_core/swrasterizer/rasterizer.h
@@ -19,10 +19,9 @@ struct Vertex : Shader::OutputVertex {
// Linear interpolation
// factor: 0=this, 1=vtx
+ // Note: This function cannot be called after perspective divide
void Lerp(float24 factor, const Vertex& vtx) {
pos = pos * factor + vtx.pos * (float24::FromFloat32(1) - factor);
-
- // TODO: Should perform perspective correct interpolation here...
quat = quat * factor + vtx.quat * (float24::FromFloat32(1) - factor);
color = color * factor + vtx.color * (float24::FromFloat32(1) - factor);
tc0 = tc0 * factor + vtx.tc0 * (float24::FromFloat32(1) - factor);
@@ -30,12 +29,11 @@ struct Vertex : Shader::OutputVertex {
tc0_w = tc0_w * factor + vtx.tc0_w * (float24::FromFloat32(1) - factor);
view = view * factor + vtx.view * (float24::FromFloat32(1) - factor);
tc2 = tc2 * factor + vtx.tc2 * (float24::FromFloat32(1) - factor);
-
- screenpos = screenpos * factor + vtx.screenpos * (float24::FromFloat32(1) - factor);
}
// Linear interpolation
// factor: 0=v0, 1=v1
+ // Note: This function cannot be called after perspective divide
static Vertex Lerp(float24 factor, const Vertex& v0, const Vertex& v1) {
Vertex ret = v0;
ret.Lerp(factor, v1);
diff --git a/src/video_core/swrasterizer/texturing.cpp b/src/video_core/swrasterizer/texturing.cpp
index 4f02b93f2..79b1ce841 100644
--- a/src/video_core/swrasterizer/texturing.cpp
+++ b/src/video_core/swrasterizer/texturing.cpp
@@ -89,6 +89,8 @@ Math::Vec3<u8> GetColorModifier(TevStageConfig::ColorModifier factor,
case ColorModifier::OneMinusSourceBlue:
return (Math::Vec3<u8>(255, 255, 255) - values.bbb()).Cast<u8>();
}
+
+ UNREACHABLE();
};
u8 GetAlphaModifier(TevStageConfig::AlphaModifier factor, const Math::Vec4<u8>& values) {
@@ -119,6 +121,8 @@ u8 GetAlphaModifier(TevStageConfig::AlphaModifier factor, const Math::Vec4<u8>&
case AlphaModifier::OneMinusSourceBlue:
return 255 - values.b();
}
+
+ UNREACHABLE();
};
Math::Vec3<u8> ColorCombine(TevStageConfig::Operation op, const Math::Vec3<u8> input[3]) {
diff --git a/src/video_core/utils.h b/src/video_core/utils.h
index 7ce83a055..d8567f314 100644
--- a/src/video_core/utils.h
+++ b/src/video_core/utils.h
@@ -8,17 +8,11 @@
namespace VideoCore {
-/**
- * Interleave the lower 3 bits of each coordinate to get the intra-block offsets, which are
- * arranged in a Z-order curve. More details on the bit manipulation at:
- * https://fgiesen.wordpress.com/2009/12/13/decoding-morton-codes/
- */
+// 8x8 Z-Order coordinate from 2D coordinates
static inline u32 MortonInterleave(u32 x, u32 y) {
- u32 i = (x & 7) | ((y & 7) << 8); // ---- -210
- i = (i ^ (i << 2)) & 0x1313; // ---2 --10
- i = (i ^ (i << 1)) & 0x1515; // ---2 -1-0
- i = (i | (i >> 7)) & 0x3F;
- return i;
+ static const u32 xlut[] = {0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15};
+ static const u32 ylut[] = {0x00, 0x02, 0x08, 0x0a, 0x20, 0x22, 0x28, 0x2a};
+ return xlut[x % 8] + ylut[y % 8];
}
/**
diff --git a/src/web_service/CMakeLists.txt b/src/web_service/CMakeLists.txt
index 334d82a8a..c93811892 100644
--- a/src/web_service/CMakeLists.txt
+++ b/src/web_service/CMakeLists.txt
@@ -1,10 +1,12 @@
set(SRCS
telemetry_json.cpp
+ verify_login.cpp
web_backend.cpp
)
set(HEADERS
telemetry_json.h
+ verify_login.h
web_backend.h
)
diff --git a/src/web_service/telemetry_json.cpp b/src/web_service/telemetry_json.cpp
index a2d007e77..6ad2ffcd4 100644
--- a/src/web_service/telemetry_json.cpp
+++ b/src/web_service/telemetry_json.cpp
@@ -3,7 +3,6 @@
// Refer to the license.txt file included.
#include "common/assert.h"
-#include "core/settings.h"
#include "web_service/telemetry_json.h"
#include "web_service/web_backend.h"
@@ -81,7 +80,7 @@ void TelemetryJson::Complete() {
SerializeSection(Telemetry::FieldType::UserFeedback, "UserFeedback");
SerializeSection(Telemetry::FieldType::UserConfig, "UserConfig");
SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem");
- PostJson(Settings::values.telemetry_endpoint_url, TopSection().dump());
+ PostJson(endpoint_url, TopSection().dump(), true, username, token);
}
} // namespace WebService
diff --git a/src/web_service/telemetry_json.h b/src/web_service/telemetry_json.h
index 39038b4f9..9e78c6803 100644
--- a/src/web_service/telemetry_json.h
+++ b/src/web_service/telemetry_json.h
@@ -17,7 +17,9 @@ namespace WebService {
*/
class TelemetryJson : public Telemetry::VisitorInterface {
public:
- TelemetryJson() = default;
+ TelemetryJson(const std::string& endpoint_url, const std::string& username,
+ const std::string& token)
+ : endpoint_url(endpoint_url), username(username), token(token) {}
~TelemetryJson() = default;
void Visit(const Telemetry::Field<bool>& field) override;
@@ -49,6 +51,9 @@ private:
nlohmann::json output;
std::array<nlohmann::json, 7> sections;
+ std::string endpoint_url;
+ std::string username;
+ std::string token;
};
} // namespace WebService
diff --git a/src/web_service/verify_login.cpp b/src/web_service/verify_login.cpp
new file mode 100644
index 000000000..1bc3b5afe
--- /dev/null
+++ b/src/web_service/verify_login.cpp
@@ -0,0 +1,28 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <json.hpp>
+#include "web_service/verify_login.h"
+#include "web_service/web_backend.h"
+
+namespace WebService {
+
+std::future<bool> VerifyLogin(std::string& username, std::string& token,
+ const std::string& endpoint_url, std::function<void()> func) {
+ auto get_func = [func, username](const std::string& reply) -> bool {
+ func();
+ if (reply.empty())
+ return false;
+ nlohmann::json json = nlohmann::json::parse(reply);
+ std::string result;
+ try {
+ result = json["username"];
+ } catch (const nlohmann::detail::out_of_range&) {
+ }
+ return result == username;
+ };
+ return GetJson<bool>(get_func, endpoint_url, false, username, token);
+}
+
+} // namespace WebService
diff --git a/src/web_service/verify_login.h b/src/web_service/verify_login.h
new file mode 100644
index 000000000..303f5dbbc
--- /dev/null
+++ b/src/web_service/verify_login.h
@@ -0,0 +1,24 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <functional>
+#include <future>
+#include <string>
+
+namespace WebService {
+
+/**
+ * Checks if username and token is valid
+ * @param username Citra username to use for authentication.
+ * @param token Citra token to use for authentication.
+ * @param endpoint_url URL of the services.citra-emu.org endpoint.
+ * @param func A function that gets exectued when the verification is finished
+ * @returns Future with bool indicating whether the verification succeeded
+ */
+std::future<bool> VerifyLogin(std::string& username, std::string& token,
+ const std::string& endpoint_url, std::function<void()> func);
+
+} // namespace WebService
diff --git a/src/web_service/web_backend.cpp b/src/web_service/web_backend.cpp
index 13e4555ac..b17d82f9c 100644
--- a/src/web_service/web_backend.cpp
+++ b/src/web_service/web_backend.cpp
@@ -2,51 +2,139 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#ifdef _WIN32
+#include <winsock.h>
+#endif
+
+#include <cstdlib>
+#include <thread>
#include <cpr/cpr.h>
-#include <stdlib.h>
#include "common/logging/log.h"
#include "web_service/web_backend.h"
namespace WebService {
static constexpr char API_VERSION[]{"1"};
-static constexpr char ENV_VAR_USERNAME[]{"CITRA_WEB_SERVICES_USERNAME"};
-static constexpr char ENV_VAR_TOKEN[]{"CITRA_WEB_SERVICES_TOKEN"};
-static std::string GetEnvironmentVariable(const char* name) {
- const char* value{getenv(name)};
- if (value) {
- return value;
+static std::unique_ptr<cpr::Session> g_session;
+
+void Win32WSAStartup() {
+#ifdef _WIN32
+ // On Windows, CPR/libcurl does not properly initialize Winsock. The below code is used to
+ // initialize Winsock globally, which fixes this problem. Without this, only the first CPR
+ // session will properly be created, and subsequent ones will fail.
+ WSADATA wsa_data;
+ const int wsa_result{WSAStartup(MAKEWORD(2, 2), &wsa_data)};
+ if (wsa_result) {
+ LOG_CRITICAL(WebService, "WSAStartup failed: %d", wsa_result);
}
- return {};
+#endif
}
-const std::string& GetUsername() {
- static const std::string username{GetEnvironmentVariable(ENV_VAR_USERNAME)};
- return username;
-}
+void PostJson(const std::string& url, const std::string& data, bool allow_anonymous,
+ const std::string& username, const std::string& token) {
+ if (url.empty()) {
+ LOG_ERROR(WebService, "URL is invalid");
+ return;
+ }
+
+ const bool are_credentials_provided{!token.empty() && !username.empty()};
+ if (!allow_anonymous && !are_credentials_provided) {
+ LOG_ERROR(WebService, "Credentials must be provided for authenticated requests");
+ return;
+ }
-const std::string& GetToken() {
- static const std::string token{GetEnvironmentVariable(ENV_VAR_TOKEN)};
- return token;
+ Win32WSAStartup();
+
+ // Built request header
+ cpr::Header header;
+ if (are_credentials_provided) {
+ // Authenticated request if credentials are provided
+ header = {{"Content-Type", "application/json"},
+ {"x-username", username.c_str()},
+ {"x-token", token.c_str()},
+ {"api-version", API_VERSION}};
+ } else {
+ // Otherwise, anonymous request
+ header = cpr::Header{{"Content-Type", "application/json"}, {"api-version", API_VERSION}};
+ }
+
+ // Post JSON asynchronously
+ static std::future<void> future;
+ future = cpr::PostCallback(
+ [](cpr::Response r) {
+ if (r.error) {
+ LOG_ERROR(WebService, "POST returned cpr error: %u:%s",
+ static_cast<u32>(r.error.code), r.error.message.c_str());
+ return;
+ }
+ if (r.status_code >= 400) {
+ LOG_ERROR(WebService, "POST returned error status code: %u", r.status_code);
+ return;
+ }
+ if (r.header["content-type"].find("application/json") == std::string::npos) {
+ LOG_ERROR(WebService, "POST returned wrong content: %s",
+ r.header["content-type"].c_str());
+ return;
+ }
+ },
+ cpr::Url{url}, cpr::Body{data}, header);
}
-void PostJson(const std::string& url, const std::string& data) {
+template <typename T>
+std::future<T> GetJson(std::function<T(const std::string&)> func, const std::string& url,
+ bool allow_anonymous, const std::string& username,
+ const std::string& token) {
if (url.empty()) {
LOG_ERROR(WebService, "URL is invalid");
- return;
+ return std::async(std::launch::async, [func{std::move(func)}]() { return func(""); });
}
- if (GetUsername().empty() || GetToken().empty()) {
- LOG_ERROR(WebService, "Environment variables %s and %s must be set to POST JSON",
- ENV_VAR_USERNAME, ENV_VAR_TOKEN);
- return;
+ const bool are_credentials_provided{!token.empty() && !username.empty()};
+ if (!allow_anonymous && !are_credentials_provided) {
+ LOG_ERROR(WebService, "Credentials must be provided for authenticated requests");
+ return std::async(std::launch::async, [func{std::move(func)}]() { return func(""); });
}
- cpr::PostAsync(cpr::Url{url}, cpr::Body{data}, cpr::Header{{"Content-Type", "application/json"},
- {"x-username", GetUsername()},
- {"x-token", GetToken()},
- {"api-version", API_VERSION}});
+ Win32WSAStartup();
+
+ // Built request header
+ cpr::Header header;
+ if (are_credentials_provided) {
+ // Authenticated request if credentials are provided
+ header = {{"Content-Type", "application/json"},
+ {"x-username", username.c_str()},
+ {"x-token", token.c_str()},
+ {"api-version", API_VERSION}};
+ } else {
+ // Otherwise, anonymous request
+ header = cpr::Header{{"Content-Type", "application/json"}, {"api-version", API_VERSION}};
+ }
+
+ // Get JSON asynchronously
+ return cpr::GetCallback(
+ [func{std::move(func)}](cpr::Response r) {
+ if (r.error) {
+ LOG_ERROR(WebService, "GET returned cpr error: %u:%s",
+ static_cast<u32>(r.error.code), r.error.message.c_str());
+ return func("");
+ }
+ if (r.status_code >= 400) {
+ LOG_ERROR(WebService, "GET returned error code: %u", r.status_code);
+ return func("");
+ }
+ if (r.header["content-type"].find("application/json") == std::string::npos) {
+ LOG_ERROR(WebService, "GET returned wrong content: %s",
+ r.header["content-type"].c_str());
+ return func("");
+ }
+ return func(r.text);
+ },
+ cpr::Url{url}, header);
}
+template std::future<bool> GetJson(std::function<bool(const std::string&)> func,
+ const std::string& url, bool allow_anonymous,
+ const std::string& username, const std::string& token);
+
} // namespace WebService
diff --git a/src/web_service/web_backend.h b/src/web_service/web_backend.h
index 2753d3b68..a63c75d13 100644
--- a/src/web_service/web_backend.h
+++ b/src/web_service/web_backend.h
@@ -4,28 +4,36 @@
#pragma once
+#include <functional>
+#include <future>
#include <string>
#include "common/common_types.h"
namespace WebService {
/**
- * Gets the current username for accessing services.citra-emu.org.
- * @returns Username as a string, empty if not set.
- */
-const std::string& GetUsername();
-
-/**
- * Gets the current token for accessing services.citra-emu.org.
- * @returns Token as a string, empty if not set.
+ * Posts JSON to services.citra-emu.org.
+ * @param url URL of the services.citra-emu.org endpoint to post data to.
+ * @param data String of JSON data to use for the body of the POST request.
+ * @param allow_anonymous If true, allow anonymous unauthenticated requests.
+ * @param username Citra username to use for authentication.
+ * @param token Citra token to use for authentication.
*/
-const std::string& GetToken();
+void PostJson(const std::string& url, const std::string& data, bool allow_anonymous,
+ const std::string& username = {}, const std::string& token = {});
/**
- * Posts JSON to services.citra-emu.org.
+ * Gets JSON from services.citra-emu.org.
+ * @param func A function that gets exectued when the json as a string is received
* @param url URL of the services.citra-emu.org endpoint to post data to.
- * @param data String of JSON data to use for the body of the POST request.
+ * @param allow_anonymous If true, allow anonymous unauthenticated requests.
+ * @param username Citra username to use for authentication.
+ * @param token Citra token to use for authentication.
+ * @return future that holds the return value T of the func
*/
-void PostJson(const std::string& url, const std::string& data);
+template <typename T>
+std::future<T> GetJson(std::function<T(const std::string&)> func, const std::string& url,
+ bool allow_anonymous, const std::string& username = {},
+ const std::string& token = {});
} // namespace WebService