diff --git a/CMakeLists.txt b/CMakeLists.txt index e6a1e9cb0..0b754d56c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,7 +110,7 @@ option(WITH_DEMOS "Install demo songs" ON) option(WITH_INSTRUMENTS "Install instruments" ON) option(WITH_WAVETABLES "Install wavetables" ON) -set(DEPENDENCIES_INCLUDE_DIRS "") +set(DEPENDENCIES_INCLUDE_DIRS extern/IconFontCppHeaders src/icon) if (ANDROID AND NOT TERMUX) set(DEPENDENCIES_DEFINES "IS_MOBILE") @@ -919,7 +919,6 @@ if (BUILD_GUI) list(APPEND DEPENDENCIES_INCLUDE_DIRS extern/imgui_patched extern/imgui_patched/backends - extern/IconFontCppHeaders extern/igfd ) if (WIN32 OR APPLE) diff --git a/TODO.md b/TODO.md index 077315e17..523d5e171 100644 --- a/TODO.md +++ b/TODO.md @@ -4,13 +4,18 @@ # THE REAL TO-DO LIST -because I want to focus for a couple hours - - Amiga's Period Modulation not working - Song is silent after playing an order after loop point -- Crash when opening one-column chan osc with 48 channels - Select loaded instrument on open - rewrite because I want a setting... +- re-engineer volume handling? Sound Unit cries at me +- finish status view +- finish auto-clone once you have done all of this (maybe not the first one) and merged the two or so pending pull requests, release 0.6.1 Furnace is like alcohol... + +# and then + +- new oscilloscope renderer - custom code that uses texture and fixes two issues: too many vertices, and broken anti-aliasing +- new pattern renderer - performance improvements diff --git a/demos/amiga/a_wave_powerhouse.fur b/demos/amiga/a_wave_powerhouse.fur new file mode 100644 index 000000000..105bea5fe Binary files /dev/null and b/demos/amiga/a_wave_powerhouse.fur differ diff --git a/demos/c64/deadlock.fur b/demos/c64/deadlock.fur new file mode 100644 index 000000000..3c4b32138 Binary files /dev/null and b/demos/c64/deadlock.fur differ diff --git a/doc/1-intro/README.md b/doc/1-intro/README.md index cd0376e99..2a227456f 100644 --- a/doc/1-intro/README.md +++ b/doc/1-intro/README.md @@ -26,4 +26,6 @@ once familiar with the tracker, look to [9-guides](../9-guides/README.md) for us ## tutorial? +[How to Learn Chiptune Trackers](https://www.youtube.com/watch?v=Q37XuOLz0jw): video tutorial created by Button Masher. covers the basic mechanics of chiptune tracking using Furnace for demonstration. + [Furnace Tutorials](https://youtube.com/playlist?list=PLCELB6AsTZUnwv0PC5AAGHjvg47F44YQ1): video tutorials created by Spinning Square Waves. be noted that these may not apply to the current version. diff --git a/doc/2-interface/asset-list.md b/doc/2-interface/asset-list.md index cc94312d4..2b5ffaaa9 100644 --- a/doc/2-interface/asset-list.md +++ b/doc/2-interface/asset-list.md @@ -55,5 +55,12 @@ everything from the wavetables list applies here also, with the addition of one samples are saved as standard wave (.wav) files. -- right-clicking the Save button brings up a menu with the following options: - - **save raw sample...**: saves the selected sample as raw data. +right-clicking the Save button brings up a menu with the following options: +- **save raw sample...**: saves the selected sample as raw data. + +right-clicking a sample in the list brings up a menu: +- **make instrument**: creates a new instrument which is set to use the selected sample. +- **duplicate**: makes a copy of the selected sample. +- **replace...**: opens a file dialog to choose a replacement sample. +- **save**: opens a file dialog to choose where to save the sample. +- **delete**: removes the sample. diff --git a/doc/2-interface/menu-bar.md b/doc/2-interface/menu-bar.md index bb3a520cb..6d6b899bc 100644 --- a/doc/2-interface/menu-bar.md +++ b/doc/2-interface/menu-bar.md @@ -49,6 +49,7 @@ items in _italic_ don't appear in basic mode and are only available in advanced - macOS: `~/Library/Application Support/Furnace/backups` - Linux/other: `~/.config/furnace/backups` - this directory grows in size as you use Furnace. remember to delete old backups periodically to save space. + - **do NOT rely on the backup system as auto-save!** you should save a restored backup because Furnace will not save backups of backups. - **exit**: closes Furnace. diff --git a/doc/2-interface/settings.md b/doc/2-interface/settings.md index a4a1676a5..e80eeaecf 100644 --- a/doc/2-interface/settings.md +++ b/doc/2-interface/settings.md @@ -47,6 +47,7 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - **When creating new song**: - **Display system preset selector** - **Start with initial system** + - **Default author name** ### Start-up @@ -92,7 +93,7 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - setting this to a high value increases latency. - **Exclusive mode**: enables Exclusive Mode, which may offer latency improvements. - only available on WASAPI devices in the PortAudio backend! -- **Low-latency mode (experimental!)**: reduces latency by running the engine faster than the tick rate. useful for live playback/jam mode. +- **Low-latency mode**: reduces latency by running the engine faster than the tick rate. useful for live playback/jam mode. - only enable if your buffer size is small (10ms or less). - **Force mono audio**: use if you're unable to hear stereo audio (e.g. single speaker or hearing loss in one ear). - **want:** displays requested audio configuration. @@ -104,6 +105,7 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - **Software clipping**: clips output to nominal range (-1.0 to 1.0) before passing it to the audio device. - this avoids activating Windows' built-in limiter. - this option shall be enabled when using PortAudio backend with a DirectSound device. +- **DC offset correction**: apply a filter to remove DC bias, where the output is overall above or below zero. default is on. ### Metronome @@ -299,6 +301,9 @@ below all the binds, select a key from the dropdown list to add it. it will appe - applies when playback is stopped. - **Don't scroll when moving cursor** - **Move cursor with scroll wheel** + - **No** + - **Yes** + - **Inverted** ## Appearance diff --git a/doc/3-pattern/README.md b/doc/3-pattern/README.md index f619ce287..31713ea64 100644 --- a/doc/3-pattern/README.md +++ b/doc/3-pattern/README.md @@ -38,18 +38,39 @@ clicking on a channel name mutes that channel. double-clicking or right-clicking it enables solo mode, in which only that channel will be audible. -clicking the `++` at the top left corner of the pattern view cycles through three channel bar view modes: -- **Compact**: shows only channel names. -- **Expanded**: as shown above. adds buttons: +clicking the `++` at the top left corner of the pattern view pops up a small menu to set view modes: +- **Effect columns/collapse**: displays extra options for collapsing channels and adding/removing effect columns: - **-**: collapse visible columns. changes to **+** when columns are hidden; click to expand them. - **<**: disables the last effect column and hides it. effects are not deleted... - - **>**: adds an effects column. if one previously existed, its contents will be preserved. + - **>**: adds an effect column. if one previously existed, its contents will be preserved. - **Pattern names**: displays pattern names (per channel). pattern names are also visible when hovering over a pattern in the order list. - -right-clicking the `++` toggles the visualizer, which is active only during playback. +- **Channel group hints**: display indicators when channels are paired in some way (e.g. OPL3 4-op mode). +- **Visualizer**: during playback, show visual effects in the pattern view. + - also can be toggled by right-clicking on the `++` button. +- **Channel status**: displays icons that indicate activity in the channel. see the "channel status" section below. to rename and/or hide channels, open [the Channels window](../8-advanced/channels.md) via the window menu. +### channel status + +- note status: + - ![note off](status-note-off.png) note off + - ![note on](status-note-on.png) note on + - ![macro released](status-note-on-rel.png) note on but macro released (`REL`) + - ![note released](status-note-off-rel.png) note released (`===`) +- pitch alteration: + - ![no effect](status-pitch-none.png) nothing + - ![pitch up](status-pitch-up.png) pitch slide up + - ![pitch down](status-pitch-down.png) pitch slide down + - ![portamento](status-pitch-porta.png) portamento + - ![arpeggio](status-pitch-arpeg.png) arpeggio +- volume alteration: + - ![no effect](status-volume-none.png) nothing + - ![volume up](status-volume-up.png) volume slide up + - ![volume down](status-volume-down.png) volume slide down + - ![tremolo](status-volume-tremolo.png) tremolo +- other icons may be present depending on the used chips. + ## input diff --git a/doc/3-pattern/status-note-off-rel.png b/doc/3-pattern/status-note-off-rel.png new file mode 100644 index 000000000..c522cf6ed Binary files /dev/null and b/doc/3-pattern/status-note-off-rel.png differ diff --git a/doc/3-pattern/status-note-off.png b/doc/3-pattern/status-note-off.png new file mode 100644 index 000000000..817a0c75c Binary files /dev/null and b/doc/3-pattern/status-note-off.png differ diff --git a/doc/3-pattern/status-note-on-rel.png b/doc/3-pattern/status-note-on-rel.png new file mode 100644 index 000000000..bb9e4160e Binary files /dev/null and b/doc/3-pattern/status-note-on-rel.png differ diff --git a/doc/3-pattern/status-note-on.png b/doc/3-pattern/status-note-on.png new file mode 100644 index 000000000..92de9979b Binary files /dev/null and b/doc/3-pattern/status-note-on.png differ diff --git a/doc/3-pattern/status-pitch-arpeg.png b/doc/3-pattern/status-pitch-arpeg.png new file mode 100644 index 000000000..67cd4b52f Binary files /dev/null and b/doc/3-pattern/status-pitch-arpeg.png differ diff --git a/doc/3-pattern/status-pitch-down.png b/doc/3-pattern/status-pitch-down.png new file mode 100644 index 000000000..1a2f9f2b1 Binary files /dev/null and b/doc/3-pattern/status-pitch-down.png differ diff --git a/doc/3-pattern/status-pitch-none.png b/doc/3-pattern/status-pitch-none.png new file mode 100644 index 000000000..21b9d1871 Binary files /dev/null and b/doc/3-pattern/status-pitch-none.png differ diff --git a/doc/3-pattern/status-pitch-porta.png b/doc/3-pattern/status-pitch-porta.png new file mode 100644 index 000000000..ab06ba0d2 Binary files /dev/null and b/doc/3-pattern/status-pitch-porta.png differ diff --git a/doc/3-pattern/status-pitch-up.png b/doc/3-pattern/status-pitch-up.png new file mode 100644 index 000000000..51a0e6f50 Binary files /dev/null and b/doc/3-pattern/status-pitch-up.png differ diff --git a/doc/3-pattern/status-volume-down.png b/doc/3-pattern/status-volume-down.png new file mode 100644 index 000000000..a788b4ea8 Binary files /dev/null and b/doc/3-pattern/status-volume-down.png differ diff --git a/doc/3-pattern/status-volume-none.png b/doc/3-pattern/status-volume-none.png new file mode 100644 index 000000000..bbf32e95e Binary files /dev/null and b/doc/3-pattern/status-volume-none.png differ diff --git a/doc/3-pattern/status-volume-tremolo.png b/doc/3-pattern/status-volume-tremolo.png new file mode 100644 index 000000000..a1fe64d51 Binary files /dev/null and b/doc/3-pattern/status-volume-tremolo.png differ diff --git a/doc/3-pattern/status-volume-up.png b/doc/3-pattern/status-volume-up.png new file mode 100644 index 000000000..525b8add1 Binary files /dev/null and b/doc/3-pattern/status-volume-up.png differ diff --git a/doc/4-instrument/README.md b/doc/4-instrument/README.md index a1681388b..b85c957e5 100644 --- a/doc/4-instrument/README.md +++ b/doc/4-instrument/README.md @@ -96,24 +96,37 @@ every macro can be defined though one of three methods, selectable with the left - ![ADSR](macro-button-ADSR.png) **ADSR:** this is a traditional ADSR envelope, defined by the rate of increase and decrease of value over time. - ![LFO](macro-button-LFO.png) **LFO:** the Low Frequency Oscillator generates a repeating wave of values. -some macros are "bitmap" style. they represent a number of "bits" that can be toggled individually, and the values listed represent the sum of which bits are turned on. - ### sequence ![sequence macro editor](macro-seq.png) +![clipped sequence macro editor](macro-seq-clip.png) + +![bitmask sequence macro editor](macro-seq-bitmask.png) + the number between the macro type label and the macro type button is the macro length in steps. the `-` and `+` buttons change the length of the macro. start out by adding at least a few steps. the values of the macro can be drawn in the "bar graph" box. +- arpeggio and pitch macros may have values above or below the visible area; small chevrons will be shown until they are scrolled into view. +- bitmask-style macros show labels for each of their bits, and these are edited as toggles. -just beneath the box is a shorter bar that controls looping. +arpeggio macros have a short bar for setting whether to interpret the values as being "relative" or "fixed". +- by default, values are offsets **relative** to the note. +- if clicked on, a value becomes **fixed** and will be played at its corresponding note without regard to the note entered into the pattern. + - values are counted from `C-0`. for example, a fixed value of 48 produces a `C-4` note. + - fixed values are especially useful for noise instruments with preset periods. + +below this is a short bar that controls macro loop and release. - click to set the start point of a loop; the end point is the last value or release point. it appears as half-height bars. right-click to remove the loop. - shift-click to set the release point. when played, the macro will hold here until the note is released. it appears as a full-height bar. right-click to remove the release point. finally, the sequence of values can be directly edited in the text box at the bottom. - the loop start is entered as a `|`. - the release point is entered as a `/`. -- in arpeggio macros, a value starting with a `@` is an absolute note (instead of a relative shift). no matter the note entered in the pattern, `@` values will be played at that exact note. this is especially useful for noise instruments with preset periods. +- in arpeggio macros, a value starting with a `@` is a fixed value as described above. +- in bitmask-style macros, the values are added up in binary and converted to decimal. see [the hexadecimal guide](../1-intro/hex.md) for more info. + + ### ADSR diff --git a/doc/4-instrument/macro-seq-bitmask.png b/doc/4-instrument/macro-seq-bitmask.png new file mode 100644 index 000000000..ce4c323f4 Binary files /dev/null and b/doc/4-instrument/macro-seq-bitmask.png differ diff --git a/doc/4-instrument/macro-seq-clip.png b/doc/4-instrument/macro-seq-clip.png new file mode 100644 index 000000000..063e92faa Binary files /dev/null and b/doc/4-instrument/macro-seq-clip.png differ diff --git a/doc/6-sample/README.md b/doc/6-sample/README.md index a7d9382fd..a6129b41a 100644 --- a/doc/6-sample/README.md +++ b/doc/6-sample/README.md @@ -159,3 +159,14 @@ in there, you can modify certain data pertaining to your sample, such as the: - **Create instrument from sample**: creates a new instrument with its sample set to the current sample. - **Zoom**: shows and sets sample view zoom level. - **Zoom mode**: switches between "Auto" (entire sample fits in window) and "100%" (each horizontal pixel represents one sample point). + +in the sample viewer: +- left-click and drag to select a region of the sample. +- right-click to display a menu: + - **cut**: puts the selection in the sample clipboard and deletes it from the sample. + - **copy**: copies the selection into the sample clipboard. + - **paste**: inserts the sample clipboard at the start of the selection. + - **paste (replace)**: replaces the selection with the sample clipboard. + - **paste (mix)**: mixes the sample clipboard into the existing sample, beginning at the start of the selection. + - **set loop to selection**: changes loop region to match selection. + - **create wavetable from selection**: copies the selection into a new wavetable entry. diff --git a/doc/7-systems/c64.md b/doc/7-systems/c64.md index 28a69671b..97b434e75 100644 --- a/doc/7-systems/c64.md +++ b/doc/7-systems/c64.md @@ -47,6 +47,7 @@ two versions of aforementioned chip exist - 6581 (original chip) and 8580 (impro - if `y` is not 0: now - this effect is not necessary if the instrument's duty macro is absolute. - `1Exy`: **change additional parameters.** + - _this effect only exists for compatibility reasons, and its use is discouraged._ - `x` may be one of the following: - `0`: attack (`y` from `0` to `F`) - `1`: decay (`y` from `0` to `F`) @@ -55,9 +56,26 @@ two versions of aforementioned chip exist - 6581 (original chip) and 8580 (impro - `4`: ring modulation (`y` is `0` or `1`) - `5`: oscillator sync (`y` is `0` or `1`) - `6`: disable channel 3 (`y` is `0` or `1`) +- `20xy`: **set attack/decay.** + - `x` is the attack. + - `y` is the decay. +- `21xy`: **set sustain/release.** + - `x` is the sustain. + - `y` is the release. - `3xxx`: **set duty cycle.** `xxx` range is `000` to `FFF`. - `4xxx`: **set cutoff.** `xxx` range is `000` to `7FF`. ## info this chip uses the [C64](../4-instrument/c64.md) instrument editor. + +## channel status + +the following icons are displayed when channel status is enabled in the pattern view: + +- channel is silent: + - ![not muted](status-C64-none.png) it's not + - ![gate bit disabled](status-C64-gate-off.png) gate bit disabled + - ![gate bit disabled and test bit enabled](status-C64-gate-off-test-on.png) gate bit disabled and test bit enabled + - ![text bit enabled](status-C64-test-on.png) test bit enabled + - ![ch3off enabled in filter mode](status-C64-ch3off.png) ch3off enabled in filter mode diff --git a/doc/7-systems/pce.md b/doc/7-systems/pce.md index ec6633c3e..15eda9551 100644 --- a/doc/7-systems/pce.md +++ b/doc/7-systems/pce.md @@ -19,8 +19,16 @@ furthermore, it has some PCM and LFO! - when LFO is enabled, channel 2 is muted and its output is passed to channel 1's frequency. - `13xx`: **set LFO speed.** - `17xx`: **toggle LEGACY sample mode.** - - **this effect exists only for compatibility reasons! its use is NOT recommented. use Sample type instruments instead.** + - **this effect exists only for compatibility reasons! its use is NOT recommended. use Sample type instruments instead.** ## info this chip uses the [PC Engine](../4-instrument/pce.md) instrument editor. + +## channel status + +the following icons are displayed when channel status is enabled in the pattern view: + +- noise mode (channels 5 and 6 only): + - ![noise mode off](status-PCE-noise-off.png) off + - ![noise mode on](status-PCE-noise-on.png) on diff --git a/doc/7-systems/snes.md b/doc/7-systems/snes.md index cf518a0d9..d10b20c39 100644 --- a/doc/7-systems/snes.md +++ b/doc/7-systems/snes.md @@ -65,6 +65,20 @@ Furnace also allows the SNES to use wavetables (and the wavetable synthesizer) i this chip uses the [SNES](../4-instrument/snes.md) instrument editor. +## channel status + +the following icons are displayed when channel status is enabled in the pattern view: + +- envelope/gain status: + - ![direct gain, envelope off](status-SNES-gain-direct.png) direct gain + - ![linear gain decrease](status-SNES-gain-dec-lin.png) linear gain decrease + - ![logarithmic gain decrease](status-SNES-gain-dec-log.png) logarithmic gain decrease + - ![linear gain increase](status-SNES-gain-inc-lin.png) linear gain increase + - ![bent-line gain increase](status-SNES-gain-inc-bent.png) bent-line gain increase + - ![envelope attack](status-SNES-env-A.png) envelope attack + - ![envelope decay](status-SNES-env-D.png) envelope decay + - ![envelope sustain](status-SNES-env-S.png) envelope sustain + - ![envelope release](status-SNES-env-R.png) envelope release ## ADSR diff --git a/doc/7-systems/status-C64-ch3off.png b/doc/7-systems/status-C64-ch3off.png new file mode 100644 index 000000000..8fd21961a Binary files /dev/null and b/doc/7-systems/status-C64-ch3off.png differ diff --git a/doc/7-systems/status-C64-gate-off-test-on.png b/doc/7-systems/status-C64-gate-off-test-on.png new file mode 100644 index 000000000..d3aab0688 Binary files /dev/null and b/doc/7-systems/status-C64-gate-off-test-on.png differ diff --git a/doc/7-systems/status-C64-gate-off.png b/doc/7-systems/status-C64-gate-off.png new file mode 100644 index 000000000..fc53a30e9 Binary files /dev/null and b/doc/7-systems/status-C64-gate-off.png differ diff --git a/doc/7-systems/status-C64-none.png b/doc/7-systems/status-C64-none.png new file mode 100644 index 000000000..d1fafa859 Binary files /dev/null and b/doc/7-systems/status-C64-none.png differ diff --git a/doc/7-systems/status-C64-test-on.png b/doc/7-systems/status-C64-test-on.png new file mode 100644 index 000000000..132d39117 Binary files /dev/null and b/doc/7-systems/status-C64-test-on.png differ diff --git a/doc/7-systems/status-PCE-noise-off.png b/doc/7-systems/status-PCE-noise-off.png new file mode 100644 index 000000000..874c8606c Binary files /dev/null and b/doc/7-systems/status-PCE-noise-off.png differ diff --git a/doc/7-systems/status-PCE-noise-on.png b/doc/7-systems/status-PCE-noise-on.png new file mode 100644 index 000000000..373022d41 Binary files /dev/null and b/doc/7-systems/status-PCE-noise-on.png differ diff --git a/doc/7-systems/status-SNES-env-A.png b/doc/7-systems/status-SNES-env-A.png new file mode 100644 index 000000000..60abd875b Binary files /dev/null and b/doc/7-systems/status-SNES-env-A.png differ diff --git a/doc/7-systems/status-SNES-env-D.png b/doc/7-systems/status-SNES-env-D.png new file mode 100644 index 000000000..e52b20784 Binary files /dev/null and b/doc/7-systems/status-SNES-env-D.png differ diff --git a/doc/7-systems/status-SNES-env-R.png b/doc/7-systems/status-SNES-env-R.png new file mode 100644 index 000000000..635121059 Binary files /dev/null and b/doc/7-systems/status-SNES-env-R.png differ diff --git a/doc/7-systems/status-SNES-env-S.png b/doc/7-systems/status-SNES-env-S.png new file mode 100644 index 000000000..0cdce9ea4 Binary files /dev/null and b/doc/7-systems/status-SNES-env-S.png differ diff --git a/doc/7-systems/status-SNES-gain-dec-lin.png b/doc/7-systems/status-SNES-gain-dec-lin.png new file mode 100644 index 000000000..5ad203ed5 Binary files /dev/null and b/doc/7-systems/status-SNES-gain-dec-lin.png differ diff --git a/doc/7-systems/status-SNES-gain-dec-log.png b/doc/7-systems/status-SNES-gain-dec-log.png new file mode 100644 index 000000000..d48907bde Binary files /dev/null and b/doc/7-systems/status-SNES-gain-dec-log.png differ diff --git a/doc/7-systems/status-SNES-gain-direct.png b/doc/7-systems/status-SNES-gain-direct.png new file mode 100644 index 000000000..6c5fd6422 Binary files /dev/null and b/doc/7-systems/status-SNES-gain-direct.png differ diff --git a/doc/7-systems/status-SNES-gain-inc-bent.png b/doc/7-systems/status-SNES-gain-inc-bent.png new file mode 100644 index 000000000..6d41a56d7 Binary files /dev/null and b/doc/7-systems/status-SNES-gain-inc-bent.png differ diff --git a/doc/7-systems/status-SNES-gain-inc-lin.png b/doc/7-systems/status-SNES-gain-inc-lin.png new file mode 100644 index 000000000..e10d8a9ed Binary files /dev/null and b/doc/7-systems/status-SNES-gain-inc-lin.png differ diff --git a/doc/7-systems/status-Swan-PCM-off.png b/doc/7-systems/status-Swan-PCM-off.png new file mode 100644 index 000000000..4596bb70c Binary files /dev/null and b/doc/7-systems/status-Swan-PCM-off.png differ diff --git a/doc/7-systems/status-Swan-PCM-on.png b/doc/7-systems/status-Swan-PCM-on.png new file mode 100644 index 000000000..a03699f1b Binary files /dev/null and b/doc/7-systems/status-Swan-PCM-on.png differ diff --git a/doc/7-systems/status-Swan-noise-off.png b/doc/7-systems/status-Swan-noise-off.png new file mode 100644 index 000000000..874c8606c Binary files /dev/null and b/doc/7-systems/status-Swan-noise-off.png differ diff --git a/doc/7-systems/status-Swan-noise-on.png b/doc/7-systems/status-Swan-noise-on.png new file mode 100644 index 000000000..373022d41 Binary files /dev/null and b/doc/7-systems/status-Swan-noise-on.png differ diff --git a/doc/7-systems/status-Swan-sweep-off.png b/doc/7-systems/status-Swan-sweep-off.png new file mode 100644 index 000000000..aaa5246b6 Binary files /dev/null and b/doc/7-systems/status-Swan-sweep-off.png differ diff --git a/doc/7-systems/status-Swan-sweep-on.png b/doc/7-systems/status-Swan-sweep-on.png new file mode 100644 index 000000000..cb968d48f Binary files /dev/null and b/doc/7-systems/status-Swan-sweep-on.png differ diff --git a/doc/7-systems/wonderswan.md b/doc/7-systems/wonderswan.md index edd189649..2ff7ac961 100644 --- a/doc/7-systems/wonderswan.md +++ b/doc/7-systems/wonderswan.md @@ -24,3 +24,17 @@ it has 4 wavetable channels. some of them have additional capabilities: ## info this chip uses the [WonderSwan](../4-instrument/wonderswan.md) instrument editor. + +## channel status + +the following icons are displayed when channel status is enabled in the pattern view: + +- PCM mode (channel 2): + - ![PCM mode off](status-Swan-PCM-off.png) off + - ![PCM mode on](status-Swan-PCM-on.png) on +- sweep (channel 3): + - ![sweep mode off](status-Swan-sweep-off.png) disabled + - ![sweep mode on](status-Swan-sweep-on.png) enabled +- noise mode (channel 4): + - ![noise mode off](status-Swan-noise-off.png) off + - ![noise mode on](status-Swan-noise-on.png) on diff --git a/doc/8-advanced/README.md b/doc/8-advanced/README.md index 16d83afa8..97ecd6f2c 100644 --- a/doc/8-advanced/README.md +++ b/doc/8-advanced/README.md @@ -23,3 +23,7 @@ as listed in the "Window" menu: - [register view](regview.md) - [log viewer](log-viewer.md) - [stats](stats.md) + +other: + +- [command line usage](command-line.md) diff --git a/doc/8-advanced/chip-manager-change.png b/doc/8-advanced/chip-manager-change.png deleted file mode 100644 index 4e9a29f2c..000000000 Binary files a/doc/8-advanced/chip-manager-change.png and /dev/null differ diff --git a/doc/8-advanced/chip-manager-remove.png b/doc/8-advanced/chip-manager-remove.png index 3e80749d4..c7b8472ea 100644 Binary files a/doc/8-advanced/chip-manager-remove.png and b/doc/8-advanced/chip-manager-remove.png differ diff --git a/doc/8-advanced/chip-manager.md b/doc/8-advanced/chip-manager.md index d0cb89943..bcfb6006d 100644 --- a/doc/8-advanced/chip-manager.md +++ b/doc/8-advanced/chip-manager.md @@ -8,7 +8,7 @@ the **chip manager** window does exactly what it says. to move a chip around, click and drag the ![crossed-arrows](chip-manager-move.png) button to its left. -to replace a chip with a different one, click the ![down-angle](chip-manager-change.png) and select the replacement. +to replace a chip with a different one, click the **Change** button and select the replacement. to remove a chip entirely, click the ![X](chip-manager-remove.png) button. diff --git a/doc/8-advanced/chip-manager.png b/doc/8-advanced/chip-manager.png index fbc5045c2..b746d85d0 100644 Binary files a/doc/8-advanced/chip-manager.png and b/doc/8-advanced/chip-manager.png differ diff --git a/doc/8-advanced/command-line.md b/doc/8-advanced/command-line.md new file mode 100644 index 000000000..cc5d4f0df --- /dev/null +++ b/doc/8-advanced/command-line.md @@ -0,0 +1,100 @@ +# command line usage + +## NAME + +Furnace - a chiptune tracker + +## SYNOPSIS + +`furnace [params...] [file]` + +## DESCRIPTION + +Furnace is a chiptune tracker that supports many systems and sound chips from the 8/16-bit era. +even though it is primarily controlled by using its graphical user interface, Furnace also offers a command line interface, which is described here. + +## USAGE + +starting Furnace without arguments will start the graphical user interface (GUI), as long as Furnace has been compiled with GUI enabled. + +passing the path to a file will open that file at start-up. if Furnace cannot open that file, it will report an error and quit. + +the following parameters may be used: + +**general** + +- `-help`: display the following help. +- `-console`: enable command-line interface (CLI) player. + - see the COMMAND LINE INTERFACE section for more information +- `-loglevel `: set the logging level to one of the following: + - `error`: critical errors only + - `warning`: errors and warnings + - `info`: errors, warnings, and useful information + - `debug`: all of the above, including debug information + - `trace`: like debug, but with even more details (default) + +- `-info`: get information about a song. + - you must provide a file, otherwise Furnace will quit. + +- `-version`: display version information. +- `-warranty`: view warranty disclaimer. + +**engine** + +- `-audio sdl|jack|portaudio`: override audio backend to one of the following: + - `sdl`: SDL (default) + - `jack`: JACK Audio Connection Kit + - `portaudio`: PortAudio +- `-view `: set visualization of data to one of the following: + - `pattern`: order and pattern + - `commands`: engine commands + - `nothing`: guess (default) +- `-loops `: set number of loops + - `-1` means loop forever. +- `-subsong `: set sub-song to play. +- `-safemode`: enable safe mode (software rendering without audio). +- `-safeaudio`: enable safe mode (software rendering with audio). +- `-benchmark render|seek`: run performance test and output total time. + - `render`: measure render time + - `seek`: measure time to seek through the entire song + - you must provide a file, otherwise Furnace will quit. + +**audio export** + +- `-output path`: export audio in .wav format to `path`. + - you must provide a file, otherwise Furnace will quit. +- `-outmode one|persys|perchan`: set audio export output mode. + - `one`: single file (default) + - `persys`: one file per chip (`_sXX` will be appended to file name, where `XX` is the chip number) + - `perchan`: one file per channel (`_cXX` will be appended to file name, where `XX` is the channel number) + +**VGM export** + +- `-vgmout path`: output VGM data to `path`. + - you must provide a file, otherwise Furnace will quit. +- `-direct`: enable VGM export direct stream mode. + - this mode is useful for DualPCM export. + - note that this will increase file size by a huge amount! + +**export (other)** + +- `-zsmout path`: output Zsound Music data for Commander X16. + - you must provide a file, otherwise Furnace will quit. + +- `-cmdout path`: output command stream dump to `path`. + - you must provide a file, otherwise Furnace will quit. +- `-binary`: set command stream output format to binary. + +## COMMAND LINE INTERFACE + +Furnace provides a command-line interface (CLI) player which may be activated through the `-console` option. + +the following controls may be used: + +- `Left`/`H`: go to previous order. +- `Right`/`L`: go to next order. +- `Space`: pause/resume playback. + +## SEE ALSO + +the Furnace user manual in the `manual.pdf` file. diff --git a/papers/format.md b/papers/format.md index 44faff0b2..54c2c0275 100644 --- a/papers/format.md +++ b/papers/format.md @@ -234,6 +234,7 @@ size | description | - 0xce: Namco C140 - 24 channels | - 0xcf: Namco C219 - 16 channels | - 0xd0: Namco C352 - 32 channels (UNAVAILABLE) + | - 0xd1: ESFM - 18 channels (UNAVAILABLE) | - 0xde: YM2610B extended - 19 channels | - 0xe0: QSound - 19 channels | - 0xfc: Pong - 1 channel @@ -633,7 +634,9 @@ size | description 1 | osc sync 1 | to filter 1 | init filter - 1 | vol macro is cutoff + 1 | vol macro is cutoff (<187) or reserved + | - from version 187 onwards, volume and cutoff macros are separate. + | - if this is on and the version is less than 187, move the volume macro into the ALG one. 1 | resonance 1 | low pass 1 | band pass @@ -1121,6 +1124,24 @@ size | description - `val[14]`: loop - `val[15]`: global (not sure how will I implement this) +## C64 compatibility note (>=187) + +in Furnace dev187 the volume and cutoff macros have been separated, as noted above. +however, there are two other changes as well: **inverted relative (non-absolute) cutoff macro**; and a new, improved Special macro. + +if version is less than 187, you must convert the Special macro: +1. do not continue if ex4 is not a Sequence type macro! +2. move bit 0 of ex4 macro data into bit 3. +3. set bit 0 on all steps of ex4 macro to 1. +4. if ex3 is not a Sequence type macro, stop here. +5. if ex3 macro length is 0, stop here. +6. merge the ex3 macro (former Special) into ex4 (former Test). + - use the largest size (between ex3 and ex4). + - if the ex3 macro is shorter than the ex4 one, use the last value of ex3, and vice-versa. + - if the ex4 macro length is 0, expand it to the largest size, and set all steps to 1. + +don't worry about loop or release... + # wavetable ``` diff --git a/papers/newIns.md b/papers/newIns.md index 557bb7119..8111ac4a4 100644 --- a/papers/newIns.md +++ b/papers/newIns.md @@ -295,7 +295,9 @@ size | description 1 | flags 1 | - bit 7: dutyIsAbs | - bit 6: initFilter - | - bit 5: volIsCutoff + | - bit 5: volIsCutoff (<187) + | - from version 187 onwards, volume and cutoff macros are separate. + | - if this is on and the version is less than 187, move the volume macro into the ALG one. | - bit 4: toFilter | - bit 3: noise on | - bit 2: pulse on @@ -322,6 +324,24 @@ size | description | - bit 0-10: cutoff ``` +## C64 compatibility note (>=187) + +in Furnace dev187 the volume and cutoff macros have been separated, as noted above. +however, there are two other changes as well: **inverted relative (non-absolute) cutoff macro**; and a new, improved Special macro. + +if version is less than 187, you must convert the Special macro: +1. do not continue if ex4 is not a Sequence type macro! +2. move bit 0 of ex4 macro data into bit 3. +3. set bit 0 on all steps of ex4 macro to 1. +4. if ex3 is not a Sequence type macro, stop here. +5. if ex3 macro length is 0, stop here. +6. merge the ex3 macro (former Special) into ex4 (former Test). + - use the largest size (between ex3 and ex4). + - if the ex3 macro is shorter than the ex4 one, use the last value of ex3, and vice-versa. + - if the ex4 macro length is 0, expand it to the largest size, and set all steps to 1. + +don't worry about loop or release... + # Game Boy data (GB) ``` @@ -556,6 +576,31 @@ size | description size | description -----|------------------------------------ 1 | switch roles of phase reset timer and frequency + 1 | hardware sequence length (>=185) + ??? | hardware sequence... + | - length: 5*hwSeqLen +``` + +a value in the hardware sequence has the following format: + +``` +size | description +-----|------------------------------------ + 1 | command + | - 0: set volume sweep + | - 1: set frequency sweep + | - 2: set cutoff sweep + | - 3: wait + | - 4: wait for release + | - 5: loop + | - 6: loop until release + 1 | sweep bound + 1 | sweep amount/command data + | - if "set sweep", this is amount. + | - for wait: length in ticks + | - for wait for release: nothing + | - for loop/loop until release: position + 2 | sweep period ``` # ES5506 data (ES) diff --git a/res/icons.sfd b/res/icons.sfd index 5d33304de..a04f40897 100644 --- a/res/icons.sfd +++ b/res/icons.sfd @@ -21,7 +21,7 @@ OS2Version: 0 OS2_WeightWidthSlopeOnly: 0 OS2_UseTypoMetrics: 0 CreationTime: 1691897631 -ModificationTime: 1697616170 +ModificationTime: 1698523374 PfmFamily: 81 TTFWeight: 400 TTFWidth: 5 @@ -53,7 +53,7 @@ FitToEm: 0 WinInfo: 57552 16 10 BeginPrivate: 0 EndPrivate -BeginChars: 65536 75 +BeginChars: 65536 95 StartChar: space Encoding: 32 32 0 @@ -5717,49 +5717,49 @@ SplineSet 635 935 l 5 203 935 l 5 203 1027 l 5 -118 675 m 29 - 118 578 l 29 - 955.375 578 l 5 - 1029.47460938 364.203125 l 5 - 1080.17480469 426.109375 l 5 - 1142.57519531 257.4921875 l 5 - 1191.32519531 371.125976562 l 5 - 1238.125 165.8515625 l 5 - 1300.52539062 393.122070312 l 5 - 1359.02539062 132.860351562 l 5 - 1417.52539062 217.170898438 l 5 - 1472.125 77.8740234375 l 5 - 1497.47460938 184.1796875 l 5 - 1546.22460938 -39.423828125 l 5 - 1561.82519531 106.947265625 l 5 - 1616.42480469 -193.381835938 l 5 - 1671.27539062 67.0830078125 l 5 - 1710.02539062 557.821289062 l 5 - 1710.02539062 695.178710938 l 5 - 1671.27539062 1185.91699219 l 5 - 1616.42480469 1446.38183594 l 5 - 1561.82519531 1109.14160156 l 5 - 1546.22460938 1292.42382812 l 5 - 1497.47460938 1068.8203125 l 5 - 1472.125 1175.12597656 l 5 - 1417.52539062 1035.82910156 l 5 - 1359.02539062 1120.13964844 l 5 - 1300.52539062 859.877929688 l 5 - 1238.125 1087.1484375 l 5 - 1191.32519531 881.874023438 l 5 - 1142.57519531 995.5078125 l 5 - 1080.17480469 826.890625 l 5 - 1029.47460938 888.796875 l 5 - 955.375 675 l 5 - 118 675 l 29 -805 318 m 5 - 373 318 l 5 - 373 478 l 5 - 83 272 l 5 - 373 66 l 5 - 373 226 l 5 - 805 226 l 5 - 805 318 l 5 +118 675 m 25 + 118 578 l 25 + 955.375 578 l 1 + 1029.47460938 364.203125 l 1 + 1080.17480469 426.109375 l 1 + 1142.57519531 257.4921875 l 1 + 1191.32519531 371.125976562 l 1 + 1238.125 165.8515625 l 1 + 1300.52539062 393.122070312 l 1 + 1359.02539062 132.860351562 l 1 + 1417.52539062 217.170898438 l 1 + 1472.125 77.8740234375 l 1 + 1497.47460938 184.1796875 l 1 + 1546.22460938 -39.423828125 l 1 + 1561.82519531 106.947265625 l 1 + 1616.42480469 -193.381835938 l 1 + 1671.27539062 67.0830078125 l 1 + 1710.02539062 557.821289062 l 1 + 1710.02539062 695.178710938 l 1 + 1671.27539062 1185.91699219 l 1 + 1616.42480469 1446.38183594 l 1 + 1561.82519531 1109.14160156 l 1 + 1546.22460938 1292.42382812 l 1 + 1497.47460938 1068.8203125 l 1 + 1472.125 1175.12597656 l 1 + 1417.52539062 1035.82910156 l 1 + 1359.02539062 1120.13964844 l 1 + 1300.52539062 859.877929688 l 1 + 1238.125 1087.1484375 l 1 + 1191.32519531 881.874023438 l 1 + 1142.57519531 995.5078125 l 1 + 1080.17480469 826.890625 l 1 + 1029.47460938 888.796875 l 1 + 955.375 675 l 1 + 118 675 l 25 +805 318 m 1 + 373 318 l 1 + 373 478 l 1 + 83 272 l 1 + 373 66 l 1 + 373 226 l 1 + 805 226 l 1 + 805 318 l 1 EndSplineSet EndChar @@ -6028,7 +6028,7 @@ EndChar StartChar: uniE144 Encoding: 57668 57668 74 Width: 1792 -Flags: HWO +Flags: HW LayerCount: 2 Fore SplineSet @@ -6056,5 +6056,681 @@ SplineSet 1551.17675781 680.580078125 1569.90136719 713.986328125 1612.40039062 713.986328125 c 0 EndSplineSet EndChar + +StartChar: uniE145 +Encoding: 57669 57669 75 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +522.990195527 -133 m 4 + 522.990195527 -160.625937316 500.62567195 -182.990195527 473 -182.990195527 c 6 + 120 -182.990195527 l 6 + 92.3740626842 -182.990195527 70.009804473 -160.62567195 70.009804473 -133 c 4 + 70.009804473 -105.374062684 92.3743280499 -83.009804473 120 -83.009804473 c 6 + 473 -83.009804473 l 6 + 500.625937316 -83.009804473 522.990195527 -105.37432805 522.990195527 -133 c 4 +120 10.009804473 m 4 + 92.3740626842 10.009804473 70.009804473 32.3743280499 70.009804473 60 c 4 + 70.009804473 64.8134431008 70.699727686 69.6268862016 72.079574112 74.2784931335 c 6 + 425.079574112 1264.27849313 l 6 + 431.263927162 1285.12659548 450.525009059 1299.99019553 473 1299.99019553 c 4 + 479.835355796 1299.99019553 499.699888713 1298.26011808 513.435208596 1279.42115066 c 6 + 899.438504977 749.990195527 l 5 + 1295 749.990195527 l 6 + 1301.13102947 749.990195527 1323.80711626 748.43031074 1337.51061627 726.339026088 c 6 + 1734.51061627 86.3390260882 l 6 + 1739.49700244 78.300519415 1741.99019553 69.1502597075 1741.99019553 60 c 4 + 1741.99019553 32.3740626842 1719.62567195 10.009804473 1692 10.009804473 c 4 + 1685.86897053 10.009804473 1663.19288374 11.5696892605 1649.48938373 33.6609739118 c 6 + 1267.16049977 650.009804473 l 5 + 874 650.009804473 l 6 + 867.164644204 650.009804473 847.300111287 651.739881916 833.564791404 670.578849337 c 6 + 492.17532648 1138.81876382 l 5 + 167.920425888 45.7215068665 l 6 + 161.736072838 24.8734045156 142.474990941 10.009804473 120 10.009804473 c 4 +291 1363.99509776 m 4 + 304.812968658 1363.99509776 315.995097764 1352.81283598 315.995097764 1339 c 4 + 315.995097764 1336.72748524 302.589006251 1222.55285612 289.855072456 1113.33612268 c 4 + 289.58961524 1110.82609608 288.953231482 1108.42736209 288.001699464 1106.19569974 c 4 + 285.999860964 1101.49353775 282.607669759 1097.55307198 278.356613679 1094.86460664 c 4 + 274.495333198 1092.4207025 269.916875116 1091.00599258 265.005682215 1091.00490287 c 6 + 265 1091.00490224 l 6 + 261.605274126 1091.00490224 258.210548251 1091.69122514 255.042904102 1093.06387093 c 6 + 45.042904102 1184.06387093 l 6 + 36.1517873883 1187.91668818 30.0049022365 1196.77638349 30.0049022365 1207 c 4 + 30.0049022365 1220.81296866 41.187164025 1231.99509776 55 1231.99509776 c 4 + 58.3947258743 1231.99509776 61.7894517486 1231.30877486 64.957095898 1229.93612907 c 6 + 204.490746756 1169.47154703 l 5 + 41.4497078318 1446.31845966 l 6 + 39.1531707682 1450.21802507 38.0049022365 1454.60901253 38.0049022365 1459 c 4 + 38.0049022365 1472.81296866 49.187164025 1483.99509776 63 1483.99509776 c 4 + 65.9338592397 1483.99509776 77.7382982208 1483.24844096 84.5502921682 1471.68154034 c 6 + 248.788761019 1192.80136799 l 5 + 266.174214397 1341.91506427 l 6 + 267.637145507 1354.46251187 278.267491735 1363.99509776 291 1363.99509776 c 4 +EndSplineSet +EndChar + +StartChar: uniE146 +Encoding: 57670 57670 76 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +923.990195527 -133 m 0 + 923.990195527 -160.625937316 901.62567195 -182.990195527 874 -182.990195527 c 2 + 473 -182.990195527 l 2 + 445.374062684 -182.990195527 423.009804473 -160.62567195 423.009804473 -133 c 0 + 423.009804473 -105.374062684 445.37432805 -83.009804473 473 -83.009804473 c 2 + 874 -83.009804473 l 2 + 901.625937316 -83.009804473 923.990195527 -105.37432805 923.990195527 -133 c 0 +120 10.009804473 m 0 + 92.3740626842 10.009804473 70.009804473 32.3743280499 70.009804473 60 c 0 + 70.009804473 64.8134431008 70.699727686 69.6268862016 72.079574112 74.2784931335 c 2 + 425.079574112 1264.27849313 l 2 + 431.263927162 1285.12659548 450.525009059 1299.99019553 473 1299.99019553 c 0 + 479.835355796 1299.99019553 499.699888713 1298.26011808 513.435208596 1279.42115066 c 2 + 899.438504977 749.990195527 l 1 + 1295 749.990195527 l 2 + 1301.13102947 749.990195527 1323.80711626 748.43031074 1337.51061627 726.339026088 c 2 + 1734.51061627 86.3390260882 l 2 + 1739.49700244 78.300519415 1741.99019553 69.1502597075 1741.99019553 60 c 0 + 1741.99019553 32.3740626842 1719.62567195 10.009804473 1692 10.009804473 c 0 + 1685.86897053 10.009804473 1663.19288374 11.5696892605 1649.48938373 33.6609739118 c 2 + 1267.16049977 650.009804473 l 1 + 874 650.009804473 l 2 + 867.164644204 650.009804473 847.300111287 651.739881916 833.564791404 670.578849337 c 2 + 492.17532648 1138.81876382 l 1 + 167.920425888 45.7215068665 l 2 + 161.736072838 24.8734045156 142.474990941 10.009804473 120 10.009804473 c 0 +987 1293.13572276 m 0 + 1000.81296866 1293.13572276 1011.99509776 1281.95346098 1011.99509776 1268.140625 c 0 + 1011.99509776 1263.69241786 1010.81670769 1259.24421072 1008.45992755 1255.30688847 c 2 + 935.698971275 1133.74980006 l 1 + 1236.81087137 1237.76397869 l 2 + 1239.45825701 1238.67847474 1242.22912851 1239.13572276 1245 1239.13572276 c 0 + 1258.81296866 1239.13572276 1269.99509776 1227.95346098 1269.99509776 1214.140625 c 0 + 1269.99509776 1203.27422071 1263.04780398 1193.92278939 1253.18912863 1190.51727131 c 2 + 939.748292604 1082.24426351 l 1 + 1077.25037188 1004.93905019 l 2 + 1079.69668307 1003.56370656 1089.99509776 996.953556381 1089.99509776 983.140625 c 0 + 1089.99509776 969.327656342 1078.81283598 958.145527236 1065 958.145527236 c 0 + 1060.77011153 958.145527236 1056.54022306 959.211084762 1052.74962812 961.342199814 c 2 + 866.749628119 1065.91348888 l 2 + 866.618722401 1065.98708554 866.465332358 1066.07567196 866.292238034 1066.17954775 c 0 + 863.033869485 1068.10546545 860.2515148 1070.74998574 858.162663277 1073.89560304 c 0 + 855.849429066 1077.31041594 854.004904086 1081.86612897 854.004902236 1087.71191406 c 0 + 854.004902236 1090.53137826 854.472612732 1093.24885041 855.337535819 1095.7869306 c 0 + 855.896115778 1097.42970853 856.630294239 1099.02574468 857.540072447 1100.54565059 c 2 + 965.540072447 1280.97436153 l 2 + 967.067066953 1283.52541385 973.701841651 1293.13572276 987 1293.13572276 c 0 +EndSplineSet +EndChar + +StartChar: uniE147 +Encoding: 57671 57671 77 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +1344.99019553 -133 m 0 + 1344.99019553 -160.625937316 1322.62567195 -182.990195527 1295 -182.990195527 c 2 + 874 -182.990195527 l 2 + 846.374062684 -182.990195527 824.009804473 -160.62567195 824.009804473 -133 c 0 + 824.009804473 -105.374062684 846.37432805 -83.009804473 874 -83.009804473 c 2 + 1295 -83.009804473 l 2 + 1322.62593732 -83.009804473 1344.99019553 -105.37432805 1344.99019553 -133 c 0 +120 10.009804473 m 0 + 92.3740626842 10.009804473 70.009804473 32.3743280499 70.009804473 60 c 0 + 70.009804473 64.8134431008 70.699727686 69.6268862016 72.079574112 74.2784931335 c 2 + 425.079574112 1264.27849313 l 2 + 431.263927162 1285.12659548 450.525009059 1299.99019553 473 1299.99019553 c 0 + 479.835355796 1299.99019553 499.699888713 1298.26011808 513.435208596 1279.42115066 c 2 + 899.438504977 749.990195527 l 1 + 1295 749.990195527 l 2 + 1301.13102947 749.990195527 1323.80711626 748.43031074 1337.51061627 726.339026088 c 2 + 1734.51061627 86.3390260882 l 2 + 1739.49700244 78.300519415 1741.99019553 69.1502597075 1741.99019553 60 c 0 + 1741.99019553 32.3740626842 1719.62567195 10.009804473 1692 10.009804473 c 0 + 1685.86897053 10.009804473 1663.19288374 11.5696892605 1649.48938373 33.6609739118 c 2 + 1267.16049977 650.009804473 l 1 + 874 650.009804473 l 2 + 867.164644204 650.009804473 847.300111287 651.739881916 833.564791404 670.578849337 c 2 + 492.17532648 1138.81876382 l 1 + 167.920425888 45.7215068665 l 2 + 161.736072838 24.8734045156 142.474990941 10.009804473 120 10.009804473 c 0 +1084.00495181 1430.66194045 m 2 + 1084.00495181 1444.57909512 1095.22502858 1455.70701183 1109 1455.70701183 c 0 + 1122.79340754 1455.70701183 1133.96768049 1444.55520556 1133.99504819 1430.76188767 c 2 + 1134.84372708 1003.00652189 l 1 + 1191.01019316 1078.20250251 1280.58910304 1196.65635616 1282.32233047 1198.38958359 c 0 + 1287.20061596 1203.26786908 1293.60030798 1205.70701183 1300 1205.70701183 c 0 + 1313.81296866 1205.70701183 1324.99509776 1194.52475004 1324.99509776 1180.71191406 c 0 + 1324.99509776 1175.39825496 1323.31356069 1170.08459585 1319.95048655 1165.64179831 c 2 + 1319.95048655 1165.64179831 1169.74933909 967.202659181 1136.79718212 921.589936639 c 1 + 1134.99509776 926.711914062 l 0 + 1134.99509776 914.405239676 1126.88992674 905.533770837 1116.96812187 902.69947513 c 0 + 1114.75667886 902.059674388 1112.41866713 901.716818782 1110 901.716816299 c 0 + 1109.21533751 901.716816299 1108.43915082 901.752904718 1107.67300982 901.823514982 c 0 + 1102.42285625 902.229856341 1097.16630151 904.09245251 1092.05299755 909.205756573 c 0 + 1083.69666264 917.562091485 1049.14355642 964.844828621 1007.26491083 1021.09775066 c 0 + 955.99749067 1089.96201665 899.880227391 1165.86808633 899.880227391 1165.86808633 c 2 + 896.630010621 1170.26443217 895.004902236 1175.48817312 895.004902236 1180.71191406 c 0 + 895.004902236 1194.52488272 906.187164025 1205.70701183 920 1205.70701183 c 0 + 923.445371477 1205.70701183 933.259523451 1204.83513145 940.119772609 1195.5557418 c 2 + 940.119772609 1195.5557418 1029.57692545 1075.08662563 1084.85734273 1001.0569193 c 1 + 1084.00495181 1430.66194045 l 2 +EndSplineSet +EndChar + +StartChar: uniE148 +Encoding: 57672 57672 78 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +1741.99019553 -133 m 0 + 1741.99019553 -160.625937316 1719.62567195 -182.990195527 1692 -182.990195527 c 2 + 1295 -182.990195527 l 2 + 1267.37406268 -182.990195527 1245.00980447 -160.62567195 1245.00980447 -133 c 0 + 1245.00980447 -105.374062684 1267.37432805 -83.009804473 1295 -83.009804473 c 2 + 1692 -83.009804473 l 2 + 1719.62593732 -83.009804473 1741.99019553 -105.37432805 1741.99019553 -133 c 0 +120 10.009804473 m 0 + 92.3740626842 10.009804473 70.009804473 32.3743280499 70.009804473 60 c 0 + 70.009804473 64.8134431008 70.699727686 69.6268862016 72.079574112 74.2784931335 c 2 + 425.079574112 1264.27849313 l 2 + 431.263927162 1285.12659548 450.525009059 1299.99019553 473 1299.99019553 c 0 + 479.835355796 1299.99019553 499.699888713 1298.26011808 513.435208596 1279.42115066 c 2 + 899.438504977 749.990195527 l 1 + 1295 749.990195527 l 2 + 1301.13102947 749.990195527 1323.80711626 748.43031074 1337.51061627 726.339026088 c 2 + 1734.51061627 86.3390260882 l 2 + 1739.49700244 78.300519415 1741.99019553 69.1502597075 1741.99019553 60 c 0 + 1741.99019553 32.3740626842 1719.62567195 10.009804473 1692 10.009804473 c 0 + 1685.86897053 10.009804473 1663.19288374 11.5696892605 1649.48938373 33.6609739118 c 2 + 1267.16049977 650.009804473 l 1 + 874 650.009804473 l 2 + 867.164644204 650.009804473 847.300111287 651.739881916 833.564791404 670.578849337 c 2 + 492.17532648 1138.81876382 l 1 + 167.920425888 45.7215068665 l 2 + 161.736072838 24.8734045156 142.474990941 10.009804473 120 10.009804473 c 0 +1647.27476051 1191.59987793 m 0 + 1650.59441446 1201.62267929 1660.02764304 1208.70701183 1671 1208.70701183 c 0 + 1684.81296866 1208.70701183 1695.99509776 1197.52475004 1695.99509776 1183.71191406 c 0 + 1695.99509776 1181.04593052 1695.57181167 1178.37994697 1694.72523949 1175.8239502 c 0 + 1653.66887383 1051.86530771 1594.4265485 873.585135594 1560.31492304 774.14523513 c 1 + 1723.338566 880.654015196 l 2 + 1727.47427684 883.356012949 1732.23713842 884.707011826 1737 884.707011826 c 0 + 1750.81296866 884.707011826 1761.99509776 873.524750038 1761.99509776 859.711914062 c 0 + 1761.99509776 851.02772187 1757.55561844 843.274013429 1750.661434 838.769812929 c 2 + 1526.70849225 692.453890982 l 2 + 1523.19152841 689.855872872 1518.3636137 687.716816299 1512 687.716816299 c 0 + 1507.04339917 687.716816299 1502.42555525 689.15668701 1498.5415823 691.64129618 c 0 + 1494.3486555 694.321072629 1491.00027694 698.22285387 1489.01330483 702.872514023 c 0 + 1488.81598153 703.3333405 1488.63210474 703.801314398 1488.4621627 704.275941682 c 2 + 1389.5442774 973.052821943 l 2 + 1388.51802729 975.841319716 1388.00490224 978.776616889 1388.00490224 981.711914062 c 0 + 1388.00490224 995.52488272 1399.18716402 1006.70701183 1413 1006.70701183 c 0 + 1423.6987823 1006.70701183 1432.92175444 999.973404506 1436.4557226 990.371006182 c 2 + 1511.5898978 786.218550321 l 1 + 1532.32115736 846.743221881 1572.08799988 964.611311617 1647.27476051 1191.59987793 c 0 +EndSplineSet +EndChar + +StartChar: uniE149 +Encoding: 57673 57673 79 +Width: 1792 +Flags: H +LayerCount: 2 +Fore +SplineSet +1484 1461.6171875 m 5 + 1484 1103.6171875 l 5 + 1667 1173.6171875 l 5 + 1441 884.6171875 l 5 + 1215 1173.6171875 l 5 + 1398 1103.6171875 l 5 + 1398 1461.6171875 l 5 + 1484 1461.6171875 l 5 +1666.98529329 -56.2001953125 m 0 + 1666.98529329 -97.6391012863 1633.43850793 -131.185488603 1592 -131.185488603 c 0 + 1572.80092394 -131.185488603 1553.60184788 -123.868060369 1538.96699141 -109.233203901 c 2 + 146.966991411 1282.7667961 l 2 + 132.332134943 1297.40165257 125.014706709 1316.60072863 125.014706709 1335.79980469 c 0 + 125.014706709 1377.23871066 158.561492075 1410.78509798 200 1410.78509798 c 0 + 219.199076061 1410.78509798 238.398152121 1403.46766974 253.033008589 1388.83281328 c 2 + 1645.03300859 -3.16718672351 l 2 + 1659.66786506 -17.8020431912 1666.98529329 -37.0011192519 1666.98529329 -56.2001953125 c 0 +EndSplineSet +EndChar + +StartChar: uniE14A +Encoding: 57674 57674 80 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +1484 1461.6171875 m 1 + 1484 1103.6171875 l 1 + 1667 1173.6171875 l 1 + 1441 884.6171875 l 1 + 1215 1173.6171875 l 1 + 1398 1103.6171875 l 1 + 1398 1461.6171875 l 1 + 1484 1461.6171875 l 1 +1666.98529329 -56.2001953125 m 0 + 1666.98529329 -97.6391012863 1633.43850793 -131.185488603 1592 -131.185488603 c 0 + 1591.52523691 -131.185488603 1591.05047382 -131.181014029 1590.57577974 -131.17206488 c 0 + 1204.22474011 -123.888399549 871.515114873 8.26117947017 618.582599933 261.19369441 c 0 + 371.118582643 508.6577117 203.65752734 866.213710135 126.078697051 1323.16817722 c 0 + 125.369370157 1327.34625121 125.014706709 1331.57302795 125.014706709 1335.79980469 c 0 + 125.014706709 1377.23871066 158.561492075 1410.78509798 200 1410.78509798 c 0 + 236.80294028 1410.78509798 267.845706788 1384.21788054 273.921302949 1348.43143216 c 0 + 347.777920162 913.401527306 505.150856207 586.757472492 724.648617111 367.259711588 c 0 + 948.32678825 143.58154045 1240.28993931 25.4291221611 1593.42422026 18.7716742555 c 0 + 1634.28501058 18.0013480719 1666.98529329 -15.3022691437 1666.98529329 -56.2001953125 c 0 +EndSplineSet +EndChar + +StartChar: uniE14B +Encoding: 57675 57675 81 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +1398 -160.3828125 m 5 + 1398 197.6171875 l 5 + 1215 127.6171875 l 5 + 1441 416.6171875 l 5 + 1667 127.6171875 l 5 + 1484 197.6171875 l 5 + 1484 -160.3828125 l 5 + 1398 -160.3828125 l 5 +200 -131.185488603 m 0 + 158.561094026 -131.185488603 125.014706709 -97.6387032376 125.014706709 -56.2001953125 c 0 + 125.014706709 -37.0011192519 132.332134943 -17.8020431912 146.966991411 -3.16718672351 c 2 + 1538.96699141 1388.83281328 l 2 + 1553.60184788 1403.46766974 1572.80092394 1410.78509798 1592 1410.78509798 c 0 + 1633.43890597 1410.78509798 1666.98529329 1377.23831261 1666.98529329 1335.79980469 c 0 + 1666.98529329 1316.60072863 1659.66786506 1297.40165257 1645.03300859 1282.7667961 c 2 + 253.033008589 -109.233203901 l 2 + 238.398152121 -123.868060369 219.199076061 -131.185488603 200 -131.185488603 c 0 +EndSplineSet +EndChar + +StartChar: uniE14C +Encoding: 57676 57676 82 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +1398 -160.3828125 m 1 + 1398 197.6171875 l 1 + 1215 127.6171875 l 1 + 1441 416.6171875 l 1 + 1667 127.6171875 l 1 + 1484 197.6171875 l 1 + 1484 -160.3828125 l 1 + 1398 -160.3828125 l 1 +200 -131.185488603 m 0 + 158.561094026 -131.185488603 125.014706709 -97.6387032376 125.014706709 -56.2001953125 c 0 + 125.014706709 -46.3359567044 126.9463412 -36.4717180962 130.809610181 -27.2265159787 c 0 + 180.222951228 91.0247182868 222.892032868 202.02925922 262.91073691 306.157577084 c 0 + 385.479688717 625.080917548 482.300015367 877.006560584 669.496680182 1064.2032254 c 0 + 860.176064791 1254.88261001 1135.57605261 1366.88874873 1584.71163148 1410.43269233 c 0 + 1587.13489866 1410.66762943 1589.56744933 1410.78509798 1592 1410.78509798 c 0 + 1633.43890597 1410.78509798 1666.98529329 1377.23831261 1666.98529329 1335.79980469 c 0 + 1666.98529329 1297.0734414 1637.60142618 1264.88138924 1599.28836852 1261.16691704 c 0 + 983.643746929 1201.47982935 759.100861728 1016.28364015 593.588205401 701.489986386 c 0 + 527.530145003 575.852112797 469.624761613 425.83922682 402.895181451 252.209442936 c 0 + 362.875526167 148.078649948 319.626145727 35.5241040949 269.190389819 -85.1738746463 c 0 + 257.838987207 -112.338954786 231.005903287 -131.185488603 200 -131.185488603 c 0 +EndSplineSet +EndChar + +StartChar: uniE14D +Encoding: 57677 57677 83 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +1195.09712219 749.990195527 m 1 + 1295 749.990195527 l 2 + 1301.13102947 749.990195527 1323.80711626 748.43031074 1337.51061627 726.339026088 c 2 + 1734.51061627 86.3390260882 l 2 + 1739.49700244 78.300519415 1741.99019553 69.1502597075 1741.99019553 60 c 0 + 1741.99019553 32.3740626842 1719.62567195 10.009804473 1692 10.009804473 c 0 + 1685.86897053 10.009804473 1663.19288374 11.5696892605 1649.48938373 33.6609739118 c 2 + 1267.16049977 650.009804473 l 1 + 1131.95161768 650.009804473 l 1 + 1195.09712219 749.990195527 l 1 +1131.95161768 650.009804473 m 1025 +731.259986684 810.89716005 m 1 + 492.17532648 1138.81876382 l 1 + 167.920425888 45.7215068665 l 2 + 161.736072838 24.8734045156 142.474990941 10.009804473 120 10.009804473 c 0 + 92.3740626842 10.009804473 70.009804473 32.3743280499 70.009804473 60 c 0 + 70.009804473 64.8134431008 70.699727686 69.6268862016 72.079574112 74.2784931335 c 2 + 425.079574112 1264.27849313 l 2 + 431.263927162 1285.12659548 450.525009059 1299.99019553 473 1299.99019553 c 0 + 479.835355796 1299.99019553 499.699888713 1298.26011808 513.435208596 1279.42115066 c 2 + 790.499437572 899.407869025 l 1 + 731.259986684 810.89716005 l 1 +1350.99804688 1459.29681673 m 0 + 1392.43695285 1459.29681673 1425.98334017 1425.75003136 1425.98334017 1384.31152344 c 0 + 1425.98334017 1370.32875638 1422.10197898 1356.34598932 1414.3392566 1344.1264358 c 2 + 463.339256601 -152.873564196 l 2 + 458.314262729 -160.783570323 438.406450284 -187.673769853 399.998046875 -187.673769853 c 0 + 358.559140901 -187.673769853 325.012753584 -154.126984488 325.012753584 -112.688476563 c 0 + 325.012753584 -98.7057095056 328.894114773 -84.7229424487 336.656837149 -72.5033889291 c 2 + 1287.65683715 1424.49661107 l 2 + 1292.68183102 1432.4066172 1312.58964347 1459.29681673 1350.99804688 1459.29681673 c 0 +EndSplineSet +EndChar + +StartChar: uniE14E +Encoding: 57678 57678 84 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +120 10 m 0 + 106 10 94.1666666667 14.8333333333 84.5 24.5 c 128 + 74.8333333333 34.1666666667 70 46 70 60 c 0 + 70 64.6666666667 70.6666666667 69.3333333333 72 74 c 2 + 425 1264 l 2 + 428.333333333 1274.66666667 434.333333333 1283.33333333 443 1290 c 128 + 451.666666667 1296.66666667 461.666666667 1300 473 1300 c 0 + 489.666666667 1300 503 1293 513 1279 c 2 + 899 750 l 1 + 1295 750 l 2 + 1313.66666667 750 1328 742 1338 726 c 2 + 1735 86 l 2 + 1739.66666667 78 1742 69.3333333333 1742 60 c 0 + 1742 46 1737.16666667 34.1666666667 1727.5 24.5 c 128 + 1717.83333333 14.8333333333 1706 10 1692 10 c 0 + 1673.33333333 10 1659 18 1649 34 c 2 + 1267 650 l 1 + 874 650 l 2 + 857.333333333 650 844 657 834 671 c 2 + 492 1139 l 1 + 168 46 l 2 + 164.666666667 35.3333333333 158.666666667 26.6666666667 150 20 c 128 + 141.333333333 13.3333333333 131.333333333 10 120 10 c 0 +EndSplineSet +EndChar + +StartChar: uniE14F +Encoding: 57679 57679 85 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +651.5 1454 m 128 + 651.833333333 1454 671 1435 709 1397 c 0 + 710.333333333 1395.66666667 733 1164 777 702 c 1 + 827 1285 l 1 + 884 1341 l 1 + 941 1285 l 1 + 1055 528 l 1 + 1099 925 l 1 + 1156 981 l 1 + 1213 925 l 1 + 1276 510 l 1 + 1299 1361 l 1 + 1356 1417 l 1 + 1413 1361 l 1 + 1553 881 l 1 + 1592 572 l 1 + 1661 1170 l 1 + 1773 1157 l 1 + 1641 17 l 1 + 1584 -40 l 1 + 1527 17 l 1 + 1451 881 l 1 + 1404 1032 l 1 + 1373 -115 l 1 + 1316 -172 l 1 + 1259 -115 l 1 + 1165 498 l 1 + 1121 97 l 1 + 1064 40 l 1 + 1007 97 l 1 + 900 809 l 1 + 837 77 l 1 + 780 20 l 1 + 723 77 l 1 + 723 82.3333333333 699.666666667 328.333333333 653 815 c 1 + 651 778.333333333 648 730 644 670 c 0 + 637 561 637 561 637 561 c 1 + 497 0 l 1 + 440 -57 l 1 + 383 0 l 1 + 289 877 l 1 + 217 -59 l 1 + 160 -116 l 1 + 103 -59 l 1 + 19 1381 l 1 + 132 1387 l 1 + 168 777 l 1 + 175 877 l 1 + 263 1113 263 1113 263 1113 c 1 + 320 1169 l 1 + 377 1113 l 1 + 462 316 l 1 + 523 561 l 2 + 523.666666667 561 528.333333333 629.333333333 537 766 c 128 + 545.666666667 902.666666667 555.666666667 1040.16666667 567 1178.5 c 128 + 578.333333333 1316.83333333 587.333333333 1389.66666667 594 1397 c 2 + 650 1453 l 2 + 650.666666667 1453.66666667 651.166666667 1454 651.5 1454 c 128 +EndSplineSet +EndChar + +StartChar: uniE150 +Encoding: 57680 57680 86 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +404 70 m 1 + 1632 70 l 1 + 1632 -50 l 1 + 284 -50 l 1 + 284 1210 l 1 + 160 1210 l 1 + 160 1330 l 1 + 404 1330 l 1 + 404 70 l 1 +EndSplineSet +EndChar + +StartChar: uniE151 +Encoding: 57681 57681 87 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +588 70 m 1 + 1632 70 l 1 + 1632 -50 l 1 + 468 -50 l 1 + 468 1210 l 1 + 160 1210 l 1 + 160 1330 l 1 + 588 1330 l 1 + 588 70 l 1 +EndSplineSet +EndChar + +StartChar: uniE152 +Encoding: 57682 57682 88 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +772 70 m 1 + 1632 70 l 1 + 1632 -50 l 1 + 652 -50 l 1 + 652 1210 l 1 + 160 1210 l 1 + 160 1330 l 1 + 772 1330 l 1 + 772 70 l 1 +EndSplineSet +EndChar + +StartChar: uniE153 +Encoding: 57683 57683 89 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +956 70 m 1 + 1632 70 l 1 + 1632 -50 l 1 + 836 -50 l 1 + 836 1210 l 1 + 160 1210 l 1 + 160 1330 l 1 + 956 1330 l 1 + 956 70 l 1 +EndSplineSet +EndChar + +StartChar: uniE154 +Encoding: 57684 57684 90 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +1140 70 m 1 + 1632 70 l 1 + 1632 -50 l 1 + 1020 -50 l 1 + 1020 1210 l 1 + 160 1210 l 1 + 160 1330 l 1 + 1140 1330 l 1 + 1140 70 l 1 +EndSplineSet +EndChar + +StartChar: uniE155 +Encoding: 57685 57685 91 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +1324 70 m 1 + 1632 70 l 1 + 1632 -50 l 1 + 1204 -50 l 1 + 1204 1210 l 1 + 160 1210 l 1 + 160 1330 l 1 + 1324 1330 l 1 + 1324 70 l 1 +EndSplineSet +EndChar + +StartChar: uniE156 +Encoding: 57686 57686 92 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +1508 70 m 1 + 1632 70 l 1 + 1632 -50 l 1 + 1388 -50 l 1 + 1388 1210 l 1 + 160 1210 l 1 + 160 1330 l 1 + 1508 1330 l 1 + 1508 70 l 1 +EndSplineSet +EndChar + +StartChar: uniE157 +Encoding: 57687 57687 93 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +896 1330 m 0 + 912.666666667 1330 926.833333333 1324.16666667 938.5 1312.5 c 128 + 950.166666667 1300.83333333 956 1286.66666667 956 1270 c 0 + 956 1082 956 1082 956 705.5 c 128 + 956 329 956 329 956 140 c 1 + 1593 686 l 2 + 1604.33333333 695.333333333 1617.33333333 700 1632 700 c 0 + 1648.66666667 700 1662.83333333 694.166666667 1674.5 682.5 c 128 + 1686.16666667 670.833333333 1692 656.666666667 1692 640 c 0 + 1692 621.333333333 1685 606 1671 594 c 2 + 935 -36 l 2 + 923.666666667 -45.3333333333 910.666666667 -50 896 -50 c 0 + 879.333333333 -50 865.166666667 -44.1666666667 853.5 -32.5 c 128 + 841.833333333 -20.8333333333 836 -6.66666666667 836 10 c 2 + 836 1140 l 1 + 199 594 l 2 + 187.666666667 584.666666667 174.666666667 580 160 580 c 0 + 143.333333333 580 129.166666667 585.833333333 117.5 597.5 c 128 + 105.833333333 609.166666667 100 623.333333333 100 640 c 0 + 100 658.666666667 107 674 121 686 c 2 + 857 1316 l 2 + 868.333333333 1325.33333333 881.333333333 1330 896 1330 c 0 +EndSplineSet +EndChar + +StartChar: uniE158 +Encoding: 57688 57688 94 +Width: 1792 +Flags: HW +LayerCount: 2 +Fore +SplineSet +1632 700 m 0 + 1648.66666667 700 1662.83333333 694.166666667 1674.5 682.5 c 128 + 1686.16666667 670.833333333 1692 656.666666667 1692 640 c 0 + 1692 627.333333333 1688.33333333 615.666666667 1681 605 c 2 + 1313 85 l 2 + 1301 68.3333333333 1284.66666667 60 1264 60 c 128 + 1243.33333333 60 1227 68.3333333333 1215 85 c 2 + 528 1056 l 1 + 209 605 l 2 + 197 588.333333333 180.666666667 580 160 580 c 0 + 143.333333333 580 129.166666667 585.833333333 117.5 597.5 c 128 + 105.833333333 609.166666667 100 623.333333333 100 640 c 0 + 100 652.666666667 103.666666667 664.333333333 111 675 c 2 + 111 675 111 675 479 1195 c 0 + 491 1211.66666667 507.333333333 1220 528 1220 c 128 + 548.666666667 1220 565 1211.66666667 577 1195 c 2 + 1264 224 l 1 + 1583 675 l 2 + 1595 691.666666667 1611.33333333 700 1632 700 c 0 +EndSplineSet +EndChar EndChars EndSplineFont diff --git a/res/icons.ttf b/res/icons.ttf index aa4b28057..0062e4bcb 100644 Binary files a/res/icons.ttf and b/res/icons.ttf differ diff --git a/res/macLicense/en.license.txt b/res/macLicense/en.license.txt index d159169d1..98c4f2f28 100644 --- a/res/macLicense/en.license.txt +++ b/res/macLicense/en.license.txt @@ -1,3 +1,24 @@ +YOU SHALL READ THE FOLLOWING TEXT BEFORE PROCEEDING!!! +IF YOU DO NOT READ IT, YOU MAY NOT BE ABLE TO USE FURNACE AT ALL. + + +if you are using a recent version of macOS, you may get an error saying that Furnace is damaged. +in that case, open Terminal, and type this: + +``` +xattr -d com.apple.quarantine /path/to/Furnace.app +``` + +(replace `/path/to/Furnace.app` with the path where Furnace.app is located, e.g. `/Applications/Furnace.app`) + +you may need to reboot after doing this before launching Furnace. + +END OF MACOS ISSUE ACKNOWLEDGEMENT - license text follows. + +------------------ + + + GNU GENERAL PUBLIC LICENSE Version 2, June 1991 diff --git a/src/engine/blip_buf.c b/src/engine/blip_buf.c index 929b8fc66..63f14a049 100644 --- a/src/engine/blip_buf.c +++ b/src/engine/blip_buf.c @@ -67,6 +67,7 @@ struct blip_t int avail; int size; int integrator; + unsigned char hipass; }; typedef int buf_t; @@ -119,6 +120,7 @@ blip_t* blip_new( int size ) { m->factor = time_unit / blip_max_ratio; m->size = size; + m->hipass = 1; blip_clear( m ); check_assumptions(); } @@ -135,6 +137,10 @@ void blip_delete( blip_t* m ) } } +void blip_set_dc( blip_t* m, unsigned char enable ) { + m->hipass=enable; +} + void blip_set_rates( blip_t* m, double clock_rate, double sample_rate ) { double factor = time_unit * sample_rate / clock_rate; @@ -231,7 +237,9 @@ int blip_read_samples( blip_t* m, short out [], int count, int stereo ) out += step; /* High-pass filter */ - sum -= s << (delta_bits - bass_shift); + if (m->hipass) { + sum -= s << (delta_bits - bass_shift); + } } while ( in != end ); m->integrator = sum; diff --git a/src/engine/blip_buf.h b/src/engine/blip_buf.h index 0853595ef..524d10265 100644 --- a/src/engine/blip_buf.h +++ b/src/engine/blip_buf.h @@ -5,6 +5,9 @@ Sample buffer that resamples from input clock rate to output sample rate */ #ifndef BLIP_BUF_H #define BLIP_BUF_H +// MODIFIED by tildearrow: +// - add option to disable high-pass filter + #ifdef __cplusplus extern "C" { #endif @@ -18,6 +21,9 @@ so that there are blip_max_ratio clocks per sample. Returns pointer to new buffer, or NULL if insufficient memory. */ blip_t* blip_new( int sample_count ); +/** (tildearrow) sets whether to enable high-pass filter. */ +void blip_set_dc( blip_t*, unsigned char enable ); + /** Sets approximate input clock rate and output sample rate. For every clock_rate input clocks, approximately sample_rate samples are generated. */ void blip_set_rates( blip_t*, double clock_rate, double sample_rate ); diff --git a/src/engine/blip_buf.txt b/src/engine/blip_buf.txt index 5bf7a3d09..94d49db27 100644 --- a/src/engine/blip_buf.txt +++ b/src/engine/blip_buf.txt @@ -4,6 +4,11 @@ Author : Shay Green Website : http://www.slack.net/~ant/ License : GNU Lesser General Public License (LGPL) +MODIFICATION DISCLAIMER +----------------------- +I have modified this library in order to add a function that disables the DC offset correction high-pass filter. + - tildearrow + Contents -------- diff --git a/src/engine/chipUtils.h b/src/engine/chipUtils.h index 4ddc0738d..7607193bb 100644 --- a/src/engine/chipUtils.h +++ b/src/engine/chipUtils.h @@ -30,7 +30,7 @@ template struct SharedChannel { int freq, baseFreq, baseNoteOverride, pitch, pitch2, arpOff; int ins, note; - bool active, insChanged, freqChanged, fixedArp, keyOn, keyOff, portaPause, inPorta; + bool active, insChanged, freqChanged, fixedArp, keyOn, keyOff, portaPause, inPorta, volChanged; T vol, outVol; DivMacroInt std; void handleArp(int offset=0) { @@ -79,6 +79,7 @@ template struct SharedChannel { keyOff(false), portaPause(false), inPorta(false), + volChanged(false), vol(initVol), outVol(initVol), std() {} diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 3f2dda6b1..2f6b7c04a 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -238,6 +238,9 @@ enum DivDispatchCmds { DIV_CMD_EXTERNAL, // (value) + DIV_CMD_C64_AD, // (value) + DIV_CMD_C64_SR, // (value) + DIV_ALWAYS_SET_VOLUME, // () -> alwaysSetVol DIV_CMD_MAX @@ -385,7 +388,23 @@ struct DivChannelModeHints { // - 1: volume // - 2: pitch // - 3: panning - // - 4: ??? + // - 4: chip primary + // - 5: chip secondary + // - 6: mixing + // - 7: DSP + // - 8: note + // - 9: misc 1 + // - 10: misc 2 + // - 11: misc 3 + // - 12: attack + // - 13: decay + // - 14: sustain + // - 15: release + // - 16: dec linear + // - 17: dec exp + // - 18: inc linear + // - 19: inc bent + // - 20: direct unsigned char type[4]; // up to 4 unsigned char count; diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index 8ff1a33c7..4148c2a3e 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -96,8 +96,13 @@ void DivDispatchContainer::setRates(double gotRate) { rateMemory=gotRate; } -void DivDispatchContainer::setQuality(bool lowQual) { +void DivDispatchContainer::setQuality(bool lowQual, bool dcHiPass) { lowQuality=lowQual; + hiPass=dcHiPass; + for (int i=0; irate,rateMemory); \ \ if (bbIn[i]==NULL) bbIn[i]=new short[bbInLen]; \ @@ -165,9 +171,11 @@ void DivDispatchContainer::fillBuf(size_t runtotal, size_t offset, size_t size) if (dcOffCompensation && runtotal>0) { dcOffCompensation=false; - for (int i=0; igetDCOffRequired()) { + if (dispatch->getDCOffRequired() && hiPass) { dcOffCompensation=true; } } @@ -621,6 +629,7 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do bbOut[i]=new short[bbInLen]; memset(bbIn[i],0,bbInLen*sizeof(short)); memset(bbOut[i],0,bbInLen*sizeof(short)); + blip_set_dc(bb[i],hiPass); } } diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index e8fe8167b..00f940740 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1081,7 +1081,7 @@ bool DivEngine::addSystem(DivSystem which) { song.patchbay.push_back((i<<20)|j); } } else { - song.patchbay.reserve(outs); + if (outs>0) song.patchbay.reserve(outs); for (unsigned int j=0; j0) swapList.reserve(song.systemLen); for (int i=0; i0) chanList.reserve(channelCount); for (int j=0; jgetPaired(dispatchChanOfChan[ch]); } +DivChannelModeHints DivEngine::getChanModeHints(int ch) { + if (ch<0 || ch>=chans) return DivChannelModeHints(); + return disCont[dispatchOfChan[ch]].dispatch->getModeHints(dispatchChanOfChan[ch]); +} + unsigned char* DivEngine::getRegisterPool(int sys, int& size, int& depth) { if (sys<0 || sys>=song.systemLen) return NULL; if (disCont[sys].dispatch==NULL) return NULL; @@ -3348,7 +3353,7 @@ bool DivEngine::switchMaster(bool full) { if (initAudioBackend()) { for (int i=0; isetRun(true)) { logE("error while activating audio!"); @@ -3447,10 +3452,14 @@ void DivEngine::initDispatch(bool isRender) { BUSY_BEGIN; logV("initializing dispatch..."); if (isRender) logI("render cores set"); + + lowQuality=getConfInt("audioQuality",0); + dcHiPass=getConfInt("audioHiPass",1); + for (int i=0; i0) ds.ins.reserve(ds.insLen); for (int i=0; ic64.triOn=reader.readC(); ins->c64.sawOn=reader.readC(); ins->c64.pulseOn=reader.readC(); @@ -617,9 +619,9 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { ins->c64.oscSync=reader.readC(); ins->c64.toFilter=reader.readC(); if (ds.version<0x11) { - ins->c64.volIsCutoff=reader.readI(); + volIsCutoff=reader.readI(); } else { - ins->c64.volIsCutoff=reader.readC(); + volIsCutoff=reader.readC(); } ins->c64.initFilter=reader.readC(); @@ -631,10 +633,16 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { ins->c64.ch3off=reader.readC(); // weird storage - if (ins->c64.volIsCutoff) { - for (int j=0; jstd.volMacro.len; j++) { - ins->std.volMacro.val[j]-=18; + if (volIsCutoff) { + // move to alg (new cutoff) + ins->std.algMacro.len=ins->std.volMacro.len; + ins->std.algMacro.loop=ins->std.volMacro.loop; + ins->std.algMacro.rel=ins->std.volMacro.rel; + for (int j=0; jstd.algMacro.len; j++) { + ins->std.algMacro.val[j]=-(ins->std.volMacro.val[j]-18); } + ins->std.volMacro.len=0; + memset(ins->std.volMacro.val,0,256*sizeof(int)); } for (int j=0; jstd.dutyMacro.len; j++) { ins->std.dutyMacro.val[j]-=12; @@ -671,7 +679,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { if (ds.version>0x0b) { ds.waveLen=(unsigned char)reader.readC(); logI("reading wavetables (%d)...",ds.waveLen); - ds.wave.reserve(ds.waveLen); + if (ds.waveLen>0) ds.wave.reserve(ds.waveLen); for (int i=0; ilen=(unsigned char)reader.readI(); @@ -841,7 +849,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { // it appears this byte stored the YMU759 sample rate ymuSampleRate=reader.readC(); } - ds.sample.reserve(ds.sampleLen); + if (ds.sampleLen>0) ds.sample.reserve(ds.sampleLen); for (int i=0; i0) ds.patchbay.reserve(conns); for (unsigned int i=0; iordersLen=ordCount=reader.readC(); - if (ds.subsong[0]->ordersLen<1 || ds.subsong[0]->ordersLen>127) { + ds.subsong[0]->ordersLen=ordCount=(unsigned char)reader.readC(); + if (ds.subsong[0]->ordersLen<1 || ds.subsong[0]->ordersLen>128) { logD("invalid order count!"); throw EndOfFileException(&reader,reader.tell()); } @@ -6052,21 +6089,41 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { } } } else { // STD + bool volIsCutoff=false; + if (sys!=DIV_SYSTEM_GB) { int realVolMacroLen=i->std.volMacro.len; if (realVolMacroLen>127) realVolMacroLen=127; - w->writeC(realVolMacroLen); - if ((sys==DIV_SYSTEM_C64_6581 || sys==DIV_SYSTEM_C64_8580) && i->c64.volIsCutoff) { - for (int j=0; jwriteI(i->std.volMacro.val[j]+18); + if (sys==DIV_SYSTEM_C64_6581 || sys==DIV_SYSTEM_C64_8580) { + if (i->std.algMacro.len>0) volIsCutoff=true; + if (volIsCutoff) { + if (i->std.volMacro.len>0) { + addWarning(".dmf only supports volume or cutoff macro in C64, but not both. volume macro will be lost."); + } + realVolMacroLen=i->std.algMacro.len; + if (realVolMacroLen>127) realVolMacroLen=127; + w->writeC(realVolMacroLen); + for (int j=0; jwriteI((-i->std.algMacro.val[j])+18); + } + } else { + w->writeC(realVolMacroLen); + for (int j=0; jwriteI(i->std.volMacro.val[j]); + } } } else { + w->writeC(realVolMacroLen); for (int j=0; jwriteI(i->std.volMacro.val[j]); } } if (realVolMacroLen>0) { - w->writeC(i->std.volMacro.loop); + if (volIsCutoff) { + w->writeC(i->std.algMacro.loop); + } else { + w->writeC(i->std.volMacro.loop); + } } } @@ -6157,7 +6214,7 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { w->writeC(i->c64.oscSync); w->writeC(i->c64.toFilter); - w->writeC(i->c64.volIsCutoff); + w->writeC(volIsCutoff); w->writeC(i->c64.initFilter); w->writeC(i->c64.res); diff --git a/src/engine/fileOpsIns.cpp b/src/engine/fileOpsIns.cpp index 0a7682735..8236ebe0f 100644 --- a/src/engine/fileOpsIns.cpp +++ b/src/engine/fileOpsIns.cpp @@ -349,6 +349,8 @@ void DivEngine::loadDMP(SafeReader& reader, std::vector& ret, St } if (ins->type==DIV_INS_C64) { + bool volIsCutoff=false; + ins->c64.triOn=reader.readC(); ins->c64.sawOn=reader.readC(); ins->c64.pulseOn=reader.readC(); @@ -365,9 +367,9 @@ void DivEngine::loadDMP(SafeReader& reader, std::vector& ret, St ins->c64.oscSync=reader.readC(); ins->c64.toFilter=reader.readC(); if (version<0x07) { // TODO: UNSURE - ins->c64.volIsCutoff=reader.readI(); + volIsCutoff=reader.readI(); } else { - ins->c64.volIsCutoff=reader.readC(); + volIsCutoff=reader.readC(); } ins->c64.initFilter=reader.readC(); @@ -379,10 +381,16 @@ void DivEngine::loadDMP(SafeReader& reader, std::vector& ret, St ins->c64.ch3off=reader.readC(); // weird storage - if (ins->c64.volIsCutoff) { - for (int j=0; jstd.volMacro.len; j++) { - ins->std.volMacro.val[j]-=18; + if (volIsCutoff) { + // move to alg (new cutoff) + ins->std.algMacro.len=ins->std.volMacro.len; + ins->std.algMacro.loop=ins->std.volMacro.loop; + ins->std.algMacro.rel=ins->std.volMacro.rel; + for (int j=0; jstd.algMacro.len; j++) { + ins->std.algMacro.val[j]=-(ins->std.volMacro.val[j]-18); } + ins->std.volMacro.len=0; + memset(ins->std.volMacro.val,0,256*sizeof(int)); } for (int j=0; jstd.dutyMacro.len; j++) { ins->std.dutyMacro.val[j]-=12; diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index abd06a26a..25c829ca8 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -101,7 +101,6 @@ bool DivInstrumentC64::operator==(const DivInstrumentC64& other) { _C(ringMod) && _C(oscSync) && _C(toFilter) && - _C(volIsCutoff) && _C(initFilter) && _C(dutyIsAbs) && _C(filterIsAbs) && @@ -196,7 +195,10 @@ bool DivInstrumentWaveSynth::operator==(const DivInstrumentWaveSynth& other) { } bool DivInstrumentSoundUnit::operator==(const DivInstrumentSoundUnit& other) { - return _C(switchRoles); + return ( + _C(switchRoles) && + _C(hwSeqLen) + ); } bool DivInstrumentES5506::operator==(const DivInstrumentES5506& other) { @@ -388,7 +390,6 @@ void DivInstrument::writeFeature64(SafeWriter* w) { w->writeC( (c64.dutyIsAbs?0x80:0)| (c64.initFilter?0x40:0)| - (c64.volIsCutoff?0x20:0)| (c64.toFilter?0x10:0)| (c64.noiseOn?8:0)| (c64.pulseOn?4:0)| @@ -691,6 +692,14 @@ void DivInstrument::writeFeatureSU(SafeWriter* w) { w->writeC(su.switchRoles); + w->writeC(su.hwSeqLen); + for (int i=0; iwriteC(su.hwSeq[i].cmd); + w->writeC(su.hwSeq[i].bound); + w->writeC(su.hwSeq[i].val); + w->writeS(su.hwSeq[i].speed); + } + FEATURE_END; } @@ -1312,7 +1321,7 @@ void DivInstrument::putInsData(SafeWriter* w) { w->writeC(c64.oscSync); w->writeC(c64.toFilter); w->writeC(c64.initFilter); - w->writeC(c64.volIsCutoff); + w->writeC(0); // this was volIsCutoff w->writeC(c64.res); w->writeC(c64.lp); w->writeC(c64.bp); @@ -2083,13 +2092,13 @@ void DivInstrument::readFeatureMA(SafeReader& reader, short version) { READ_FEAT_END; } -void DivInstrument::readFeature64(SafeReader& reader, short version) { +void DivInstrument::readFeature64(SafeReader& reader, bool& volIsCutoff, short version) { READ_FEAT_BEGIN; unsigned char next=reader.readC(); c64.dutyIsAbs=next&128; c64.initFilter=next&64; - c64.volIsCutoff=next&32; + volIsCutoff=next&32; c64.toFilter=next&16; c64.noiseOn=next&8; c64.pulseOn=next&4; @@ -2536,6 +2545,16 @@ void DivInstrument::readFeatureSU(SafeReader& reader, short version) { su.switchRoles=reader.readC(); + if (version>=185) { + su.hwSeqLen=reader.readC(); + for (int i=0; i0 && !(std.ex3Macro.open&6)) { + if (std.ex4Macro.len>0 && std.ex4Macro.len=std.ex3Macro.len) { + std.ex4Macro.val[i]|=(std.ex3Macro.val[std.ex3Macro.len-1]&3)<<1; + } else { + std.ex4Macro.val[i]|=(std.ex3Macro.val[i]&3)<<1; + } + } + } + std.ex4Macro.len=maxLen; + + std.ex3Macro=DivInstrumentMacro(DIV_MACRO_EX3); +} + bool DivInstrument::save(const char* path, bool oldFormat, DivSong* song, bool writeInsName) { SafeWriter* w=new SafeWriter(); w->init(); @@ -3611,7 +3704,7 @@ bool DivInstrument::saveDMP(const char* path) { w->writeC(c64.ringMod); w->writeC(c64.oscSync); w->writeC(c64.toFilter); - w->writeC(c64.volIsCutoff); + w->writeC(0); // this was volIsCutoff... w->writeC(c64.initFilter); w->writeC(c64.res); w->writeC((c64.cut*100)/2047); diff --git a/src/engine/instrument.h b/src/engine/instrument.h index 477962dfa..31440d7aa 100644 --- a/src/engine/instrument.h +++ b/src/engine/instrument.h @@ -385,7 +385,7 @@ struct DivInstrumentGB { DIV_GB_HWCMD_MAX }; - struct HWSeqCommand { + struct HWSeqCommandGB { unsigned char cmd; unsigned short data; } hwSeq[256]; @@ -403,7 +403,7 @@ struct DivInstrumentGB { hwSeqLen(0), softEnv(false), alwaysInit(false) { - memset(hwSeq,0,256*sizeof(int)); + memset(hwSeq,0,256*sizeof(HWSeqCommandGB)); } }; @@ -412,7 +412,7 @@ struct DivInstrumentC64 { unsigned char a, d, s, r; unsigned short duty; unsigned char ringMod, oscSync; - bool toFilter, volIsCutoff, initFilter, dutyIsAbs, filterIsAbs, noTest; + bool toFilter, initFilter, dutyIsAbs, filterIsAbs, noTest; unsigned char res; unsigned short cut; bool hp, lp, bp, ch3off; @@ -435,7 +435,6 @@ struct DivInstrumentC64 { ringMod(0), oscSync(0), toFilter(false), - volIsCutoff(false), initFilter(false), dutyIsAbs(false), filterIsAbs(false), @@ -663,6 +662,25 @@ struct DivInstrumentWaveSynth { struct DivInstrumentSoundUnit { bool switchRoles; + unsigned char hwSeqLen; + enum HWSeqCommands: unsigned char { + DIV_SU_HWCMD_VOL=0, + DIV_SU_HWCMD_PITCH, + DIV_SU_HWCMD_CUT, + DIV_SU_HWCMD_WAIT, + DIV_SU_HWCMD_WAIT_REL, + DIV_SU_HWCMD_LOOP, + DIV_SU_HWCMD_LOOP_REL, + + DIV_SU_HWCMD_MAX + }; + struct HWSeqCommandSU { + unsigned char cmd; + unsigned char bound; + unsigned char val; + unsigned short speed; + unsigned short padding; + } hwSeq[256]; bool operator==(const DivInstrumentSoundUnit& other); bool operator!=(const DivInstrumentSoundUnit& other) { @@ -670,7 +688,10 @@ struct DivInstrumentSoundUnit { } DivInstrumentSoundUnit(): - switchRoles(false) {} + switchRoles(false), + hwSeqLen(0) { + memset(hwSeq,0,256*sizeof(HWSeqCommandSU)); + } }; struct DivInstrumentES5506 { @@ -794,7 +815,7 @@ struct DivInstrument { void readFeatureNA(SafeReader& reader, short version); void readFeatureFM(SafeReader& reader, short version); void readFeatureMA(SafeReader& reader, short version); - void readFeature64(SafeReader& reader, short version); + void readFeature64(SafeReader& reader, bool& volIsCutoff, short version); void readFeatureGB(SafeReader& reader, short version); void readFeatureSM(SafeReader& reader, short version); void readFeatureOx(SafeReader& reader, int op, short version); @@ -813,6 +834,8 @@ struct DivInstrument { DivDataErrors readInsDataOld(SafeReader& reader, short version); DivDataErrors readInsDataNew(SafeReader& reader, short version, bool fui, DivSong* song); + + void convertC64SpecialMacro(); /** * save the instrument to a SafeWriter. diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 15ff00d92..cf0687d34 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -20,6 +20,7 @@ #include "c64.h" #include "../engine.h" #include "sound/c64_fp/siddefs-fp.h" +#include "IconsFontAwesome4.h" #include #include "../../ta-log.h" @@ -158,21 +159,10 @@ void DivPlatformC64::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_C64); - if (ins->c64.volIsCutoff) { - if (ins->c64.filterIsAbs) { - filtCut=MIN(2047,chan[i].std.vol.val); - } else { - filtCut-=((signed char)chan[i].std.vol.val)*7; - if (filtCut>2047) filtCut=2047; - if (filtCut<0) filtCut=0; - } - willUpdateFilter=true; - } else { - vol=MIN(15,chan[i].std.vol.val); - willUpdateFilter=true; - } + vol=MIN(15,chan[i].std.vol.val); + willUpdateFilter=true; } + if (NEW_ARP_STRAT) { chan[i].handleArp(); } else if (chan[i].std.arp.had) { @@ -186,14 +176,18 @@ void DivPlatformC64::tick(bool sysTick) { if (ins->c64.dutyIsAbs) { chan[i].duty=chan[i].std.duty.val; } else { - chan[i].duty-=((signed char)chan[i].std.duty.val)*4; + if (multiplyRel) { + chan[i].duty-=((signed char)chan[i].std.duty.val)*4; + } else { + chan[i].duty-=chan[i].std.duty.val; + } } rWrite(i*7+2,chan[i].duty&0xff); rWrite(i*7+3,chan[i].duty>>8); } if (chan[i].std.wave.had) { chan[i].wave=chan[i].std.wave.val; - rWrite(i*7+4,(chan[i].wave<<4)|(chan[i].test<<3)|(chan[i].ring<<2)|(chan[i].sync<<1)|(int)(chan[i].active)); + rWrite(i*7+4,(chan[i].wave<<4)|(chan[i].test<<3)|(chan[i].ring<<2)|(chan[i].sync<<1)|(int)(chan[i].active && chan[i].gate)); } if (chan[i].std.pitch.had) { if (chan[i].std.pitch.mode) { @@ -204,6 +198,21 @@ void DivPlatformC64::tick(bool sysTick) { } chan[i].freqChanged=true; } + if (chan[i].std.alg.had) { // new cutoff macro + DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_C64); + if (ins->c64.filterIsAbs) { + filtCut=MIN(2047,chan[i].std.alg.val); + } else { + if (multiplyRel) { + filtCut+=((signed char)chan[i].std.alg.val)*7; + } else { + filtCut+=chan[i].std.alg.val; + } + if (filtCut>2047) filtCut=2047; + if (filtCut<0) filtCut=0; + } + willUpdateFilter=true; + } if (chan[i].std.ex1.had) { filtControl=chan[i].std.ex1.val&15; willUpdateFilter=true; @@ -212,15 +221,33 @@ void DivPlatformC64::tick(bool sysTick) { filtRes=chan[i].std.ex2.val&15; willUpdateFilter=true; } - if (chan[i].std.ex3.had) { - chan[i].sync=chan[i].std.ex3.val&1; - chan[i].ring=chan[i].std.ex3.val&2; - chan[i].freqChanged=true; - rWrite(i*7+4,(chan[i].wave<<4)|(chan[i].test<<3)|(chan[i].ring<<2)|(chan[i].sync<<1)|(int)(chan[i].active)); - } if (chan[i].std.ex4.had) { - chan[i].test=chan[i].std.ex4.val&1; - rWrite(i*7+4,(chan[i].wave<<4)|(chan[i].test<<3)|(chan[i].ring<<2)|(chan[i].sync<<1)|(int)(chan[i].active)); + chan[i].gate=chan[i].std.ex4.val&1; + chan[i].sync=chan[i].std.ex4.val&2; + chan[i].ring=chan[i].std.ex4.val&4; + chan[i].test=chan[i].std.ex4.val&8; + chan[i].freqChanged=true; + rWrite(i*7+4,(chan[i].wave<<4)|(chan[i].test<<3)|(chan[i].ring<<2)|(chan[i].sync<<1)|(int)(chan[i].active && chan[i].gate)); + } + + if (chan[i].std.ex5.had) { + chan[i].attack=chan[i].std.ex5.val&15; + rWrite(i*7+5,(chan[i].attack<<4)|(chan[i].decay)); + } + + if (chan[i].std.ex6.had) { + chan[i].decay=chan[i].std.ex6.val&15; + rWrite(i*7+5,(chan[i].attack<<4)|(chan[i].decay)); + } + + if (chan[i].std.ex7.had) { + chan[i].sustain=chan[i].std.ex7.val&15; + rWrite(i*7+6,(chan[i].sustain<<4)|(chan[i].release)); + } + + if (chan[i].std.ex8.had) { + chan[i].release=chan[i].std.ex8.val&15; + rWrite(i*7+6,(chan[i].sustain<<4)|(chan[i].release)); } if (sysTick) { @@ -243,7 +270,7 @@ void DivPlatformC64::tick(bool sysTick) { if (chan[i].keyOn) { rWrite(i*7+5,(chan[i].attack<<4)|(chan[i].decay)); rWrite(i*7+6,(chan[i].sustain<<4)|(chan[i].release)); - rWrite(i*7+4,(chan[i].wave<<4)|(chan[i].test<<3)|(chan[i].ring<<2)|(chan[i].sync<<1)|1); + rWrite(i*7+4,(chan[i].wave<<4)|(chan[i].test<<3)|(chan[i].ring<<2)|(chan[i].sync<<1)|(chan[i].gate?1:0)); } if (chan[i].keyOff) { rWrite(i*7+5,(chan[i].attack<<4)|(chan[i].decay)); @@ -387,7 +414,7 @@ int DivPlatformC64::dispatch(DivCommand c) { break; case DIV_CMD_WAVE: chan[c.chan].wave=c.value; - rWrite(c.chan*7+4,(chan[c.chan].wave<<4)|(chan[c.chan].test<<3)|(chan[c.chan].ring<<2)|(chan[c.chan].sync<<1)|(int)(chan[c.chan].active)); + rWrite(c.chan*7+4,(chan[c.chan].wave<<4)|(chan[c.chan].test<<3)|(chan[c.chan].ring<<2)|(chan[c.chan].sync<<1)|(int)(chan[c.chan].active && chan[c.chan].gate)); break; case DIV_CMD_LEGATO: chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value+((HACKY_LEGATO_MESS)?(chan[c.chan].std.arp.val):(0))); @@ -396,7 +423,7 @@ int DivPlatformC64::dispatch(DivCommand c) { break; case DIV_CMD_PRE_PORTA: if (chan[c.chan].active && c.value2) { - if (parent->song.resetMacroOnPorta || !chan[c.chan].inPorta) { + if (parent->song.resetMacroOnPorta || parent->song.preNoteNoEffect) { chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_C64)); chan[c.chan].keyOn=true; } @@ -457,23 +484,35 @@ int DivPlatformC64::dispatch(DivCommand c) { switch (c.value>>4) { case 0: chan[c.chan].attack=c.value&15; + if (!no1EUpdate) { + rWrite(c.chan*7+5,(chan[c.chan].attack<<4)|(chan[c.chan].decay)); + } break; case 1: chan[c.chan].decay=c.value&15; + if (!no1EUpdate) { + rWrite(c.chan*7+5,(chan[c.chan].attack<<4)|(chan[c.chan].decay)); + } break; case 2: chan[c.chan].sustain=c.value&15; + if (!no1EUpdate) { + rWrite(c.chan*7+6,(chan[c.chan].sustain<<4)|(chan[c.chan].release)); + } break; case 3: chan[c.chan].release=c.value&15; + if (!no1EUpdate) { + rWrite(c.chan*7+6,(chan[c.chan].sustain<<4)|(chan[c.chan].release)); + } break; case 4: chan[c.chan].ring=c.value; - rWrite(c.chan*7+4,(chan[c.chan].wave<<4)|(chan[c.chan].test<<3)|(chan[c.chan].ring<<2)|(chan[c.chan].sync<<1)|(int)(chan[c.chan].active)); + rWrite(c.chan*7+4,(chan[c.chan].wave<<4)|(chan[c.chan].test<<3)|(chan[c.chan].ring<<2)|(chan[c.chan].sync<<1)|(int)(chan[c.chan].active && chan[c.chan].gate)); break; case 5: chan[c.chan].sync=c.value; - rWrite(c.chan*7+4,(chan[c.chan].wave<<4)|(chan[c.chan].test<<3)|(chan[c.chan].ring<<2)|(chan[c.chan].sync<<1)|(int)(chan[c.chan].active)); + rWrite(c.chan*7+4,(chan[c.chan].wave<<4)|(chan[c.chan].test<<3)|(chan[c.chan].ring<<2)|(chan[c.chan].sync<<1)|(int)(chan[c.chan].active && chan[c.chan].gate)); break; case 6: filtControl&=7; @@ -481,6 +520,16 @@ int DivPlatformC64::dispatch(DivCommand c) { break; } break; + case DIV_CMD_C64_AD: + chan[c.chan].attack=c.value>>4; + chan[c.chan].decay=c.value&15; + rWrite(c.chan*7+5,(chan[c.chan].attack<<4)|(chan[c.chan].decay)); + break; + case DIV_CMD_C64_SR: + chan[c.chan].sustain=c.value>>4; + chan[c.chan].release=c.value&15; + rWrite(c.chan*7+6,(chan[c.chan].sustain<<4)|(chan[c.chan].release)); + break; case DIV_CMD_MACRO_OFF: chan[c.chan].std.mask(c.value,true); break; @@ -546,6 +595,24 @@ DivMacroInt* DivPlatformC64::getChanMacroInt(int ch) { return &chan[ch].std; } +DivChannelModeHints DivPlatformC64::getModeHints(int ch) { + DivChannelModeHints ret; + ret.count=1; + ret.hint[0]=ICON_FA_BELL_SLASH_O; + ret.type[0]=0; + if (ch==2 && (filtControl&8)) { + ret.type[0]=7; + } else if (chan[ch].test && !chan[ch].gate) { + ret.type[0]=5; + } else if (chan[ch].test) { + ret.type[0]=6; + } else if (!chan[ch].gate) { + ret.type[0]=4; + } + + return ret; +} + DivDispatchOscBuffer* DivPlatformC64::getOscBuffer(int ch) { return oscBuf[ch]; } @@ -594,7 +661,18 @@ void DivPlatformC64::reset() { needInitTables=false; } else if (sidCore==1) { sid_fp->reset(); - sid_fp->clockSilent(16000); + for (int i=0; i<3; i++) { + sid_fp->write(i*7+5,testAD); + sid_fp->write(i*7+6,testSR); + sid_fp->write(i*7+4,8); + } + sid_fp->clockSilent(30000); + for (int i=0; i<3; i++) { + sid_fp->write(i*7+5,testAD); + sid_fp->write(i*7+6,testSR); + sid_fp->write(i*7+4,0); + } + sid_fp->clockSilent(30000); } else { sid->reset(); } @@ -605,7 +683,7 @@ void DivPlatformC64::reset() { filtControl=7; filtRes=0; filtCut=2047; - resetTime=1; + resetTime=initResetTime; vol=15; chanOrder[0]=0; @@ -652,8 +730,12 @@ void DivPlatformC64::setFlags(const DivConfig& flags) { if (sidCore==1) sid_fp->setSamplingParameters(chipClock,reSIDfp::DECIMATE,rate,0); } keyPriority=flags.getBool("keyPriority",true); + no1EUpdate=flags.getBool("no1EUpdate",false); + multiplyRel=flags.getBool("multiplyRel",false); testAD=((flags.getInt("testAttack",0)&15)<<4)|(flags.getInt("testDecay",0)&15); testSR=((flags.getInt("testSustain",0)&15)<<4)|(flags.getInt("testRelease",0)&15); + initResetTime=flags.getInt("initResetTime",2); + if (initResetTime<0) initResetTime=1; // init fake filter table // taken from dSID diff --git a/src/engine/platform/c64.h b/src/engine/platform/c64.h index 38e735d9a..5f7882c68 100644 --- a/src/engine/platform/c64.h +++ b/src/engine/platform/c64.h @@ -26,13 +26,17 @@ #include "sound/c64_fp/SID.h" #include "sound/c64_d/dsid.h" +// TODO: +// - ex3 (special) unify with ex4 (gate/test) +// - ex4 (test) compatibility + class DivPlatformC64: public DivDispatch { struct Channel: public SharedChannel { int prevFreq, testWhen; unsigned char sweep, wave, attack, decay, sustain, release; short duty; bool sweepChanged, filter; - bool resetMask, resetFilter, resetDuty, ring, sync, test; + bool resetMask, resetFilter, resetDuty, gate, ring, sync, test; Channel(): SharedChannel(15), prevFreq(65535), @@ -49,6 +53,7 @@ class DivPlatformC64: public DivDispatch { resetMask(false), resetFilter(false), resetDuty(false), + gate(true), ring(false), sync(false), test(false) {} @@ -70,9 +75,9 @@ class DivPlatformC64: public DivDispatch { unsigned char filtControl, filtRes, vol; unsigned char writeOscBuf; unsigned char sidCore; - int filtCut, resetTime; + int filtCut, resetTime, initResetTime; - bool keyPriority, sidIs6581, needInitTables; + bool keyPriority, sidIs6581, needInitTables, no1EUpdate, multiplyRel; unsigned char chanOrder[3]; unsigned char testAD, testSR; @@ -108,6 +113,7 @@ class DivPlatformC64: public DivDispatch { bool isVolGlobal(); float getPostAmp(); DivMacroInt* getChanMacroInt(int ch); + DivChannelModeHints getModeHints(int chan); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index 64aca0be5..2881bbc42 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -191,22 +191,22 @@ void DivPlatformES5506::tick(bool sysTick) { const int nextVol=VOL_SCALE_LOG((0xfff*chan[i].vol)/0xff,(0xfff*chan[i].std.vol.val)/chan[i].volMacroMax,0xfff); if (chan[i].outVol!=nextVol) { chan[i].outVol=nextVol; - chan[i].volChanged.lVol=1; - chan[i].volChanged.rVol=1; + chan[i].volChangedES.lVol=1; + chan[i].volChangedES.rVol=1; } } if (chan[i].std.panL.had) { const int nextLVol=VOL_SCALE_LOG((0xfff*chan[i].lVol)/0xff,(0xfff*chan[i].std.panL.val)/chan[i].panMacroMax,0xfff); if (chan[i].outLVol!=nextLVol) { chan[i].outLVol=nextLVol; - chan[i].volChanged.lVol=1; + chan[i].volChangedES.lVol=1; } } if (chan[i].std.panR.had) { const int nextRVol=VOL_SCALE_LOG((0xfff*chan[i].rVol)/0xff,(0xfff*chan[i].std.panR.val)/chan[i].panMacroMax,0xfff); if (chan[i].outRVol!=nextRVol) { chan[i].outRVol=nextRVol; - chan[i].volChanged.rVol=1; + chan[i].volChangedES.rVol=1; } } // arpeggio/pitch macros, frequency related @@ -340,7 +340,7 @@ void DivPlatformES5506::tick(bool sysTick) { if (chan[i].ca!=ca) { chan[i].ca=ca; if (!chan[i].keyOn) { - chan[i].volChanged.ca=1; + chan[i].volChangedES.ca=1; } } } @@ -360,9 +360,9 @@ void DivPlatformES5506::tick(bool sysTick) { } } // update registers - if (chan[i].volChanged.changed) { + if (chan[i].volChangedES.changed) { // calculate volume (16 bit) - if (chan[i].volChanged.lVol) { + if (chan[i].volChangedES.lVol) { chan[i].resLVol=VOL_SCALE_LOG(chan[i].outVol,chan[i].outLVol,0xfff); chan[i].resLVol-=volScale; if (chan[i].resLVol<0) chan[i].resLVol=0; @@ -371,7 +371,7 @@ void DivPlatformES5506::tick(bool sysTick) { pageWrite(0x00|i,0x02,chan[i].resLVol); } } - if (chan[i].volChanged.rVol) { + if (chan[i].volChangedES.rVol) { chan[i].resRVol=VOL_SCALE_LOG(chan[i].outVol,chan[i].outRVol,0xfff); chan[i].resRVol-=volScale; if (chan[i].resRVol<0) chan[i].resRVol=0; @@ -380,10 +380,10 @@ void DivPlatformES5506::tick(bool sysTick) { pageWrite(0x00|i,0x04,chan[i].resRVol); } } - if (chan[i].volChanged.ca) { + if (chan[i].volChangedES.ca) { pageWriteMask(0x00|i,0x5f,0x00,(chan[i].ca<<10),0x1c00); } - chan[i].volChanged.changed=0; + chan[i].volChangedES.changed=0; } if (chan[i].pcmChanged.changed) { if (chan[i].pcmChanged.index) { @@ -750,7 +750,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { chan[c.chan].freqChanged=true; chan[c.chan].pcmChanged.changed=0xff; chan[c.chan].noteChanged.changed=0xff; - chan[c.chan].volChanged.changed=0xff; + chan[c.chan].volChangedES.changed=0xff; } if (!chan[c.chan].std.vol.will) { chan[c.chan].outVol=(0xfff*chan[c.chan].vol)/0xff; @@ -787,7 +787,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { chan[c.chan].vol=c.value; if (!chan[c.chan].std.vol.has) { chan[c.chan].outVol=(0xfff*c.value)/0xff; - chan[c.chan].volChanged.changed=0xff; + chan[c.chan].volChangedES.changed=0xff; } } break; @@ -797,14 +797,14 @@ int DivPlatformES5506::dispatch(DivCommand c) { case DIV_CMD_PANNING: { if (chan[c.chan].ca!=0) { chan[c.chan].ca=0; - chan[c.chan].volChanged.ca=1; + chan[c.chan].volChangedES.ca=1; } // Left volume if (chan[c.chan].lVol!=c.value) { chan[c.chan].lVol=c.value; if (!chan[c.chan].std.panL.has) { chan[c.chan].outLVol=(0xfff*c.value)/0xff; - chan[c.chan].volChanged.lVol=1; + chan[c.chan].volChangedES.lVol=1; } } // Right volume @@ -812,7 +812,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { chan[c.chan].rVol=c.value2; if (!chan[c.chan].std.panR.has) { chan[c.chan].outRVol=(0xfff*c.value2)/0xff; - chan[c.chan].volChanged.rVol=1; + chan[c.chan].volChangedES.rVol=1; } } break; @@ -821,7 +821,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { unsigned char ca=CLAMP(c.value>>1,0,5); if (chan[c.chan].ca!=ca) { chan[c.chan].ca=ca; - chan[c.chan].volChanged.ca=1; + chan[c.chan].volChangedES.ca=1; } if ((c.value&1)==0) { // Left volume @@ -829,7 +829,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { chan[c.chan].lVol=c.value2; if (!chan[c.chan].std.panL.has) { chan[c.chan].outLVol=(0xfff*c.value2)/0xff; - chan[c.chan].volChanged.lVol=1; + chan[c.chan].volChangedES.lVol=1; } } } @@ -839,7 +839,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { chan[c.chan].rVol=c.value2; if (!chan[c.chan].std.panR.has) { chan[c.chan].outRVol=(0xfff*c.value2)/0xff; - chan[c.chan].volChanged.rVol=1; + chan[c.chan].volChangedES.rVol=1; } } } @@ -1041,7 +1041,7 @@ void DivPlatformES5506::forceIns() { chan[i].insChanged=true; chan[i].freqChanged=true; chan[i].noteChanged.changed=0xff; - chan[i].volChanged.changed=0xff; + chan[i].volChangedES.changed=0xff; chan[i].filterChanged.changed=0xff; chan[i].envChanged.changed=0xff; chan[i].pcmChanged.changed=0xff; diff --git a/src/engine/platform/es5506.h b/src/engine/platform/es5506.h index 6bac20c37..e02dd4116 100644 --- a/src/engine/platform/es5506.h +++ b/src/engine/platform/es5506.h @@ -97,7 +97,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf { VolChanged() : changed(0) {} - } volChanged; + } volChangedES; struct FilterChanged { // Filter changed flags union { // pack flag bits in single byte @@ -198,7 +198,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf { isReverseLoop(false), cr(0), noteChanged(NoteChanged()), - volChanged(VolChanged()), + volChangedES(VolChanged()), filterChanged(FilterChanged()), envChanged(EnvChanged()), pcmChanged(PCMChanged()), diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index 75606f00c..aab02e1e1 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -800,7 +800,7 @@ DivMacroInt* DivPlatformGenesisExt::getChanMacroInt(int ch) { } unsigned short DivPlatformGenesisExt::getPan(int ch) { - if (ch==csmChan) return 0; + if (ch==4+csmChan) return 0; if (ch>=4+extChanOffs) return DivPlatformGenesis::getPan(ch-3); if (ch>=extChanOffs) { if (extMode) { diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 2daba109e..037a1cd69 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -19,6 +19,7 @@ #include "pce.h" #include "../engine.h" +#include "furIcons.h" #include //#define rWrite(a,v) pendingWrites[a]=v; @@ -512,6 +513,18 @@ unsigned short DivPlatformPCE::getPan(int ch) { return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); } +DivChannelModeHints DivPlatformPCE::getModeHints(int ch) { + DivChannelModeHints ret; + if (ch<4) return ret; + ret.count=1; + ret.hint[0]=ICON_FUR_NOISE; + ret.type[0]=0; + + if (chan[ch].noise) ret.type[0]=4; + + return ret; +} + DivSamplePos DivPlatformPCE::getSamplePos(int ch) { if (ch>=6) return DivSamplePos(); if (!chan[ch].pcm) return DivSamplePos(); diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index 2436453e4..c2649eb05 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -83,6 +83,7 @@ class DivPlatformPCE: public DivDispatch { void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); unsigned short getPan(int chan); + DivChannelModeHints getModeHints(int chan); DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index ae1746678..0b6bdbbc9 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -20,6 +20,7 @@ #include "snes.h" #include "../engine.h" #include "../../ta-log.h" +#include "furIcons.h" #include #define CHIP_FREQBASE 131072 @@ -710,6 +711,63 @@ DivChannelPair DivPlatformSNES::getPaired(int ch) { return DivChannelPair(); } +DivChannelModeHints DivPlatformSNES::getModeHints(int ch) { + DivChannelModeHints ret; + ret.count=1; + ret.hint[0]="-"; + ret.type[0]=0; + + const SPC_DSP::voice_t* v=dsp.get_voice(ch); + if (v!=NULL) { + if (v->regs[5]&128) { + switch (v->env_mode) { + case SPC_DSP::env_attack: + ret.hint[0]=ICON_FUR_ADSR_A; + ret.type[0]=12; + break; + case SPC_DSP::env_decay: + ret.hint[0]=ICON_FUR_ADSR_D; + ret.type[0]=13; + break; + case SPC_DSP::env_sustain: + ret.hint[0]=ICON_FUR_ADSR_S; + ret.type[0]=14; + break; + case SPC_DSP::env_release: + ret.hint[0]=ICON_FUR_ADSR_R; + ret.type[0]=15; + break; + } + } else { + if (v->regs[7]&128) { + switch (v->regs[7]&0x60) { + case 0: + ret.hint[0]=ICON_FUR_DEC_LINEAR; + ret.type[0]=16; + break; + case 32: + ret.hint[0]=ICON_FUR_DEC_EXP; + ret.type[0]=17; + break; + case 64: + ret.hint[0]=ICON_FUR_INC_LINEAR; + ret.type[0]=18; + break; + case 96: + ret.hint[0]=ICON_FUR_INC_BENT; + ret.type[0]=19; + break; + } + } else { + ret.hint[0]=ICON_FUR_VOL_DIRECT; + ret.type[0]=20; + } + } + } + + return ret; +} + DivSamplePos DivPlatformSNES::getSamplePos(int ch) { if (ch>=8) return DivSamplePos(); if (!chan[ch].active) return DivSamplePos(); diff --git a/src/engine/platform/snes.h b/src/engine/platform/snes.h index 277a06c95..8c48c6c72 100644 --- a/src/engine/platform/snes.h +++ b/src/engine/platform/snes.h @@ -102,6 +102,7 @@ class DivPlatformSNES: public DivDispatch { DivMacroInt* getChanMacroInt(int ch); unsigned short getPan(int chan); DivChannelPair getPaired(int chan); + DivChannelModeHints getModeHints(int chan); DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index 6ec9032e5..5a88618f3 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -134,6 +134,79 @@ void DivPlatformSoundUnit::tick(bool sysTick) { } writeControlUpper(i); } + + // run hardware sequence + if (chan[i].active) { + if (--chan[i].hwSeqDelay<=0) { + chan[i].hwSeqDelay=0; + DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_SU); + int hwSeqCount=0; + while (chan[i].hwSeqPossu.hwSeqLen && hwSeqCount<8) { + bool leave=false; + unsigned char bound=ins->su.hwSeq[chan[i].hwSeqPos].bound; + unsigned char val=ins->su.hwSeq[chan[i].hwSeqPos].val; + unsigned short speed=ins->su.hwSeq[chan[i].hwSeqPos].speed; + switch (ins->su.hwSeq[chan[i].hwSeqPos].cmd) { + case DivInstrumentSoundUnit::DIV_SU_HWCMD_VOL: + chan[i].volSweepP=speed; + chan[i].volSweepV=val; + chan[i].volSweepB=bound; + chan[i].volSweep=(val>0); + chWrite(i,0x14,chan[i].volSweepP&0xff); + chWrite(i,0x15,chan[i].volSweepP>>8); + chWrite(i,0x16,chan[i].volSweepV); + chWrite(i,0x17,chan[i].volSweepB); + writeControlUpper(i); + break; + case DivInstrumentSoundUnit::DIV_SU_HWCMD_PITCH: + chan[i].freqSweepP=speed; + chan[i].freqSweepV=val; + chan[i].freqSweepB=bound; + chan[i].freqSweep=(val>0); + chWrite(i,0x10,chan[i].freqSweepP&0xff); + chWrite(i,0x11,chan[i].freqSweepP>>8); + chWrite(i,0x12,chan[i].freqSweepV); + chWrite(i,0x13,chan[i].freqSweepB); + writeControlUpper(i); + break; + case DivInstrumentSoundUnit::DIV_SU_HWCMD_CUT: + chan[i].cutSweepP=speed; + chan[i].cutSweepV=val; + chan[i].cutSweepB=bound; + chan[i].cutSweep=(val>0); + chWrite(i,0x18,chan[i].cutSweepP&0xff); + chWrite(i,0x19,chan[i].cutSweepP>>8); + chWrite(i,0x1a,chan[i].cutSweepV); + chWrite(i,0x1b,chan[i].cutSweepB); + writeControlUpper(i); + break; + case DivInstrumentSoundUnit::DIV_SU_HWCMD_WAIT: + chan[i].hwSeqDelay=(val+1)*parent->tickMult; + leave=true; + break; + case DivInstrumentSoundUnit::DIV_SU_HWCMD_WAIT_REL: + if (!chan[i].released) { + chan[i].hwSeqPos--; + leave=true; + } + break; + case DivInstrumentSoundUnit::DIV_SU_HWCMD_LOOP: + chan[i].hwSeqPos=val-1; + break; + case DivInstrumentSoundUnit::DIV_SU_HWCMD_LOOP_REL: + if (!chan[i].released) { + chan[i].hwSeqPos=val-1; + } + break; + } + + chan[i].hwSeqPos++; + if (leave) break; + hwSeqCount++; + } + } + } + if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { //DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_SU); chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,chan[i].switchRoles,2,chan[i].pitch2,chipClock,chan[i].switchRoles?CHIP_DIVIDER:CHIP_FREQBASE); @@ -160,8 +233,7 @@ void DivPlatformSoundUnit::tick(bool sysTick) { } if (chan[i].keyOn) { if (chan[i].pcm) { - DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_SU); - int sNum=ins->amiga.getSample(chan[i].note); + int sNum=chan[i].sample; DivSample* sample=parent->getSample(sNum); if (sample!=NULL && sNum>=0 && sNumsong.sampleLen) { unsigned int sampleEnd=sampleOffSU[sNum]+(sample->getLoopEndPosition()); @@ -220,6 +292,9 @@ int DivPlatformSoundUnit::dispatch(DivCommand c) { } chan[c.chan].active=true; chan[c.chan].keyOn=true; + chan[c.chan].released=false; + chan[c.chan].hwSeqPos=0; + chan[c.chan].hwSeqDelay=0; chWrite(c.chan,0x02,chan[c.chan].vol); chan[c.chan].macroInit(ins); if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { @@ -231,11 +306,14 @@ int DivPlatformSoundUnit::dispatch(DivCommand c) { case DIV_CMD_NOTE_OFF: chan[c.chan].active=false; chan[c.chan].keyOff=true; + chan[c.chan].hwSeqPos=0; + chan[c.chan].hwSeqDelay=0; chan[c.chan].macroInit(NULL); break; case DIV_CMD_NOTE_OFF_ENV: case DIV_CMD_ENV_RELEASE: chan[c.chan].std.release(); + chan[c.chan].released=true; break; case DIV_CMD_INSTRUMENT: if (chan[c.chan].ins!=c.value || c.value2==1) { diff --git a/src/engine/platform/su.h b/src/engine/platform/su.h index 4f227e5b5..7062cbc8b 100644 --- a/src/engine/platform/su.h +++ b/src/engine/platform/su.h @@ -30,12 +30,14 @@ class DivPlatformSoundUnit: public DivDispatch { signed char pan; unsigned char duty; bool noise, pcm, phaseReset, filterPhaseReset, switchRoles; - bool pcmLoop, timerSync, freqSweep, volSweep, cutSweep; + bool pcmLoop, timerSync, freqSweep, volSweep, cutSweep, released; unsigned short freqSweepP, volSweepP, cutSweepP; unsigned char freqSweepB, volSweepB, cutSweepB; unsigned char freqSweepV, volSweepV, cutSweepV; unsigned short syncTimer; signed short wave; + unsigned short hwSeqPos; + short hwSeqDelay; Channel(): SharedChannel(127), cutoff(16383), @@ -56,6 +58,7 @@ class DivPlatformSoundUnit: public DivDispatch { freqSweep(false), volSweep(false), cutSweep(false), + released(false), freqSweepP(0), volSweepP(0), cutSweepP(0), @@ -66,7 +69,9 @@ class DivPlatformSoundUnit: public DivDispatch { volSweepV(0), cutSweepV(0), syncTimer(0), - wave(0) {} + wave(0), + hwSeqPos(0), + hwSeqDelay(0) {} }; Channel chan[8]; DivDispatchOscBuffer* oscBuf[8]; diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index 4e5fb4cca..25260a44c 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -19,6 +19,8 @@ #include "swan.h" #include "../engine.h" +#include "furIcons.h" +#include "IconsFontAwesome4.h" #include #define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);}} @@ -480,6 +482,30 @@ unsigned short DivPlatformSwan::getPan(int ch) { return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); } +DivChannelModeHints DivPlatformSwan::getModeHints(int ch) { + DivChannelModeHints ret; + + switch (ch) { + case 1: // PCM + ret.count=1; + ret.hint[0]=ICON_FA_VOLUME_UP; + ret.type[0]=pcm?4:0; + break; + case 2: // sweep + ret.count=1; + ret.hint[0]=ICON_FUR_SAW; + ret.type[0]=sweep?2:0; + break; + case 3: // noise + ret.count=1; + ret.hint[0]=ICON_FUR_NOISE; + ret.type[0]=noise?4:0; + break; + } + + return ret; +} + DivDispatchOscBuffer* DivPlatformSwan::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/swan.h b/src/engine/platform/swan.h index 5f33e81c0..4dab6eb7c 100644 --- a/src/engine/platform/swan.h +++ b/src/engine/platform/swan.h @@ -63,6 +63,7 @@ class DivPlatformSwan: public DivDispatch { void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); unsigned short getPan(int chan); + DivChannelModeHints getModeHints(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 438641797..2211cf0f9 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -239,6 +239,9 @@ const char* cmdName[]={ "EXTERNAL", + "C64_AD", + "C64_SR", + "ALWAYS_SET_VOLUME" }; @@ -1263,11 +1266,11 @@ void DivEngine::nextRow() { for (int j=0; jdata[curRow][4+(j<<1)]==0x03) { + if (pat->data[curRow][4+(j<<1)]==0x03 && pat->data[curRow][5+(j<<1)]!=0 && pat->data[curRow][5+(j<<1)]!=-1) { doPreparePreNote=false; break; } - if (pat->data[curRow][4+(j<<1)]==0x06) { + if (pat->data[curRow][4+(j<<1)]==0x06 && pat->data[curRow][5+(j<<1)]!=0 && pat->data[curRow][5+(j<<1)]!=-1) { doPreparePreNote=false; break; } @@ -1294,11 +1297,11 @@ void DivEngine::nextRow() { int addition=0; for (int j=0; jdata[curRow][4+(j<<1)]==0x03) { + if (pat->data[curRow][4+(j<<1)]==0x03 && pat->data[curRow][5+(j<<1)]!=0 && pat->data[curRow][5+(j<<1)]!=-1) { doPrepareCut=false; break; } - if (pat->data[curRow][4+(j<<1)]==0x06) { + if (pat->data[curRow][4+(j<<1)]==0x06 && pat->data[curRow][5+(j<<1)]!=0 && pat->data[curRow][5+(j<<1)]!=-1) { doPrepareCut=false; break; } diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index d4a58dcad..ed4b74a33 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -597,7 +597,9 @@ void DivEngine::registerSystems() { {0x1a, {DIV_CMD_C64_RESET_MASK, "1Axx: Disable envelope reset for this channel (1 disables; 0 enables)"}}, {0x1b, {DIV_CMD_C64_FILTER_RESET, "1Bxy: Reset cutoff (x: on new note; y: now)"}}, {0x1c, {DIV_CMD_C64_DUTY_RESET, "1Cxy: Reset pulse width (x: on new note; y: now)"}}, - {0x1e, {DIV_CMD_C64_EXTENDED, "1Exy: Change additional parameters"}}, + {0x1e, {DIV_CMD_C64_EXTENDED, "1Exy: Change other parameters (LEGACY)"}}, + {0x20, {DIV_CMD_C64_AD, "20xy: Set attack/decay (x: attack; y: decay)"}}, + {0x21, {DIV_CMD_C64_SR, "21xy: Set sustain/release (x: sustain; y: release)"}}, }; const EffectHandler c64FineDutyHandler(DIV_CMD_C64_FINE_DUTY, "3xxx: Set pulse width (0 to FFF)", effectValLong<12>); const EffectHandler c64FineCutoffHandler(DIV_CMD_C64_FINE_CUTOFF, "4xxx: Set cutoff (0 to 7FF)", effectValLong<11>); diff --git a/src/engine/wavOps.cpp b/src/engine/wavOps.cpp index 52a03073a..7c89dd710 100644 --- a/src/engine/wavOps.cpp +++ b/src/engine/wavOps.cpp @@ -111,7 +111,7 @@ void DivEngine::runExportThread() { if (initAudioBackend()) { for (int i=0; isetRun(true)) { logE("error while activating audio!"); @@ -223,7 +223,7 @@ void DivEngine::runExportThread() { if (initAudioBackend()) { for (int i=0; isetRun(true)) { logE("error while activating audio!"); @@ -349,7 +349,7 @@ void DivEngine::runExportThread() { if (initAudioBackend()) { for (int i=0; isetRun(true)) { logE("error while activating audio!"); diff --git a/src/gui/about.cpp b/src/gui/about.cpp index 6fb9c97b5..66d62b9c7 100644 --- a/src/gui/about.cpp +++ b/src/gui/about.cpp @@ -40,6 +40,7 @@ const char* aboutLine[]={ "djtuBIG-MaliceX", "Eknous", "laoo", + "LTVA1", "MooingLemur", "OPNA2608", "superctr", @@ -105,6 +106,7 @@ const char* aboutLine[]={ "jaezu", "Laggy", "LovelyA72", + "LTVA1", "LunaMoth", "Lunathir", "LVintageNerd", diff --git a/src/gui/dataList.cpp b/src/gui/dataList.cpp index 2762b6fc3..527848a63 100644 --- a/src/gui/dataList.cpp +++ b/src/gui/dataList.cpp @@ -202,6 +202,8 @@ void FurnaceGUI::waveListItem(int i, float* wavePreview, int dir, int asset) { void FurnaceGUI::sampleListItem(int i, int dir, int asset) { bool memWarning=false; + ImGui::PushID(i); + DivSample* sample=e->song.sample[i]; for (int j=0; jsong.systemLen; j++) { DivDispatch* dispatch=e->getDispatch(j); @@ -243,7 +245,32 @@ void FurnaceGUI::sampleListItem(int i, int dir, int asset) { } ImGui::PopStyleColor(); } + if (ImGui::BeginPopupContextItem("SampleRightMenu")) { + curSample=i; + samplePos=0; + updateSampleTex=true; + lastAssetType=2; + ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]); + if (ImGui::MenuItem("make instrument")) { + doAction(GUI_ACTION_SAMPLE_MAKE_INS); + } + if (ImGui::MenuItem("duplicate")) { + doAction(GUI_ACTION_SAMPLE_LIST_DUPLICATE); + } + if (ImGui::MenuItem("replace...")) { + doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE:GUI_ACTION_SAMPLE_LIST_OPEN); + } + if (ImGui::MenuItem("save")) { + doAction(GUI_ACTION_SAMPLE_LIST_SAVE); + } + if (ImGui::MenuItem("delete")) { + doAction(GUI_ACTION_SAMPLE_LIST_DELETE); + } + ImGui::PopStyleColor(); + ImGui::EndPopup(); + } if (wantScrollList && curSample==i) ImGui::SetScrollHereY(); + ImGui::PopID(); } void FurnaceGUI::drawInsList(bool asChild) { diff --git a/src/gui/debug.cpp b/src/gui/debug.cpp index 8436e6616..c0ce44bfd 100644 --- a/src/gui/debug.cpp +++ b/src/gui/debug.cpp @@ -238,6 +238,7 @@ ImGui::TextColored(ch->mask?colorOn:colorOff,">> Mask"); void putDispatchChip(void* data, int type) { +<<<<<<< HEAD ImVec4 colorOn=ImVec4(1.0f,1.0f,0.0f,1.0f); ImVec4 colorOff=ImVec4(0.3f,0.3f,0.3f,1.0f); switch (type) { @@ -1118,4 +1119,10 @@ void putDispatchChan(void* data, int chanNum, int type) { ImGui::Text("Unimplemented chip! Help!"); break; } +======= + ImGui::Text("I will finish later..."); +} +void putDispatchChan(void* data, int chanNum, int type) { + ImGui::Text("I will finish later..."); +>>>>>>> 89f8970e74cece7142e27a60f50d30b8d46b02cd } diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 69b24947d..8a1fd8a2e 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -97,6 +97,7 @@ void FurnaceGUI::doAction(int what) { if (!e->isPlaying()) { play(); } + e->setRepeatPattern(false); break; case GUI_ACTION_PLAY_REPEAT: play(); @@ -671,12 +672,14 @@ void FurnaceGUI::doAction(int what) { if (e->moveInsUp(curIns)) { curIns--; wantScrollList=true; + MARK_MODIFIED; } break; case GUI_ACTION_INS_LIST_MOVE_DOWN: if (e->moveInsDown(curIns)) { curIns++; wantScrollList=true; + MARK_MODIFIED; } break; case GUI_ACTION_INS_LIST_DELETE: @@ -751,12 +754,14 @@ void FurnaceGUI::doAction(int what) { if (e->moveWaveUp(curWave)) { curWave--; wantScrollList=true; + MARK_MODIFIED; } break; case GUI_ACTION_WAVE_LIST_MOVE_DOWN: if (e->moveWaveDown(curWave)) { curWave++; wantScrollList=true; + MARK_MODIFIED; } break; case GUI_ACTION_WAVE_LIST_DELETE: @@ -851,6 +856,7 @@ void FurnaceGUI::doAction(int what) { curSample--; wantScrollList=true; updateSampleTex=true; + MARK_MODIFIED; } break; case GUI_ACTION_SAMPLE_LIST_MOVE_DOWN: @@ -858,6 +864,7 @@ void FurnaceGUI::doAction(int what) { curSample++; wantScrollList=true; updateSampleTex=true; + MARK_MODIFIED; } break; case GUI_ACTION_SAMPLE_LIST_DELETE: diff --git a/src/gui/editing.cpp b/src/gui/editing.cpp index aa7e6f5c7..45603e68c 100644 --- a/src/gui/editing.cpp +++ b/src/gui/editing.cpp @@ -83,6 +83,8 @@ void FurnaceGUI::makeUndo(ActionType action) { s.selStart=selStart; s.selEnd=selEnd; s.order=curOrder; + s.oldOrdersLen=oldOrdersLen; + s.newOrdersLen=e->curSubSong->ordersLen; s.nibble=curNibble; size_t subSong=e->getCurrentSubSong(); switch (action) { @@ -94,8 +96,6 @@ void FurnaceGUI::makeUndo(ActionType action) { } } } - s.oldOrdersLen=oldOrdersLen; - s.newOrdersLen=e->curSubSong->ordersLen; if (oldOrdersLen!=e->curSubSong->ordersLen) { doPush=true; } diff --git a/src/gui/font_furicon.cpp b/src/gui/font_furicon.cpp index e22136c60..7a112bb57 100644 --- a/src/gui/font_furicon.cpp +++ b/src/gui/font_furicon.cpp @@ -1,328 +1,366 @@ #include "fonts.h" -// File: 'icons.ttf' (29112 bytes) +// File: 'icons.ttf' (31848 bytes) // Exported using binary_to_compressed_c.cpp -const unsigned int furIcons_compressed_size = 15318; -const unsigned int furIcons_compressed_data[15320/4] = +const unsigned int furIcons_compressed_size = 17176; +const unsigned int furIcons_compressed_data[17176/4] = { - 0x0000bc57, 0x00000000, 0xb8710000, 0x00000400, 0x00010037, 0x000e0000, 0x00030080, 0x54464660, 0xa9a8a24d, 0x7100006a, 0x2815829c, 0x4544471c, - 0x00150046, 0x200f8214, 0x2b0f8380, 0x322f534f, 0x7852fa8c, 0x68010000, 0x562c0f82, 0x70616d63, 0x3fd0dec7, 0x64020000, 0xe62c1382, 0x20747663, - 0x6f043b00, 0x4c040000, 0x04261f82, 0x70736167, 0x5982ffff, 0x82710021, 0x08002933, 0x66796c67, 0x82a68389, 0xf02c1f82, 0x8c670000, 0x64616568, - 0x8e89f224, 0xec202b82, 0x36210382, 0x23108268, 0x05068209, 0x24204b82, 0x24280f82, 0x78746d68, 0xdd13df29, 0xc0200f82, 0xa4280f82, 0x61636f6c, - 0xb4e91903, 0x50203f82, 0x9e270f82, 0x7078616d, 0x82039800, 0x4801213b, 0x202c0f82, 0x656d616e, 0xccc485ad, 0x7c6c0000, 0xe9263382, 0x74736f70, - 0xaf83e3e7, 0xaf826e20, 0x840e0321, 0x820120eb, 0x36a92979, 0x3c0f5f27, 0x070b00f5, 0x00253682, 0xfffde000, 0x2b08839f, 0xaa4155e1, 0x68fe80fc, - 0xe0050007, 0x08220f82, 0x05820200, 0x33820283, 0xff000622, 0x07290982, 0x0080fc00, 0x00000700, 0x8b0c8201, 0x84042002, 0x034e2511, 0x000800bb, + 0x0000bc57, 0x00000000, 0x687c0000, 0x00000400, 0x00010037, 0x000e0000, 0x00030080, 0x54464660, 0x81b6a24d, 0x7c00002e, 0x2815824c, 0x4544471c, + 0x00150046, 0x200f8214, 0x2b0f8330, 0x322f534f, 0x8c52fa8c, 0x68010000, 0x562b0f82, 0x70616d63, 0x13d444cb, 0x82020000, 0x0e022d13, 0x20747663, + 0x6f043b00, 0x9c040000, 0x04261f82, 0x70736167, 0x5982ffff, 0x287c0022, 0x082b0f82, 0x66796c67, 0x8d352477, 0x82050000, 0xfc70293f, 0x64616568, + 0x52610025, 0xec201b82, 0x36210382, 0x23108268, 0x05068209, 0x24205f82, 0x24270f82, 0x78746d68, 0x8218da2d, 0xc001212f, 0xcc280f82, 0x61636f6c, + 0xa00d4029, 0x03825f82, 0x6dc60028, 0x00707861, 0x3b8203ac, 0x82480121, 0x6e202c1f, 0xae656d61, 0x00ccc486, 0x82647600, 0x70e93043, 0xb374736f, + 0x00c25c09, 0x00507800, 0x84d60300, 0x00012deb, 0x0bac9800, 0x3c0f5f95, 0x070b00f5, 0x00253682, 0xfffde000, 0x2b08839f, 0x6e1963e1, 0x68fe80fc, + 0xe0050007, 0x08220f82, 0x05820200, 0x33820283, 0xff000622, 0x07290982, 0x0080fc00, 0x00000700, 0x8b0c8201, 0x84042002, 0x03622511, 0x000800bb, 0x02210083, 0x83238300, 0x00402225, 0x820b822e, 0x00072b0d, 0x05009001, 0x8c040000, 0x1182e604, 0x0785fa20, 0x005c032b, 0x00cf0159, 0x05000200, - 0x85158209, 0x10012102, 0x05840785, 0x72754629, 0x00400054, 0x8544e120, 0x84062083, 0x8404856a, 0x833b208b, 0x82072026, 0x25038304, 0x090280fc, + 0x85158209, 0x10012102, 0x05840785, 0x72754629, 0x00400054, 0x8558e120, 0x84062083, 0x8404856a, 0x833b208b, 0x82072026, 0x25038304, 0x090280fc, 0x0c829100, 0x20005222, 0xa52c7982, 0x4b003500, 0x91002900, 0x78006d01, 0x60349b82, 0x52004700, 0x0a001701, 0x8f004a00, 0x1b003201, 0x2e004f00, 0xca263182, 0x36011801, 0x1b82a900, 0x33002825, 0x82004d01, 0x38238291, 0x01220003, 0x007a017c, 0x01390039, 0x00ce0127, 0x014c0013, 0x00220073, - 0x240d8247, 0x0085000b, 0x260f82b5, 0x012e005b, 0x845c004b, 0x822a2001, 0x82532005, 0x004b2e03, 0x0053005e, 0x015c00c8, 0x002e0156, 0x208d826b, - 0x20038603, 0x22b7861c, 0x840300e0, 0x001c2409, 0x82c40004, 0x00082e1b, 0x00020008, 0xe0200000, 0xff44e1f4, 0x260984ff, 0xff00e1f0, 0x82e3ffff, - 0x8400200b, 0x0006222b, 0x260b820e, 0x00050004, 0x82070006, 0x8209202f, 0x000b24a1, 0x820d000c, 0x000f2617, 0x00110010, 0x2ca18212, 0x00150014, - 0x00170016, 0x00190018, 0x08df821a, 0x1d001c38, 0x1f001e00, 0x21002000, 0x23002200, 0x25002400, 0x27002600, 0x29002800, 0x2b002a00, 0x2d002c00, - 0x2f002e00, 0x31003000, 0x33003200, 0x35003400, 0x37003600, 0xf5823800, 0x003a2608, 0x003c003b, 0x003e003d, 0x0040003f, 0x00420041, 0x00440043, - 0x00460045, 0x00480047, 0x004a0049, 0x004c004b, 0x209e824d, 0x82a28506, 0x0100229f, 0x21058202, 0x008d0002, 0x82000121, 0x40128df0, 0x3b22d20d, - 0xd5826f04, 0x85002c21, 0x3c920801, 0xc6008400, 0x24056404, 0xd406c405, 0xea075807, 0x3409ce08, 0xb00a7609, 0x880bfe0a, 0x2e0cee0b, 0x6a0de60c, - 0x640ed80d, 0xa40fca0e, 0xbc105a10, 0xc6117e11, 0x0c139212, 0xd8138c13, 0x48159814, 0x12173816, 0x1e1b8017, 0x341cae1b, 0xea1dc01c, 0xbc1f081f, - 0x34218020, 0xfc218a21, 0xc8238622, 0xca272a27, 0x5229b028, 0x0a2ac629, 0xa42bbe2a, 0x162ef42b, 0x682e442e, 0xf02f8e2e, 0x6a300c30, 0x1e31d230, - 0xac315631, 0xec31de31, 0x6433ba32, 0x9d82c633, 0x00022108, 0x0200003b, 0x00aa0415, 0x00070003, 0x0001b12e, 0x07b23c2f, 0x32ed0004, 0xdc0506b1, - 0x0203b23c, 0x00220a82, 0x168303b1, 0x16830520, 0x0607b227, 0xb23cfc01, 0x37178301, 0x11211133, 0x21112125, 0xfeda013b, 0xfe640161, 0xfbaa049c, - 0x34043b56, 0xfc255783, 0x03f5ff80, 0x20098280, 0x2e598201, 0x25210500, 0x0533fd21, 0x07b3f99a, 0x820b0b00, 0x03250815, 0x0f000902, 0xfd03f704, - 0x25001b00, 0x00002f00, 0x32213001, 0x0e141516, 0x07060701, 0x16171615, 0x15011e17, 0x2f0b8214, 0x2123010e, 0x36322137, 0x2634013d, 0x33352123, - 0x4d080985, 0x0a02012b, 0x8e7dbd01, 0x2020311f, 0x25251e1e, 0x132b1f20, 0x5f232214, 0xa217fe38, 0x483f1801, 0xe8fe3f48, 0x42423dfc, 0xfd03fc3d, - 0x4f38778d, 0x030c0d32, 0x0d0d0208, 0x3f581c1c, 0x2735363c, 0x428b2c27, 0x423e313e, 0x2e393e88, 0x8f833e3a, 0x91003008, 0x6f066300, 0x0f00a903, - 0x2b001700, 0x30250000, 0x30213027, 0x36233007, 0x16333712, 0x30011712, 0x30070623, 0x30012633, 0x30270011, 0x85133033, 0x02062f03, 0x02301107, - 0xc7fe4cea, 0xbf2f8a49, 0x0382ab2f, 0x8dfe3408, 0xf73d3c06, 0xfe84023c, 0xcc9b17f7, 0x3794cb04, 0xe3631dce, 0x2e028ce3, 0xd2fd8c8c, 0xb9c9028c, - 0xf0fdb9b9, 0xd4014a01, 0x018bfe28, 0x9afe6175, 0x82b3fe32, 0x03002182, 0xab3a0482, 0x61030007, 0x8c035803, 0x0000ba03, 0x27022637, 0x021d3033, - 0x17041d17, 0x0290031d, 0x11a31491, 0x26f14782, 0x86957191, 0x17011e26, 0x37013e33, 0x86067341, 0x033d220d, 0x20028937, 0x850b8a04, 0x8211a317, - 0x9126f129, 0x2e86a171, 0x07020633, 0x27022623, 0x2327012e, 0x8207010e, 0x22052d0d, 0x013e2726, 0x33011e37, 0x26343532, 0x26291883, 0x34352627, - 0x16323336, 0x2b218217, 0x2223012e, 0x17141506, 0x011e1716, 0x15230285, 0x82250614, 0x2223223b, 0x26288227, 0x37342627, 0x823e3736, 0x2021823c, - 0x352c8407, 0x1614011d, 0x3e373233, 0x23013d02, 0x23113335, 0x185e188e, 0x00cc0168, 0x040e0434, 0x030e040c, 0x7b0e390e, 0x030e390f, 0x030d030f, - 0x61cc040e, 0x18640127, 0x0e7a1962, 0x205c833a, 0x3b5c820c, 0x020f3c0f, 0x276e4bf0, 0x1d0c2f0b, 0x2a77314d, 0x0a240934, 0x702a2b5a, 0x24634865, - 0x3c081382, 0x3731401a, 0x31161637, 0x30092409, 0x13161544, 0x0c430274, 0x34484f09, 0x20212b2c, 0x12121213, 0x3d5f2222, 0x1e38375a, 0x3c461153, - 0x48505048, 0x271a1a1e, 0x5adf7c16, 0xbe0170b7, 0x10b8cd70, 0x47014d00, 0x19681a2d, 0x44196719, 0x44441001, 0x8244f0fe, 0x6819220a, 0x5b01101a, - 0x47414701, 0x70af084d, 0x457042fe, 0x1a451301, 0x67191967, 0xedfe451a, 0x36380b45, 0x290b2a0b, 0x2f2c6d2c, 0x0207020d, 0x512d2c15, 0x3431615c, - 0x250b290a, 0x2a342d24, 0x020c1516, 0x1f0b0208, 0x293f1717, 0x306e6865, 0x2a13133e, 0xb8424229, 0x2a2a4242, 0x47262728, 0x5c393131, 0x5c52a452, - 0x31210908, 0xfe573b1e, 0x0700009e, 0x02ff5200, 0x1a05ae06, 0x24001a00, 0x49003800, 0x78005300, 0x00008000, 0x35262205, 0x023e3734, 0x07063337, - 0x010e0706, 0x013e3307, 0x15163233, 0x32270614, 0x2334013d, 0x14011d22, 0x27022603, 0x17121633, 0x36331716, 0x82123637, 0x0702272a, 0x21112321, - 0x27831732, 0x23130727, 0x2327012e, 0x07794837, 0x22011527, 0x012e2726, 0x222a8234, 0x82333637, 0x06172123, 0x080b5845, 0x1e373698, 0x010e1701, - 0x15011105, 0x35011101, 0x6d6ba201, 0x4f3a0f10, 0x2a3b8a31, 0x251d1e2a, 0x47110c09, 0x6e5f5131, 0x6c6d6d6a, 0x2183211f, 0x1450136b, 0x0e0c0e0e, - 0x144e140e, 0x20832169, 0x01658f01, 0x2b2c5609, 0x71803a39, 0x78175608, 0x2626249b, 0xad029b24, 0x21225d3a, 0x22212323, 0x563b2e2e, 0x0d1f3333, - 0x353e1249, 0x444c4c44, 0x0f124236, 0x69200e38, 0x2801e4fe, 0xd8fe72fe, 0x3c7f84fd, 0x606f3c3d, 0x28292d22, 0x32562829, 0x676a312f, 0x7755776a, - 0x02827719, 0x18035608, 0x6fbf0170, 0x46e7fe46, 0x4e4f4f4e, 0x46190146, 0x7041fe6f, 0x34339e02, 0x11604d60, 0xc913e7fe, 0x2a265536, 0xde262a3e, - 0x2a278efe, 0x84b6842a, 0x14142a2a, 0x074a2525, 0x5f323929, 0x5e53a152, 0x21083b36, 0xb24e4a09, 0x100134fe, 0x0192fe82, 0x82effecd, 0x3f008200, - 0x00200004, 0x03e006ab, 0x000b0061, 0x004a0015, 0x37000074, 0x21301130, 0x06141632, 0x0119012b, 0x2008b749, 0x05ce4601, 0x16171622, 0xd0461282, - 0x012e2806, 0x023e3435, 0x46173233, 0x072c08d1, 0x16141506, 0x011e011f, 0x020e1415, 0x2105cd46, 0x2485022e, 0x46171621, 0x36230cc6, 0x46013e37, - 0xd10806c8, 0x5d200121, 0xb45d6666, 0x2f2e2aad, 0xdd02ad29, 0x0c2a7655, 0x2b230d32, 0x4141362b, 0x270a3b2e, 0x2162620a, 0x4c36563d, 0x0d283738, - 0x4b1a0d32, 0x20203938, 0x643c3734, 0x5a3f205d, 0x0a04dd02, 0x663c4c5e, 0x4d2a294a, 0x7d5a426c, 0x51135923, 0x6161503d, 0x1d1c2050, 0x8a191616, - 0x02b75ff3, 0x6db96d9e, 0x6a01f5fe, 0x292e282b, 0x3db6fd2b, 0x0c2f0b34, 0x3a17162b, 0x0c2e2731, 0x12020702, 0x482c515c, 0x1a1b1b31, 0x0b2d0b32, - 0x18172921, 0x0b292a2c, 0x505d130c, 0x1d374d2f, 0x2d403171, 0x54548257, 0x502e5881, 0x3b2f3447, 0x5d6e5d66, 0x10080966, 0x34202f0f, 0x009bfe5d, - 0x002e0005, 0x03d206ab, 0x00120061, 0x002a001f, 0x00460134, 0x68422500, 0x013e2807, 0x14021e32, 0x4227020e, 0x222a0583, 0x14011d06, 0x21110516, - 0x5e411732, 0x2e052c0f, 0x1d232701, 0x0f1d1707, 0x870e1d17, 0x820b8502, 0x11013305, 0x16331123, 0x011e1712, 0x053d3317, 0x270f3d27, 0x02870e3d, - 0x042d0b88, 0x23113311, 0x33010226, 0x2223603c, 0x3a028223, 0x44607a5f, 0x61442323, 0x4f4f483c, 0x014f4f90, 0x560901df, 0x56572b2c, 0x82259aa3, - 0x029a2600, 0x09220863, 0x0732440c, 0x21756228, 0x23082285, 0x10880d08, 0x85217623, 0x074c42ac, 0x5428282d, 0x5484b684, 0x525d5a27, 0x845d52a2, - 0x024f3304, 0xc134339e, 0x01f1fe67, 0x3d2a2569, 0x15b22629, 0x7f441553, 0x284dae4d, 0x0270fe02, 0xf4fe439e, 0x80884043, 0xfd900126, 0x0c014362, - 0x3a055f43, 0x065400a5, 0x00b8035b, 0x0048002f, 0x005e0054, 0x23302500, 0x2223010e, 0x4435022e, 0x3e43078a, 0x49062008, 0x362106e3, 0x35018237, - 0x3523013d, 0x01231121, 0x15163221, 0x0e070614, 0x1e150701, 0x0b821702, 0x020e0730, 0x33372123, 0x3d363732, 0x26273401, 0x5d4d012b, 0xe541080a, - 0x60740e04, 0x345c804a, 0x43303035, 0x9c715343, 0x124a122b, 0x634d6518, 0x28637979, 0x1b1b2424, 0x01ac1010, 0x0601772f, 0x77697201, 0x3415141b, - 0x353d1a1a, 0x10111311, 0xfe2f4f39, 0x35e98768, 0x0800821e, 0xd2e9356a, 0x33373733, 0x503de2d2, 0x6aa26d38, 0x3738a268, 0x59631c1c, 0x3b0b2b0b, - 0x88757f49, 0x0b0a7f75, 0x1e1d1413, 0xfe754127, 0x76460341, 0x15422f62, 0x07031415, 0x242f1601, 0x2c323525, 0x7525412d, 0x29331c1b, 0x711c1b34, - 0x30273033, 0x00000033, 0x00350005, 0x03cb06ab, 0x001f0061, 0x00530046, 0x00660060, 0x26222500, 0x2c131b44, 0x011e3736, 0x06070617, 0x012e2221, - 0x23218227, 0x013e3736, 0x82050646, 0x32072a14, 0x033e1716, 0x021e3233, 0x10584315, 0x2135a808, 0x37123635, 0x15331133, 0x33251523, 0x010e2311, - 0x96834e01, 0x41694926, 0x5b217658, 0x4d3b4811, 0x3d4d5959, 0x3a0f124c, 0x3c3d210e, 0x5738fc01, 0x2c10113c, 0x29552323, 0x2d2d3990, 0x16172221, - 0x0104020d, 0x30251c0b, 0x35482a20, 0x573e211d, 0x41413b35, 0x02424275, 0x2dc9fea1, 0x5b8e2eb5, 0xdbbefe5b, 0xac8e2307, 0x8154a9b1, 0x4b4d2e58, - 0x6a393032, 0x6a5d665d, 0x2309313f, 0x29294909, 0x30304424, 0x3680493d, 0x291c5336, 0x29282627, 0x01362d2d, 0x1b231501, 0x4d371c0f, 0x3c53332f, - 0x3d3e5821, 0x843e3d0d, 0x4d2f0804, 0x014a5d83, 0x3afe4a2a, 0x01d88355, 0x00ed3b63, 0xff4b0008, 0x05b50608, 0x000c0015, 0x001c0016, 0x005c0028, - 0x00720068, 0x1700009b, 0x44301130, 0x01211235, 0x23ec8311, 0x15211133, 0xa6450187, 0x2d754c06, 0x2406b44c, 0x13331323, 0x2a0b8503, 0x2533010f, - 0x2337013e, 0x8207010e, 0x82138202, 0x1e232702, 0x23111701, 0xaf4c3311, 0x82332005, 0x2902821e, 0xb0231133, 0x2c560901, 0x5644582c, 0xca013007, - 0x0186f466, 0x01e1fe85, 0x01fdfe03, 0x4be7fa1f, 0x25210cdd, 0x07dd4b09, 0x0c2e0c22, 0x0811dd4b, 0x22093830, 0x2309e109, 0x81c96408, 0x0e04f1ca, - 0x0e030d03, 0x02b03b04, 0x010402d0, 0x071f080b, 0x15165716, 0x1f081557, 0x05010b08, 0x12786201, 0x0b821248, 0x03820920, 0x47125408, 0xf8627712, - 0x33349f02, 0xf1fe67c2, 0x29266901, 0xfd25293e, 0xfd9f02bc, 0x9f025abb, 0xcf58c45a, 0x3957035a, 0x0b2b0b35, 0x2c6e2c2a, 0x08020c2f, 0x2c2d1402, - 0x31605d51, 0x0a290a34, 0x342d2524, 0x0b16162a, 0x0a030802, 0x3f171720, 0x0b696429, 0x821f7c1f, 0x33408202, 0x11e00161, 0x41101041, 0x1390d311, - 0x4b13144c, 0x2db62d13, 0x13220282, 0x0b821349, 0x0263fe29, 0x279d279f, 0x82165816, 0x2c088202, 0x000061fd, 0x29000400, 0xd706ab00, 0x05534703, - 0x46003a22, 0x471a5347, 0x1d261140, 0x16171401, 0x04433233, 0x41252007, 0x21080adc, 0x5e200129, 0xb35d6665, 0x2e2e29ad, 0x0f03ad29, 0x49269584, - 0x3b574169, 0x3d0f223b, 0x3b48110f, 0x00822c4e, 0x4c3c4e35, 0x0f3a0e13, 0x013d3c22, 0xfeae012d, 0xfe2301bf, 0x474101dd, 0xb1341005, 0x598154a9, - 0x4b26272d, 0x30082208, 0x5d353539, 0x35355d66, 0x2a07c642, 0x609e020b, 0x60c460ba, 0x51030000, 0x082e825f, 0x02ff6d01, 0x1a059305, 0x55004400, - 0x91826d00, 0xab009e29, 0xe300d500, 0x47250000, 0x232c0558, 0x2e070622, 0x37362701, 0x3637013e, 0x22051b44, 0x52020e07, 0x0621098f, 0x2a018207, - 0x022e2223, 0x17163727, 0x481e1716, 0x352109d6, 0x06644401, 0x023e3737, 0x10163233, 0x3e322706, 0x34013d02, 0x0e22022e, 0x1d060701, 0x05a14f01, - 0x02252582, 0x37363435, 0x05f24835, 0x42823220, 0x2405634a, 0x15011e15, 0x476b8214, 0x13200ce1, 0x200bee47, 0x211e8325, 0x99822307, 0x22230282, - 0x82062726, 0x2223232d, 0x4f822e27, 0xb0833720, 0x4c853320, 0xc9880720, 0x55087382, 0x3e4b0216, 0x30313a3c, 0x300c1743, 0x14130f0c, 0x2b202133, - 0x213a502f, 0x2f240a0a, 0x1a191d1a, 0x22161313, 0x2c2d1f1f, 0x36472f36, 0x0c500f2a, 0x11120e0e, 0x413e1c2e, 0x02473f45, 0x3c5c3e98, 0x0e0f0f0e, - 0x7d3e5c3c, 0x237d7676, 0x0e0e1e31, 0x3145311e, 0x0082071f, 0x100fb308, 0x3bf8fd31, 0x4a1f3d59, 0x1e3e343c, 0x29685337, 0x0f0f3829, 0x4a3d343f, - 0x5a3c1010, 0x42423c3a, 0x3d424279, 0x6f3b3b37, 0x52033a3a, 0x56451616, 0x5b389029, 0x0d2d2122, 0x0a010501, 0x30260e0e, 0x24242a20, 0x11101d35, - 0x36561f1f, 0x3c2c2b38, 0x3bec1011, 0x3b3a4241, 0x35994141, 0x312e0729, 0x2a0a262c, 0x1415160a, 0x17090a1d, 0x2028412d, 0x1928191a, 0x0d060406, - 0x3914150d, 0x1a482c25, 0x140e0e19, 0x3e172c21, 0x0c111114, 0x343a0d0c, 0x5c363407, 0x582f6afe, 0x52534040, 0x2f594041, 0xb6b8feb7, 0x49331c5c, - 0x482c752c, 0x341c1c34, 0x09822424, 0x23252e08, 0x031c1a1a, 0x47341d06, 0x1151432a, 0x3a4e1307, 0x192d4026, 0x202d0c0d, 0x4e3a2620, 0x51110713, - 0x24232a43, 0x38571d34, 0x37321332, 0x27048237, 0x303a0138, 0x302e102e, 0x2a080484, 0x4041491f, 0x291b556b, 0x5a28284e, 0x14010136, 0x0f1b1212, - 0x4c360f0e, 0x2b2a3230, 0x12221e1d, 0x30304413, 0x0e3c3f93, 0x823e3e3c, 0x003f2104, 0x04370082, 0xb7007800, 0x56038806, 0x27000f00, 0x40003700, - 0x30010000, 0x84233011, 0x30352a03, 0x30153021, 0x30353013, 0x830f8a33, 0x8233201b, 0x30212217, 0x54278227, 0x0e3c0c81, 0x2e330701, 0x6cac0101, - 0x53fc01c8, 0x24015b5b, 0x2b025c5c, 0x6f3afb3c, 0x88269926, 0x43080382, 0x1005d7fe, 0x10c61041, 0xfdf50240, 0x603e02c2, 0x58c2fd60, 0x5858ee01, - 0xb55812fe, 0xbe0170b5, 0x42fe7070, 0x313a0270, 0xc53131c5, 0x00050000, 0x06ab0008, 0x006103f8, 0x003e0034, 0x00500046, 0x37000058, 0x2a329f4b, - 0x23072327, 0x12163313, 0x86230117, 0x081190a1, 0x7655fd42, 0x0d310d2a, 0x372b2b23, 0x3a2e4140, 0x620a280a, 0x563c2262, 0x38384c36, 0x0d320d27, - 0x3a374b1a, 0x36341f20, 0x215d653c, 0xd0025a3e, 0x6e3bfa3d, 0x982689e4, 0x04d7fe26, 0xc5104011, 0x28034010, 0xac201391, 0x242c824b, 0x02b5b50b, - 0x0a00419e, 0x8ef7fd21, 0x82002010, 0x00033400, 0x06ab0060, 0x006103a0, 0x002b0015, 0x2500004b, 0x46300330, 0x06240eaa, 0x35210702, 0x2013b141, - 0x1d874805, 0xdb3c012d, 0x12471270, 0x040b2b0a, 0x820b2b0b, 0x256d2509, 0x4b012595, 0x2605c741, 0x96838401, 0x48684a26, 0xb7281461, 0xdd379e02, - 0x279b2737, 0x08820282, 0xd641c383, 0x480b2007, 0xcb821741, 0x4700042a, 0xb906b700, 0x0b005603, 0x2122cd82, 0x3f462900, 0x0a1b4618, 0x23110128, - 0x21352311, 0x4c4d4815, 0x2e292807, 0x02ad292e, 0x46ad0114, 0x01250702, 0x01c86c7b, 0x0f0846fc, 0xea45c120, 0x3e022106, 0x82057942, 0x4f06207f, - 0x1e340893, 0x3d002700, 0x58004e00, 0x00007e00, 0x26272205, 0x36373435, 0x30250184, 0x07020e33, 0x05944f06, 0x954f1720, 0x1d222408, 0x4f011401, - 0x12560694, 0x4f06200a, 0x0e212d96, 0x12974f01, 0x6b7a033f, 0x0f103736, 0x28271d1d, 0x553b8a31, 0x0a12123a, 0x3147110c, 0x6e2f3051, 0xfed96d6a, - 0x06924f09, 0x05130426, 0x0512050c, 0x2212944f, 0x4f144d14, 0x0e221794, 0x954f0e3a, 0x42fd350e, 0x3d3c7f42, 0x3038363d, 0x522d232f, 0x332a2b50, - 0x3535312f, 0x2213904f, 0x821a691a, 0x11924f02, 0x2eb62e22, 0x2215924f, 0x4f082008, 0x003c0d93, 0xff170106, 0x05e90508, 0x000b0015, 0x002d0017, - 0x0055004b, 0x0500005f, 0x33301130, 0x21220382, 0x07841530, 0xc6500b87, 0x34353305, 0x013e3736, 0x1e171632, 0x07061401, 0x3227010e, 0x01823736, - 0x34013d2b, 0x2e272627, 0x06222301, 0x46018207, 0x052107bf, 0x12d14f11, 0x016ccc24, 0x03826311, 0x10fd2208, 0x26266a42, 0x26262929, 0x256b836a, - 0x262a2a26, 0x26416b25, 0x0d161740, 0x160d0c0c, 0x28264017, 0x220b873f, 0x48f4013f, 0xf8250c83, 0xc1fd9f02, 0x2b048460, 0x2c2d5703, 0x5455822b, - 0x2d2c2b82, 0xa9200983, 0x612d0883, 0x2519191b, 0x2e692e25, 0x19192525, 0x2f0c8c1b, 0x6e9f0256, 0xf5fe6eb8, 0x282c6a01, 0x002c282e, 0x0036f082, - 0x06ab000a, 0x006103f6, 0x00300012, 0x0044003a, 0x2500004a, 0x40502e22, 0x07494f06, 0x112fe6af, 0x15211133, 0x6a422c01, 0x4c29294c, 0x8541426a, - 0x21e09b07, 0x6449665d, 0x02220808, 0x10016d13, 0x82572dac, 0x58825454, 0x82582d2d, 0x2d5782a8, 0x191a1b60, 0x6a2e2425, 0x1925242e, 0x0c8c1b1a, - 0x6d505520, 0x02c1280e, 0x60c2fd9e, 0x82040000, 0x06ab2ccb, 0x006103b6, 0x00220013, 0x4366002d, 0x302306d3, 0x88213015, 0x30112603, 0x32333001, - 0x24e88317, 0x2b060701, 0x05ba5201, 0x2b262724, 0x4d581101, 0x077e5106, 0x27262724, 0x0282012e, 0x37343522, 0x230d8051, 0x17141506, 0x08068051, - 0x07060724, 0x014a010e, 0x01cafea3, 0x01edfe13, 0x3441edc3, 0x29294a34, 0x4134344a, 0x5c4beded, 0x804b2e2e, 0xde45dc02, 0x2a242705, 0x4140372b, - 0xdf451717, 0x11112405, 0x4535563d, 0x2b0807e0, 0x3f3a384a, 0x3c361a1a, 0x10115d65, 0xb759201f, 0xba609e02, 0x02dcfe60, 0x5415159e, 0x547da87d, - 0x5e601515, 0x2f5b6c5b, 0x6b22fe2f, 0x210ad645, 0x5a511717, 0x24242107, 0x08095b51, 0x2a2c2f29, 0x0c0b1514, 0x2f515c13, 0x1c1b2627, 0x0400001d, - 0x63008f00, 0xa9037106, 0x2f001500, 0x43003900, 0x30250000, 0x50333001, 0x535a06ec, 0x02062806, 0x32210107, 0x49141516, 0xdf840bd4, 0x37212322, - 0x4f08a252, 0x012e0906, 0x8dedfea2, 0x0f165916, 0x0f050b36, 0x09820b38, 0xb92f8937, 0x01c2012f, 0x1b776873, 0x19193429, 0x1b1a1f1e, 0x1c111024, - 0x06f54e1d, 0x4e3c3c21, 0x633407f3, 0xfe454603, 0xc53645ec, 0x25c83729, 0x45140145, 0x8cd2fd8c, 0x3605e44e, 0x0703142a, 0x170b0b01, 0x32354918, - 0x21202d2c, 0x33377525, 0x4e373429, 0x013409e3, 0x0508ff32, 0x001405ce, 0x00330026, 0x008a0078, 0x0500009b, 0x202ec44e, 0x41d14a01, 0x27012e32, - 0x11231123, 0x011e1333, 0x33113317, 0x35212311, 0x0e260482, 0x27260702, 0x10823736, 0x02153008, 0x3d573870, 0x222c1010, 0x902a5523, 0x222d2d39, - 0x0c171721, 0x0a010501, 0x1f31251c, 0x1e35472b, 0x35573d22, 0x7542423a, 0x44024141, 0x4a393b3f, 0x13210888, 0x06884a34, 0x230a0b22, 0x0807884a, - 0x1f1f233c, 0x2f362c2c, 0x0f293747, 0x0e0e0d4f, 0x1d2d1211, 0x4045413e, 0x08b2fd47, 0x68030e34, 0x340edb79, 0x79670308, 0x08bc4301, 0x123e3417, - 0x56554002, 0x25f8a3a5, 0x3c303044, 0x284f8149, 0x1447080d, 0x1d0f1b24, 0x332f4d36, 0x59223c53, 0x3c0d3d3e, 0x0d3c3f3f, 0x3d013e3d, 0x2e072935, - 0x0a262b31, 0x14160a2a, 0x09091e14, 0x28402d17, 0x271a1a20, 0x06050619, 0x15140e0c, 0x482c2538, 0x0e0e1a1a, 0x172b2115, 0x4a10153f, 0x35080659, - 0x035c3633, 0x1b63104a, 0x9e0200fe, 0x631b8dfe, 0xfd010210, 0xf5015a62, 0x13433818, 0x5d5c3a02, 0x005abcfd, 0x001b0003, 0x03e506ab, 0x00390061, - 0x007f005c, 0x47492500, 0x0568430d, 0x26272622, 0x54106943, 0x07260aea, 0x010e0706, 0x1d472221, 0x013e2305, 0xd0513233, 0x5636200f, 0x22a2055b, - 0x54100127, 0x320d2a77, 0x0570490c, 0x2c069143, 0x11113131, 0x4c36573c, 0x0c273837, 0x0b734933, 0x10112308, 0x025a1f1f, 0x13958429, 0x68252413, - 0x22765742, 0x120f3d0f, 0x584e3a48, 0x4c3c4e58, 0x0f3a0f12, 0x1e9e7922, 0x430b8b49, 0x2e2306b4, 0x432c512e, 0x17230bb5, 0x552a2d17, 0x272d0611, - 0x1d1c1b26, 0x4154a9b1, 0x2e2c2c40, 0x053b4e4d, 0x200a0051, 0x281a9a52, 0x00050000, 0x06ab004f, 0x092b55b1, 0x55400021, 0x0122342b, 0x02823521, - 0x15212808, 0x21070206, 0x603d5401, 0x23232222, 0x79602222, 0x24244460, 0x483c6044, 0x4f904e4e, 0x01de014f, 0x2c2b5709, 0x57a35757, 0x032e0589, - 0x0141fe60, 0x01cdfe42, 0x36d636a6, 0xd9544c01, 0xfd2a082b, 0xea015bbc, 0xfe525b59, 0x070052ba, 0x08ff2e00, 0x1505d206, 0x33001c00, 0x53004700, - 0x73005d00, 0x00009100, 0x30070637, 0x034c3015, 0x30113205, 0x36373633, 0x06333037, 0x17121607, 0x01012e23, 0x0ae54511, 0x230cf145, 0x33302726, - 0x20062949, 0x22cf8233, 0x57013011, 0x2e21187d, 0x2df34701, 0x42f73608, 0x046d6d1a, 0x5a5a1848, 0x32ae417f, 0x278316ba, 0x01a50192, 0x01c0fead, - 0x01ddfe23, 0x74220140, 0x6d1b7c73, 0x6c1b031b, 0xa418781b, 0x014afb2d, 0x65655e20, 0x075d505e, 0x14481720, 0x41230829, 0x02d01e4b, 0x5cacfe9f, - 0x4d6d6d1e, 0xe8fe4bce, 0xfee13d21, 0x609f02e2, 0x60c460bb, 0xcbcc0801, 0x8232c732, 0xfe292702, 0xf6fe4ee2, 0xf8476203, 0xb5fd210d, 0x212d3748, - 0x83620000, 0x0005358f, 0x0608ffca, 0x00150536, 0x0017000f, 0x00660033, 0x05000092, 0x2a11054e, 0x33300706, 0x012e0526, 0x4e302327, 0x33260549, - 0x011e1330, 0xe7493317, 0x30232106, 0x21106359, 0x62592726, 0x05ad5a0a, 0x230d6159, 0x33270226, 0x16214282, 0x078e5317, 0x27069c53, 0x33373637, - 0x23070206, 0x262f6c82, 0x07062327, 0x0207010e, 0x3afb3df8, 0x4e98266e, 0x30340770, 0x0230c631, 0x08340e19, 0xdb796802, 0x030e3408, 0x5bfc7967, - 0x48057c44, 0x2e35050e, 0x621e1e3a, 0x563d2262, 0x38374c36, 0x1a490327, 0x1f3a384a, 0x07eb4d20, 0x90015e08, 0x6e1a6a1a, 0x18092e0d, 0x24080317, - 0x0f360b0a, 0x0a360e79, 0x03092309, 0x6b232331, 0x7a1b6e1c, 0x1910390d, 0x19190219, 0xf80d3b10, 0x0170b6b6, 0xfe7070bf, 0x3b027041, 0x34949494, - 0xfd0f641b, 0xfe9f02ff, 0x1b640f8d, 0x61fd0102, 0x343d5703, 0x2b0b2f0c, 0x313a1616, 0x060b2e27, 0x06945905, 0x321b1a35, 0x28224102, 0x2a2c1717, - 0x130d0a2a, 0x4d2f515c, 0x830b1e36, 0xdb3b334b, 0x1e706f2d, 0xdc2b2998, 0x2bdc3c3c, 0xde259425, 0x5f83a2a1, 0x3fea3223, 0x37008266, 0x0032ea3f, - 0xff180104, 0x05e8050e, 0x001b000f, 0x0043003a, 0x25000057, 0x221a7d41, 0x54233021, 0x072405fc, 0x37013e23, 0x98430a82, 0x010e2708, 0x01011e07, - 0xc5433311, 0x41112007, 0x33200676, 0xb5432782, 0xcd360806, 0x030c320c, 0x0ddb7867, 0x68030c31, 0x7f3f0379, 0x021b6d1b, 0x781b6b1b, 0x23249124, - 0x1980238b, 0x1a021966, 0x24781a67, 0x9325248c, 0x016cd9fb, 0x26010111, 0x8043269a, 0x77230807, 0x81279a27, 0xfd185f17, 0xfe9e02ff, 0x175f188e, - 0x62fd0002, 0x2c2cb22d, 0xe5392db2, 0x36db3639, 0x8229a729, 0xda363e02, 0x03e63936, 0xfd9e0229, 0x080160c2, 0x430f0144, 0x3131c732, 0xfe4332c7, - 0xf6fe43f2, 0x22008200, 0x82360106, 0x82ca20f3, 0x00142ff3, 0x002a001e, 0x00460032, 0x05000052, 0x57442330, 0x14152205, 0x20cb8206, 0x0f195d17, - 0x07232722, 0x50083065, 0x0221070b, 0x0e3f4f03, 0x21030222, 0x3a0b704e, 0x21016da3, 0x4142685a, 0x79186118, 0x85165a16, 0x2f2e2aac, 0xb603ac29, - 0x423bfa3d, 0x10340a66, 0x10c51040, 0x6e79fd40, 0x4811716e, 0x0a2b0b11, 0x0b2c0b04, 0x6e240982, 0x68016f70, 0x08099c4e, 0x9e02f220, 0x5f485d6c, - 0x2fbc2f14, 0x5b2db52d, 0x282e292b, 0x96fed52b, 0x0170b6b6, 0xfe6f6fbf, 0xfd507041, 0x59012506, 0x4f014f01, 0x240b554f, 0xb1feb1fe, 0x07ae5402, - 0x00020030, 0x066300a9, 0x00a90357, 0x0033001d, 0xd3412500, 0x51062005, 0xb641058d, 0x0516210e, 0x49050d50, 0x40080819, 0x15303330, 0xa0760330, - 0x04139027, 0x18966464, 0xbc3335c2, 0x7f20a017, 0x81200220, 0xbe179620, 0x2d018a33, 0x411c0aeb, 0x5003164f, 0xccce4195, 0x20ed4163, 0x0127a7a7, - 0x014f5333, 0xd0342426, 0x34028234, 0x4fdbfe24, 0x0271d7d7, 0x54461e72, 0xa1480217, 0x712bfd47, 0xe71e1000, 0x06348101, 0x02ff2801, 0x1a05d805, - 0x25000f00, 0x56004300, 0x7c007400, 0x4f11d353, 0x0120335b, 0x512ba14e, 0x022807a6, 0x01c76d67, 0x417301fb, 0x2107704f, 0x824f6b82, 0x416b2205, - 0x09794f27, 0x40272725, 0x820d1616, 0x16162c00, 0x41d0fd40, 0x29294c6b, 0x87416b4c, 0x41262107, 0x41341c87, 0x163f2826, 0x0d0d0c17, 0x3f16170c, - 0xc86ced02, 0x4c01fc01, 0x3605cf51, 0x2b2db7fd, 0x5554822c, 0x2d2c2c81, 0x812c2c2d, 0x2b2c82a9, 0x4e1a612d, 0x252106c0, 0x05c04e24, 0x4e252421, - 0x1a2406cd, 0x572d0103, 0x58232e83, 0x82582d2d, 0x8a57202c, 0x09c24f2b, 0x2205f94e, 0x52e8011a, 0x07360833, 0xfdfe3300, 0x0905c206, 0x16000c00, - 0x61003c00, 0x9c008600, 0xb95aa200, 0x0f8b6119, 0x2014f451, 0x06835a01, 0x5a010b21, 0x24a51a7f, 0x1614112c, 0x11353632, 0x07141133, 0x934d020e, - 0x5b112005, 0x0124063e, 0x2b2c5709, 0x2a08284a, 0x5e3aad02, 0x23232121, 0x612f2121, 0x1d5205b2, 0x390e390c, 0x0269200e, 0x010501c3, 0x081f080b, - 0x1f078282, 0x04010b08, 0x13786201, 0x29058b5a, 0x12082007, 0x62771247, 0x2282c0fb, 0x1d820c20, 0x08828226, 0x020c081e, 0x12222283, 0x33821249, - 0x20080825, 0x82481207, 0x64013322, 0x65388e38, 0x58350c0c, 0x0c36577f, 0x6636020c, 0xc15af8f4, 0xb120080f, 0x842a2b27, 0x2b2a83b6, 0x25251413, - 0x0820084a, 0x535e3239, 0x365e53a1, 0x0821093c, 0xa8014f4a, 0x2305925a, 0x1001f0fe, 0x2117905a, 0x23a1ff04, 0x9f023208, 0x4d514efe, 0xb201514d, - 0x32445efe, 0x1f1f4132, 0x44323241, 0x61fda201, 0xbbfd9f02, 0x0000005a, 0xff4d0104, 0x05b30502, 0x0017001a, 0x008b0051, 0x059f529d, 0x4a09bb50, - 0xaa5009d5, 0x23414d14, 0x4d0efe48, 0x0120297a, 0x2110f14e, 0x5a468501, 0x4b013809, 0x0c2a7654, 0x2a240c32, 0x4240362c, 0x0a3b1717, 0x31610a28, - 0x48111031, 0x0c2306d9, 0x621a0c33, 0x3b290653, 0x10105d65, 0xfd5a1f20, 0x2332848b, 0x2b2b230d, 0x272e3286, 0x3131620a, 0x563c1111, 0x37384c36, - 0x32890d28, 0x82643c21, 0x1f1f2b32, 0x0ce2015b, 0x68020d31, 0x0682db79, 0x79670323, 0x069246f2, 0x343d0b32, 0x2b0c2e0c, 0x31391616, 0x0b171827, - 0x12020702, 0x250d5e4d, 0x17172822, 0x5e4d2b2c, 0x6203210b, 0x012133b1, 0x0f3c487e, 0x0000002f, 0x00cf0002, 0x03310654, 0x003400b8, 0x10d94e4a, - 0x666a2620, 0x08805c05, 0x52095e4a, 0x0e220740, 0x35430102, 0x2787080d, 0x1135022e, 0x946a0202, 0x0f3f0f34, 0x4436352d, 0x493a5250, 0x3d7b2525, - 0x6b4c2a3d, 0x46465e44, 0x21045b31, 0x2847465d, 0x44202128, 0x29747e4b, 0xf901704e, 0x8551c552, 0x764b1110, 0x4b3b3bae, 0x404d5521, 0x360f3a0f, - 0x3d481b1c, 0x070e3a31, 0x393a1706, 0x3e593865, 0x3e212121, 0x322a0351, 0x34381c1d, 0x100d1a1a, 0x3a657318, 0x03254461, 0x6bfcfd54, 0x026b6c6c, - 0x5c11fe04, 0x2b574443, 0x86581615, 0x82ef015c, 0x732d10db, 0x0a393d07, 0xf60608ff, 0x0e001505, 0x2b001800, 0x53004900, 0x63005d00, 0x30010000, - 0x09505c33, 0x7e5a2b20, 0x2b262306, 0xe24c1101, 0x146b5c2c, 0x1133113a, 0x76021521, 0x256841ed, 0x25292925, 0xed416825, 0x5c5c4bed, 0x49fe804b, - 0x3c3a985b, 0x292ba701, 0x7ea77e2a, 0x602b292a, 0x5b6b5b5f, 0x0221fe5f, 0x82572df7, 0x57825455, 0x2007822d, 0x290682a9, 0x19191b61, 0x692f2425, - 0xbf4c242f, 0x5c0c8807, 0xfd2e0e82, 0xfd9f02c0, 0x050061c2, 0xab000300, 0xa756fd06, 0x5659200a, 0x052034a7, 0x2024bd4c, 0x11c05608, 0x200dae6b, - 0x06c056a4, 0x744c9620, 0x83072105, 0x2007744c, 0x0f006761, 0x3a2bd456, 0x134c13a7, 0xfe124b13, 0x121101ef, 0x4a13124a, 0x0263fe13, 0x279c279e, - 0x82165916, 0x22088202, 0x820062fd, 0x00033100, 0x06ab0022, 0x006103de, 0x0033001b, 0x1300006c, 0x561c4153, 0x114c15e7, 0x012e2114, 0x5c105259, - 0xd7200fbc, 0x28054d53, 0x0c320cdb, 0x01796803, 0x0abc5640, 0xb85c4c20, 0x2a02212f, 0x240a214b, 0xfd010218, 0x09a14b62, 0x5c080f6e, 0x250827b5, - 0x01070000, 0x0502ff7c, 0x001a0584, 0x005b0037, 0x00750068, 0x00a9009c, 0x010000d5, 0x010e2130, 0x37363307, 0x8866023e, 0x07012e07, 0x27222306, - 0x2627012e, 0x17163727, 0x7917821e, 0x22220515, 0x14820706, 0x37013e23, 0x3a5e6621, 0x6b07bf66, 0x1e220d24, 0x246b3301, 0x35212117, 0x29607182, - 0x23262405, 0x83020e22, 0x233c8283, 0x17163202, 0xc9790182, 0x08c28206, 0x26032137, 0x0c03d7fe, 0x0d0b0602, 0x1c2b200d, 0x1f364b2b, 0x2d3d1010, - 0x232d392c, 0x13143423, 0x0e0c4f10, 0x1c2b230d, 0x3b41413b, 0x0f12342b, 0x11040f3c, 0x017c0104, 0x245d6669, 0xfe3b3b37, 0x3c583717, 0x232c1110, - 0x90295523, 0x212d2e38, 0x0c171622, 0x097d6b01, 0x6b221e21, 0x5908067d, 0x50034141, 0x8f2339fe, 0x1b1b3324, 0x291c323a, 0x1006141f, 0x120b103f, - 0x664c3812, 0x0e1c1b50, 0x1d2d190f, 0x691a201e, 0x0152011a, 0x289e274e, 0x17101014, 0x4e361c0c, 0x2a2a3231, 0x0a10113d, 0x1516210a, 0x10143e18, - 0x410d1911, 0x413a0b3a, 0x09021421, 0x3ef93e02, 0x4e6657fd, 0xd1012137, 0x2d0be66b, 0x28282726, 0x01352d2e, 0x1b231401, 0xe66b1d10, 0x683f0812, - 0x2e207f20, 0x0c2e2a2a, 0x1c113831, 0x19061627, 0x1d1d2006, 0x1a1e1b2e, 0x2b25241b, 0x1c3e4528, 0x5a171c1c, 0x00000017, 0xff7a0106, 0x05860502, - 0x0028001a, 0x006c0036, 0x009f0092, 0x680000ca, 0x3f680c40, 0x21252226, 0x18834206, 0x37013e24, 0x345f031e, 0x07386906, 0x25211322, 0x6d14a75e, - 0x2122196b, 0x88613635, 0x1e454206, 0x45685220, 0x5a393505, 0x0d2c2222, 0x0e0a0403, 0x1f30260e, 0x3424242b, 0x1e11111e, 0x08054468, 0x10103d45, - 0x41413bec, 0x42423a3b, 0xd6fe3403, 0x0b070c05, 0x2a210c0d, 0x364a2b1d, 0x3e0f101f, 0x2d392c2d, 0x13352322, 0x340e1014, 0x221b0d0d, 0x403c1c2b, - 0x342b3c40, 0x0f3c0e12, 0x7c011207, 0x583810fd, 0x8211103c, 0x29552c23, 0x2e2d3890, 0x17162221, 0x6d03030c, 0xcd5e07c7, 0x41412205, 0x05494275, - 0x336b6b25, 0x423b1c1b, 0x0f210548, 0x07484240, 0x0e1b1c2e, 0x1e2c190f, 0x691b201d, 0xb352011a, 0x222d3068, 0x42a449f2, 0x0a241475, 0x21140a2a, - 0x230b7642, 0xb9010174, 0x212d3b42, 0x3a42605f, 0x06003824, 0x08ff3900, 0x1505c706, 0x1c000f00, 0x32002800, 0x7a005700, 0x58050000, 0x303407d1, - 0x16333013, 0x26031712, 0x06233027, 0x30073007, 0x01012e33, 0x5315536e, 0x25750f99, 0x14735313, 0x1e171625, 0x44331701, 0x113c0588, 0x0a1e0423, - 0x06e20624, 0xc9640a24, 0x21872182, 0x0c0b0af1, 0xb13c0a0b, 0x9bfc290b, 0x080d306e, 0x3bad0230, 0x2421215d, 0x2f212124, 0x33553b2e, 0x4a0d1f34, - 0x44343f11, 0x35444c4c, 0x380e1243, 0x026a1f0e, 0x010501c4, 0x0421090c, 0x22038282, 0x0c820c09, 0x3678623e, 0x05210937, 0x05171808, 0x62771552, - 0x187f23f8, 0x02237f18, 0x41fe709f, 0x31e00170, 0xd3240082, 0xa5018c24, 0x211d4e53, 0x4d532907, 0x52163f12, 0x01f0fe09, 0x16510810, 0xfe124b14, - 0x769f0263, 0x0e5d1975, 0xb10b4242, 0x0061fd2f, 0x67410700, 0x00162c08, 0x002a0020, 0x003f0035, 0x7f870064, 0x06230807, 0x6c321507, 0x0e20061c, - 0x2305a571, 0x34013d36, 0x200ca371, 0x13ff7301, 0x76057856, 0x75411e9b, 0x02220822, 0x4e100198, 0x1d343750, 0x0a221817, 0x39281609, 0x66d5fe22, - 0x262625a7, 0x2197a725, 0x97212525, 0x7d413bfd, 0xa7013f50, 0x48415459, 0x0b0b0c05, 0x211c1c28, 0x1c33472b, 0x2c2b275a, 0x2457272c, 0x23292b28, - 0x85411d01, 0x00003451, 0xff270105, 0x05d90502, 0x002a001a, 0x003c0034, 0x827d0071, 0x09597314, 0x33023e24, 0x71761632, 0x10e76a19, 0x650e7b54, - 0x5d65085e, 0x0d7c5d0d, 0x210a0c5b, 0x8676f402, 0x7302261f, 0x6f3afb3c, 0x07ed6be5, 0xc6114026, 0xb6fd4010, 0x6b12ea76, 0x6426135d, 0x5a3f215e, - 0xd3542e01, 0x768c2009, 0x59210796, 0x0896762d, 0x0808652e, 0x1f2f1010, 0x9bfe5d34, 0x9e02b6b6, 0x200b345b, 0x0a51544e, 0x020b2f22, 0x540ef376, - 0x5c250982, 0x374d2f51, 0x09fd6f1d, 0x0200003d, 0x16ffce01, 0x0e043205, 0x3b002100, 0x30050000, 0x26272223, 0x2e353035, 0x82262701, 0x05b04208, - 0x1617322f, 0x15011e17, 0x15070214, 0x3e322733, 0x05987401, 0x23022e22, 0x0808436f, 0x04021e28, 0x28558e70, 0x2f885527, 0x3e191b2f, 0x50503938, - 0x395050c4, 0xa0bb3e38, 0x603af09a, 0x13131244, 0x3a604412, 0x09855f3b, 0x2cea5f31, 0x0b4c492b, 0x5b41414d, 0xc27f735c, 0x82224142, 0x42413400, - 0xfee17fc2, 0xf2671cfc, 0x37374c28, 0x37459e45, 0x8a284c37, 0x0300290a, 0xb7001300, 0x5603ed06, 0x3d220782, 0x61675100, 0x61032005, 0x944b0f5f, - 0x30032206, 0x07535803, 0x30233023, 0x0f2b6c11, 0x30231123, 0x22018221, 0x84013035, 0x21230805, 0x02061530, 0xe3302107, 0x5d1772cf, 0x5b170d17, - 0x8a227017, 0x01090322, 0x080c0105, 0x8282081e, 0x44071f08, 0x12360597, 0x20071249, 0x1f080808, 0x12481208, 0x9a026277, 0x410141fe, 0x7662cefe, - 0x01b73206, 0x329b0103, 0xc83131c8, 0xeefe4432, 0x01fdfe45, 0x21874b9d, 0x28097d62, 0x00040000, 0x06ab004c, 0x26e382b4, 0x001e0014, 0x835f0028, - 0x1ddb5de5, 0x2107a642, 0x994a0111, 0x5db92032, 0x192106e4, 0x08e45d60, 0xac2a2e24, 0x56681302, 0x58032707, 0x0c03d7fe, 0x244a0703, 0x0e132123, - 0x2006244a, 0x0eec5db7, 0x292e2827, 0x96fed52b, 0x065a6802, 0x9e28402a, 0x10101427, 0x351d0c17, 0x210fc549, 0xc5491011, 0x8200200e, 0x01043000, - 0x0502ff73, 0x001a058d, 0x007d004c, 0x72e000b4, 0x17201717, 0x2106e24a, 0x01840607, 0x011e1522, 0x8405f24a, 0x2306220d, 0x05115722, 0x82372721, - 0x0c227217, 0x210a324b, 0x596b2627, 0x06364b06, 0x36370123, 0x85558632, 0x010e2354, 0x68412107, 0x8a012033, 0x1d514964, 0x67500221, 0x62081192, - 0x1d1d2828, 0x0a0a1110, 0x17181212, 0x13331d1a, 0x110b0b13, 0x2c1f2011, 0x232f362c, 0x141c1b24, 0x0d4f0f15, 0x2d12111c, 0x45423d1d, 0x80034740, - 0x8f2439fe, 0x1b1c3323, 0x1b321e1d, 0x0b0f0f2a, 0x4010050a, 0x13110b0f, 0x66262637, 0x0e1c1b51, 0x1616190e, 0x1a201e1d, 0x52011b69, 0xd6fea7fd, - 0x49030b03, 0x37350893, 0x3e100f1e, 0x2d392d2c, 0x14342322, 0x0d4e0f14, 0x2c220e0d, 0x0692491b, 0x4c3b0f21, 0x02240507, 0x2438fe50, 0x2107b34b, - 0xb34b1e2a, 0x854b2008, 0x4b18205e, 0x357208b3, 0x0c270810, 0x2116170b, 0x1a20291f, 0x0c141419, 0x0604060d, 0x1d14151a, 0x242c251c, 0x0e191a24, - 0x110a0a0e, 0x17161511, 0x7222143e, 0x7520093d, 0x2609614b, 0x0e111c1c, 0x4b13140e, 0x0d210764, 0x05654b0e, 0x1f442923, 0x05664b1f, 0x4c460521, - 0x62202b22, 0x2028bb4b, 0x06274f04, 0x0f005628, 0x37002e00, 0x5b5e8f03, 0x243f6f13, 0x02260526, 0x011d3327, 0x22354618, 0x158a4518, 0x5fa638c9, - 0x461826a6, 0x1520194a, 0x153d4618, 0x3d370122, 0x14774518, 0x45181494, 0x119111b3, 0x26a638a6, 0x35215fcc, 0x3f461833, 0x3a012810, 0xc901b266, - 0x706b0601, 0x282105f6, 0x12f67027, 0x18eb0123, 0x0346185f, 0x03012d4f, 0x040c040e, 0x380e040e, 0x390e7c0e, 0x46180782, 0x01285204, 0x18621964, - 0x0f390f7a, 0x0b3a6b82, 0x0f030e04, 0xfc020f3d, 0x4502bbfd, 0xb0fd5959, 0x3c7f4242, 0x38373c3d, 0x7a71302f, 0x34302107, 0x200a7a71, 0xda45104a, - 0x002f5503, 0x00050000, 0x06ab0047, 0x006103b9, 0x822f001e, 0x0058280b, 0x01000070, 0x6c07010e, 0xc67a0ad7, 0x82332005, 0x06d96c14, 0x20243e7b, - 0x3925a405, 0x3d0f1001, 0x046c6c10, 0x1e104010, 0x287e1e79, 0xad2b289f, 0x8822832b, 0xd27a6302, 0x06062718, 0x31100f07, 0x209e5202, 0xf0012208, - 0xcf124612, 0xacfe9e02, 0x25145115, 0xbc2f2491, 0xfefe412f, 0xfed13441, 0x40592ef0, 0x40525340, 0x06797a41, 0x49341b35, 0x482c762b, 0x341b1b34, - 0x762c2424, 0x1b23252b, 0xa35c1b1a, 0x00002224, 0x08934e06, 0x42002f3a, 0x8d006300, 0xa0009800, 0x30050000, 0x30353021, 0x36373637, 0x34353035, - 0x2a0adb49, 0x013e3736, 0x17011e32, 0x4a141516, 0x07250581, 0x2107010e, 0x052a5605, 0x82343521, 0x3637211d, 0x8306937c, 0x05554d3d, 0x82272621, - 0x85222001, 0x05dd752f, 0x16171623, 0x51421801, 0x22f74e08, 0xf2791220, 0x4503240c, 0x53d639fe, 0x5a550911, 0x1c1c2c05, 0x3750664c, 0x0c0d0f0e, - 0x531d1716, 0x01260613, 0x2e2e3f49, 0x00820e3c, 0x2e3c2308, 0x767c3f2e, 0x19227c76, 0x070f1018, 0x0f070606, 0x45191810, 0x100f1918, 0x06070706, - 0x18190f10, 0x0e4f89fe, 0x3d742620, 0x726e3afb, 0x0c0f4f72, 0xbf68f22c, 0x2f292a2e, 0x1138310c, 0xc349261d, 0x17172a06, 0x24351e1b, 0x23282b25, - 0x07c34922, 0x18176722, 0x33072e7c, 0xfeb71817, 0x0e5cb6b8, 0x231a1a0e, 0x2c752d24, 0x1a1a2424, 0x0e29a182, 0x24231b1a, 0x242d752c, 0x210e8323, - 0x2d4f7703, 0x4f01231f, 0x2f4f4f01, 0x0020080a, 0x01060000, 0x0568fe0b, 0x000f05f5, 0x0039001f, 0x004b0041, 0x006f0055, 0x23300100, 0x013d2622, - 0x2014fd4e, 0x1afd4e06, 0x2007f667, 0x12877701, 0x41180520, 0x2e080d65, 0x33112311, 0x37363313, 0x02231133, 0x35395fe5, 0x201f5b38, 0x262a1211, - 0x82353625, 0x26263536, 0x676b7c29, 0x2d4027a1, 0x0d0c0c0d, 0x8227402d, 0x0d0c2d09, 0x402d0c0d, 0xc76ded02, 0x3bfbfb01, 0x2b0cff79, 0x09051504, - 0x62190923, 0x19621818, 0x05390882, 0x06b48067, 0x677b595a, 0x313a68fe, 0x2b340732, 0x4c3e3d2b, 0x2b2c8155, 0x3d008217, 0x55812c2b, 0x4513ad96, - 0x25331aa2, 0x2e6a2d25, 0x1b332425, 0x2524331b, 0x252d6a2e, 0xec673325, 0x24012108, 0x2d09e276, 0x2b282e29, 0x1249123e, 0x2d2db32c, 0x08822cb3, - 0x02fffd39, 0xababfe9e, 0x0062fdaa, 0x00020000, 0x06540085, 0x00b8037b, 0x644d0034, 0x1a41357f, 0x133d0813, 0x01231133, 0x359469b7, 0x2c103e10, - 0x51443536, 0x26493951, 0x3e3d7a25, 0x436c4c2a, 0x3145465f, 0x5d21035b, 0x27284846, 0x4a442120, 0x4e29757e, 0x06fa0371, 0x130b2c0b, 0x81242381, - 0x27088213, 0xe1a18206, 0x829ae007, 0x2a2d8c64, 0x5a178f02, 0x40ec2217, 0x8222ec40, 0x7ffd3808, 0x56fe4603, 0xbafcaa01, 0x00030000, 0x066300b5, - 0x00a9034b, 0x7b15000b, 0x092119ad, 0x11d57601, 0x6801b63c, 0x747f7f74, 0x3934d8e1, 0x03d83439, 0x8cedfe5a, 0x0a175817, 0x0f050f37, 0x09820a38, - 0xba2e8834, 0x4603632e, 0xfe89e689, 0x36c501b2, 0x36323a32, 0xa17631fd, 0xc8252205, 0x0aa17637, 0x00820020, 0x20071b50, 0x06bf4561, 0xbd457e20, - 0x34ce4e46, 0x10152108, 0x6d6d0f3d, 0x10401003, 0x7f1e781f, 0x2b27a028, 0x22832bac, 0x3f630287, 0x0e0f3b5c, 0x5c3b0f0e, 0x28054344, 0x0d0d1f31, - 0x3145311f, 0x053b441f, 0x1a033122, 0x45325050, 0x01213edf, 0x2c7150ef, 0x5b01053a, 0xa50502ff, 0x34001a05, 0x48003e00, 0xa2008100, 0x22050000, - 0x37362726, 0x54079f79, 0x0225103f, 0x23012e07, 0x0f3f5422, 0x14654b18, 0x01694589, 0x0d597629, 0x2a0eb157, 0x010e1716, 0x76555002, 0x7f26252a, - 0x0b2314c7, 0x7f091e1a, 0x01210dc8, 0x0545442d, 0x2aacb335, 0xac2a2e2e, 0x76542cfe, 0x2425262b, 0x40372b2a, 0x69161842, 0x0d211140, 0x0e406919, - 0x08057476, 0x69242521, 0x22755841, 0x48112e2d, 0x58584e3b, 0x134b3d4e, 0x79224d0a, 0x23343dfd, 0x16162b23, 0x54273139, 0x0a230e8c, 0x54081b16, - 0x4b18128d, 0x292507bf, 0x012b282e, 0x693d8918, 0x2a082650, 0x4055a9b1, 0x2d2c2d40, 0x19194b4d, 0x5d6a3930, 0x3e695d66, 0x492f0631, 0x00000052, - 0x002e0004, 0x03d206b7, 0x000f0056, 0x18360027, 0x5e15e741, 0x132015d5, 0x25182d61, 0x01c86c62, 0xad5570fc, 0xed832b09, 0x25256940, 0x25252828, - 0xf6604069, 0x18812005, 0x2009e841, 0x05bb7002, 0x2a9e0227, 0xa87d2a2a, 0x2705827d, 0x6c5b5e60, 0x22fe5e5b, 0x002d9e82, 0xff4b0106, 0x05b50502, - 0x0015001a, 0x30ab821e, 0x016e0049, 0x050000d8, 0x21303530, 0x12363530, 0x053d7437, 0x2330152e, 0x25301530, 0x11303330, 0x010e2330, 0x2007145e, - 0xd344183e, 0x48012008, 0x2e23073d, 0x7e062201, 0x1e240719, 0x26220102, 0x6d08006a, 0x07220681, 0x46181d06, 0x352b0e81, 0x0f231133, 0x0e0f1501, - 0x840d0f15, 0x91088205, 0x2e05270b, 0x35372701, 0x02840b3f, 0x05840a20, 0x06200b88, 0x073c1793, 0x15331133, 0xc9fea102, 0x8e2db52d, 0xbffe5c5c, - 0x8e2307db, 0x5c3eaf02, 0x1d0f0e3c, 0x09bd4418, 0x00820720, 0x310f0f26, 0x0f103145, 0x07390982, 0xeefd311f, 0x49279683, 0x3b584168, 0x3c0f213b, - 0x3b481110, 0x2d2d2c4d, 0xd849182c, 0xbc2f220a, 0x3b4c1808, 0x222eeb2e, 0xd20b2c0b, 0xd202206e, 0x01012453, 0x18f2a3a6, 0x290ea54a, 0x582fe2fe, - 0x51524140, 0x45185883, 0x243b07aa, 0x2b752c25, 0x1a1a2425, 0x1a1a1c1c, 0x752b2524, 0x3324252c, 0xb106031c, 0x188055a9, 0x2c0f6148, 0x09313e34, - 0x29490923, 0x015a0b29, 0xd0b1d4f5, 0x280a2254, 0x8953d00a, 0x55b64150, 0xfd235f86, 0x82005abc, 0x02350800, 0x5f025c00, 0x7105a406, 0x1b000300, - 0x21130000, 0x27012115, 0x33351737, 0x07173715, 0x17231533, 0x23152707, 0x37270735, 0x065c3523, 0x04b8f948, 0x8c2a8cc2, 0x2103823c, 0x0887c6c6, - 0x46a50224, 0x118c2202, 0x00261a84, 0x5c000100, 0x5b8225ff, 0x1400d622, 0x38085982, 0x3e012c32, 0x34113505, 0x022c032e, 0x019d5c23, 0xf6050134, - 0x5b7fadc7, 0xaa6f3c2e, 0xfef8fecc, 0xada9fee5, 0x5633a502, 0x7a837e72, 0xf90e4766, 0x7d5b154f, 0x68869190, 0x24478d3e, 0x012c2201, 0x2047832e, - 0x2747823e, 0x9da40633, 0xfbfeccfe, 0x01254889, 0x011b0108, 0x82489657, 0x000532ef, 0x0638ff2a, 0x009405d6, 0x00400004, 0x014b0044, 0x2b9b8208, - 0x21072130, 0x030e2204, 0x07040e07, 0x2e06eb57, 0x33363435, 0x041e1732, 0x37033e32, 0x8337043e, 0x1716240c, 0x83141516, 0x032e391e, 0x21152103, - 0x05231501, 0x25352325, 0x33023e34, 0x36171632, 0x17031e32, 0x14212682, 0x21058306, 0x05833236, 0x013e1725, 0x82033e37, 0x84362047, 0x22288340, - 0x8631011e, 0x2317840c, 0x021e3233, 0x5b852983, 0x85141521, 0x27262961, 0x3435012e, 0x27022e35, 0x0e2e6e83, 0x27222301, 0x0607010e, 0x07062722, - 0x0c86030e, 0x02200683, 0xb0840e82, 0x03862683, 0x82022e21, 0x273b08ba, 0x35010e34, 0x2627010e, 0x16172627, 0x06273435, 0x36373437, 0x5c262223, - 0xfe46e401, 0x54e00462, 0x2f4f5061, 0x3c15070f, 0x522c5b40, 0x4da7934b, 0x151d0835, 0x2f0f0f1b, 0x9a61504f, 0xddd4081b, 0x62fee401, 0x019610fe, - 0x96000100, 0x0e047afc, 0x1b131a24, 0x171f0e0b, 0x0202080c, 0x11151b11, 0x04070602, 0x10072e38, 0x020c0e10, 0x06030810, 0x0a0c130c, 0x530b0609, - 0x040d1339, 0x0c11282c, 0x2f411e18, 0x0d151d0c, 0x241a0e04, 0x27142013, 0x11140c1e, 0x0909090a, 0x2c21492f, 0x121a1301, 0x1004180f, 0x25210f06, - 0x2a100f14, 0x10171c19, 0x21091224, 0x132e0e0d, 0x18133b1a, 0x0d060707, 0x0e290938, 0x111a141b, 0x122f340d, 0x19100807, 0x160b0a11, 0x1c101010, - 0x22180f17, 0x08221a0c, 0x030d1611, 0x06171601, 0x021a0327, 0x01100801, 0x08020103, 0x021a1207, 0x2fbb6eb9, 0x173c5242, 0x424a1d09, 0xa72d184b, - 0x0f0d4d4e, 0x17161d15, 0x2f42523c, 0x90081897, 0x016e5801, 0xf0f0fa25, 0x1d0da0fa, 0x1b151a29, 0x1d110e07, 0x26170e11, 0x0c020b3a, 0x0505070d, - 0x0b091037, 0x08040910, 0x040d670c, 0x3b1f2741, 0x0e186037, 0x121d1107, 0x15092617, 0x5201100f, 0x04380443, 0x34010512, 0x10171108, 0x0b122d0c, - 0x3e080403, 0x2f070b42, 0x0b24111d, 0x14111045, 0x1d0f331c, 0x0a5d090e, 0x18180c4d, 0x022d410c, 0x17211617, 0x0c110508, 0x2226141b, 0x19220e05, - 0x02071703, 0x02030c0c, 0x04110205, 0x04020202, 0x24038201, 0x171a0702, 0x07b34300, 0x00492508, 0x000f000b, 0x33150100, 0x23152315, 0x33352335, - 0x15210135, 0xb4980521, 0xb4b464b4, 0x480628fb, 0x4905b8f9, 0x64380b83, 0x465cfdb4, 0x53000500, 0x8c063eff, 0x0600a705, 0x2c002800, 0x37003000, - 0x11293d82, 0x33010b33, 0x07232711, 0x20018327, 0x26058403, 0x1b35020b, 0x82173702, 0x84132001, 0x33172905, 0x2b153321, 0x37333502, 0x2e082d85, - 0xcea0a104, 0xc936a0ce, 0x303f334a, 0x3a3a3f2f, 0x10311937, 0x27273736, 0x31103637, 0x3a3a3719, 0x3f302f3f, 0x01c94a33, 0xbc8a8af2, 0x83887373, - 0x0247082c, 0x01b00108, 0xfedefe22, 0x3ed63a50, 0xe3cd72a9, 0x8b54fcfe, 0xfe92df6a, 0x010401d4, 0xeb0189eb, 0xaffe0401, 0x8b6adfb7, 0xe3fcfe54, - 0x3ea972cd, 0x3a6161d6, 0xdefe50fe, 0xb0012201, 0x00030000, 0x0637ff5c, 0x82e005a4, 0x000d22bb, 0x26b7833b, 0x23010923, 0x84110311, 0x2f012206, - 0x85bf8501, 0x840f2005, 0x020f220f, 0x23c4821f, 0x011f013f, 0x0586c485, 0xc8340328, 0x14011401, 0x068598c8, 0x38d8023d, 0x4b604e72, 0x5a5a6048, - 0x184b2754, 0x394b4554, 0x155a364b, 0x39252539, 0x82365a15, 0x5445310c, 0x54274b18, 0x48605a5a, 0x724e604b, 0xfcfe5d01, 0x04229484, 0xb9825d02, - 0x3008d183, 0x1bc8fefc, 0x2d420438, 0x21665951, 0x48582a37, 0x645a7084, 0x8f523b4b, 0x4a656c43, 0x4b3b528f, 0x84705a64, 0x372a5848, 0x51596621, - 0x3804422d, 0x3b008200, 0xff4b0002, 0x05b50622, 0x000900d0, 0x0500002a, 0x15012d15, 0x010d3521, 0x17130135, 0x3f20ad8b, 0x0324d98d, 0x6d010307, - 0x04227e83, 0x7a820126, 0xd3fa2608, 0x1f6d6e4e, 0x756d3262, 0x615e7d75, 0x4994667d, 0x7d669449, 0x757d5e61, 0x62326d75, 0x4e6e6d1f, 0xcecea03e, - 0x080383a0, 0xfe540333, 0x73eccd7e, 0x426e54b0, 0x59a1b2cc, 0x36993184, 0x84319935, 0xccb2a159, 0xb0546e42, 0xcd090190, 0x00007efe, 0xff5e0002, - 0x05a2066a, 0x000b007b, 0x0e5b421f, 0x03270330, 0x27020b27, 0x021b3711, 0x13371337, 0x69421521, 0xc7fe2106, 0x86877487, 0x42a70221, 0xfc330777, - 0x629dfef0, 0xfeb2f7fe, 0xfe6501be, 0x07058467, 0x8267fe84, 0xb2be2f09, 0xfe62f7fe, 0x0300749d, 0x3eff5300, 0x9342af06, 0x002f2c06, 0x35211300, - 0x2135010d, 0x41211503, 0x80420507, 0x021b2205, 0x42798235, 0x072109a0, 0x20268503, 0x075442cb, 0x45035522, 0x21068c42, 0x8c42363b, 0x3b36210b, - 0x20068c42, 0x074b4296, 0xa0030428, 0xfea0cece, 0x864261fc, 0x9bfe2126, 0x00202f83, 0x04280082, 0x5effc800, 0xa6053806, 0x0f2bb582, 0x1f001b00, - 0x35250000, 0x43031521, 0x0b8b0b7f, 0x1123112e, 0xcc016c04, 0x64b4b4b4, 0xc0fcb4b4, 0x02270684, 0x64a05a31, 0x439c0464, 0xfe210595, 0x2507855c, - 0xb8f90e02, 0x62824806, 0x47010021, 0x0221058f, 0x2c6382a5, 0x15211300, 0x48065c21, 0xa502b8f9, 0x3a1c8246, 0xff560105, 0x05aa0508, 0x000f0015, - 0x00450039, 0x008f0065, 0x33350500, 0x5e062311, 0x332a0571, 0x01153311, 0x020e0714, 0x8b552307, 0x012e2105, 0x0e211a82, 0x52501802, 0x18042012, - 0x4b0a8650, 0x146308e8, 0x3736280d, 0x0617011e, 0x67250607, 0x26210fce, 0x10136a27, 0x21070632, 0xbc9c0115, 0x0b376507, 0x6e3d0b2c, 0x1c02a3a5, - 0x2c05da67, 0x22215b38, 0x04020d2d, 0x0e0f0a01, 0x20501825, 0xd9fe3212, 0x75424275, 0x8456fe41, 0x69492695, 0x22765741, 0x06104e5b, 0x08aa5218, - 0xe2025f08, 0x07cf39fe, 0x3b1b1c33, 0x1e2a1b32, 0x332c0515, 0x3713120a, 0x1c50664c, 0x190e0f1b, 0x201e1d2c, 0x52014f4f, 0xf5015bf8, 0x270a3b6b, - 0xfd77430a, 0xa5015bbc, 0x6b414049, 0x4d2a1b55, 0x36592928, 0x12140101, 0x0f101a12, 0x304c370e, 0x1e2a2b31, 0x1312211e, 0x92303044, 0x3c0e3c3e, - 0x04823f3f, 0xb2ca0131, 0x588154a9, 0x314b4d2d, 0x5d6a392f, 0x4a6a5d65, 0x682f088b, 0x292f07b8, 0x310c2e2a, 0x271d1038, 0x69141116, 0x1b390d9f, - 0x43441c1d, 0x0000005c, 0xff2e0104, 0x05c70508, 0x00130015, 0x004d0035, 0x13037986, 0x01301123, 0x10b55230, 0x30333023, 0x22038613, 0x82233011, - 0x15514e21, 0x2137276d, 0x8e612e01, 0x05c43708, 0x18092309, 0x62181962, 0x08240918, 0xb3816805, 0x687bb406, 0x3a6d2bfc, 0x02f8323b, 0x60bb609f, - 0x0102dcfe, 0x2d124812, 0xb32c2cb3, 0x2b08822d, 0x9f02fffd, 0x5501abfe, 0x620361fd, 0xc3222084, 0x41180b61, 0x17200ac4, 0x0805ec78, 0x2c515c45, - 0x1b312424, 0x0b321b1a, 0x28220b2d, 0x152a2c2e, 0x130d0a15, 0x262f515c, 0x1e1b1b27, 0x6b000100, 0x9506d300, 0x44003104, 0x32010000, 0x07141516, - 0x0607020e, 0x052e2223, 0x26272627, 0x06072223, 0x83010e07, 0x26450810, 0x36373435, 0x33063e37, 0x17051e32, 0x33161716, 0x013e3732, 0x023e013f, - 0x2a1e4c06, 0x66240b07, 0x2a6e7232, 0x2f444252, 0x49131b36, 0x305d7021, 0x12594643, 0x14110d10, 0x04122a1e, 0x381c140a, 0x4d404330, 0x08218b26, - 0x2a483231, 0x03161557, 0xca021f0b, 0x0f111e2a, 0x32934116, 0x472a1e72, 0x242e5539, 0x43a83184, 0x151e9846, 0x1e2a0a08, 0x1106141c, 0x3a522e22, - 0x891d2a44, 0x2a48281d, 0x0728287c, 0x8400130e, 0x000e2200, 0x84c982ae, 0x2004820a, 0x240b8602, 0x000d0001, 0x240b861f, 0x00070002, 0x240b863d, - 0x00260003, 0x200b8693, 0x20238204, 0x240b86d6, 0x010f0005, 0x2b0b8604, 0x010c0006, 0x0003002e, 0x00090401, 0x0b850085, 0x1a000124, 0x17860300, - 0x0e000224, 0x0b862d00, 0x4c000324, 0x0b864500, 0x23820420, 0x0b86ba20, 0x1e000524, 0x0b86e400, 0x18000624, 0x4c831401, 0x75004630, 0x6e007200, - 0x63006100, 0x20006500, 0x07824900, 0x0f826f20, 0x0000732e, 0x6e727546, 0x20656361, 0x6e6f6349, 0x52200e82, 0x67201f82, 0x6c202d82, 0x72282b82, - 0x65520000, 0x616c7567, 0x46210882, 0x212f8300, 0x07830074, 0x67007222, 0x3a204584, 0x59994982, 0x83002021, 0x0031221f, 0x22b28238, 0x82300031, - 0x82322005, 0x00322205, 0x2a738233, 0x46746e6f, 0x6567726f, 0x8c203a20, 0x280f827f, 0x312d3831, 0x30322d30, 0xa8278332, 0x825620b6, 0x00722490, - 0x84690073, 0x822020a6, 0x00302468, 0x842e0031, 0x00303007, 0x72655600, 0x6e6f6973, 0x31303020, 0x8230302e, 0x41b68d10, 0x0d41110e, 0x00002406, - 0x8b000200, 0x8b012000, 0x200b840c, 0x0805824e, 0x020001a0, 0x02010300, 0x04010301, 0x06010501, 0x08010701, 0x0a010901, 0x0c010b01, 0x0e010d01, - 0x10010f01, 0x12011101, 0x14011301, 0x16011501, 0x18011701, 0x1a011901, 0x1c011b01, 0x1e011d01, 0x20011f01, 0x22012101, 0x24012301, 0x26012501, - 0x28012701, 0x2a012901, 0x2c012b01, 0x2e012d01, 0x30012f01, 0x32013101, 0x34013301, 0x36013501, 0x38013701, 0x3a013901, 0x3c013b01, 0x3e013d01, - 0x40013f01, 0x42014101, 0x44014301, 0x46014501, 0x48014701, 0x4a014901, 0x75074b01, 0x3045696e, 0x07863046, 0x07863120, 0x07863220, 0x07863320, - 0x07843420, 0x85303121, 0x30312127, 0x31212785, 0x21278530, 0x27853031, 0x87303121, 0x86352027, 0x8636202f, 0x86372007, 0x86382007, 0x86392007, - 0x86412007, 0x86422007, 0x86432007, 0x86442007, 0x86452007, 0x85462007, 0x30312107, 0x31200786, 0x7f860786, 0x7f863120, 0x7f863120, 0x7f863120, - 0x7f863120, 0x7f863120, 0x7f863120, 0x7f863120, 0x7f863120, 0x7f863120, 0x7f863120, 0x7f863120, 0x7f863120, 0x7f863120, 0x85303221, 0x31322177, - 0x7f860786, 0x7f863220, 0x7f863220, 0x7f863220, 0x7f863220, 0x7f863220, 0x7f863220, 0x7f863220, 0x7f863220, 0x7f863220, 0x7f863220, 0x7f863220, - 0x7f863220, 0x7f863220, 0x85303321, 0x31332177, 0x7f860786, 0x7f863320, 0x7f863320, 0x7f863320, 0x7f863320, 0x7f863320, 0x7f863320, 0x7f863320, - 0x7f863320, 0x7f863320, 0x7f863320, 0x7f863320, 0x7f863320, 0x7f863320, 0x85303421, 0x31342177, 0x7f860786, 0x7f863420, 0x00343422, 0x01230083, - 0x4400ffff, 0x002607f1, 0x14000c00, 0x16820400, 0x00000224, 0x03860100, 0x00240985, 0x206855e0, 0x002c1182, 0x9ffffde0, 0x00000000, 0xaa4155e1, - 0xc915fa05, 0x00001e86, + 0x240d8247, 0x0085000b, 0x260f82b5, 0x012e005b, 0x845c004b, 0x822a2001, 0x82532005, 0x004b3203, 0x0053005e, 0x015c00c8, 0x002e0156, 0x001e006b, + 0x21018446, 0x0185007d, 0x13220d83, 0x018ca000, 0x64006422, 0x0320b582, 0x1c200386, 0x0123df85, 0x84030008, 0x001c2409, 0x82ec0004, 0x00082e1b, + 0x00020008, 0xe0200000, 0xff58e1f4, 0x260984ff, 0xff00e1f0, 0x82e3ffff, 0x8400200b, 0x0006222b, 0x260b820e, 0x00050004, 0x82070006, 0x8209202f, + 0x000b24c9, 0x820d000c, 0x000f2617, 0x00110010, 0x32c98212, 0x00150014, 0x00170016, 0x00190018, 0x001b001a, 0x821d001c, 0x1f8408a7, 0x21002000, + 0x23002200, 0x25002400, 0x27002600, 0x29002800, 0x2b002a00, 0x2d002c00, 0x2f002e00, 0x31003000, 0x33003200, 0x35003400, 0x37003600, 0x39003800, + 0x3b003a00, 0x3d003c00, 0x3f003e00, 0x41004000, 0x43004200, 0x45004400, 0x47004600, 0x49004800, 0x4b004a00, 0x4d004c00, 0x4f004e00, 0x51005000, + 0x53005200, 0x55005400, 0x57005600, 0x59005800, 0x5b005a00, 0x5d005c00, 0x5f005e00, 0x61006000, 0x0620c682, 0xc782ca85, 0x02010022, 0x02210582, + 0x23008d00, 0x03000001, 0x0d40118d, 0x043b22d3, 0x21d6826f, 0x0185002c, 0x003cba08, 0x04c60084, 0x05240564, 0x07d406c4, 0x08ea0758, 0x093409ce, + 0x0ab00a76, 0x0b880bfe, 0x0c2e0cee, 0x0d6a0de6, 0x0e640ed8, 0x10a40fca, 0x11bc105a, 0x12c6117e, 0x130c1392, 0x14d8138c, 0x16481598, 0x17121738, + 0x1b1e1b80, 0x1c341cae, 0x1fea1dc0, 0x20bc1f08, 0x21342180, 0x22fc218a, 0x27c82386, 0x28ca272a, 0x295229b0, 0x2a0a2ac6, 0x2ba42bbe, 0x2e162ef4, + 0x2e682e44, 0x30f02f8e, 0x306a300c, 0x311e31d2, 0x31ac3156, 0x32ec31de, 0x336433ba, 0x344034c6, 0x353a35bc, 0x36de35b6, 0x3642361a, 0x37e43690, + 0x378e371c, 0x37b437a0, 0x37dc37c8, 0x380438f0, 0x384c3816, 0x08c5827e, 0x3b000221, 0x15020000, 0x0300aa04, 0x2e000700, 0x2f0001b1, 0x0407b23c, + 0xb132ed00, 0x3cdc0506, 0x820203b2, 0xb100220a, 0x20168303, 0x27168305, 0x010607b2, 0x01b23cfc, 0x33371783, 0x25112111, 0x3b211121, 0x61feda01, + 0x9cfe6401, 0x56fbaa04, 0x8334043b, 0x80fc2557, 0x8003f5ff, 0x01200982, 0x002e5982, 0x21252105, 0x9a0533fd, 0x0007b3f9, 0x15820b0b, 0x02032508, + 0x040f0009, 0x00fd03f7, 0x0025001b, 0x0100002f, 0x16322130, 0x010e1415, 0x15070607, 0x17161716, 0x1415011e, 0x0e2f0b82, 0x37212301, 0x3d363221, + 0x23263401, 0x85333521, 0x2b4d0809, 0x010a0201, 0x1f8e7dbd, 0x1e202031, 0x2025251e, 0x14132b1f, 0x385f2322, 0x01a217fe, 0x48483f18, 0xfce8fe3f, + 0x3d42423d, 0x8dfd03fc, 0x324f3877, 0x08030c0d, 0x1c0d0d02, 0x3c3f581c, 0x27273536, 0x3e428b2c, 0x88423e31, 0x3a2e393e, 0x088f833e, 0x00910030, + 0x036f0663, 0x000f00a9, 0x002b0017, 0x27302500, 0x07302130, 0x12362330, 0x12163337, 0x23300117, 0x33300706, 0x11300126, 0x33302700, 0x03851330, + 0x0702062f, 0xea023011, 0x49c7fe4c, 0x2fbf2f8a, 0x080382ab, 0x068dfe34, 0x3cf73d3c, 0xf7fe8402, 0x04cc9b17, 0xce3794cb, 0xe3e3631d, 0x8c2e028c, + 0x8cd2fd8c, 0xb9b9c902, 0x01f0fdb9, 0x28d4014a, 0x75018bfe, 0x329afe61, 0x8282b3fe, 0x82030021, 0x07ab3a04, 0x03610300, 0x038c0358, 0x370000ba, + 0x33270226, 0x17021d30, 0x1d17041d, 0x91029003, 0x8211a314, 0x9126f147, 0x26869571, 0x3317011e, 0x4137013e, 0x0d860673, 0x37033d22, 0x04200289, + 0x17850b8a, 0x298211a3, 0x719126f1, 0x332e86a1, 0x23070206, 0x2e270226, 0x0e232701, 0x0d820701, 0x2622052d, 0x37013e27, 0x3233011e, 0x83263435, + 0x27262918, 0x36343526, 0x17163233, 0x2e2b2182, 0x06222301, 0x16171415, 0x85011e17, 0x14152302, 0x3b822506, 0x27222322, 0x27262882, 0x36373426, + 0x3c823e37, 0x07202182, 0x1d352c84, 0x33161401, 0x023e3732, 0x3523013d, 0x8e231133, 0x68185e18, 0x3400cc01, 0x0c040e04, 0x0e030e04, 0x0f7b0e39, + 0x0f030e39, 0x0e030d03, 0x2761cc04, 0x62186401, 0x3a0e7a19, 0x0c205c83, 0x0f3b5c82, 0xf0020f3c, 0x0b276e4b, 0x4d1d0c2f, 0x342a7731, 0x5a0a2409, + 0x65702a2b, 0x82246348, 0x1a3c0813, 0x37373140, 0x09311616, 0x44300924, 0x74131615, 0x090c4302, 0x2c34484f, 0x1320212b, 0x22121212, 0x5a3d5f22, + 0x531e3837, 0x483c4611, 0x1e485050, 0x16271a1a, 0xb75adf7c, 0x70be0170, 0x0010b8cd, 0x2d47014d, 0x1919681a, 0x01441967, 0xfe444410, 0x0a8244f0, + 0x1a681922, 0x015b0110, 0x4d474147, 0xfe70af08, 0x01457042, 0x671a4513, 0x1a671919, 0x45edfe45, 0x0b36380b, 0x2c290b2a, 0x0d2f2c6d, 0x15020702, + 0x5c512d2c, 0x0a343161, 0x24250b29, 0x162a342d, 0x08020c15, 0x171f0b02, 0x65293f17, 0x3e306e68, 0x292a1313, 0x42b84242, 0x282a2a42, 0x31472627, + 0x525c3931, 0x085c52a4, 0x1e312109, 0x9efe573b, 0x00070000, 0x0602ff52, 0x001a05ae, 0x0024001a, 0x00490038, 0x00780053, 0x05000080, 0x34352622, + 0x37023e37, 0x06070633, 0x07010e07, 0x33013e33, 0x14151632, 0x3d322706, 0x22233401, 0x0314011d, 0x33270226, 0x16171216, 0x37363317, 0x2a821236, + 0x21070227, 0x32211123, 0x27278317, 0x2e231307, 0x37232701, 0x27077948, 0x26220115, 0x34012e27, 0x37222a82, 0x23823336, 0x45061721, 0x98080b58, + 0x011e3736, 0x05010e17, 0x01150111, 0x01350111, 0x106d6ba2, 0x314f3a0f, 0x2a2a3b8a, 0x09251d1e, 0x3147110c, 0x6a6e5f51, 0x1f6c6d6d, 0x6b218321, + 0x0e145013, 0x0e0e0c0e, 0x69144e14, 0x01208321, 0x0901658f, 0x392b2c56, 0x0871803a, 0x9b781756, 0x24262624, 0x3aad029b, 0x2321225d, 0x2e222123, + 0x33563b2e, 0x490d1f33, 0x44353e12, 0x36444c4c, 0x380f1242, 0xfe69200e, 0xfe2801e4, 0xfdd8fe72, 0x3d3c7f84, 0x22606f3c, 0x2928292d, 0x2f325628, + 0x6a676a31, 0x19775577, 0x08028277, 0x70180356, 0x466fbf01, 0x4e46e7fe, 0x464e4f4f, 0x6f461901, 0x027041fe, 0x6034339e, 0xfe11604d, 0x36c913e7, + 0x3e2a2655, 0xfede262a, 0x2a2a278e, 0x2a84b684, 0x2514142a, 0x29074a25, 0x525f3239, 0x365e53a1, 0x0921083b, 0xfeb24e4a, 0x82100134, 0xcd0192fe, + 0x0082effe, 0x043f0082, 0xab002000, 0x6103e006, 0x15000b00, 0x74004a00, 0x30370000, 0x32213011, 0x2b061416, 0x49011901, 0x012008b7, 0x2205ce46, + 0x82161716, 0x06d04612, 0x35012e28, 0x33023e34, 0xd1461732, 0x06072c08, 0x1f161415, 0x15011e01, 0x46020e14, 0x2e2105cd, 0x21248502, 0xc6461716, + 0x3736230c, 0xc846013e, 0x21d10806, 0x665d2001, 0xadb45d66, 0x292f2e2a, 0x55dd02ad, 0x320c2a76, 0x2b2b230d, 0x2e414136, 0x0a270a3b, 0x3d216262, + 0x384c3656, 0x320d2837, 0x384b1a0d, 0x34202039, 0x5d643c37, 0x025a3f20, 0x5e0a04dd, 0x4a663c4c, 0x6c4d2a29, 0x237d5a42, 0x3d511359, 0x50616150, + 0x161d1c20, 0xf38a1916, 0x9e02b75f, 0xfe6db96d, 0x2b6a01f5, 0x2b292e28, 0x343db6fd, 0x2b0c2f0b, 0x313a1716, 0x020c2e27, 0x5c120207, 0x31482c51, + 0x321a1b1b, 0x210b2d0b, 0x2c181729, 0x0c0b292a, 0x2f505d13, 0x711d374d, 0x572d4031, 0x81545482, 0x47502e58, 0x663b2f34, 0x665d6e5d, 0x0f100809, + 0x5d34202f, 0x05009bfe, 0xab002e00, 0x6103d206, 0x1f001200, 0x34002a00, 0x00004601, 0x07684225, 0x32013e28, 0x0e14021e, 0x83422702, 0x06222a05, + 0x1614011d, 0x32211105, 0x0f5e4117, 0x012e052c, 0x071d2327, 0x170f1d17, 0x02870e1d, 0x05820b85, 0x23110133, 0x12163311, 0x17011e17, 0x27053d33, + 0x3d270f3d, 0x8802870e, 0x11042d0b, 0x26231133, 0x3c330102, 0x23222360, 0x5f3a0282, 0x2344607a, 0x3c614423, 0x904f4f48, 0xdf014f4f, 0x2c560901, + 0xa356572b, 0x0082259a, 0x63029a26, 0x0c092208, 0x28073244, 0x85217562, 0x08230822, 0x2310880d, 0xac852176, 0x2d074c42, 0x84542828, 0x275484b6, + 0xa2525d5a, 0x04845d52, 0x9e024f33, 0x67c13433, 0x6901f1fe, 0x293d2a25, 0x5315b226, 0x4d7f4415, 0x02284dae, 0x9e0270fe, 0x43f4fe43, 0x26808840, + 0x62fd9001, 0x430c0143, 0xa53a055f, 0x5b065400, 0x2f00b803, 0x54004800, 0x00005e00, 0x0e233025, 0x2e222301, 0x8a443502, 0x083e4307, 0xe3490620, + 0x37362106, 0x3d350182, 0x21352301, 0x21012311, 0x14151632, 0x010e0706, 0x021e1507, 0x300b8217, 0x23020e07, 0x32333721, 0x013d3637, 0x2b262734, + 0x0a5d4d01, 0x04e54108, 0x4a60740e, 0x35345c80, 0x43433030, 0x2b9c7153, 0x18124a12, 0x79634d65, 0x24286379, 0x101b1b24, 0x2f01ac10, 0x01060177, + 0x1b776972, 0x1a341514, 0x11353d1a, 0x39101113, 0x68fe2f4f, 0x1e35e987, 0x6a080082, 0x33d2e935, 0xd2333737, 0x38503de2, 0x686aa26d, 0x1c3738a2, + 0x0b59631c, 0x493b0b2b, 0x7588757f, 0x130b0a7f, 0x271e1d14, 0x41fe7541, 0x62764603, 0x1515422f, 0x01070314, 0x25242f16, 0x2d2c3235, 0x1b752541, + 0x3429331c, 0x33711c1b, 0x33302730, 0x05000000, 0xab003500, 0x6103cb06, 0x46001f00, 0x60005300, 0x00006600, 0x44262225, 0x362c131b, 0x17011e37, + 0x21060706, 0x27012e22, 0x36232182, 0x46013e37, 0x14820506, 0x1632072a, 0x33033e17, 0x15021e32, 0x08105843, 0x352135a8, 0x33371236, 0x23153311, + 0x11332515, 0x01010e23, 0x2696834e, 0x58416949, 0x115b2176, 0x594d3b48, 0x4c3d4d59, 0x0e3a0f12, 0x013c3d21, 0x3c5738fc, 0x232c1011, 0x90295523, + 0x212d2d39, 0x0d161722, 0x0b010402, 0x2030251c, 0x1d35482a, 0x35573e21, 0x7541413b, 0xa1024242, 0xb52dc9fe, 0x5b5b8e2e, 0x07dbbefe, 0xb1ac8e23, + 0x588154a9, 0x324b4d2e, 0x5d6a3930, 0x3f6a5d66, 0x09230931, 0x24292949, 0x3d303044, 0x36368049, 0x27291c53, 0x2d292826, 0x0101362d, 0x0f1b2315, + 0x2f4d371c, 0x213c5333, 0x0d3d3e58, 0x04843e3d, 0x834d2f08, 0x2a014a5d, 0x553afe4a, 0x6301d883, 0x0800ed3b, 0x08ff4b00, 0x1505b506, 0x16000c00, + 0x28001c00, 0x68005c00, 0x9b007200, 0x30170000, 0x35443011, 0x11012112, 0x3323ec83, 0x87152111, 0x06a64501, 0x4c2d754c, 0x232406b4, 0x03133313, + 0x0f2a0b85, 0x3e253301, 0x0e233701, 0x02820701, 0x02821382, 0x011e2327, 0x11231117, 0x05af4c33, 0x1e823320, 0x33290282, 0x01b02311, 0x2c2c5609, + 0x07564458, 0x66ca0130, 0x850186f4, 0x0301e1fe, 0x1f01fdfe, 0xdd4be7fa, 0x0925210c, 0x2207dd4b, 0x4b0c2e0c, 0x300811dd, 0x09220938, 0x082309e1, + 0xca81c964, 0x030e04f1, 0x040e030d, 0xd002b03b, 0x0b010402, 0x16071f08, 0x57151657, 0x081f0815, 0x0105010b, 0x48127862, 0x200b8212, 0x08038209, + 0x12471254, 0x02f86277, 0xc233349f, 0x01f1fe67, 0x3e292669, 0xbcfd2529, 0xbbfd9f02, 0x5a9f025a, 0x5acf58c4, 0x35395703, 0x2a0b2b0b, 0x2f2c6e2c, + 0x0208020c, 0x512c2d14, 0x3431605d, 0x240a290a, 0x2a342d25, 0x020b1616, 0x200a0308, 0x293f1717, 0x1f0b6964, 0x02821f7c, 0x61334082, 0x4111e001, + 0x11411010, 0x4c1390d3, 0x134b1314, 0x822db62d, 0x49132202, 0x290b8213, 0x9f0263fe, 0x16279d27, 0x02821658, 0xfd2c0882, 0x00000061, 0x00290004, + 0x03d706ab, 0x22055347, 0x4746003a, 0x40471a53, 0x011d2611, 0x33161714, 0x07044332, 0xdc412520, 0x2921080a, 0x655e2001, 0xadb35d66, 0x292e2e29, + 0x840f03ad, 0x69492695, 0x3b3b5741, 0x0f3d0f22, 0x4e3b4811, 0x3500822c, 0x134c3c4e, 0x220f3a0e, 0x2d013d3c, 0xbffeae01, 0xddfe2301, 0x05474101, + 0xa9b13410, 0x2d598154, 0x084b2627, 0x39300822, 0x665d3535, 0x4235355d, 0x0b2a07c6, 0xba609e02, 0x0060c460, 0x5f510300, 0x01082e82, 0x0502ff6d, + 0x001a0593, 0x00550044, 0x2991826d, 0x00ab009e, 0x00e300d5, 0x58472500, 0x22232c05, 0x012e0706, 0x3e373627, 0x44363701, 0x0722051b, 0x8f52020e, + 0x07062109, 0x232a0182, 0x27022e22, 0x16171637, 0xd6481e17, 0x01352109, 0x37066444, 0x33023e37, 0x06101632, 0x023e3227, 0x2e34013d, 0x010e2202, + 0x011d0607, 0x8205a14f, 0x35022525, 0x35373634, 0x2005f248, 0x4a428232, 0x15240563, 0x1415011e, 0xe1476b82, 0x4713200c, 0x25200bee, 0x07211e83, + 0x82998223, 0x26222302, 0x2d820627, 0x27222323, 0x204f822e, 0x20b08337, 0x204c8533, 0x82c98807, 0x16550873, 0x3c3e4b02, 0x4330313a, 0x0c300c17, + 0x3314130f, 0x2f2b2021, 0x0a213a50, 0x1a2f240a, 0x131a191d, 0x1f221613, 0x362c2d1f, 0x2a36472f, 0x0e0c500f, 0x2e11120e, 0x45413e1c, 0x9802473f, + 0x0e3c5c3e, 0x3c0e0f0f, 0x767d3e5c, 0x31237d76, 0x1e0e0e1e, 0x1f314531, 0x08008207, 0x31100fb3, 0x593bf8fd, 0x3c4a1f3d, 0x371e3e34, 0x29296853, + 0x3f0f0f38, 0x104a3d34, 0x3a5a3c10, 0x7942423c, 0x373d4242, 0x3a6f3b3b, 0x1652033a, 0x29564516, 0x225b3890, 0x010d2d21, 0x0e0a0105, 0x2030260e, + 0x3524242a, 0x1f11101d, 0x3836561f, 0x113c2c2b, 0x413bec10, 0x413b3a42, 0x29359941, 0x2c312e07, 0x0a2a0a26, 0x1d141516, 0x2d17090a, 0x1a202841, + 0x06192819, 0x0d0d0604, 0x25391415, 0x191a482c, 0x21140e0e, 0x143e172c, 0x0c0c1111, 0x07343a0d, 0xfe5c3634, 0x40582f6a, 0x41525340, 0xb72f5940, + 0x5cb6b8fe, 0x2c49331c, 0x34482c75, 0x24341c1c, 0x08098224, 0x1a23252e, 0x06031c1a, 0x2a47341d, 0x07115143, 0x263a4e13, 0x0d192d40, 0x20202d0c, + 0x134e3a26, 0x43511107, 0x3424232a, 0x3238571d, 0x37373213, 0x38270482, 0x2e303a01, 0x84302e10, 0x1f2a0804, 0x6b404149, 0x4e291b55, 0x365a2828, + 0x12140101, 0x0e0f1b12, 0x304c360f, 0x1d2b2a32, 0x1312221e, 0x93303044, 0x3c0e3c3f, 0x04823e3e, 0x82003f21, 0x00043700, 0x06b70078, 0x00560388, + 0x0027000f, 0x00400037, 0x11300100, 0x03842330, 0x2130352a, 0x13301530, 0x33303530, 0x1b830f8a, 0x17823320, 0x27302122, 0x81542782, 0x010e3c0c, + 0x012e3307, 0xc86cac01, 0x5b53fc01, 0x5c24015b, 0x3c2b025c, 0x266f3afb, 0x82882699, 0xfe430803, 0x411005d7, 0x4010c610, 0xc2fdf502, 0x60603e02, + 0x0158c2fd, 0xfe5858ee, 0xb5b55812, 0x70be0170, 0x7042fe70, 0xc5313a02, 0x00c53131, 0x08000500, 0xf806ab00, 0x34006103, 0x46003e00, 0x58005000, + 0x4b370000, 0x272a329f, 0x13230723, 0x17121633, 0xa1862301, 0x42081190, 0x2a7655fd, 0x230d310d, 0x40372b2b, 0x0a3a2e41, 0x62620a28, 0x36563c22, + 0x2738384c, 0x1a0d320d, 0x203a374b, 0x3c36341f, 0x3e215d65, 0x3dd0025a, 0xe46e3bfa, 0x26982689, 0x1104d7fe, 0x10c51040, 0x91280340, 0x4bac2013, + 0x0b242c82, 0x9e02b5b5, 0x210a0041, 0x108ef7fd, 0x00820020, 0x60000334, 0xa006ab00, 0x15006103, 0x4b002b00, 0x30250000, 0xaa463003, 0x0206240e, + 0x41352107, 0x052013b1, 0x2d1d8748, 0x70db3c01, 0x0a124712, 0x0b040b2b, 0x09820b2b, 0x95256d25, 0x414b0125, 0x012605c7, 0x26968384, 0x6148684a, + 0x02b72814, 0x37dd379e, 0x82279b27, 0x83088202, 0x07d641c3, 0x41480b20, 0x2acb8217, 0x00470004, 0x03b906b7, 0x820b0056, 0x002122cd, 0x183f4629, + 0x280a1b46, 0x11231101, 0x15213523, 0x074c4d48, 0x2e2e2928, 0x1402ad29, 0x0246ad01, 0x7b012507, 0xfc01c86c, 0x200f0846, 0x06ea45c1, 0x423e0221, + 0x7f820579, 0x934f0620, 0x001e3408, 0x003d0027, 0x0058004e, 0x0500007e, 0x35262722, 0x84363734, 0x33302501, 0x0607020e, 0x2005944f, 0x08954f17, + 0x011d2224, 0x944f0114, 0x0a125606, 0x964f0620, 0x010e212d, 0x3f12974f, 0x366b7a03, 0x1d0f1037, 0x3128271d, 0x3a553b8a, 0x0c0a1212, 0x51314711, + 0x6a6e2f30, 0x09fed96d, 0x2606924f, 0x0c051304, 0x4f051205, 0x14221294, 0x944f144d, 0x3a0e2217, 0x0e954f0e, 0x4242fd35, 0x3d3d3c7f, 0x2f303836, + 0x50522d23, 0x2f332a2b, 0x4f353531, 0x1a221390, 0x02821a69, 0x2211924f, 0x4f2eb62e, 0x08221592, 0x934f0820, 0x06003c0d, 0x08ff1701, 0x1505e905, + 0x17000b00, 0x4b002d00, 0x5f005500, 0x30050000, 0x82333011, 0x30212203, 0x87078415, 0x05c6500b, 0x36343533, 0x32013e37, 0x011e1716, 0x0e070614, + 0x36322701, 0x2b018237, 0x2734013d, 0x012e2726, 0x07062223, 0xbf460182, 0x11052107, 0x2412d14f, 0x11016ccc, 0x08038263, 0x4210fd22, 0x2926266a, + 0x6a262629, 0x26256b83, 0x25262a2a, 0x4026416b, 0x0c0d1617, 0x17160d0c, 0x3f282640, 0x3f220b87, 0x8348f401, 0x02f8250c, 0x60c1fd9f, 0x032b0484, + 0x2b2c2d57, 0x82545582, 0x832d2c2b, 0x83a92009, 0x1b612d08, 0x25251919, 0x252e692e, 0x1b191925, 0x562f0c8c, 0xb86e9f02, 0x01f5fe6e, 0x2e282c6a, + 0x82002c28, 0x0a0036f0, 0xf606ab00, 0x12006103, 0x3a003000, 0x4a004400, 0x22250000, 0x0640502e, 0xaf07494f, 0x33112fe6, 0x01152111, 0x4c6a422c, + 0x6a4c2929, 0x07854142, 0x5d21e09b, 0x08644966, 0x13022208, 0xac10016d, 0x5482572d, 0x2d588254, 0xa882582d, 0x602d5782, 0x25191a1b, 0x2e6a2e24, + 0x1a192524, 0x200c8c1b, 0x0e6d5055, 0x9e02c128, 0x0060c2fd, 0xcb820400, 0xb606ab2c, 0x13006103, 0x2d002200, 0xd3436600, 0x15302306, 0x03882130, + 0x01301126, 0x17323330, 0x0124e883, 0x012b0607, 0x2405ba52, 0x012b2627, 0x064d5811, 0x24077e51, 0x2e272627, 0x22028201, 0x51373435, 0x06230d80, + 0x51171415, 0x24080680, 0x0e070607, 0xa3014a01, 0x1301cafe, 0xc301edfe, 0x343441ed, 0x4a29294a, 0xed413434, 0x2e5c4bed, 0x02804b2e, 0x05de45dc, + 0x2b2a2427, 0x17414037, 0x05df4517, 0x3d111124, 0xe0453556, 0x4a2b0807, 0x1a3f3a38, 0x653c361a, 0x1f10115d, 0x02b75920, 0x60ba609e, 0x9e02dcfe, + 0x7d541515, 0x15547da8, 0x5b5e6015, 0x2f2f5b6c, 0x456b22fe, 0x17210ad6, 0x075a5117, 0x51242421, 0x2908095b, 0x142a2c2f, 0x130c0b15, 0x272f515c, + 0x1d1c1b26, 0x00040000, 0x0663008f, 0x00a90371, 0x002f0015, 0x00430039, 0x01302500, 0xec503330, 0x06535a06, 0x07020628, 0x16322101, 0xd4491415, + 0x22df840b, 0x52372123, 0x064f08a2, 0xa2012e09, 0x168dedfe, 0x360f1659, 0x380f050b, 0x3709820b, 0x2fb92f89, 0x7301c201, 0x291b7768, 0x1e191934, + 0x241b1a1f, 0x1d1c1110, 0x2106f54e, 0xf34e3c3c, 0x03633407, 0xecfe4546, 0x29c53645, 0x4525c837, 0x8c451401, 0x4e8cd2fd, 0x2a3605e4, 0x01070314, + 0x18170b0b, 0x2c323549, 0x2521202d, 0x29333775, 0xe34e3734, 0x32013409, 0xce0508ff, 0x26001405, 0x78003300, 0x9b008a00, 0x4e050000, 0x01202ec4, + 0x3241d14a, 0x2327012e, 0x33112311, 0x17011e13, 0x11331133, 0x82352123, 0x020e2604, 0x36272607, 0x08108237, 0x70021530, 0x103d5738, 0x23222c10, + 0x39902a55, 0x21222d2d, 0x010c1717, 0x1c0a0105, 0x2b1f3125, 0x221e3547, 0x3a35573d, 0x41754242, 0x3f440241, 0x884a393b, 0x34132108, 0x2206884a, + 0x4a230a0b, 0x3c080788, 0x2c1f1f23, 0x472f362c, 0x4f0f2937, 0x110e0e0d, 0x3e1d2d12, 0x47404541, 0x3408b2fd, 0x7968030e, 0x08340edb, 0x01796703, + 0x1708bc43, 0x02123e34, 0xa5565540, 0x4425f8a3, 0x493c3030, 0x0d284f81, 0x24144708, 0x361d0f1b, 0x53332f4d, 0x3e59223c, 0x3f3c0d3d, 0x3d0d3c3f, + 0x353d013e, 0x312e0729, 0x2a0a262b, 0x1414160a, 0x1709091e, 0x2028402d, 0x19271a1a, 0x0c060506, 0x3815140e, 0x1a482c25, 0x150e0e1a, 0x3f172b21, + 0x594a1015, 0x33350806, 0x4a035c36, 0xfe1b6310, 0xfe9e0200, 0x10631b8d, 0x62fd0102, 0x18f5015a, 0x02134338, 0xfd5d5c3a, 0x03005abc, 0xab001b00, + 0x6103e506, 0x5c003900, 0x00007f00, 0x0d474925, 0x22056843, 0x43262726, 0xea541069, 0x0607260a, 0x21010e07, 0x051d4722, 0x33013e23, 0x0fd05132, + 0x5b563620, 0x2722a205, 0x77541001, 0x0c320d2a, 0x43057049, 0x312c0691, 0x3c111131, 0x374c3657, 0x330c2738, 0x080b7349, 0x1f101123, 0x29025a1f, + 0x13139584, 0x42682524, 0x0f227657, 0x48120f3d, 0x58584e3a, 0x124c3c4e, 0x220f3a0f, 0x491e9e79, 0xb4430b8b, 0x2e2e2306, 0xb5432c51, 0x1717230b, + 0x11552a2d, 0x26272d06, 0xb11d1c1b, 0x404154a9, 0x4d2e2c2c, 0x51053b4e, 0x52200a00, 0x00281a9a, 0x4f000500, 0xb106ab00, 0x21092b55, 0x2b554000, + 0x21012234, 0x08028235, 0x06152128, 0x01210702, 0x22603d54, 0x22232322, 0x60796022, 0x44242444, 0x4e483c60, 0x4f4f904e, 0x0901de01, 0x572c2b57, + 0x8957a357, 0x60032e05, 0x420141fe, 0xa601cdfe, 0x0136d636, 0x2bd9544c, 0xbcfd2a08, 0x59ea015b, 0xbafe525b, 0x00070052, 0x0608ff2e, 0x001505d2, + 0x0033001c, 0x00530047, 0x0073005d, 0x37000091, 0x15300706, 0x05034c30, 0x33301132, 0x37363736, 0x07063330, 0x23171216, 0x1101012e, 0x450ae545, + 0x26230cf1, 0x49333027, 0x33200629, 0x1122cf82, 0x7d570130, 0x012e2118, 0x082df347, 0x1a42f736, 0x48046d6d, 0x7f5a5a18, 0xba32ae41, 0x92278316, + 0xad01a501, 0x2301c0fe, 0x4001ddfe, 0x73742201, 0x1b6d1b7c, 0x1b6c1b03, 0x2da41878, 0x20014afb, 0x5e65655e, 0x20075d50, 0x29144817, 0x4b412308, + 0x9f02d01e, 0x1e5cacfe, 0xce4d6d6d, 0x21e8fe4b, 0xe2fee13d, 0xbb609f02, 0x0160c460, 0x32cbcc08, 0x028232c7, 0xe2fe2927, 0x03f6fe4e, 0x0df84762, + 0x48b5fd21, 0x00212d37, 0x8f836200, 0xca000535, 0x360608ff, 0x0f001505, 0x33001700, 0x92006600, 0x4e050000, 0x062a1105, 0x26333007, 0x27012e05, + 0x494e3023, 0x30332605, 0x17011e13, 0x06e74933, 0x59302321, 0x26211063, 0x0a625927, 0x5905ad5a, 0x26230d61, 0x82332702, 0x17162142, 0x53078e53, + 0x3727069c, 0x06333736, 0x82230702, 0x27262f6c, 0x0e070623, 0xf8020701, 0x6e3afb3d, 0x704e9826, 0x31303407, 0x190230c6, 0x0208340e, 0x08db7968, + 0x67030e34, 0x445bfc79, 0x0e48057c, 0x3a2e3505, 0x62621e1e, 0x36563d22, 0x2738374c, 0x4a1a4903, 0x201f3a38, 0x0807eb4d, 0x1a90015e, 0x0d6e1a6a, + 0x1718092e, 0x0a240803, 0x790f360b, 0x090a360e, 0x31030923, 0x1c6b2323, 0x0d7a1b6e, 0x19191039, 0x10191902, 0xb6f80d3b, 0xbf0170b6, 0x41fe7070, + 0x943b0270, 0x1b349494, 0xfffd0f64, 0x8dfe9f02, 0x021b640f, 0x0361fd01, 0x0c343d57, 0x162b0b2f, 0x27313a16, 0x05060b2e, 0x35069459, 0x02321b1a, + 0x17282241, 0x2a2a2c17, 0x5c130d0a, 0x364d2f51, 0x4b830b1e, 0x2ddb3b33, 0x981e706f, 0x3cdc2b29, 0x252bdc3c, 0xa1de2594, 0x235f83a2, 0x663fea32, + 0x3f370082, 0x040032ea, 0x0eff1801, 0x0f05e805, 0x3a001b00, 0x57004300, 0x41250000, 0x21221a7d, 0xfc542330, 0x23072405, 0x8237013e, 0x0898430a, + 0x07010e27, 0x1101011e, 0x07c54333, 0x76411120, 0x82332006, 0x06b54327, 0x0ccd3608, 0x67030c32, 0x310ddb78, 0x7968030c, 0x1b7f3f03, 0x1b021b6d, + 0x24781b6b, 0x8b232491, 0x66198023, 0x671a0219, 0x8c24781a, 0xfb932524, 0x11016cd9, 0x9a260101, 0x07804326, 0x27772308, 0x1781279a, 0xfffd185f, + 0x8efe9e02, 0x02175f18, 0x2d62fd00, 0xb22c2cb2, 0x39e5392d, 0x2936db36, 0x028229a7, 0x36da363e, 0x2903e639, 0xc2fd9e02, 0x44080160, 0x32430f01, + 0xc73131c7, 0xf2fe4332, 0x00f6fe43, 0x06220082, 0xf3823601, 0xf382ca20, 0x1e00142f, 0x32002a00, 0x52004600, 0x30050000, 0x05574423, 0x06141522, + 0x1720cb82, 0x220f195d, 0x65072327, 0x0b500830, 0x03022107, 0x220e3f4f, 0x4e210302, 0xa33a0b70, 0x5a21016d, 0x18414268, 0x16791861, 0xac85165a, + 0x292f2e2a, 0x3db603ac, 0x66423bfa, 0x4010340a, 0x4010c510, 0x6e6e79fd, 0x11481171, 0x040a2b0b, 0x820b2c0b, 0x706e2409, 0x4e68016f, 0x2008099c, + 0x6c9e02f2, 0x145f485d, 0x2d2fbc2f, 0x2b5b2db5, 0x2b282e29, 0xb696fed5, 0xbf0170b6, 0x41fe6f6f, 0x06fd5070, 0x01590125, 0x4f4f014f, 0xfe240b55, + 0x02b1feb1, 0x3007ae54, 0xa9000200, 0x57066300, 0x1d00a903, 0x00003300, 0x05d34125, 0x8d510620, 0x0eb64105, 0x50051621, 0x1949050d, 0x30400808, + 0x30153033, 0x27a07603, 0x64041390, 0xc2189664, 0x17bc3335, 0x207f20a0, 0x20812002, 0x33be1796, 0xeb2d018a, 0x4f411c0a, 0x95500316, 0x63ccce41, + 0xa720ed41, 0x330127a7, 0x26014f53, 0x34d03424, 0x24340282, 0xd74fdbfe, 0x720271d7, 0x1754461e, 0x47a14802, 0x00712bfd, 0x01e71e10, 0x01063481, + 0x0502ff28, 0x001a05d8, 0x0025000f, 0x00560043, 0x537c0074, 0x5b4f11d3, 0x4e012033, 0xa6512ba1, 0x67022807, 0xfb01c76d, 0x4f417301, 0x82210770, + 0x05824f6b, 0x27416b22, 0x2509794f, 0x16402727, 0x00820d16, 0x4016162c, 0x6b41d0fd, 0x4c29294c, 0x0787416b, 0x87412621, 0x2641341c, 0x17163f28, + 0x0c0d0d0c, 0x023f1617, 0x01c86ced, 0x514c01fc, 0xfd3605cf, 0x2c2b2db7, 0x81555482, 0x2d2d2c2c, 0xa9812c2c, 0x2d2b2c82, 0xc04e1a61, 0x24252106, + 0x2105c04e, 0xcd4e2524, 0x031a2406, 0x83572d01, 0x2d58232e, 0x2c82582d, 0x2b8a5720, 0x4e09c24f, 0x1a2205f9, 0x3352e801, 0x00073608, 0x06fdfe33, + 0x000905c2, 0x0016000c, 0x0061003c, 0x009c0086, 0x19b95aa2, 0x510f8b61, 0x012014f4, 0x2106835a, 0x7f5a010b, 0x2c24a51a, 0x32161411, 0x33113536, + 0x0e071411, 0x05934d02, 0x3e5b1120, 0x09012406, 0x4a2b2c57, 0x022a0828, 0x215e3aad, 0x21232321, 0xb2612f21, 0x0c1d5205, 0x0e390e39, 0xc3026920, + 0x0b010501, 0x82081f08, 0x081f0782, 0x0104010b, 0x5a137862, 0x0729058b, 0x47120820, 0xfb627712, 0x202282c0, 0x261d820c, 0x1e088282, 0x83020c08, + 0x49122222, 0x25338212, 0x07200808, 0x22824812, 0x38640133, 0x0c65388e, 0x7f58350c, 0x0c0c3657, 0xf4663602, 0x0fc15af8, 0x27b12008, 0xb6842a2b, + 0x132b2a83, 0x4a252514, 0x39082008, 0xa1535e32, 0x3c365e53, 0x4a082109, 0x5aa8014f, 0xfe230592, 0x5a1001f0, 0x04211790, 0x0823a1ff, 0xfe9f0232, + 0x4d4d514e, 0xfeb20151, 0x3232445e, 0x411f1f41, 0x01443232, 0x0261fda2, 0x5abbfd9f, 0x04000000, 0x02ff4d01, 0x1a05b305, 0x51001700, 0x9d008b00, + 0x50059f52, 0xd54a09bb, 0x14aa5009, 0x4823414d, 0x7a4d0efe, 0x4e012029, 0x012110f1, 0x095a4685, 0x544b0138, 0x320c2a76, 0x2c2a240c, 0x17424036, + 0x280a3b17, 0x3131610a, 0xd9481110, 0x330c2306, 0x53621a0c, 0x653b2906, 0x2010105d, 0x8bfd5a1f, 0x0d233284, 0x862b2b23, 0x0a272e32, 0x11313162, + 0x36563c11, 0x2837384c, 0x2132890d, 0x3282643c, 0x5b1f1f2b, 0x310ce201, 0x7968020d, 0x230682db, 0xf2796703, 0x32069246, 0x0c343d0b, 0x162b0c2e, + 0x27313916, 0x020b1718, 0x4d120207, 0x22250d5e, 0x2c171728, 0x0b5e4d2b, 0xb1620321, 0x7e012133, 0x2f0f3c48, 0x02000000, 0x5400cf00, 0xb8033106, + 0x4a003400, 0x2010d94e, 0x05666a26, 0x4a08805c, 0x4052095e, 0x020e2207, 0x0d354301, 0x2e278708, 0x02113502, 0x34946a02, 0x2d0f3f0f, 0x50443635, + 0x25493a52, 0x3d3d7b25, 0x446b4c2a, 0x3146465e, 0x5d21045b, 0x28284746, 0x4b442021, 0x4e29747e, 0x52f90170, 0x108551c5, 0xae764b11, 0x214b3b3b, + 0x0f404d55, 0x1c360f3a, 0x313d481b, 0x06070e3a, 0x65393a17, 0x213e5938, 0x513e2121, 0x1d322a03, 0x1a34381c, 0x18100d1a, 0x613a6573, 0x54032544, + 0x6c6bfcfd, 0x04026b6c, 0x435c11fe, 0x152b5744, 0x5c865816, 0xdb82ef01, 0x07732d10, 0xff0a393d, 0x05f60608, 0x000e0015, 0x002b0018, 0x00530049, + 0x0063005d, 0x33300100, 0x2009505c, 0x067e5a2b, 0x012b2623, 0x2ce24c11, 0x3a146b5c, 0x21113311, 0xed760215, 0x25256841, 0x25252929, 0xeded4168, + 0x4b5c5c4b, 0x5b49fe80, 0x013c3a98, 0x2a292ba7, 0x2a7ea77e, 0x5f602b29, 0x5f5b6b5b, 0xf70221fe, 0x5582572d, 0x2d578254, 0xa9200782, 0x61290682, + 0x2519191b, 0x2f692f24, 0x07bf4c24, 0x825c0c88, 0xc0fd2e0e, 0xc2fd9f02, 0x00050061, 0x06ab0003, 0x0aa756fd, 0xa7565920, 0x4c052034, 0x082024bd, + 0x6b11c056, 0xa4200dae, 0x2006c056, 0x05744c96, 0x4c830721, 0x61200774, 0x560f0067, 0xa73a2bd4, 0x13134c13, 0xeffe124b, 0x4a121101, 0x134a1312, + 0x9e0263fe, 0x16279c27, 0x02821659, 0xfd220882, 0x00820062, 0x22000331, 0xde06ab00, 0x1b006103, 0x6c003300, 0x53130000, 0xe7561c41, 0x14114c15, + 0x59012e21, 0xbc5c1052, 0x53d7200f, 0xdb28054d, 0x030c320c, 0x40017968, 0x200abc56, 0x2fb85c4c, 0x4b2a0221, 0x18240a21, 0x62fd0102, 0x6e09a14b, + 0xb55c080f, 0x00250827, 0x7c010700, 0x840502ff, 0x37001a05, 0x68005b00, 0x9c007500, 0xd500a900, 0x30010000, 0x07010e21, 0x3e373633, 0x07886602, + 0x0607012e, 0x2e272223, 0x27262701, 0x1e171637, 0x15791782, 0x06222205, 0x23148207, 0x2137013e, 0x663a5e66, 0x246b07bf, 0x011e220d, 0x17246b33, + 0x82352121, 0x05296071, 0x22232624, 0x8383020e, 0x02233c82, 0x82171632, 0x06c97901, 0x3708c282, 0xfe260321, 0x020c03d7, 0x0d0d0b06, 0x2b1c2b20, + 0x101f364b, 0x2c2d3d10, 0x23232d39, 0x10131434, 0x0d0e0c4f, 0x3b1c2b23, 0x2b3b4141, 0x3c0f1234, 0x0411040f, 0x69017c01, 0x37245d66, 0x17fe3b3b, + 0x103c5837, 0x23232c11, 0x38902955, 0x22212d2e, 0x010c1716, 0x21097d6b, 0x7d6b221e, 0x41590806, 0xfe500341, 0x248f2339, 0x3a1b1b33, 0x1f291c32, + 0x3f100614, 0x12120b10, 0x50664c38, 0x0f0e1c1b, 0x1e1d2d19, 0x1a691a20, 0x4e015201, 0x14289e27, 0x0c171010, 0x314e361c, 0x3d2a2a32, 0x0a0a1011, + 0x18151621, 0x1110143e, 0x3a410d19, 0x21413a0b, 0x02090214, 0xfd3ef93e, 0x374e6657, 0x6bd10121, 0x262d0be6, 0x2e282827, 0x0101352d, 0x101b2314, + 0x12e66b1d, 0x20683f08, 0x2a2e207f, 0x310c2e2a, 0x271c1138, 0x06190616, 0x2e1d1d20, 0x1b1a1e1b, 0x282b2524, 0x1c1c3e45, 0x175a171c, 0x06000000, + 0x02ff7a01, 0x1a058605, 0x36002800, 0x92006c00, 0xca009f00, 0x40680000, 0x263f680c, 0x06212522, 0x24188342, 0x1e37013e, 0x06345f03, 0x22073869, + 0x5e252113, 0x6b6d14a7, 0x35212219, 0x06886136, 0x201e4542, 0x05456852, 0x225a3935, 0x030d2c22, 0x0e0e0a04, 0x2b1f3026, 0x1e342424, 0x681e1111, + 0x45080544, 0xec10103d, 0x3b41413b, 0x0342423a, 0x05d6fe34, 0x0d0b070c, 0x1d2a210c, 0x1f364a2b, 0x2d3e0f10, 0x222d392c, 0x14133523, 0x0d340e10, + 0x2b221b0d, 0x40403c1c, 0x12342b3c, 0x070f3c0e, 0xfd7c0112, 0x3c583810, 0x23821110, 0x9029552c, 0x212e2d38, 0x0c171622, 0xc76d0303, 0x05cd5e07, + 0x75414122, 0x25054942, 0x1b336b6b, 0x48423b1c, 0x400f2105, 0x2e074842, 0x0f0e1b1c, 0x1d1e2c19, 0x1a691b20, 0x68b35201, 0xf2222d30, 0x7542a449, + 0x2a0a2414, 0x4221140a, 0x74230b76, 0x42b90101, 0x5f212d3b, 0x243a4260, 0x00060038, 0x0608ff39, 0x001505c7, 0x001c000f, 0x00320028, 0x007a0057, + 0xd1580500, 0x13303407, 0x12163330, 0x27260317, 0x07062330, 0x33300730, 0x6e01012e, 0x99531553, 0x1325750f, 0x25147353, 0x011e1716, 0x88443317, + 0x23113c05, 0x240a1e04, 0x2406e206, 0x82c9640a, 0xf1218721, 0x0b0c0b0a, 0x0bb13c0a, 0x6e9bfc29, 0x30080d30, 0x5d3bad02, 0x24242121, 0x2e2f2121, + 0x3433553b, 0x114a0d1f, 0x4c44343f, 0x4335444c, 0x0e380e12, 0xc4026a1f, 0x0c010501, 0x82042109, 0x09220382, 0x3e0c820c, 0x37367862, 0x08052109, + 0x52051718, 0xf8627715, 0x18187f23, 0x9f02237f, 0x7041fe70, 0x8231e001, 0x24d32400, 0x53a5018c, 0x07211d4e, 0x124d5329, 0x0952163f, 0x1001f0fe, + 0x14165108, 0x63fe124b, 0x75769f02, 0x420e5d19, 0x2fb10b42, 0x000061fd, 0x08674107, 0x2000162c, 0x35002a00, 0x64003f00, 0x077f8700, 0x07062308, + 0x1c6c3215, 0x710e2006, 0x362305a5, 0x7134013d, 0x01200ca3, 0x5613ff73, 0x9b760578, 0x2275411e, 0x98022208, 0x504e1001, 0x171d3437, 0x090a2218, + 0x22392816, 0xa766d5fe, 0x25262625, 0x252197a7, 0xfd972125, 0x507d413b, 0x59a7013f, 0x05484154, 0x280b0b0c, 0x2b211c1c, 0x5a1c3347, 0x2c2c2b27, + 0x28245727, 0x0123292b, 0x5185411d, 0x05000034, 0x02ff2701, 0x1a05d905, 0x34002a00, 0x71003c00, 0x14827d00, 0x24095973, 0x3233023e, 0x19717616, + 0x5410e76a, 0x5e650e7b, 0x0d5d6508, 0x5b0d7c5d, 0x02210a0c, 0x1f8676f4, 0x3c730226, 0xe56f3afb, 0x2607ed6b, 0x10c61140, 0x76b6fd40, 0x5d6b12ea, + 0x5e642613, 0x015a3f21, 0x09d3542e, 0x96768c20, 0x2d592107, 0x2e089676, 0x10080865, 0x341f2f10, 0xb69bfe5d, 0x5b9e02b6, 0x4e200b34, 0x220a5154, + 0x76020b2f, 0x82540ef3, 0x515c2509, 0x1d374d2f, 0x3d09fd6f, 0x01020000, 0x0516ffce, 0x000e0432, 0x003b0021, 0x23300500, 0x35262722, 0x012e3530, + 0x08822627, 0x2f05b042, 0x17161732, 0x1415011e, 0x33150702, 0x013e3227, 0x22059874, 0x6f23022e, 0x28080843, 0x7004021e, 0x2728558e, 0x2f2f8855, + 0x383e191b, 0xc4505039, 0x38395050, 0x9aa0bb3e, 0x44603af0, 0x12131312, 0x3b3a6044, 0x3109855f, 0x2b2cea5f, 0x4d0b4c49, 0x5c5b4141, 0x42c27f73, + 0x00822241, 0xc2424134, 0xfcfee17f, 0x28f2671c, 0x4537374c, 0x3737459e, 0x0a8a284c, 0x00030029, 0x06b70013, 0x825603ed, 0x003d2207, 0x05616751, + 0x5f610320, 0x06944b0f, 0x03300322, 0x23075358, 0x11302330, 0x230f2b6c, 0x21302311, 0x35220182, 0x05840130, 0x30212308, 0x07020615, 0xcfe33021, + 0x175d1772, 0x175b170d, 0x228a2270, 0x05010903, 0x1e080c01, 0x08828208, 0x9744071f, 0x49123605, 0x08200712, 0x081f0808, 0x77124812, 0xfe9a0262, + 0xfe410141, 0x067662ce, 0x0301b732, 0xc8329b01, 0x32c83131, 0x45eefe44, 0x9d01fdfe, 0x6221874b, 0x0028097d, 0x4c000400, 0xb406ab00, 0x1426e382, + 0x28001e00, 0xe5835f00, 0x421ddb5d, 0x112107a6, 0x32994a01, 0xe45db920, 0x60192106, 0x2408e45d, 0x02ac2a2e, 0x07566813, 0xfe580327, 0x030c03d7, + 0x23244a07, 0x4a0e1321, 0xb7200624, 0x270eec5d, 0x2b292e28, 0x0296fed5, 0x2a065a68, 0x279e2840, 0x17101014, 0x49351d0c, 0x11210fc5, 0x0ec54910, + 0x00820020, 0x73010430, 0x8d0502ff, 0x4c001a05, 0xb4007d00, 0x1772e000, 0x4a172017, 0x072106e2, 0x22018406, 0x4a011e15, 0x0d8405f2, 0x22230622, + 0x21051157, 0x17823727, 0x4b0c2272, 0x27210a32, 0x06596b26, 0x2306364b, 0x32363701, 0x54855586, 0x07010e23, 0x33684121, 0x648a0120, 0x211d5149, + 0x92675002, 0x28620811, 0x101d1d28, 0x120a0a11, 0x1a171812, 0x1313331d, 0x11110b0b, 0x2c2c1f20, 0x24232f36, 0x15141c1b, 0x1c0d4f0f, 0x1d2d1211, + 0x4045423d, 0xfe800347, 0x238f2439, 0x1d1b1c33, 0x2a1b321e, 0x0a0b0f0f, 0x0f401005, 0x3713110b, 0x51662626, 0x0e0e1c1b, 0x1d161619, 0x691a201e, + 0xfd52011b, 0x03d6fea7, 0x9349030b, 0x1e373508, 0x2c3e100f, 0x222d392d, 0x14143423, 0x0d0d4e0f, 0x1b2c220e, 0x21069249, 0x074c3b0f, 0x50022405, + 0x4b2438fe, 0x2a2107b3, 0x08b34b1e, 0x5e854b20, 0xb34b1820, 0x10357208, 0x0b0c2708, 0x1f211617, 0x191a2029, 0x0d0c1414, 0x1a060406, 0x1c1d1415, + 0x24242c25, 0x0e0e191a, 0x11110a0a, 0x3e171615, 0x3d722214, 0x4b752009, 0x1c260961, 0x0e0e111c, 0x644b1314, 0x0e0d2107, 0x2305654b, 0x1f1f4429, + 0x2105664b, 0x224c4605, 0x4b62202b, 0x042028bb, 0x2806274f, 0x000f0056, 0x0337002e, 0x135b5e8f, 0x26243f6f, 0x27022605, 0x18011d33, 0x18223546, + 0xc9158a45, 0xa65fa638, 0x4a461826, 0x18152019, 0x22153d46, 0x183d3701, 0x94147745, 0xb3451814, 0xa6119111, 0xcc26a638, 0x3335215f, 0x103f4618, + 0x663a0128, 0x01c901b2, 0xf6706b06, 0x27282105, 0x2312f670, 0x5f18eb01, 0x4f034618, 0x0e03012d, 0x0e040c04, 0x0e380e04, 0x82390e7c, 0x04461807, + 0x64012852, 0x7a186219, 0x820f390f, 0x040b3a6b, 0x3d0f030e, 0xfdfc020f, 0x594502bb, 0x42b0fd59, 0x3d3c7f42, 0x2f38373c, 0x077a7130, 0x71343021, + 0x4a200a7a, 0x03da4510, 0x00002f55, 0x47000500, 0xb906ab00, 0x1e006103, 0x0b822f00, 0x70005828, 0x0e010000, 0xd76c0701, 0x05c67a0a, 0x14823320, + 0x7b06d96c, 0x0520243e, 0x013925a4, 0x103d0f10, 0x10046c6c, 0x791e1040, 0x9f287e1e, 0x2bad2b28, 0x02882283, 0x18d27a63, 0x07060627, 0x0231100f, + 0x08209e52, 0x12f00122, 0x02cf1246, 0x15acfe9e, 0x91251451, 0x2fbc2f24, 0x41fefe41, 0xf0fed134, 0x4040592e, 0x41405253, 0x3506797a, 0x2b49341b, + 0x34482c76, 0x24341b1b, 0x2b762c24, 0x1a1b2325, 0x24a35c1b, 0x06000022, 0x3a08934e, 0x0042002f, 0x008d0063, 0x00a00098, 0x21300500, 0x37303530, + 0x35363736, 0x49343530, 0x362a0adb, 0x32013e37, 0x1617011e, 0x814a1415, 0x0e072505, 0x05210701, 0x21052a56, 0x1d823435, 0x7c363721, 0x3d830693, + 0x2105554d, 0x01822726, 0x2f852220, 0x2305dd75, 0x01161716, 0x08514218, 0x2022f74e, 0x0cf27912, 0xfe450324, 0x1153d639, 0x055a5509, 0x4c1c1c2c, + 0x0e375066, 0x160c0d0f, 0x13531d17, 0x49012606, 0x3c2e2e3f, 0x0800820e, 0x2e2e3c23, 0x76767c3f, 0x1819227c, 0x06070f10, 0x100f0706, 0x18451918, + 0x06100f19, 0x10060707, 0xfe18190f, 0x200e4f89, 0xfb3d7426, 0x72726e3a, 0x2c0c0f4f, 0x2ebf68f2, 0x0c2f292a, 0x1d113831, 0x06c34926, 0x1b17172a, + 0x2524351e, 0x2223282b, 0x2207c349, 0x7c181767, 0x1733072e, 0xb8feb718, 0x0e0e5cb6, 0x24231a1a, 0x242c752d, 0x821a1a24, 0x1a0e29a1, 0x2c24231b, + 0x23242d75, 0x03210e83, 0x1f2d4f77, 0x014f0123, 0x0a2f4f4f, 0x00002008, 0x0b010600, 0xf50568fe, 0x1f000f05, 0x41003900, 0x55004b00, 0x00006f00, + 0x22233001, 0x4e013d26, 0x062014fd, 0x671afd4e, 0x012007f6, 0x20128777, 0x65411805, 0x112e080d, 0x13331123, 0x33373633, 0xe5022311, 0x3835395f, + 0x11201f5b, 0x25262a12, 0x36823536, 0x29262635, 0xa1676b7c, 0x0d2d4027, 0x2d0d0c0c, 0x09822740, 0x0d0d0c2d, 0x02402d0c, 0x01c76ded, 0x793bfbfb, + 0x042b0cff, 0x23090515, 0x18621909, 0x82196218, 0x67053908, 0x5a06b480, 0xfe677b59, 0x32313a68, 0x2b2b3407, 0x554c3e3d, 0x172b2c81, 0x2b3d0082, + 0x9655812c, 0xa24513ad, 0x2525331a, 0x252e6a2d, 0x1b1b3324, 0x2e252433, 0x25252d6a, 0x08ec6733, 0x76240121, 0x292d09e2, 0x3e2b282e, 0x2c124912, + 0xb32d2db3, 0x3908822c, 0x9e02fffd, 0xaaababfe, 0x000062fd, 0x85000200, 0x7b065400, 0x3400b803, 0x7f644d00, 0x131a4135, 0x33133d08, 0xb7012311, + 0x10359469, 0x362c103e, 0x51514435, 0x25264939, 0x2a3e3d7a, 0x5f436c4c, 0x5b314546, 0x465d2103, 0x20272848, 0x7e4a4421, 0x714e2975, 0x0b06fa03, + 0x81130b2c, 0x13812423, 0x06270882, 0x07e1a182, 0x64829ae0, 0x022a2d8c, 0x175a178f, 0x4040ec22, 0x088222ec, 0x037ffd38, 0x0156fe46, 0x00bafcaa, + 0xb5000300, 0x4b066300, 0x0b00a903, 0xad7b1500, 0x01092119, 0x3c11d576, 0x746801b6, 0xe1747f7f, 0x393934d8, 0x5a03d834, 0x178cedfe, 0x370a1758, + 0x380f050f, 0x3409820a, 0x2eba2e88, 0x89460363, 0xb2fe89e6, 0x3236c501, 0xfd36323a, 0x05a17631, 0x37c82522, 0x200aa176, 0x50008200, 0x6120071b, + 0x2006bf45, 0x46bd457e, 0x0834ce4e, 0x3d101521, 0x036d6d0f, 0x1f104010, 0x287f1e78, 0xac2b27a0, 0x8722832b, 0x5c3f6302, 0x0e0e0f3b, 0x445c3b0f, + 0x31280543, 0x1f0d0d1f, 0x1f314531, 0x22053b44, 0x501a0331, 0xdf453250, 0xef01213e, 0x3a2c7150, 0xff5b0105, 0x05a50502, 0x0034001a, 0x0048003e, + 0x00a20081, 0x26220500, 0x79373627, 0x3f54079f, 0x07022510, 0x2223012e, 0x180f3f54, 0x8914654b, 0x29016945, 0x570d5976, 0x162a0eb1, 0x02010e17, + 0x2a765550, 0xc77f2625, 0x1a0b2314, 0xc87f091e, 0x2d01210d, 0x35054544, 0x2e2aacb3, 0xfeac2a2e, 0x2b76542c, 0x2a242526, 0x4240372b, 0x40691618, + 0x190d2111, 0x760e4069, 0x21080574, 0x41692425, 0x2d227558, 0x3b48112e, 0x4e58584e, 0x0a134b3d, 0xfd79224d, 0x2323343d, 0x3916162b, 0x8c542731, + 0x160a230e, 0x8d54081b, 0xbf4b1812, 0x2e292507, 0x18012b28, 0x50693d89, 0xb12a0826, 0x404055a9, 0x4d2d2c2d, 0x3019194b, 0x665d6a39, 0x313e695d, + 0x52492f06, 0x04000000, 0xb7002e00, 0x5603d206, 0x27000f00, 0x41183600, 0xd55e15e7, 0x61132015, 0x6225182d, 0xfc01c86c, 0x09ad5570, 0x40ed832b, + 0x28252569, 0x69252528, 0x05f66040, 0x41188120, 0x022009e8, 0x2705bb70, 0x2a2a9e02, 0x7da87d2a, 0x60270582, 0x5b6c5b5e, 0x8222fe5e, 0x06002d9e, + 0x02ff4b01, 0x1a05b505, 0x1e001500, 0x4930ab82, 0xd8016e00, 0x30050000, 0x30213035, 0x37123635, 0x2e053d74, 0x30233015, 0x30253015, 0x30113033, + 0x5e010e23, 0x3e200714, 0x08d34418, 0x3d480120, 0x012e2307, 0x197e0622, 0x021e2407, 0x6a262201, 0x816d0800, 0x06072206, 0x8146181d, 0x33352b0e, + 0x010f2311, 0x150e0f15, 0x05840d0f, 0x0b910882, 0x012e0527, 0x3f353727, 0x2002840b, 0x8805840a, 0x9306200b, 0x33073c17, 0x02153311, 0x2dc9fea1, + 0x5c8e2db5, 0xdbbffe5c, 0x028e2307, 0x3c5c3eaf, 0x181d0f0e, 0x2009bd44, 0x26008207, 0x45310f0f, 0x820f1031, 0x1f073909, 0x83eefd31, 0x68492796, + 0x3b3b5841, 0x103c0f21, 0x4d3b4811, 0x2c2d2d2c, 0x0ad84918, 0x08bc2f22, 0x2e3b4c18, 0x0b222eeb, 0x6ed20b2c, 0x53d20220, 0xa6010124, 0x4a18f2a3, + 0xfe290ea5, 0x40582fe2, 0x83515241, 0xaa451858, 0x25243b07, 0x252b752c, 0x1c1a1a24, 0x241a1a1c, 0x2c752b25, 0x1c332425, 0xa9b10603, 0x48188055, + 0x342c0f61, 0x2309313e, 0x29294909, 0xf5015a0b, 0x54d0b1d4, 0x0a280a22, 0x508953d0, 0x8655b641, 0xbcfd235f, 0x0082005a, 0x00023508, 0x065f025c, + 0x007105a4, 0x001b0003, 0x15211300, 0x37270121, 0x15333517, 0x33071737, 0x07172315, 0x35231527, 0x23372707, 0x48065c35, 0xc204b8f9, 0x3c8c2a8c, + 0xc6210382, 0x240887c6, 0x0246a502, 0x84118c22, 0x0000261a, 0xff5c0001, 0x225b8225, 0x821400d6, 0x32380859, 0x053e012c, 0x2e341135, 0x23022c03, + 0x34019d5c, 0xc7f60501, 0x2e5b7fad, 0xccaa6f3c, 0xe5fef8fe, 0x02ada9fe, 0x725633a5, 0x667a837e, 0x4ff90e47, 0x907d5b15, 0x3e688691, 0x0124478d, + 0x2e012c22, 0x3e204783, 0x33274782, 0xfe9da406, 0x89fbfecc, 0x08012548, 0x57011b01, 0xef824896, 0x2a000532, 0xd60638ff, 0x04009405, 0x44004000, + 0x08014b00, 0x302b9b82, 0x04210721, 0x07030e22, 0x5707040e, 0x352e06eb, 0x32333634, 0x32041e17, 0x3e37033e, 0x0c833704, 0x16171624, 0x1e831415, + 0x03032e39, 0x01211521, 0x25052315, 0x34253523, 0x3233023e, 0x32361716, 0x8217031e, 0x06142126, 0x36210583, 0x25058332, 0x37013e17, 0x4782033e, + 0x40843620, 0x1e222883, 0x0c863101, 0x33231784, 0x83021e32, 0x215b8529, 0x61851415, 0x2e272629, 0x35343501, 0x8327022e, 0x010e2e6e, 0x0e272223, + 0x22060701, 0x0e070627, 0x830c8603, 0x82022006, 0x83b0840e, 0x21038626, 0xba82022e, 0x34273b08, 0x0e35010e, 0x27262701, 0x35161726, 0x37062734, + 0x23363734, 0x015c2622, 0x62fe46e4, 0x6154e004, 0x0f2f4f50, 0x403c1507, 0x4b522c5b, 0x354da793, 0x1b151d08, 0x4f2f0f0f, 0x1b9a6150, 0x01ddd408, + 0xfe62fee4, 0x00019610, 0xfc960001, 0x240e047a, 0x0b1b131a, 0x0c171f0e, 0x11020208, 0x0211151b, 0x38040706, 0x1010072e, 0x10020c0e, 0x0c060308, + 0x090a0c13, 0x39530b06, 0x2c040d13, 0x180c1128, 0x0c2f411e, 0x040d151d, 0x13241a0e, 0x1e271420, 0x0a11140c, 0x2f090909, 0x012c2149, 0x0f121a13, + 0x06100418, 0x1425210f, 0x192a100f, 0x2410171c, 0x0d210912, 0x1a132e0e, 0x0718133b, 0x380d0607, 0x1b0e2909, 0x0d111a14, 0x07122f34, 0x11191008, + 0x10160b0a, 0x171c1010, 0x0c22180f, 0x1108221a, 0x01030d16, 0x27061716, 0x01021a03, 0x03011008, 0x07080201, 0xb9021a12, 0x422fbb6e, 0x09173c52, + 0x4b424a1d, 0x4ea72d18, 0x150f0d4d, 0x3c17161d, 0x972f4252, 0x01900818, 0x25016e58, 0xfaf0f0fa, 0x291d0da0, 0x071b151a, 0x111d110e, 0x3a26170e, + 0x0d0c020b, 0x37050507, 0x100b0910, 0x0c080409, 0x41040d67, 0x373b1f27, 0x070e1860, 0x17121d11, 0x0f150926, 0x43520110, 0x12043804, 0x08340105, + 0x0c101711, 0x030b122d, 0x423e0804, 0x1d2f070b, 0x450b2411, 0x1c141110, 0x0e1d0f33, 0x4d0a5d09, 0x0c18180c, 0x17022d41, 0x08172116, 0x1b0c1105, + 0x05222614, 0x0319220e, 0x0c020717, 0x0502030c, 0x02041102, 0x01040202, 0x02240382, 0x00171a07, 0x0807b343, 0x0b004925, 0x00000f00, 0x15331501, + 0x35231523, 0x35333523, 0x21152101, 0xb4b49805, 0xfbb4b464, 0xf9480628, 0x834905b8, 0xb464380b, 0x00465cfd, 0xff530005, 0x058c063e, 0x000600a7, + 0x002c0028, 0x82370030, 0x3311293d, 0x1133010b, 0x27072327, 0x03200183, 0x0b260584, 0x021b3502, 0x01821737, 0x05841320, 0x21331729, 0x022b1533, + 0x85373335, 0x042e082d, 0xcecea0a1, 0x4ac936a0, 0x2f303f33, 0x373a3a3f, 0x36103119, 0x37272737, 0x19311036, 0x3f3a3a37, 0x333f302f, 0xf201c94a, + 0x73bc8a8a, 0x2c838873, 0x08024708, 0x2201b001, 0x50fedefe, 0xa93ed63a, 0xfee3cd72, 0x6a8b54fc, 0xd4fe92df, 0xeb010401, 0x01eb0189, 0xb7affe04, + 0x548b6adf, 0xcde3fcfe, 0xd63ea972, 0xfe3a6161, 0x01defe50, 0x00b00122, 0x5c000300, 0xa40637ff, 0xbb82e005, 0x3b000d22, 0x2326b783, 0x11230109, + 0x06841103, 0x012f0122, 0x0585bf85, 0x0f840f20, 0x1f020f22, 0x3f23c482, 0x85011f01, 0x280586c4, 0x01c83403, 0xc8140114, 0x3d068598, 0x7238d802, + 0x484b604e, 0x545a5a60, 0x54184b27, 0x4b394b45, 0x39155a36, 0x15392525, 0x0c82365a, 0x18544531, 0x5a54274b, 0x4b48605a, 0x01724e60, 0x84fcfe5d, + 0x02042294, 0x83b9825d, 0xfc3008d1, 0x381bc8fe, 0x512d4204, 0x37216659, 0x8448582a, 0x4b645a70, 0x438f523b, 0x8f4a656c, 0x644b3b52, 0x4884705a, + 0x21372a58, 0x2d515966, 0x00380442, 0x023b0082, 0x22ff4b00, 0xd005b506, 0x2a000900, 0x15050000, 0x2115012d, 0x35010d35, 0x8b171301, 0x8d3f20ad, + 0x070324d9, 0x836d0103, 0x2604227e, 0x087a8201, 0x4ed3fa26, 0x621f6d6e, 0x75756d32, 0x7d615e7d, 0x49499466, 0x617d6694, 0x75757d5e, 0x1f62326d, + 0x3e4e6e6d, 0xa0cecea0, 0x33080383, 0x7efe5403, 0xb073eccd, 0xcc426e54, 0x8459a1b2, 0x35369931, 0x59843199, 0x42ccb2a1, 0x90b0546e, 0xfecd0901, + 0x0200007e, 0x6aff5e00, 0x7b05a206, 0x1f000b00, 0x300e5b42, 0x27032703, 0x1127020b, 0x37021b37, 0x21133713, 0x06694215, 0x87c7fe21, 0x21868774, + 0x7742a702, 0xf0fc3307, 0xfe629dfe, 0xbefeb2f7, 0x67fe6501, 0x84070584, 0x098267fe, 0xfeb2be2f, 0x9dfe62f7, 0x00030074, 0x063eff53, 0x069342af, + 0x00002f2c, 0x0d352113, 0x03213501, 0x07412115, 0x05804205, 0x35021b22, 0xa0427982, 0x03072109, 0xcb202685, 0x22075442, 0x42450355, 0x3b21068c, + 0x0b8c4236, 0x423b3621, 0x9620068c, 0x28074b42, 0xcea00304, 0xfcfea0ce, 0x26864261, 0x839bfe21, 0x8200202f, 0x00042800, 0x065effc8, 0x82a60538, + 0x000f2bb5, 0x001f001b, 0x21352500, 0x7f430315, 0x2e0b8b0b, 0x04112311, 0xb4cc016c, 0xb464b4b4, 0x84c0fcb4, 0x31022706, 0x6464a05a, 0x95439c04, + 0x5cfe2105, 0x02250785, 0x06b8f90e, 0x21628248, 0x8f470100, 0xa5022105, 0x002c6382, 0x21152113, 0xf948065c, 0x46a502b8, 0x053a1c82, 0x08ff5601, + 0x1505aa05, 0x39000f00, 0x65004500, 0x00008f00, 0x11333505, 0x715e0623, 0x11332a05, 0x14011533, 0x07020e07, 0x058b5523, 0x82012e21, 0x020e211a, + 0x12525018, 0x50180420, 0xe84b0a86, 0x0d146308, 0x1e373628, 0x07061701, 0xce672506, 0x2726210f, 0x3210136a, 0x15210706, 0x07bc9c01, 0x2c0b3765, + 0xa56e3d0b, 0x671c02a3, 0x382c05da, 0x2d22215b, 0x0104020d, 0x250e0f0a, 0x12205018, 0x75d9fe32, 0x41754242, 0x958456fe, 0x41694926, 0x5b227657, + 0x1806104e, 0x0808aa52, 0xfee2025f, 0x3307cf39, 0x323b1b1c, 0x151e2a1b, 0x0a332c05, 0x4c371312, 0x1b1c5066, 0x2c190e0f, 0x4f201e1d, 0xf852014f, + 0x6bf5015b, 0x0a270a3b, 0xbcfd7743, 0x49a5015b, 0x556b4140, 0x284d2a1b, 0x01365929, 0x12121401, 0x0e0f101a, 0x31304c37, 0x1e1e2a2b, 0x44131221, + 0x3e923030, 0x3f3c0e3c, 0x3104823f, 0xa9b2ca01, 0x2d588154, 0x2f314b4d, 0x655d6a39, 0x8b4a6a5d, 0xb8682f08, 0x2a292f07, 0x38310c2e, 0x16271d10, + 0x9f691411, 0x1d1b390d, 0x5c43441c, 0x04000000, 0x08ff2e01, 0x1505c705, 0x35001300, 0x86004d00, 0x23130379, 0x30013011, 0x2310b552, 0x13303330, + 0x11220386, 0x21822330, 0x6d15514e, 0x01213727, 0x088e612e, 0x0905c437, 0x62180923, 0x18621819, 0x05082409, 0x06b38168, 0xfc687bb4, 0x3b3a6d2b, + 0x9f02f832, 0xfe60bb60, 0x120102dc, 0xb32d1248, 0x2db32c2c, 0xfd2b0882, 0xfe9f02ff, 0xfd5501ab, 0x84620361, 0x61c32220, 0xc441180b, 0x7817200a, + 0x450805ec, 0x242c515c, 0x1a1b3124, 0x2d0b321b, 0x2e28220b, 0x15152a2c, 0x5c130d0a, 0x27262f51, 0x001e1b1b, 0x006b0001, 0x049506d3, 0x00440031, + 0x16320100, 0x0e071415, 0x23060702, 0x27052e22, 0x23262726, 0x07060722, 0x1083010e, 0x35264508, 0x37363734, 0x3233063e, 0x1617051e, 0x32331617, + 0x3f013e37, 0x06023e01, 0x072a1e4c, 0x3266240b, 0x522a6e72, 0x362f4442, 0x2149131b, 0x43305d70, 0x10125946, 0x1e14110d, 0x0a04122a, 0x30381c14, + 0x264d4043, 0x3108218b, 0x572a4832, 0x0b031615, 0x2aca021f, 0x160f111e, 0x72329341, 0x39472a1e, 0x84242e55, 0x4643a831, 0x08151e98, 0x1c1e2a0a, + 0x22110614, 0x443a522e, 0x1d891d2a, 0x7c2a4828, 0x0e072828, 0x00820013, 0x1e00033e, 0xce0649ff, 0x0b00cc05, 0x4e002b00, 0x14040000, 0x22212306, + 0x33363426, 0x22253221, 0x0127b883, 0x3233013e, 0x82210117, 0x82e28203, 0x012729de, 0x09272221, 0x13010e01, 0x0620f384, 0x1582e682, 0x82012f21, + 0x3336252c, 0x03011f32, 0x17210885, 0x08e48213, 0x1d0b0238, 0x159ffe15, 0x01151d1d, 0x8afe1561, 0x01021d15, 0x111a0561, 0x82010f19, 0x0f1c8c01, + 0x1d078d01, 0xfe0f1c15, 0x1977fe82, 0xfeaafe0f, 0x9a1a05bc, 0x011a0f0a, 0x54820301, 0x05055408, 0x0a0f0fd2, 0xa38b0505, 0x0e0a0f03, 0x0111a408, + 0x1d2a700e, 0x5d1d2a1d, 0x0707151d, 0x1410a604, 0x18effd15, 0x0e0c80fd, 0x02181d15, 0xd4011568, 0x1410bbfb, 0x0a0f4a05, 0x0403e101, 0x02040407, + 0x0a10075b, 0x013d020f, 0x0a070615, 0xe9fe0c0f, 0x840d0995, 0x844620f3, 0x841420f3, 0xad5020f3, 0x830120f3, 0x010f22f3, 0x24e98225, 0x07141516, + 0x06734b05, 0x30012f25, 0x82272623, 0x363726f8, 0x0336013f, 0x20f5829c, 0x23f5846f, 0xf9fc1591, 0x033ef5a2, 0x040f0a52, 0x042d0148, 0x110f0a04, + 0x0d89c7fe, 0x05070a0f, 0x030501ba, 0x02010104, 0xf7a3076c, 0x0b0e033d, 0x68790607, 0x120b0e01, 0x074d6d05, 0x030f0a0f, 0x06050369, 0x02040408, + 0x8a0cb403, 0x84b020f7, 0xae5220f7, 0x363421f7, 0x1322f982, 0x06833736, 0x06071424, 0x04822707, 0x83222321, 0x262722f4, 0x06f14131, 0x05171623, + 0x20f98241, 0x23f9845b, 0x54fb15a5, 0xb32ef9a3, 0x010f140f, 0x1408068d, 0x2196050f, 0xf1831202, 0x0607092b, 0x0f056b4f, 0x5a070d0a, 0x08faa337, + 0x0f0a8d29, 0x54fe0a0f, 0x0f0806bd, 0xc706090a, 0x0513052d, 0x06060101, 0x0906916a, 0x790a0f0a, 0x0300004a, 0x49ff4600, 0x4105e206, 0xec4135f3, + 0x07022206, 0x21098537, 0x854d010f, 0x23342105, 0x2406eb42, 0x0636011f, 0x20f982ce, 0x23f98473, 0xc7f9158d, 0x053ef9a2, 0x0a1206e6, 0x285f010f, + 0x0a0707a3, 0x07e00b0f, 0x07060708, 0x02620103, 0x06110a0f, 0xf8a22a4c, 0x9e045108, 0x040a0f11, 0x74e2fe04, 0x0a0f046b, 0x0493070e, 0x01070404, + 0x05040d01, 0xcc110f0a, 0x0000007d, 0xff7d0002, 0x0583067c, 0x000600b6, 0x01000012, 0x010b3711, 0x14001117, 0x01272206, 0x32363426, 0xcc050117, + 0xb7e2e2b7, 0x3e2c0d01, 0x1690fa16, 0x05350582, 0xfeb60570, 0xdffe469a, 0x01462101, 0x3e31fa66, 0x7005162c, 0x21058216, 0x4f8d90fa, 0x4f881f20, + 0x06140129, 0x2c312223, 0x41002701, 0x1626060f, 0x00011217, 0x5c891e05, 0xfe011f38, 0xbd14fedd, 0x017588fe, 0x291c1f2c, 0x57016c05, 0x12025201, + 0x6b8c2b1f, 0x2c1f1238, 0x01bdc605, 0x06ae0278, 0x242c1f07, 0xfe82fd1b, 0x0aaefea9, 0xc7842c01, 0xc7825f20, 0xc7858320, 0x07110534, 0x1127011b, + 0x34262224, 0x32360137, 0x01071416, 0xc7837605, 0x8a1bfb21, 0x01a02bae, 0x21014666, 0xfe46dffe, 0xd8841d9a, 0xc583de83, 0x4f87c785, 0x00002f22, + 0xf0444f86, 0x37362605, 0x3637063e, 0x06e24324, 0x06070626, 0x07020e04, 0x06220282, 0x65860e07, 0xfcfa2808, 0x31062c1f, 0x3f232253, 0x4938402a, + 0xb6019227, 0x04034c01, 0x1d272c1f, 0xd0e2feb6, 0x1f3472a3, 0x532b2f46, 0x8c260833, 0x1f240881, 0xd7760e0f, 0x5699595a, 0x275d557b, 0x0120a892, + 0x2b1d1f2c, 0x5c431203, 0x3b649586, 0xd96f789f, 0x00191578, 0x04340082, 0x44ff4600, 0xb405ce06, 0x0e000d00, 0x30002000, 0x33010000, 0x270a7d45, + 0x03253123, 0x23010e01, 0x280a9d45, 0x16320109, 0x01071415, 0x23148606, 0x64ab0436, 0x280a5d45, 0xef6ffe87, 0x1a05bcfe, 0x0a954211, 0x31021529, + 0xfc0c2c1f, 0x82291649, 0xb7032406, 0x45ee0216, 0xa126094a, 0xbbfb4801, 0x66451410, 0x84fe2a08, 0x1f2c3002, 0x27fa1216, 0x22068323, 0x8223d905, + 0x010025a6, 0x09004600, 0x1425a782, 0x00001f00, 0x1e2b4637, 0x10437820, 0x450a2022, 0x00201bd7, 0x13286f82, 0xed0654ff, 0x3f00ae05, 0x32267e82, + 0x011b1617, 0x03881737, 0x03170226, 0x27032707, 0x0b230482, 0x83270701, 0x03342503, 0x07300706, 0x2c081086, 0x37133703, 0x17013f30, 0x1a323713, + 0x02013f01, 0x0239018b, 0x39393242, 0x39392c72, 0x3939173f, 0x7045278c, 0x4c393984, 0x39391f2f, 0x2413825e, 0x39393f6b, 0x20408246, 0x080e828c, + 0x39394824, 0x07247154, 0x55393958, 0x221a013d, 0xae05380a, 0x4bfd0239, 0x38384702, 0x8d010bfd, 0x61fe3838, 0x05825303, 0xcbfe2026, 0xfb0d5602, + 0x032a3282, 0x85fb9760, 0x65023939, 0x05826ffe, 0x24fdc831, 0x02083939, 0x6d5a37da, 0x3939cffd, 0x82fc6d03, 0xa005314a, 0x649efd06, 0xfc3838ec, + 0x9a01f5e3, 0x380b9f01, 0xe382d482, 0xffa02008, 0x056006ce, 0x00070032, 0x15212500, 0x35231121, 0x04940133, 0x7cbcfacc, 0x047846f4, 0x920078ec, + 0x35212c23, 0x044c0221, 0xfe74fb14, 0x86ac01cc, 0x29279625, 0x5c030403, 0x14fe2cfc, 0x279e6402, 0xa402bc28, 0x5cfde4fc, 0x279d1c03, 0x01740429, + 0xfc9cfdec, 0x9dd403a4, 0x2c052927, 0x54fe3401, 0x8c04ecfb, 0x33232796, 0x82112315, 0xe40527c7, 0x34fbf47c, 0xeb884405, 0xceff6428, 0x32059c06, + 0xd0821f00, 0x15163226, 0x01011930, 0x42058445, 0x112006ed, 0x2c09f442, 0x23198003, 0x16117d02, 0xfd152319, 0x21068320, 0x0c8483fd, 0x11e00233, + 0x19233205, 0xcafdccfd, 0x230e2202, 0xfd121c19, 0x2306828a, 0xdefd6a04, 0x02220d84, 0x7b410e76, 0x00642805, 0x049c063b, 0x851a00c4, 0x8214206b, + 0x27222262, 0x37608709, 0x32360130, 0x36010917, 0x23196006, 0x1290fe0b, 0x51fd123e, 0x1f12c1fe, 0x01210d82, 0x330d8270, 0x3f01af02, 0x23bc0212, + 0xfd101319, 0x031919f8, 0x193dfecb, 0x02280c83, 0xfc191908, 0x19c30135, 0x00256483, 0x00ae000e, 0x83098401, 0x86022004, 0x0001220b, 0x85e1820d, + 0x00022417, 0x863d0007, 0x00032417, 0x86930026, 0x8204200b, 0x86d62023, 0x0005240b, 0x8604010f, 0x00062b0b, 0x002e010c, 0x04010003, 0x00850009, + 0x01200b85, 0x0320c782, 0x02201786, 0x2d207782, 0x03240b86, 0x45004c00, 0x04200b86, 0xba202382, 0x05240b86, 0xe4001e00, 0x06240b86, 0x14011800, + 0x46304c83, 0x72007500, 0x61006e00, 0x65006300, 0x49002000, 0x6f200782, 0x732e0f82, 0x75460000, 0x63616e72, 0x63492065, 0x0e826e6f, 0x1f825220, + 0x2d826720, 0x2b826c20, 0x00007228, 0x75676552, 0x0882616c, 0x83004621, 0x0074212f, 0x72220783, 0x45846700, 0x49823a20, 0x20215999, 0x281f8300, + 0x00380032, 0x0031002d, 0x20058230, 0x22058232, 0x82330032, 0x6e6f2a73, 0x726f4674, 0x3a206567, 0x827f8c20, 0x3832280f, 0x2d30312d, 0x83323032, + 0x20b6a827, 0x24908256, 0x00730072, 0x20a68469, 0x20688220, 0x20748230, 0x3007842e, 0x56000030, 0x69737265, 0x30206e6f, 0x302e3130, 0x8d108230, + 0x110e41b6, 0x24060d41, 0x02000000, 0x20008b00, 0x840c8b01, 0x8262200b, 0x01c80805, 0x03000200, 0x03010201, 0x05010401, 0x07010601, 0x09010801, + 0x0b010a01, 0x0d010c01, 0x0f010e01, 0x11011001, 0x13011201, 0x15011401, 0x17011601, 0x19011801, 0x1b011a01, 0x1d011c01, 0x1f011e01, 0x21012001, + 0x23012201, 0x25012401, 0x27012601, 0x29012801, 0x2b012a01, 0x2d012c01, 0x2f012e01, 0x31013001, 0x33013201, 0x35013401, 0x37013601, 0x39013801, + 0x3b013a01, 0x3d013c01, 0x3f013e01, 0x41014001, 0x43014201, 0x45014401, 0x47014601, 0x49014801, 0x4b014a01, 0x4d014c01, 0x4f014e01, 0x51015001, + 0x53015201, 0x55015401, 0x57015601, 0x59015801, 0x5b015a01, 0x5d015c01, 0x5f015e01, 0x696e7507, 0x30463045, 0x31200786, 0x32200786, 0x33200786, + 0x34200786, 0x31210784, 0x21278530, 0x27853031, 0x85303121, 0x30312127, 0x31212785, 0x20278730, 0x202f8635, 0x20078636, 0x20078637, 0x20078638, + 0x20078639, 0x20078641, 0x20078642, 0x20078643, 0x20078644, 0x20078645, 0x21078546, 0x07863031, 0x07863120, 0x31207f86, 0x31207f86, 0x31207f86, + 0x31207f86, 0x31207f86, 0x31207f86, 0x31207f86, 0x31207f86, 0x31207f86, 0x31207f86, 0x31207f86, 0x31207f86, 0x31207f86, 0x32217f86, 0x21778530, + 0x07863132, 0x32207f86, 0x32207f86, 0x32207f86, 0x32207f86, 0x32207f86, 0x32207f86, 0x32207f86, 0x32207f86, 0x32207f86, 0x32207f86, 0x32207f86, + 0x32207f86, 0x32207f86, 0x33217f86, 0x21778530, 0x07863133, 0x33207f86, 0x33207f86, 0x33207f86, 0x33207f86, 0x33207f86, 0x33207f86, 0x33207f86, + 0x33207f86, 0x33207f86, 0x33207f86, 0x33207f86, 0x33207f86, 0x33207f86, 0x34217f86, 0x21778530, 0x07863134, 0x34207f86, 0x34207f86, 0x34207f86, + 0x34207f86, 0x34207f86, 0x34207f86, 0x34207f86, 0x34207f86, 0x34207f86, 0x34207f86, 0x34207f86, 0x34207f86, 0x34207f86, 0x35217f86, 0x21778530, + 0x07863135, 0x35207f86, 0x35207f86, 0x35207f86, 0x35207f86, 0x35207f86, 0x35227f86, 0x00830038, 0xffff0123, 0x07b94500, 0x0c000026, 0x04001400, + 0x02241682, 0x01000000, 0x09850386, 0x55e00024, 0x11822068, 0xfde0002c, 0x00009fff, 0x63e10000, 0xfa056e19, 0x72e94484, }; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 6dedb529c..2a4bc8a0a 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2237,6 +2237,9 @@ int FurnaceGUI::load(String path) { if (settings.playOnLoad==2 || (settings.playOnLoad==1 && wasPlaying)) { play(); } + } else { + // warn the user + showWarning("you have loaded a backup!\nif you need to, please save it somewhere.\n\nDO NOT RELY ON THE BACKUP SYSTEM FOR AUTO-SAVE!\nFurnace will not save backups of backups.",GUI_WARN_GENERIC); } return 0; } diff --git a/src/gui/gui.h b/src/gui/gui.h index 73fe79951..5d98548f7 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -310,7 +310,26 @@ enum FurnaceGUIColors { GUI_COLOR_PATTERN_STATUS_REL, GUI_COLOR_PATTERN_STATUS_REL_ON, GUI_COLOR_PATTERN_STATUS_ON, - + GUI_COLOR_PATTERN_STATUS_VOLUME, + GUI_COLOR_PATTERN_STATUS_PITCH, + GUI_COLOR_PATTERN_STATUS_PANNING, + GUI_COLOR_PATTERN_STATUS_SYS1, + GUI_COLOR_PATTERN_STATUS_SYS2, + GUI_COLOR_PATTERN_STATUS_MIXING, + GUI_COLOR_PATTERN_STATUS_DSP, + GUI_COLOR_PATTERN_STATUS_NOTE, + GUI_COLOR_PATTERN_STATUS_MISC1, + GUI_COLOR_PATTERN_STATUS_MISC2, + GUI_COLOR_PATTERN_STATUS_MISC3, + GUI_COLOR_PATTERN_STATUS_ATTACK, + GUI_COLOR_PATTERN_STATUS_DECAY, + GUI_COLOR_PATTERN_STATUS_SUSTAIN, + GUI_COLOR_PATTERN_STATUS_RELEASE, + GUI_COLOR_PATTERN_STATUS_DEC_LINEAR, + GUI_COLOR_PATTERN_STATUS_DEC_EXP, + GUI_COLOR_PATTERN_STATUS_INC, + GUI_COLOR_PATTERN_STATUS_BENT, + GUI_COLOR_PATTERN_STATUS_DIRECT, GUI_COLOR_PATTERN_PAIR, GUI_COLOR_SAMPLE_BG, @@ -1445,6 +1464,7 @@ class FurnaceGUI { int mainFontSize, patFontSize, headFontSize, iconSize; int audioEngine; int audioQuality; + int audioHiPass; int audioChans; int arcadeCore; int ym2612Core; @@ -1637,6 +1657,7 @@ class FurnaceGUI { iconSize(16), audioEngine(DIV_AUDIO_SDL), audioQuality(0), + audioHiPass(1), audioChans(2), arcadeCore(0), ym2612Core(0), diff --git a/src/gui/guiConst.cpp b/src/gui/guiConst.cpp index 39607ba92..a31273004 100644 --- a/src/gui/guiConst.cpp +++ b/src/gui/guiConst.cpp @@ -993,6 +993,26 @@ const FurnaceGUIColorDef guiColors[GUI_COLOR_MAX]={ D(GUI_COLOR_PATTERN_STATUS_REL,"",ImVec4(0.7f,0.1f,0.1f,1.0f)), D(GUI_COLOR_PATTERN_STATUS_REL_ON,"",ImVec4(1.0f,0.8f,0.1f,1.0f)), D(GUI_COLOR_PATTERN_STATUS_ON,"",ImVec4(0.3f,1.0f,0.1f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_VOLUME,"",ImVec4(0.0f,1.0f,0.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_PITCH,"",ImVec4(1.0f,1.0f,0.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_PANNING,"",ImVec4(0.0f,1.0f,1.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_SYS1,"",ImVec4(0.5f,1.0f,0.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_SYS2,"",ImVec4(0.0f,1.0f,0.5f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_MIXING,"",ImVec4(1.0f,0.3f,1.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_DSP,"",ImVec4(0.3f,0.6f,1.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_NOTE,"",ImVec4(0.3f,0.3f,1.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_MISC1,"",ImVec4(1.0f,0.5f,0.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_MISC2,"",ImVec4(0.7f,0.5f,1.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_MISC3,"",ImVec4(1.0f,0.1f,0.1f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_ATTACK,"",ImVec4(1.0f,0.1f,0.1f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_DECAY,"",ImVec4(0.1f,0.4f,0.5f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_SUSTAIN,"",ImVec4(0.1f,1.0f,1.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_RELEASE,"",ImVec4(1.0f,0.1f,1.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_DEC_LINEAR,"",ImVec4(0.0f,0.6f,0.7f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_DEC_EXP,"",ImVec4(1.0f,0.3f,0.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_INC,"",ImVec4(0.1f,0.1f,1.0f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_BENT,"",ImVec4(1.0f,1.0f,0.1f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_DIRECT,"",ImVec4(1.0f,0.5f,0.2f,1.0f)), D(GUI_COLOR_PATTERN_PAIR,"",ImVec4(0.6f,0.8f,1.0f,1.0f)), diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 1a18a0e2e..35c7273f5 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -23,6 +23,7 @@ #include "imgui_internal.h" #include "../engine/macroInt.h" #include "IconsFontAwesome4.h" +#include "furIcons.h" #include "misc/cpp/imgui_stdlib.h" #include "guiConst.h" #include "intConst.h" @@ -211,8 +212,8 @@ enum FMParams { const char* macroTypeLabels[4]={ ICON_FA_BAR_CHART "##IMacroType", - ICON_FA_AREA_CHART "##IMacroType", - ICON_FA_LINE_CHART "##IMacroType", + ICON_FUR_ADSR "##IMacroType", + ICON_FUR_TRI "##IMacroType", ICON_FA_SIGN_OUT "##IMacroType" }; @@ -252,8 +253,8 @@ const char* filtModeBits[5]={ "low", "band", "high", "ch3off", NULL }; -const char* c64SpecialBits[3]={ - "sync", "ring", NULL +const char* c64TestGateBits[5]={ + "gate", "sync", "ring", "test", NULL }; const char* pokeyCtlBits[9]={ @@ -343,6 +344,16 @@ const char* gbHWSeqCmdTypes[6]={ "Loop until Release" }; +const char* suHWSeqCmdTypes[7]={ + "Volume Sweep", + "Frequency Sweep", + "Cutoff Sweep", + "Wait", + "Wait for Release", + "Loop", + "Loop until Release" +}; + const char* snesGainModes[5]={ "Direct", "Decrease (linear)", @@ -2310,7 +2321,6 @@ void FurnaceGUI::alterSampleMap(int column, int val) { void FurnaceGUI::insTabSample(DivInstrument* ins) { const char* sampleTabName="Sample"; - if (ins->type==DIV_INS_SU) sampleTabName="Sound Unit"; if (ins->type==DIV_INS_NES) sampleTabName="DPCM"; if (ImGui::BeginTabItem(sampleTabName)) { if (ins->type==DIV_INS_NES && e->song.oldDPCM) { @@ -2339,9 +2349,6 @@ void FurnaceGUI::insTabSample(DivInstrument* ins) { ins->type==DIV_INS_VRC6 || ins->type==DIV_INS_SU) { P(ImGui::Checkbox("Use sample",&ins->amiga.useSample)); - if (ins->type==DIV_INS_SU) { - P(ImGui::Checkbox("Switch roles of frequency and phase reset timer",&ins->su.switchRoles)); - } if (ins->type==DIV_INS_X1_010) { if (ImGui::InputInt("Sample bank slot##BANKSLOT",&ins->x1_010.bankSlot,1,4)) { PARAMETER if (ins->x1_010.bankSlot<0) ins->x1_010.bankSlot=0; @@ -4998,12 +5005,8 @@ void FurnaceGUI::drawInsEdit() { } popToggleColors(); - if (ImGui::Checkbox("Volume Macro is Cutoff Macro",&ins->c64.volIsCutoff)) { - ins->std.volMacro.vZoom=-1; - PARAMETER; - } if (ImGui::Checkbox("Absolute Cutoff Macro",&ins->c64.filterIsAbs)) { - ins->std.volMacro.vZoom=-1; + ins->std.algMacro.vZoom=-1; PARAMETER; } if (ImGui::Checkbox("Absolute Duty Macro",&ins->c64.dutyIsAbs)) { @@ -5013,6 +5016,242 @@ void FurnaceGUI::drawInsEdit() { P(ImGui::Checkbox("Don't test before new note",&ins->c64.noTest)); ImGui::EndTabItem(); } + if (ins->type==DIV_INS_SU) if (ImGui::BeginTabItem("Sound Unit")) { + P(ImGui::Checkbox("Switch roles of frequency and phase reset timer",&ins->su.switchRoles)); + if (ImGui::BeginChild("HWSeqSU",ImGui::GetContentRegionAvail(),true,ImGuiWindowFlags_MenuBar)) { + ImGui::BeginMenuBar(); + ImGui::Text("Hardware Sequence"); + ImGui::EndMenuBar(); + + if (ins->su.hwSeqLen>0) if (ImGui::BeginTable("HWSeqListSU",3)) { + ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthFixed); + int curFrame=0; + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + ImGui::TableNextColumn(); + ImGui::Text("Tick"); + ImGui::TableNextColumn(); + ImGui::Text("Command"); + ImGui::TableNextColumn(); + ImGui::Text("Move/Remove"); + for (int i=0; isu.hwSeqLen; i++) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("%d (#%d)",curFrame,i); + ImGui::TableNextColumn(); + ImGui::PushID(i); + if (ins->su.hwSeq[i].cmd>=DivInstrumentSoundUnit::DIV_SU_HWCMD_MAX) { + ins->su.hwSeq[i].cmd=0; + } + int cmd=ins->su.hwSeq[i].cmd; + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (ImGui::Combo("##HWSeqCmd",&cmd,suHWSeqCmdTypes,DivInstrumentSoundUnit::DIV_SU_HWCMD_MAX)) { + if (ins->su.hwSeq[i].cmd!=cmd) { + ins->su.hwSeq[i].cmd=cmd; + ins->su.hwSeq[i].val=0; + ins->su.hwSeq[i].bound=0; + ins->su.hwSeq[i].speed=0; + } + } + bool somethingChanged=false; + switch (ins->su.hwSeq[i].cmd) { + case DivInstrumentSoundUnit::DIV_SU_HWCMD_VOL: { + int swPeriod=ins->su.hwSeq[i].speed; + int swBound=ins->su.hwSeq[i].bound; + int swVal=ins->su.hwSeq[i].val&31; + bool swDir=ins->su.hwSeq[i].val&32; + bool swLoop=ins->su.hwSeq[i].val&64; + bool swInvert=ins->su.hwSeq[i].val&128; + + if (ImGui::InputInt("Period",&swPeriod,1,16)) { + if (swPeriod<0) swPeriod=0; + if (swPeriod>65535) swPeriod=65535; + somethingChanged=true; + } + if (CWSliderInt("Amount",&swVal,0,31)) { + somethingChanged=true; + } + if (CWSliderInt("Bound",&swBound,0,255)) { + somethingChanged=true; + } + if (ImGui::RadioButton("Up",swDir)) { PARAMETER + swDir=true; + somethingChanged=true; + } + ImGui::SameLine(); + if (ImGui::RadioButton("Down",!swDir)) { PARAMETER + swDir=false; + somethingChanged=true; + } + if (ImGui::Checkbox("Loop",&swLoop)) { PARAMETER + somethingChanged=true; + } + ImGui::SameLine(); + if (ImGui::Checkbox("Flip",&swInvert)) { PARAMETER + somethingChanged=true; + } + + if (somethingChanged) { + ins->su.hwSeq[i].speed=swPeriod; + ins->su.hwSeq[i].bound=swBound; + ins->su.hwSeq[i].val=(swVal&31)|(swDir?32:0)|(swLoop?64:0)|(swInvert?128:0); + PARAMETER; + } + break; + } + case DivInstrumentSoundUnit::DIV_SU_HWCMD_PITCH: + case DivInstrumentSoundUnit::DIV_SU_HWCMD_CUT: { + int swPeriod=ins->su.hwSeq[i].speed; + int swBound=ins->su.hwSeq[i].bound; + int swVal=ins->su.hwSeq[i].val&127; + bool swDir=ins->su.hwSeq[i].val&128; + + if (ImGui::InputInt("Period",&swPeriod,1,16)) { + if (swPeriod<0) swPeriod=0; + if (swPeriod>65535) swPeriod=65535; + somethingChanged=true; + } + if (CWSliderInt("Amount",&swVal,0,31)) { + somethingChanged=true; + } + if (CWSliderInt("Bound",&swBound,0,255)) { + somethingChanged=true; + } + if (ImGui::RadioButton("Up",swDir)) { PARAMETER + swDir=true; + somethingChanged=true; + } + ImGui::SameLine(); + if (ImGui::RadioButton("Down",!swDir)) { PARAMETER + swDir=false; + somethingChanged=true; + } + + if (somethingChanged) { + ins->su.hwSeq[i].speed=swPeriod; + ins->su.hwSeq[i].bound=swBound; + ins->su.hwSeq[i].val=(swVal&127)|(swDir?128:0); + PARAMETER; + } + break; + } + case DivInstrumentSoundUnit::DIV_SU_HWCMD_WAIT: { + int len=ins->su.hwSeq[i].val+1; + curFrame+=ins->su.hwSeq[i].val+1; + + if (ImGui::InputInt("Ticks",&len)) { + if (len<1) len=1; + if (len>255) len=256; + somethingChanged=true; + } + + if (somethingChanged) { + ins->su.hwSeq[i].val=len-1; + PARAMETER; + } + break; + } + case DivInstrumentSoundUnit::DIV_SU_HWCMD_WAIT_REL: + curFrame++; + break; + case DivInstrumentSoundUnit::DIV_SU_HWCMD_LOOP: + case DivInstrumentSoundUnit::DIV_SU_HWCMD_LOOP_REL: { + int pos=ins->su.hwSeq[i].val; + + if (ImGui::InputInt("Position",&pos)) { + if (pos<0) pos=0; + if (pos>(ins->su.hwSeqLen-1)) pos=(ins->su.hwSeqLen-1); + somethingChanged=true; + } + + if (somethingChanged) { + ins->su.hwSeq[i].val=pos; + PARAMETER; + } + break; + } + default: + break; + } + ImGui::PopID(); + ImGui::TableNextColumn(); + ImGui::PushID(i+512); + if (ImGui::Button(ICON_FA_CHEVRON_UP "##HWCmdUp")) { + if (i>0) { + e->lockEngine([ins,i]() { + ins->su.hwSeq[i-1].cmd^=ins->su.hwSeq[i].cmd; + ins->su.hwSeq[i].cmd^=ins->su.hwSeq[i-1].cmd; + ins->su.hwSeq[i-1].cmd^=ins->su.hwSeq[i].cmd; + + ins->su.hwSeq[i-1].speed^=ins->su.hwSeq[i].speed; + ins->su.hwSeq[i].speed^=ins->su.hwSeq[i-1].speed; + ins->su.hwSeq[i-1].speed^=ins->su.hwSeq[i].speed; + + ins->su.hwSeq[i-1].val^=ins->su.hwSeq[i].val; + ins->su.hwSeq[i].val^=ins->su.hwSeq[i-1].val; + ins->su.hwSeq[i-1].val^=ins->su.hwSeq[i].val; + + ins->su.hwSeq[i-1].bound^=ins->su.hwSeq[i].bound; + ins->su.hwSeq[i].bound^=ins->su.hwSeq[i-1].bound; + ins->su.hwSeq[i-1].bound^=ins->su.hwSeq[i].bound; + }); + } + MARK_MODIFIED; + } + ImGui::SameLine(); + if (ImGui::Button(ICON_FA_CHEVRON_DOWN "##HWCmdDown")) { + if (isu.hwSeqLen-1) { + e->lockEngine([ins,i]() { + ins->su.hwSeq[i+1].cmd^=ins->su.hwSeq[i].cmd; + ins->su.hwSeq[i].cmd^=ins->su.hwSeq[i+1].cmd; + ins->su.hwSeq[i+1].cmd^=ins->su.hwSeq[i].cmd; + + ins->su.hwSeq[i+1].speed^=ins->su.hwSeq[i].speed; + ins->su.hwSeq[i].speed^=ins->su.hwSeq[i+1].speed; + ins->su.hwSeq[i+1].speed^=ins->su.hwSeq[i].speed; + + ins->su.hwSeq[i+1].val^=ins->su.hwSeq[i].val; + ins->su.hwSeq[i].val^=ins->su.hwSeq[i+1].val; + ins->su.hwSeq[i+1].val^=ins->su.hwSeq[i].val; + + ins->su.hwSeq[i+1].bound^=ins->su.hwSeq[i].bound; + ins->su.hwSeq[i].bound^=ins->su.hwSeq[i+1].bound; + ins->su.hwSeq[i+1].bound^=ins->su.hwSeq[i].bound; + }); + } + MARK_MODIFIED; + } + ImGui::SameLine(); + pushDestColor(); + if (ImGui::Button(ICON_FA_TIMES "##HWCmdDel")) { + for (int j=i; jsu.hwSeqLen-1; j++) { + ins->su.hwSeq[j].cmd=ins->su.hwSeq[j+1].cmd; + ins->su.hwSeq[j].speed=ins->su.hwSeq[j+1].speed; + ins->su.hwSeq[j].val=ins->su.hwSeq[j+1].val; + ins->su.hwSeq[j].bound=ins->su.hwSeq[j+1].bound; + } + ins->su.hwSeqLen--; + } + popDestColor(); + ImGui::PopID(); + } + ImGui::EndTable(); + } + + if (ImGui::Button(ICON_FA_PLUS "##HWCmdAdd")) { + if (ins->su.hwSeqLen<255) { + ins->su.hwSeq[ins->su.hwSeqLen].cmd=0; + ins->su.hwSeq[ins->su.hwSeqLen].speed=0; + ins->su.hwSeq[ins->su.hwSeqLen].val=0; + ins->su.hwSeq[ins->su.hwSeqLen].bound=0; + ins->su.hwSeqLen++; + } + } + } + ImGui::EndChild(); + ImGui::EndTabItem(); + } if (ins->type==DIV_INS_MSM6258 || ins->type==DIV_INS_MSM6295 || ins->type==DIV_INS_ADPCMA || @@ -5735,17 +5974,6 @@ void FurnaceGUI::drawInsEdit() { int volMax=15; int volMin=0; - if (ins->type==DIV_INS_C64) { - if (ins->c64.volIsCutoff) { - volumeLabel="Cutoff"; - if (ins->c64.filterIsAbs) { - volMax=2047; - } else { - volMin=-64; - volMax=64; - } - } - } if (ins->type==DIV_INS_PCE || ins->type==DIV_INS_AY8930 || ins->type==DIV_INS_SM8521) { volMax=31; } @@ -5805,8 +6033,8 @@ void FurnaceGUI::drawInsEdit() { if (ins->c64.dutyIsAbs) { dutyMax=4095; } else { - dutyMin=-96; - dutyMax=96; + dutyMin=-4095; + dutyMax=4095; } } if (ins->type==DIV_INS_STD) { @@ -6191,6 +6419,14 @@ void FurnaceGUI::drawInsEdit() { } if (ex1Max>0) { if (ins->type==DIV_INS_C64) { + int cutoffMin=-2047; + int cutoffMax=2047; + + if (ins->c64.filterIsAbs) { + cutoffMin=0; + cutoffMax=2047; + } + macroList.push_back(FurnaceGUIMacroDesc("Cutoff",&ins->std.algMacro,cutoffMin,cutoffMax,160,uiColors[GUI_COLOR_MACRO_OTHER])); macroList.push_back(FurnaceGUIMacroDesc("Filter Mode",&ins->std.ex1Macro,0,ex1Max,64,uiColors[GUI_COLOR_MACRO_OTHER],false,NULL,NULL,true,filtModeBits)); } else if (ins->type==DIV_INS_SAA1099) { macroList.push_back(FurnaceGUIMacroDesc("Envelope",&ins->std.ex1Macro,0,ex1Max,160,uiColors[GUI_COLOR_MACRO_OTHER],false,NULL,NULL,true,saaEnvBits)); @@ -6236,8 +6472,11 @@ void FurnaceGUI::drawInsEdit() { } } if (ins->type==DIV_INS_C64) { - macroList.push_back(FurnaceGUIMacroDesc("Special",&ins->std.ex3Macro,0,2,32,uiColors[GUI_COLOR_MACRO_OTHER],false,NULL,NULL,true,c64SpecialBits)); - macroList.push_back(FurnaceGUIMacroDesc("Test/Gate",&ins->std.ex4Macro,0,1,32,uiColors[GUI_COLOR_MACRO_OTHER],false,NULL,NULL,true)); + macroList.push_back(FurnaceGUIMacroDesc("Special",&ins->std.ex4Macro,0,4,64,uiColors[GUI_COLOR_MACRO_OTHER],false,NULL,NULL,true,c64TestGateBits)); + macroList.push_back(FurnaceGUIMacroDesc("Attack",&ins->std.ex5Macro,0,15,128,uiColors[GUI_COLOR_MACRO_OTHER])); + macroList.push_back(FurnaceGUIMacroDesc("Decay",&ins->std.ex6Macro,0,15,128,uiColors[GUI_COLOR_MACRO_OTHER])); + macroList.push_back(FurnaceGUIMacroDesc("Sustain",&ins->std.ex7Macro,0,15,128,uiColors[GUI_COLOR_MACRO_OTHER])); + macroList.push_back(FurnaceGUIMacroDesc("Release",&ins->std.ex8Macro,0,15,128,uiColors[GUI_COLOR_MACRO_OTHER])); } if (ins->type==DIV_INS_AY || ins->type==DIV_INS_AY8930 || (ins->type==DIV_INS_X1_010 && !ins->amiga.useSample)) { macroList.push_back(FurnaceGUIMacroDesc("AutoEnv Num",&ins->std.ex3Macro,0,15,160,uiColors[GUI_COLOR_MACRO_OTHER])); diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 98ea6c94e..212de12f2 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -932,19 +932,21 @@ void FurnaceGUI::drawPattern() { ImGuiWindow* win=ImGui::GetCurrentWindow(); ImVec2 posMin=win->DC.CursorPos; ImGui::Dummy(ImVec2(dpiScale,settings.iconSize*dpiScale)); - ImVec2 posMax=ImGui::GetContentRegionMax(); + ImVec2 posMax=ImVec2(win->WorkRect.Max.x,win->WorkRect.Max.y); + posMin.y-=ImGui::GetStyle().ItemSpacing.y*0.5; ImDrawList* dl=ImGui::GetWindowDrawList(); - ImVec2 iconPos[6]; - - for (int i=0; i<6; i++) { - iconPos[i]=ImLerp(posMin,posMax,ImVec2((float)i/6.0f,0.0f)); - - //dl->AddText(mainFont,settings.mainFontSize*dpiScale,iconPos[i],0xffffffff,ICON_FUR_SINE); - } - DivChannelState* cs=e->getChanState(i); if (cs!=NULL) { + DivChannelModeHints hints=e->getChanModeHints(i); + if (hints.count>4) hints.count=4; + int hintCount=3+hints.count; + + // calculate icon size + for (int i=0; ikeyOn) { @@ -960,6 +962,7 @@ void FurnaceGUI::drawPattern() { onOffColor=uiColors[GUI_COLOR_PATTERN_STATUS_OFF]; } } + iconPos[0].x-=mainFont->CalcTextSizeA(mainFont->FontSize,FLT_MAX,0.0f,ICON_FA_SQUARE).x*0.5f; dl->AddText(mainFont,settings.mainFontSize*dpiScale,iconPos[0],ImGui::GetColorU32(onOffColor),ICON_FA_SQUARE); // 2. PITCH SLIDE/VIBRATO @@ -967,23 +970,24 @@ void FurnaceGUI::drawPattern() { const char* pitchIcon=ICON_FUR_SINE; if (cs->inPorta) { pitchIcon=ICON_FA_SHARE; - pitchColor=uiColors[GUI_COLOR_PATTERN_EFFECT_PITCH]; + pitchColor=uiColors[GUI_COLOR_PATTERN_STATUS_PITCH]; } else if (cs->portaSpeed>0) { if (cs->portaNote>=60) { pitchIcon=ICON_FA_CHEVRON_UP; } else { pitchIcon=ICON_FA_CHEVRON_DOWN; } - pitchColor=uiColors[GUI_COLOR_PATTERN_EFFECT_PITCH]; + pitchColor=uiColors[GUI_COLOR_PATTERN_STATUS_PITCH]; } else if (cs->vibratoDepth>0) { pitchIcon=ICON_FUR_SINE; - pitchColor=uiColors[GUI_COLOR_PATTERN_EFFECT_PITCH]; + pitchColor=uiColors[GUI_COLOR_PATTERN_STATUS_PITCH]; } else if (cs->arp) { pitchIcon=ICON_FA_BARS; - pitchColor=uiColors[GUI_COLOR_PATTERN_EFFECT_MISC]; + pitchColor=uiColors[GUI_COLOR_PATTERN_STATUS_NOTE]; } else { - pitchColor=uiColors[GUI_COLOR_TOGGLE_OFF]; + pitchColor=uiColors[GUI_COLOR_PATTERN_STATUS_OFF]; } + iconPos[1].x-=mainFont->CalcTextSizeA(mainFont->FontSize,FLT_MAX,0.0f,pitchIcon).x*0.5f; dl->AddText(mainFont,settings.mainFontSize*dpiScale,iconPos[1],ImGui::GetColorU32(pitchColor),pitchIcon); @@ -992,18 +996,95 @@ void FurnaceGUI::drawPattern() { const char* volIcon=ICON_FA_MINUS; if (cs->tremoloDepth>0) { volIcon=ICON_FUR_SINE; - volColor=uiColors[GUI_COLOR_PATTERN_VOLUME_MAX]; + volColor=uiColors[GUI_COLOR_PATTERN_STATUS_VOLUME]; } else if (cs->volSpeed) { if (cs->volSpeed>0) { volIcon=ICON_FA_CHEVRON_UP; } else { volIcon=ICON_FA_CHEVRON_DOWN; } - volColor=uiColors[GUI_COLOR_PATTERN_VOLUME_MAX]; + volColor=uiColors[GUI_COLOR_PATTERN_STATUS_VOLUME]; } else { - volColor=uiColors[GUI_COLOR_TOGGLE_OFF]; + volColor=uiColors[GUI_COLOR_PATTERN_STATUS_OFF]; } + iconPos[2].x-=mainFont->CalcTextSizeA(mainFont->FontSize,FLT_MAX,0.0f,volIcon).x*0.5f; dl->AddText(mainFont,settings.mainFontSize*dpiScale,iconPos[2],ImGui::GetColorU32(volColor),volIcon); + + // 4. OTHER + for (int i=0; iCalcTextSizeA(mainFont->FontSize,FLT_MAX,0.0f,hints.hint[i]).x*0.5f; + dl->AddText(mainFont,settings.mainFontSize*dpiScale,iconPos[i+3],ImGui::GetColorU32(hintColor),hints.hint[i]); + } } } chanHeadBottom=ImGui::GetCursorScreenPos().y-ImGui::GetStyle().ItemSpacing.y; diff --git a/src/gui/plot_nolerp.cpp b/src/gui/plot_nolerp.cpp index eefb4ea1b..f4d03717d 100644 --- a/src/gui/plot_nolerp.cpp +++ b/src/gui/plot_nolerp.cpp @@ -394,6 +394,8 @@ int PlotCustomEx(ImGuiPlotType plot_type, const char* label, float (*values_gett window->DrawList->AddLine(ImLerp(inner_bb.Min,inner_bb.Max,ImVec2(0.0f,histogram_zero_line_t)),ImLerp(inner_bb.Min,inner_bb.Max,ImVec2(1.0f,histogram_zero_line_t)),col_base); } + ImVec2 chevron[3]; + for (int n = 0; n < res_w; n++) { const float t1 = t0 + t_step; @@ -421,11 +423,30 @@ int PlotCustomEx(ImGuiPlotType plot_type, const char* label, float (*values_gett if (values_highlight!=NULL) { if (values_highlight[v1_idx]) rCol=ImGui::GetColorU32(highlightColor); } - window->DrawList->AddRectFilled(pos0, pos1, rCol); + if (blockMode) { + if ((int)v0>=(int)(scale_max+0.5)) { + float chScale=(pos1.x-pos0.x)*0.125; + chevron[0]=ImVec2(pos0.x+(pos1.x-pos0.x)*0.25,pos1.y+4.0f*chScale); + chevron[1]=ImVec2(pos0.x+(pos1.x-pos0.x)*0.5,pos1.y+2.0f*chScale); + chevron[2]=ImVec2(pos0.x+(pos1.x-pos0.x)*0.75,pos1.y+4.0f*chScale); + window->DrawList->AddPolyline(chevron, 3, rCol, 0, chScale); + } else if ((int)v0<(int)(scale_min)) { + float chScale=(pos1.x-pos0.x)*0.125; + chevron[0]=ImVec2(pos0.x+(pos1.x-pos0.x)*0.25,pos1.y-4.0f*chScale); + chevron[1]=ImVec2(pos0.x+(pos1.x-pos0.x)*0.5,pos1.y-2.0f*chScale); + chevron[2]=ImVec2(pos0.x+(pos1.x-pos0.x)*0.75,pos1.y-4.0f*chScale); + window->DrawList->AddPolyline(chevron, 3, rCol, 0, chScale); + } else { + window->DrawList->AddRectFilled(pos0, pos1, rCol); + } + } else { + window->DrawList->AddRectFilled(pos0, pos1, rCol); + } } t0 = t1; tp0 = tp1; + v0 = v1; } } diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index b83794638..e64452721 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -976,7 +976,7 @@ void FurnaceGUI::initSystemPresets() { ); ENTRY( "PC + AdLib (drums mode)", { - CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") } ); diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 9e8212216..5a57483dd 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -572,6 +572,7 @@ void FurnaceGUI::drawSampleEdit() { sampleNoteCoarse=i; coarseChanged=true; } + if (i==sampleNoteCoarse) ImGui::SetItemDefaultFocus(); } ImGui::EndCombo(); } else if (ImGui::IsItemHovered()) { diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 6384d2aad..de5fc62e1 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -1060,6 +1060,12 @@ void FurnaceGUI::drawSettings() { settingsChanged=true; } + bool audioHiPassB=settings.audioHiPass; + if (ImGui::Checkbox("DC offset correction",&audioHiPassB)) { + settings.audioHiPass=audioHiPassB; + settingsChanged=true; + } + // SUBSECTION METRONOME CONFIG_SUBSECTION("Metronome"); ImGui::AlignTextToFramePadding(); @@ -3366,10 +3372,30 @@ void FurnaceGUI::drawSettings() { UI_COLOR_CONFIG(GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,"Secondary specific effect"); UI_COLOR_CONFIG(GUI_COLOR_PATTERN_EFFECT_MISC,"Miscellaneous"); UI_COLOR_CONFIG(GUI_COLOR_EE_VALUE,"External command output"); - UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_OFF,"Status: off"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_OFF,"Status: off/disabled"); UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_REL,"Status: off + macro rel"); UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_REL_ON,"Status: on + macro rel"); UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_ON,"Status: on"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_VOLUME,"Status: volume"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_PITCH,"Status: pitch"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_PANNING,"Status: panning"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_SYS1,"Status: chip (primary)"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_SYS2,"Status: chip (secondary)"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_MIXING,"Status: mixing"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_DSP,"Status: DSP effect"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_NOTE,"Status: note altering"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_MISC1,"Status: misc color 1"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_MISC2,"Status: misc color 2"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_MISC3,"Status: misc color 3"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_ATTACK,"Status: attack"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_DECAY,"Status: decay"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_SUSTAIN,"Status: sustain"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_RELEASE,"Status: release"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_DEC_LINEAR,"Status: decrease linear"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_DEC_EXP,"Status: decrease exp"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_INC,"Status: increase"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_BENT,"Status: bent"); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_DIRECT,"Status: direct"); ImGui::TreePop(); } if (ImGui::TreeNode("Sample Editor")) { @@ -3554,6 +3580,7 @@ void FurnaceGUI::syncSettings() { settings.renderDriver=e->getConfString("renderDriver",""); settings.sdlAudioDriver=e->getConfString("sdlAudioDriver",""); settings.audioQuality=e->getConfInt("audioQuality",0); + settings.audioHiPass=e->getConfInt("audioHiPass",1); settings.audioBufSize=e->getConfInt("audioBufSize",1024); settings.audioRate=e->getConfInt("audioRate",44100); settings.arcadeCore=e->getConfInt("arcadeCore",0); @@ -3736,6 +3763,7 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.iconSize,2,48); clampSetting(settings.audioEngine,0,2); clampSetting(settings.audioQuality,0,1); + clampSetting(settings.audioHiPass,0,1); clampSetting(settings.audioBufSize,32,4096); clampSetting(settings.audioRate,8000,384000); clampSetting(settings.audioChans,1,16); @@ -3967,7 +3995,9 @@ void FurnaceGUI::commitSettings() { settings.fdsCoreRender!=e->getConfInt("fdsCoreRender",0) || settings.c64CoreRender!=e->getConfInt("c64CoreRender",0) || settings.pokeyCoreRender!=e->getConfInt("pokeyCoreRender",1) || - settings.opnCoreRender!=e->getConfInt("opnCoreRender",1) + settings.opnCoreRender!=e->getConfInt("opnCoreRender",1) || + settings.audioQuality!=e->getConfInt("audioQuality",0) || + settings.audioHiPass!=e->getConfInt("audioHiPass",1) ); e->setConf("mainFontSize",settings.mainFontSize); @@ -3981,6 +4011,7 @@ void FurnaceGUI::commitSettings() { e->setConf("renderDriver",settings.renderDriver); e->setConf("sdlAudioDriver",settings.sdlAudioDriver); e->setConf("audioQuality",settings.audioQuality); + e->setConf("audioHiPass",settings.audioHiPass); e->setConf("audioBufSize",settings.audioBufSize); e->setConf("audioRate",settings.audioRate); e->setConf("audioChans",settings.audioChans); diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index a552ccadc..b6106efc1 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -586,10 +586,13 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl case DIV_SYSTEM_C64_6581: { int clockSel=flags.getInt("clockSel",0); bool keyPriority=flags.getBool("keyPriority",true); + bool no1EUpdate=flags.getBool("no1EUpdate",false); + bool multiplyRel=flags.getBool("multiplyRel",false); int testAttack=flags.getInt("testAttack",0); int testDecay=flags.getInt("testDecay",0); int testSustain=flags.getInt("testSustain",0); int testRelease=flags.getInt("testRelease",0); + int initResetTime=flags.getInt("initResetTime",2); ImGui::Text("Clock rate:"); @@ -644,14 +647,38 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl altered=true; } + ImGui::Text("Envelope reset time:"); + + pushWarningColor(initResetTime<1 || initResetTime>4); + if (CWSliderInt("##InitReset",&initResetTime,0,16)) { + if (initResetTime<0) initResetTime=0; + if (initResetTime>16) initResetTime=16; + altered=true; + } + popWarningColor(); + + ImGui::Text("- 0 disables envelope reset. not recommended!\n- 1 may trigger SID envelope bugs.\n- values that are too high may result in notes being skipped."); + + if (ImGui::Checkbox("Disable 1Exy env update (compatibility)",&no1EUpdate)) { + altered=true; + } + + if (ImGui::Checkbox("Relative duty and cutoff macros are coarse (compatibility)",&multiplyRel)) { + altered=true; + } + + if (altered) { e->lockSave([&]() { flags.set("clockSel",clockSel); flags.set("keyPriority",keyPriority); + flags.set("no1EUpdate",no1EUpdate); + flags.set("multiplyRel",multiplyRel); flags.set("testAttack",testAttack); flags.set("testDecay",testDecay); flags.set("testSustain",testSustain); flags.set("testRelease",testRelease); + flags.set("initResetTime",initResetTime); }); } break; diff --git a/src/gui/sysManager.cpp b/src/gui/sysManager.cpp index 80f9c001a..07741e44c 100644 --- a/src/gui/sysManager.cpp +++ b/src/gui/sysManager.cpp @@ -83,10 +83,7 @@ void FurnaceGUI::drawSysManager() { ImGui::TreePop(); } ImGui::TableNextColumn(); - ImGui::Button(ICON_FA_CHEVRON_DOWN "##SysChange"); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Change"); - } + ImGui::Button("Change##SysChange"); if (ImGui::BeginPopupContextItem("SysPickerC",ImGuiPopupFlags_MouseButtonLeft)) { DivSystem picked=systemPicker(); if (picked!=DIV_SYSTEM_NULL) { diff --git a/src/gui/tutorial.cpp b/src/gui/tutorial.cpp index ef98a9533..7774b95f0 100644 --- a/src/gui/tutorial.cpp +++ b/src/gui/tutorial.cpp @@ -274,7 +274,7 @@ void FurnaceGUI::drawTutorial() { ImGui::TextWrapped( "if you need help, you may:\n" "- read the manual (a file called manual.pdf)\n" - "- ask for help in Discussions (https://github.com/tildearrow/furnace/discussions), the Furnace Discord (https://discord.gg/EfrwT2wq7z) or Furnace in Revolt (https://rvlt.gg/GRPS6tmc)" + "- ask for help in Discussions (https://github.com/tildearrow/furnace/discussions), the Furnace Discord (https://discord.gg/EfrwT2wq7z) or Furnace in Revolt (official: https://rvlt.gg/GRPS6tmc)" ); ImGui::Separator(); diff --git a/src/gui/furIcons.h b/src/icon/furIcons.h similarity index 79% rename from src/gui/furIcons.h rename to src/icon/furIcons.h index a97085bd8..718e6822b 100644 --- a/src/gui/furIcons.h +++ b/src/icon/furIcons.h @@ -1,7 +1,7 @@ // not auto-generated. update every time you change icons.ttf! #define ICON_MIN_FUR 0xe0f0 -#define ICON_MAX_FUR 0xe144 +#define ICON_MAX_FUR 0xe158 // test #define ICON_FUR_TEST0 u8"\ue0f0" @@ -82,5 +82,27 @@ #define ICON_FUR_SAMPLE_SIGN u8"\ue140" #define ICON_FUR_SAMPLE_TRIM u8"\ue141" +// waveforms +#define ICON_FUR_NOISE u8"\ue14f" +#define ICON_FUR_PULSE1 u8"\ue150" +#define ICON_FUR_PULSE2 u8"\ue151" +#define ICON_FUR_PULSE3 u8"\ue152" +#define ICON_FUR_PULSE4 u8"\ue153" +#define ICON_FUR_PULSE5 u8"\ue154" +#define ICON_FUR_PULSE6 u8"\ue155" +#define ICON_FUR_PULSE7 u8"\ue156" +#define ICON_FUR_SAW u8"\ue157" +#define ICON_FUR_TRI u8"\ue158" + // misc -#define ICON_FUR_SINE u8"\ue144" \ No newline at end of file +#define ICON_FUR_SINE u8"\ue144" +#define ICON_FUR_ADSR_A u8"\ue145" +#define ICON_FUR_ADSR_D u8"\ue146" +#define ICON_FUR_ADSR_S u8"\ue147" +#define ICON_FUR_ADSR_R u8"\ue148" +#define ICON_FUR_DEC_LINEAR u8"\ue149" +#define ICON_FUR_DEC_EXP u8"\ue14a" +#define ICON_FUR_INC_LINEAR u8"\ue14b" +#define ICON_FUR_INC_BENT u8"\ue14c" +#define ICON_FUR_VOL_DIRECT u8"\ue14d" +#define ICON_FUR_ADSR u8"\ue14e" \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 356cde56e..e5dc006bd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -370,7 +370,7 @@ void initParams() { params.push_back(TAParam("C","cmdout",true,pCmdOut,"","output command stream")); params.push_back(TAParam("b","binary",false,pBinary,"","set command stream output format to binary")); params.push_back(TAParam("L","loglevel",true,pLogLevel,"debug|info|warning|error","set the log level (info by default)")); - params.push_back(TAParam("v","view",true,pView,"pattern|commands|nothing","set visualization (pattern by default)")); + params.push_back(TAParam("v","view",true,pView,"pattern|commands|nothing","set visualization (nothing by default)")); params.push_back(TAParam("i","info",false,pInfo,"","get info about a song")); params.push_back(TAParam("c","console",false,pConsole,"","enable console mode")); @@ -554,7 +554,7 @@ int main(int argc, char** argv) { if (safeMode && (consoleMode || benchMode || infoMode || outName!="" || vgmOutName!="" || cmdOutName!="")) { logE("you can't use safe mode and console/export mode together."); - return 0; + return 1; } if (safeMode && !safeModeWithAudio) { @@ -566,11 +566,13 @@ int main(int argc, char** argv) { FILE* f=ps_fopen(fileName.c_str(),"rb"); if (f==NULL) { reportError(fmt::sprintf("couldn't open file! (%s)",strerror(errno))); + e.everythingOK(); finishLogFile(); return 1; } if (fseek(f,0,SEEK_END)<0) { reportError(fmt::sprintf("couldn't open file! (couldn't get file size: %s)",strerror(errno))); + e.everythingOK(); fclose(f); finishLogFile(); return 1; @@ -578,6 +580,7 @@ int main(int argc, char** argv) { ssize_t len=ftell(f); if (len==(SIZE_MAX>>1)) { reportError(fmt::sprintf("couldn't open file! (couldn't get file length: %s)",strerror(errno))); + e.everythingOK(); fclose(f); finishLogFile(); return 1; @@ -588,6 +591,7 @@ int main(int argc, char** argv) { } else { reportError(fmt::sprintf("couldn't open file! (tell error: %s)",strerror(errno))); } + e.everythingOK(); fclose(f); finishLogFile(); return 1; @@ -595,6 +599,7 @@ int main(int argc, char** argv) { unsigned char* file=new unsigned char[len]; if (fseek(f,0,SEEK_SET)<0) { reportError(fmt::sprintf("couldn't open file! (size error: %s)",strerror(errno))); + e.everythingOK(); fclose(f); delete[] file; finishLogFile(); @@ -602,6 +607,7 @@ int main(int argc, char** argv) { } if (fread(file,1,(size_t)len,f)!=(size_t)len) { reportError(fmt::sprintf("couldn't open file! (read error: %s)",strerror(errno))); + e.everythingOK(); fclose(f); delete[] file; finishLogFile(); @@ -610,6 +616,7 @@ int main(int argc, char** argv) { fclose(f); if (!e.load(file,(size_t)len)) { reportError(fmt::sprintf("could not open file! (%s)",e.getLastError())); + e.everythingOK(); finishLogFile(); return 1; }