From ce7281a1ebd586881c114eb78ed115604b431b29 Mon Sep 17 00:00:00 2001 From: Jon Latane Date: Fri, 6 Sep 2019 12:27:20 -0400 Subject: [PATCH 1/4] Firebase things and stuff --- .gitignore | 1 + app/build.gradle | 5 +- .../kotlin/com/jonlatane/beatpad/Dialogs.kt | 2 +- .../beatpad/PaletteEditorActivity.kt | 42 +- .../model/chord/ChordExtensionNames.kt | 3768 +++++++++-------- .../com/jonlatane/beatpad/storage/Storage.kt | 1 + .../smartrecycler/RecyclerViewExtensions.kt | 2 +- .../beatpad/view/InstrumentConfiguration.kt | 2 +- .../beatpad/view/beat/BeatAdapter.kt | 2 +- .../view/harmony/ChordTextPositioner.kt | 2 +- .../view/harmony/HarmonyBeatAdapter.kt | 6 +- .../beatpad/view/melody/MelodyBeatAdapter.kt | 2 +- .../beatpad/view/melody/MelodyView.kt | 2 +- .../view/palette/BeatScratchToolbar.kt | 7 +- .../view/palette/MelodyReferenceAdapter.kt | 10 +- .../beatpad/view/palette/PaletteViewModel.kt | 6 +- .../beatpad/view/palette/PartListAdapter.kt | 10 +- .../view/palette/SectionListAdapter.kt | 10 +- .../beatpad/view/palette/SectionListView.kt | 2 +- .../filemanagement/PaletteManagementDialog.kt | 4 +- .../main/res/menu/beatscratch_app_menu.xml | 2 + build.gradle | 2 + 22 files changed, 1972 insertions(+), 1918 deletions(-) diff --git a/.gitignore b/.gitignore index 9577decf..f7726827 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ /captures .externalNativeBuild .idea/**/* +google-services.json diff --git a/app/build.gradle b/app/build.gradle index 14c1febf..c729bdfd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,6 +80,8 @@ android { } } +apply plugin: 'com.google.gms.google-services' // Google Play services Gradle plugin + repositories { jcenter() maven { url 'https://jitpack.io' } @@ -111,8 +113,7 @@ dependencies { implementation 'net.iharder:base64:2.3.9' implementation 'com.github.stupacki:MultiFunctions:1.2.1' //implementation 'org.nield:kotlin-statistics:1.2.1' - - + implementation 'com.firebaseui:firebase-ui-auth:4.3.1' implementation("org.jetbrains.kotlinx:kotlinx-io-jvm:$kotlinx_io_version") { exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-common' diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/Dialogs.kt b/app/src/main/kotlin/com/jonlatane/beatpad/Dialogs.kt index bc0952c0..da4ef102 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/Dialogs.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/Dialogs.kt @@ -163,7 +163,7 @@ fun showInstrumentPicker2( } } ).lparams(matchParent, wrapContent) - adapter = recycler.adapter + adapter = recycler.adapter!! } } }.show() diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt b/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt index da66d0be..ff00a7ff 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt @@ -9,6 +9,9 @@ import android.os.Bundle import android.support.constraint.ConstraintSet import android.view.View import android.view.WindowManager +import com.firebase.ui.auth.AuthUI +import com.firebase.ui.auth.IdpResponse +import com.google.firebase.auth.FirebaseAuth import com.jonlatane.beatpad.model.Melody import com.jonlatane.beatpad.model.Part import com.jonlatane.beatpad.output.instrument.audiotrack.AudioTrackCache @@ -37,10 +40,13 @@ class PaletteEditorActivity : Activity(), Storage, AnkoLogger, InstrumentConfigu override val storageContext: Context get() = this private lateinit var ui: PaletteUI override val viewModel get() = ui.viewModel + companion object { + val RC_SIGN_IN = 1001 + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - ui = PaletteUI(viewModel = PaletteViewModel(storageContext)).also { + ui = PaletteUI(viewModel = PaletteViewModel(storageContext, this)).also { it.setContentView(this) } @@ -210,6 +216,40 @@ class PaletteEditorActivity : Activity(), Storage, AnkoLogger, InstrumentConfigu outState.putInt("beatHeight", viewModel.melodyBeatAdapter.elementHeight) } + fun signIn() { + // Choose authentication providers + val providers = arrayListOf( + AuthUI.IdpConfig.EmailBuilder().build(), + AuthUI.IdpConfig.PhoneBuilder().build(), + AuthUI.IdpConfig.GoogleBuilder().build()) + + // Create and launch sign-in intent + startActivityForResult( + AuthUI.getInstance() + .createSignInIntentBuilder() + .setAvailableProviders(providers) + .build(), + RC_SIGN_IN) + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (requestCode == RC_SIGN_IN) { + val response = IdpResponse.fromResultIntent(data) + + if (resultCode == Activity.RESULT_OK) { + // Successfully signed in + val user = FirebaseAuth.getInstance().currentUser + // ... + } else { + // Sign in failed. If response is null the user canceled the + // sign-in flow using the back button. Otherwise check + // response.getError().getErrorCode() and handle the error. + // ... + } + } + } + /** * For handling diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/model/chord/ChordExtensionNames.kt b/app/src/main/kotlin/com/jonlatane/beatpad/model/chord/ChordExtensionNames.kt index 93cdfdff..19f509d6 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/model/chord/ChordExtensionNames.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/model/chord/ChordExtensionNames.kt @@ -10,6 +10,8 @@ package com.jonlatane.beatpad.model.chord * Same for minor 3 vs. #9, #5 vs b6, etc. 2048 names total. Grind away yay! 😩 */ object ChordExtensionNames { + fun slashRoot(tone: Int) = "{slashRoot:$tone}" + const val slashBass = "{slashBass}" operator fun get(extension: Int): List = when(extension) { 0b00000000000 -> listOf(" only") 0b00000000001 -> listOf("(M7 only)") @@ -68,98 +70,98 @@ object ChordExtensionNames { 0b00000110110 -> listOf("(b5,5,6,7 only)") 0b00000110111 -> listOf("(b5,5,6,7,M7 only)") 0b00000111000 -> listOf("(b5,5,b6 only)") - 0b00000111001 -> listOf("?") - 0b00000111010 -> listOf("?") - 0b00000111011 -> listOf("?") - 0b00000111100 -> listOf("?") - 0b00000111101 -> listOf("?") - 0b00000111110 -> listOf("?") - 0b00000111111 -> listOf("?") + 0b00000111001 -> listOf() + 0b00000111010 -> listOf() + 0b00000111011 -> listOf() + 0b00000111100 -> listOf() + 0b00000111101 -> listOf() + 0b00000111110 -> listOf() + 0b00000111111 -> listOf() 0b00001000000 -> listOf("sus(no5)") 0b00001000001 -> listOf("M7sus(no5)") 0b00001000010 -> listOf("7sus(no5)") 0b00001000011 -> listOf("M7sus(no5)") - 0b00001000100 -> listOf("?") - 0b00001000101 -> listOf("?") - 0b00001000110 -> listOf("?") - 0b00001000111 -> listOf("?") - 0b00001001000 -> listOf("?") - 0b00001001001 -> listOf("?") - 0b00001001010 -> listOf("?") - 0b00001001011 -> listOf("?") - 0b00001001100 -> listOf("?") - 0b00001001101 -> listOf("?") - 0b00001001110 -> listOf("?") - 0b00001001111 -> listOf("?") - 0b00001010000 -> listOf("?") - 0b00001010001 -> listOf("?") - 0b00001010010 -> listOf("?") - 0b00001010011 -> listOf("?") - 0b00001010100 -> listOf("?") - 0b00001010101 -> listOf("?") - 0b00001010110 -> listOf("?") - 0b00001010111 -> listOf("?") - 0b00001011000 -> listOf("?") - 0b00001011001 -> listOf("?") - 0b00001011010 -> listOf("?") - 0b00001011011 -> listOf("?") - 0b00001011100 -> listOf("?") - 0b00001011101 -> listOf("?") - 0b00001011110 -> listOf("?") - 0b00001011111 -> listOf("?") - 0b00001100000 -> listOf("?") - 0b00001100001 -> listOf("?") - 0b00001100010 -> listOf("?") - 0b00001100011 -> listOf("?") - 0b00001100100 -> listOf("?") - 0b00001100101 -> listOf("?") - 0b00001100110 -> listOf("?") - 0b00001100111 -> listOf("?") - 0b00001101000 -> listOf("?") - 0b00001101001 -> listOf("?") - 0b00001101010 -> listOf("?") - 0b00001101011 -> listOf("?") - 0b00001101100 -> listOf("?") - 0b00001101101 -> listOf("?") - 0b00001101110 -> listOf("?") - 0b00001101111 -> listOf("?") - 0b00001110000 -> listOf("?") - 0b00001110001 -> listOf("?") - 0b00001110010 -> listOf("?") - 0b00001110011 -> listOf("?") - 0b00001110100 -> listOf("?") - 0b00001110101 -> listOf("?") - 0b00001110110 -> listOf("?") - 0b00001110111 -> listOf("?") - 0b00001111000 -> listOf("?") - 0b00001111001 -> listOf("?") - 0b00001111010 -> listOf("?") - 0b00001111011 -> listOf("?") - 0b00001111100 -> listOf("?") - 0b00001111101 -> listOf("?") - 0b00001111110 -> listOf("?") - 0b00001111111 -> listOf("?") - 0b00010000000 -> listOf("(no 5)") // Major no 5) - 0b00010000001 -> listOf("?") - 0b00010000010 -> listOf("?") - 0b00010000011 -> listOf("?") - 0b00010000100 -> listOf("?") - 0b00010000101 -> listOf("?") - 0b00010000110 -> listOf("?") - 0b00010000111 -> listOf("?") - 0b00010001000 -> listOf("?") - 0b00010001001 -> listOf("?") - 0b00010001010 -> listOf("?") - 0b00010001011 -> listOf("?") - 0b00010001100 -> listOf("?") - 0b00010001101 -> listOf("?") - 0b00010001110 -> listOf("?") - 0b00010001111 -> listOf("?") - 0b00010010000 -> listOf("") // Actual major chord) - 0b00010010001 -> listOf("M7") + 0b00001000100 -> listOf() + 0b00001000101 -> listOf() + 0b00001000110 -> listOf() + 0b00001000111 -> listOf() + 0b00001001000 -> listOf() + 0b00001001001 -> listOf() + 0b00001001010 -> listOf() + 0b00001001011 -> listOf() + 0b00001001100 -> listOf() + 0b00001001101 -> listOf() + 0b00001001110 -> listOf() + 0b00001001111 -> listOf() + 0b00001010000 -> listOf() + 0b00001010001 -> listOf() + 0b00001010010 -> listOf() + 0b00001010011 -> listOf() + 0b00001010100 -> listOf() + 0b00001010101 -> listOf() + 0b00001010110 -> listOf() + 0b00001010111 -> listOf() + 0b00001011000 -> listOf() + 0b00001011001 -> listOf() + 0b00001011010 -> listOf() + 0b00001011011 -> listOf() + 0b00001011100 -> listOf() + 0b00001011101 -> listOf() + 0b00001011110 -> listOf() + 0b00001011111 -> listOf() + 0b00001100000 -> listOf() + 0b00001100001 -> listOf() + 0b00001100010 -> listOf() + 0b00001100011 -> listOf() + 0b00001100100 -> listOf() + 0b00001100101 -> listOf() + 0b00001100110 -> listOf() + 0b00001100111 -> listOf() + 0b00001101000 -> listOf() + 0b00001101001 -> listOf() + 0b00001101010 -> listOf() + 0b00001101011 -> listOf() + 0b00001101100 -> listOf() + 0b00001101101 -> listOf() + 0b00001101110 -> listOf() + 0b00001101111 -> listOf() + 0b00001110000 -> listOf() + 0b00001110001 -> listOf() + 0b00001110010 -> listOf() + 0b00001110011 -> listOf() + 0b00001110100 -> listOf() + 0b00001110101 -> listOf() + 0b00001110110 -> listOf() + 0b00001110111 -> listOf() + 0b00001111000 -> listOf() + 0b00001111001 -> listOf() + 0b00001111010 -> listOf() + 0b00001111011 -> listOf() + 0b00001111100 -> listOf() + 0b00001111101 -> listOf() + 0b00001111110 -> listOf() + 0b00001111111 -> listOf() + 0b00010000000 -> listOf("(no5)") // Major no 5) + 0b00010000001 -> listOf("M7(no5)") + 0b00010000010 -> listOf("7(no5)") + 0b00010000011 -> listOf("M7#6(no5)") + 0b00010000100 -> listOf("6(no5)", "${slashRoot(9)}m/$slashBass") + 0b00010000101 -> listOf("M7(6)(no5)") + 0b00010000110 -> listOf("7(6)(no5)") + 0b00010000111 -> listOf("M7#6(6)(no5)") + 0b00010001000 -> listOf("M#5") + 0b00010001001 -> listOf("M7#5") + 0b00010001010 -> listOf("7#5") + 0b00010001011 -> listOf("M7#6#5") + 0b00010001100 -> listOf("6#5") + 0b00010001101 -> listOf("M7#5(6)") + 0b00010001110 -> listOf("7#5(6)") + 0b00010001111 -> listOf("M7#5#6(6)") + 0b00010010000 -> listOf("") // Actual major chord + 0b00010010001 -> listOf("M7", "${slashRoot(4)}m/$slashBass") 0b00010010010 -> listOf("7") 0b00010010011 -> listOf("M7#13") - 0b00010010100 -> listOf("6") + 0b00010010100 -> listOf("6", "${slashRoot(9)}m7/$slashBass") 0b00010010101 -> listOf("M7(13)") 0b00010010110 -> listOf("7(13)") 0b00010010111 -> listOf("M7(13)(#13)") @@ -167,122 +169,122 @@ object ChordExtensionNames { 0b00010011001 -> listOf("M7(b6)") 0b00010011010 -> listOf("7(b13)") 0b00010011011 -> listOf("M7(b13)(#13)") - 0b00010011100 -> listOf("?") - 0b00010011101 -> listOf("?") - 0b00010011110 -> listOf("?") - 0b00010011111 -> listOf("?") - 0b00010100000 -> listOf("?") - 0b00010100001 -> listOf("?") - 0b00010100010 -> listOf("?") - 0b00010100011 -> listOf("?") - 0b00010100100 -> listOf("?") - 0b00010100101 -> listOf("?") - 0b00010100110 -> listOf("?") - 0b00010100111 -> listOf("?") - 0b00010101000 -> listOf("?") - 0b00010101001 -> listOf("?") - 0b00010101010 -> listOf("?") - 0b00010101011 -> listOf("?") - 0b00010101100 -> listOf("?") - 0b00010101101 -> listOf("?") - 0b00010101110 -> listOf("?") - 0b00010101111 -> listOf("?") - 0b00010110000 -> listOf("?") - 0b00010110001 -> listOf("?") - 0b00010110010 -> listOf("?") - 0b00010110011 -> listOf("?") - 0b00010110100 -> listOf("?") - 0b00010110101 -> listOf("?") - 0b00010110110 -> listOf("?") - 0b00010110111 -> listOf("?") - 0b00010111000 -> listOf("?") - 0b00010111001 -> listOf("?") - 0b00010111010 -> listOf("?") - 0b00010111011 -> listOf("?") - 0b00010111100 -> listOf("?") - 0b00010111101 -> listOf("?") - 0b00010111110 -> listOf("?") - 0b00010111111 -> listOf("?") - 0b00011000000 -> listOf("?") - 0b00011000001 -> listOf("?") - 0b00011000010 -> listOf("?") - 0b00011000011 -> listOf("?") - 0b00011000100 -> listOf("?") - 0b00011000101 -> listOf("?") - 0b00011000110 -> listOf("?") - 0b00011000111 -> listOf("?") - 0b00011001000 -> listOf("?") - 0b00011001001 -> listOf("?") - 0b00011001010 -> listOf("?") - 0b00011001011 -> listOf("?") - 0b00011001100 -> listOf("?") - 0b00011001101 -> listOf("?") - 0b00011001110 -> listOf("?") - 0b00011001111 -> listOf("?") - 0b00011010000 -> listOf("?") - 0b00011010001 -> listOf("?") - 0b00011010010 -> listOf("?") - 0b00011010011 -> listOf("?") - 0b00011010100 -> listOf("?") - 0b00011010101 -> listOf("?") - 0b00011010110 -> listOf("?") - 0b00011010111 -> listOf("?") - 0b00011011000 -> listOf("?") - 0b00011011001 -> listOf("?") - 0b00011011010 -> listOf("?") - 0b00011011011 -> listOf("?") - 0b00011011100 -> listOf("?") - 0b00011011101 -> listOf("?") - 0b00011011110 -> listOf("?") - 0b00011011111 -> listOf("?") - 0b00011100000 -> listOf("?") - 0b00011100001 -> listOf("?") - 0b00011100010 -> listOf("?") - 0b00011100011 -> listOf("?") - 0b00011100100 -> listOf("?") - 0b00011100101 -> listOf("?") - 0b00011100110 -> listOf("?") - 0b00011100111 -> listOf("?") - 0b00011101000 -> listOf("?") - 0b00011101001 -> listOf("?") - 0b00011101010 -> listOf("?") - 0b00011101011 -> listOf("?") - 0b00011101100 -> listOf("?") - 0b00011101101 -> listOf("?") - 0b00011101110 -> listOf("?") - 0b00011101111 -> listOf("?") - 0b00011110000 -> listOf("?") - 0b00011110001 -> listOf("?") - 0b00011110010 -> listOf("?") - 0b00011110011 -> listOf("?") - 0b00011110100 -> listOf("?") - 0b00011110101 -> listOf("?") - 0b00011110110 -> listOf("?") - 0b00011110111 -> listOf("?") - 0b00011111000 -> listOf("?") - 0b00011111001 -> listOf("?") - 0b00011111010 -> listOf("?") - 0b00011111011 -> listOf("?") - 0b00011111100 -> listOf("?") - 0b00011111101 -> listOf("?") - 0b00011111110 -> listOf("?") - 0b00011111111 -> listOf("?") - 0b00100000000 -> listOf("?") - 0b00100000001 -> listOf("?") - 0b00100000010 -> listOf("?") - 0b00100000011 -> listOf("?") - 0b00100000100 -> listOf("?") - 0b00100000101 -> listOf("?") - 0b00100000110 -> listOf("?") - 0b00100000111 -> listOf("?") - 0b00100001000 -> listOf("?") - 0b00100001001 -> listOf("?") - 0b00100001010 -> listOf("?") - 0b00100001011 -> listOf("?") - 0b00100001100 -> listOf("?") - 0b00100001101 -> listOf("?") - 0b00100001110 -> listOf("?") - 0b00100001111 -> listOf("?") + 0b00010011100 -> listOf() + 0b00010011101 -> listOf() + 0b00010011110 -> listOf() + 0b00010011111 -> listOf() + 0b00010100000 -> listOf() + 0b00010100001 -> listOf() + 0b00010100010 -> listOf() + 0b00010100011 -> listOf() + 0b00010100100 -> listOf() + 0b00010100101 -> listOf() + 0b00010100110 -> listOf() + 0b00010100111 -> listOf() + 0b00010101000 -> listOf() + 0b00010101001 -> listOf() + 0b00010101010 -> listOf() + 0b00010101011 -> listOf() + 0b00010101100 -> listOf() + 0b00010101101 -> listOf() + 0b00010101110 -> listOf() + 0b00010101111 -> listOf() + 0b00010110000 -> listOf() + 0b00010110001 -> listOf() + 0b00010110010 -> listOf() + 0b00010110011 -> listOf() + 0b00010110100 -> listOf() + 0b00010110101 -> listOf() + 0b00010110110 -> listOf() + 0b00010110111 -> listOf() + 0b00010111000 -> listOf() + 0b00010111001 -> listOf() + 0b00010111010 -> listOf() + 0b00010111011 -> listOf() + 0b00010111100 -> listOf() + 0b00010111101 -> listOf() + 0b00010111110 -> listOf() + 0b00010111111 -> listOf() + 0b00011000000 -> listOf() + 0b00011000001 -> listOf() + 0b00011000010 -> listOf() + 0b00011000011 -> listOf() + 0b00011000100 -> listOf() + 0b00011000101 -> listOf() + 0b00011000110 -> listOf() + 0b00011000111 -> listOf() + 0b00011001000 -> listOf() + 0b00011001001 -> listOf() + 0b00011001010 -> listOf() + 0b00011001011 -> listOf() + 0b00011001100 -> listOf() + 0b00011001101 -> listOf() + 0b00011001110 -> listOf() + 0b00011001111 -> listOf() + 0b00011010000 -> listOf() + 0b00011010001 -> listOf() + 0b00011010010 -> listOf() + 0b00011010011 -> listOf() + 0b00011010100 -> listOf() + 0b00011010101 -> listOf() + 0b00011010110 -> listOf() + 0b00011010111 -> listOf() + 0b00011011000 -> listOf() + 0b00011011001 -> listOf() + 0b00011011010 -> listOf() + 0b00011011011 -> listOf() + 0b00011011100 -> listOf() + 0b00011011101 -> listOf() + 0b00011011110 -> listOf() + 0b00011011111 -> listOf() + 0b00011100000 -> listOf() + 0b00011100001 -> listOf() + 0b00011100010 -> listOf() + 0b00011100011 -> listOf() + 0b00011100100 -> listOf() + 0b00011100101 -> listOf() + 0b00011100110 -> listOf() + 0b00011100111 -> listOf() + 0b00011101000 -> listOf() + 0b00011101001 -> listOf() + 0b00011101010 -> listOf() + 0b00011101011 -> listOf() + 0b00011101100 -> listOf() + 0b00011101101 -> listOf() + 0b00011101110 -> listOf() + 0b00011101111 -> listOf() + 0b00011110000 -> listOf() + 0b00011110001 -> listOf() + 0b00011110010 -> listOf() + 0b00011110011 -> listOf() + 0b00011110100 -> listOf() + 0b00011110101 -> listOf() + 0b00011110110 -> listOf() + 0b00011110111 -> listOf() + 0b00011111000 -> listOf() + 0b00011111001 -> listOf() + 0b00011111010 -> listOf() + 0b00011111011 -> listOf() + 0b00011111100 -> listOf() + 0b00011111101 -> listOf() + 0b00011111110 -> listOf() + 0b00011111111 -> listOf() + 0b00100000000 -> listOf() + 0b00100000001 -> listOf() + 0b00100000010 -> listOf() + 0b00100000011 -> listOf() + 0b00100000100 -> listOf() + 0b00100000101 -> listOf() + 0b00100000110 -> listOf() + 0b00100000111 -> listOf() + 0b00100001000 -> listOf() + 0b00100001001 -> listOf() + 0b00100001010 -> listOf() + 0b00100001011 -> listOf() + 0b00100001100 -> listOf() + 0b00100001101 -> listOf() + 0b00100001110 -> listOf() + 0b00100001111 -> listOf() 0b00100010000 -> listOf("m") 0b00100010001 -> listOf("mM7") 0b00100010010 -> listOf("m7") @@ -293,749 +295,749 @@ object ChordExtensionNames { 0b00100010111 -> listOf("mM7(6)(#6)") 0b00100011000 -> listOf("m(b6)") 0b00100011001 -> listOf("mM7(b6)") - 0b00100011010 -> listOf("?") - 0b00100011011 -> listOf("?") - 0b00100011100 -> listOf("?") - 0b00100011101 -> listOf("?") - 0b00100011110 -> listOf("?") - 0b00100011111 -> listOf("?") - 0b00100100000 -> listOf("?") - 0b00100100001 -> listOf("?") - 0b00100100010 -> listOf("?") - 0b00100100011 -> listOf("?") - 0b00100100100 -> listOf("?") - 0b00100100101 -> listOf("?") - 0b00100100110 -> listOf("?") - 0b00100100111 -> listOf("?") - 0b00100101000 -> listOf("?") - 0b00100101001 -> listOf("?") - 0b00100101010 -> listOf("?") - 0b00100101011 -> listOf("?") - 0b00100101100 -> listOf("?") - 0b00100101101 -> listOf("?") - 0b00100101110 -> listOf("?") - 0b00100101111 -> listOf("?") - 0b00100110000 -> listOf("?") - 0b00100110001 -> listOf("?") - 0b00100110010 -> listOf("?") - 0b00100110011 -> listOf("?") - 0b00100110100 -> listOf("?") - 0b00100110101 -> listOf("?") - 0b00100110110 -> listOf("?") - 0b00100110111 -> listOf("?") - 0b00100111000 -> listOf("?") - 0b00100111001 -> listOf("?") - 0b00100111010 -> listOf("?") - 0b00100111011 -> listOf("?") - 0b00100111100 -> listOf("?") - 0b00100111101 -> listOf("?") - 0b00100111110 -> listOf("?") - 0b00100111111 -> listOf("?") - 0b00101000000 -> listOf("?") - 0b00101000001 -> listOf("?") - 0b00101000010 -> listOf("?") - 0b00101000011 -> listOf("?") - 0b00101000100 -> listOf("?") - 0b00101000101 -> listOf("?") - 0b00101000110 -> listOf("?") - 0b00101000111 -> listOf("?") - 0b00101001000 -> listOf("?") - 0b00101001001 -> listOf("?") - 0b00101001010 -> listOf("?") - 0b00101001011 -> listOf("?") - 0b00101001100 -> listOf("?") - 0b00101001101 -> listOf("?") - 0b00101001110 -> listOf("?") - 0b00101001111 -> listOf("?") - 0b00101010000 -> listOf("?") - 0b00101010001 -> listOf("?") - 0b00101010010 -> listOf("?") - 0b00101010011 -> listOf("?") - 0b00101010100 -> listOf("?") - 0b00101010101 -> listOf("?") - 0b00101010110 -> listOf("?") - 0b00101010111 -> listOf("?") - 0b00101011000 -> listOf("?") - 0b00101011001 -> listOf("?") - 0b00101011010 -> listOf("?") - 0b00101011011 -> listOf("?") - 0b00101011100 -> listOf("?") - 0b00101011101 -> listOf("?") - 0b00101011110 -> listOf("?") - 0b00101011111 -> listOf("?") - 0b00101100000 -> listOf("?") - 0b00101100001 -> listOf("?") - 0b00101100010 -> listOf("?") - 0b00101100011 -> listOf("?") - 0b00101100100 -> listOf("?") - 0b00101100101 -> listOf("?") - 0b00101100110 -> listOf("?") - 0b00101100111 -> listOf("?") - 0b00101101000 -> listOf("?") - 0b00101101001 -> listOf("?") - 0b00101101010 -> listOf("?") - 0b00101101011 -> listOf("?") - 0b00101101100 -> listOf("?") - 0b00101101101 -> listOf("?") - 0b00101101110 -> listOf("?") - 0b00101101111 -> listOf("?") - 0b00101110000 -> listOf("?") - 0b00101110001 -> listOf("?") - 0b00101110010 -> listOf("?") - 0b00101110011 -> listOf("?") - 0b00101110100 -> listOf("?") - 0b00101110101 -> listOf("?") - 0b00101110110 -> listOf("?") - 0b00101110111 -> listOf("?") - 0b00101111000 -> listOf("?") - 0b00101111001 -> listOf("?") - 0b00101111010 -> listOf("?") - 0b00101111011 -> listOf("?") - 0b00101111100 -> listOf("?") - 0b00101111101 -> listOf("?") - 0b00101111110 -> listOf("?") - 0b00101111111 -> listOf("?") - 0b00110000000 -> listOf("?") - 0b00110000001 -> listOf("?") - 0b00110000010 -> listOf("?") - 0b00110000011 -> listOf("?") - 0b00110000100 -> listOf("?") - 0b00110000101 -> listOf("?") - 0b00110000110 -> listOf("?") - 0b00110000111 -> listOf("?") - 0b00110001000 -> listOf("?") - 0b00110001001 -> listOf("?") - 0b00110001010 -> listOf("?") - 0b00110001011 -> listOf("?") - 0b00110001100 -> listOf("?") - 0b00110001101 -> listOf("?") - 0b00110001110 -> listOf("?") - 0b00110001111 -> listOf("?") - 0b00110010000 -> listOf("?") - 0b00110010001 -> listOf("?") - 0b00110010010 -> listOf("?") - 0b00110010011 -> listOf("?") - 0b00110010100 -> listOf("?") - 0b00110010101 -> listOf("?") - 0b00110010110 -> listOf("?") - 0b00110010111 -> listOf("?") - 0b00110011000 -> listOf("?") - 0b00110011001 -> listOf("?") - 0b00110011010 -> listOf("?") - 0b00110011011 -> listOf("?") - 0b00110011100 -> listOf("?") - 0b00110011101 -> listOf("?") - 0b00110011110 -> listOf("?") - 0b00110011111 -> listOf("?") - 0b00110100000 -> listOf("?") - 0b00110100001 -> listOf("?") - 0b00110100010 -> listOf("?") - 0b00110100011 -> listOf("?") - 0b00110100100 -> listOf("?") - 0b00110100101 -> listOf("?") - 0b00110100110 -> listOf("?") - 0b00110100111 -> listOf("?") - 0b00110101000 -> listOf("?") - 0b00110101001 -> listOf("?") - 0b00110101010 -> listOf("?") - 0b00110101011 -> listOf("?") - 0b00110101100 -> listOf("?") - 0b00110101101 -> listOf("?") - 0b00110101110 -> listOf("?") - 0b00110101111 -> listOf("?") - 0b00110110000 -> listOf("?") - 0b00110110001 -> listOf("?") - 0b00110110010 -> listOf("?") - 0b00110110011 -> listOf("?") - 0b00110110100 -> listOf("?") - 0b00110110101 -> listOf("?") - 0b00110110110 -> listOf("?") - 0b00110110111 -> listOf("?") - 0b00110111000 -> listOf("?") - 0b00110111001 -> listOf("?") - 0b00110111010 -> listOf("?") - 0b00110111011 -> listOf("?") - 0b00110111100 -> listOf("?") - 0b00110111101 -> listOf("?") - 0b00110111110 -> listOf("?") - 0b00110111111 -> listOf("?") - 0b00111000000 -> listOf("?") - 0b00111000001 -> listOf("?") - 0b00111000010 -> listOf("?") - 0b00111000011 -> listOf("?") - 0b00111000100 -> listOf("?") - 0b00111000101 -> listOf("?") - 0b00111000110 -> listOf("?") - 0b00111000111 -> listOf("?") - 0b00111001000 -> listOf("?") - 0b00111001001 -> listOf("?") - 0b00111001010 -> listOf("?") - 0b00111001011 -> listOf("?") - 0b00111001100 -> listOf("?") - 0b00111001101 -> listOf("?") - 0b00111001110 -> listOf("?") - 0b00111001111 -> listOf("?") - 0b00111010000 -> listOf("?") - 0b00111010001 -> listOf("?") - 0b00111010010 -> listOf("?") - 0b00111010011 -> listOf("?") - 0b00111010100 -> listOf("?") - 0b00111010101 -> listOf("?") - 0b00111010110 -> listOf("?") - 0b00111010111 -> listOf("?") - 0b00111011000 -> listOf("?") - 0b00111011001 -> listOf("?") - 0b00111011010 -> listOf("?") - 0b00111011011 -> listOf("?") - 0b00111011100 -> listOf("?") - 0b00111011101 -> listOf("?") - 0b00111011110 -> listOf("?") - 0b00111011111 -> listOf("?") - 0b00111100000 -> listOf("?") - 0b00111100001 -> listOf("?") - 0b00111100010 -> listOf("?") - 0b00111100011 -> listOf("?") - 0b00111100100 -> listOf("?") - 0b00111100101 -> listOf("?") - 0b00111100110 -> listOf("?") - 0b00111100111 -> listOf("?") - 0b00111101000 -> listOf("?") - 0b00111101001 -> listOf("?") - 0b00111101010 -> listOf("?") - 0b00111101011 -> listOf("?") - 0b00111101100 -> listOf("?") - 0b00111101101 -> listOf("?") - 0b00111101110 -> listOf("?") - 0b00111101111 -> listOf("?") - 0b00111110000 -> listOf("?") - 0b00111110001 -> listOf("?") - 0b00111110010 -> listOf("?") - 0b00111110011 -> listOf("?") - 0b00111110100 -> listOf("?") - 0b00111110101 -> listOf("?") - 0b00111110110 -> listOf("?") - 0b00111110111 -> listOf("?") - 0b00111111000 -> listOf("?") - 0b00111111001 -> listOf("?") - 0b00111111010 -> listOf("?") - 0b00111111011 -> listOf("?") - 0b00111111100 -> listOf("?") - 0b00111111101 -> listOf("?") - 0b00111111110 -> listOf("?") - 0b00111111111 -> listOf("?") - 0b01000000000 -> listOf("?") - 0b01000000001 -> listOf("?") - 0b01000000010 -> listOf("?") - 0b01000000011 -> listOf("?") - 0b01000000100 -> listOf("?") - 0b01000000101 -> listOf("?") - 0b01000000110 -> listOf("?") - 0b01000000111 -> listOf("?") - 0b01000001000 -> listOf("?") - 0b01000001001 -> listOf("?") - 0b01000001010 -> listOf("?") - 0b01000001011 -> listOf("?") - 0b01000001100 -> listOf("?") - 0b01000001101 -> listOf("?") - 0b01000001110 -> listOf("?") - 0b01000001111 -> listOf("?") - 0b01000010000 -> listOf("?") - 0b01000010001 -> listOf("?") - 0b01000010010 -> listOf("?") - 0b01000010011 -> listOf("?") - 0b01000010100 -> listOf("?") - 0b01000010101 -> listOf("?") - 0b01000010110 -> listOf("?") - 0b01000010111 -> listOf("?") - 0b01000011000 -> listOf("?") - 0b01000011001 -> listOf("?") - 0b01000011010 -> listOf("?") - 0b01000011011 -> listOf("?") - 0b01000011100 -> listOf("?") - 0b01000011101 -> listOf("?") - 0b01000011110 -> listOf("?") - 0b01000011111 -> listOf("?") - 0b01000100000 -> listOf("?") - 0b01000100001 -> listOf("?") - 0b01000100010 -> listOf("?") - 0b01000100011 -> listOf("?") - 0b01000100100 -> listOf("?") - 0b01000100101 -> listOf("?") - 0b01000100110 -> listOf("?") - 0b01000100111 -> listOf("?") - 0b01000101000 -> listOf("?") - 0b01000101001 -> listOf("?") - 0b01000101010 -> listOf("?") - 0b01000101011 -> listOf("?") - 0b01000101100 -> listOf("?") - 0b01000101101 -> listOf("?") - 0b01000101110 -> listOf("?") - 0b01000101111 -> listOf("?") - 0b01000110000 -> listOf("?") - 0b01000110001 -> listOf("?") - 0b01000110010 -> listOf("?") - 0b01000110011 -> listOf("?") - 0b01000110100 -> listOf("?") - 0b01000110101 -> listOf("?") - 0b01000110110 -> listOf("?") - 0b01000110111 -> listOf("?") - 0b01000111000 -> listOf("?") - 0b01000111001 -> listOf("?") - 0b01000111010 -> listOf("?") - 0b01000111011 -> listOf("?") - 0b01000111100 -> listOf("?") - 0b01000111101 -> listOf("?") - 0b01000111110 -> listOf("?") - 0b01000111111 -> listOf("?") - 0b01001000000 -> listOf("?") - 0b01001000001 -> listOf("?") - 0b01001000010 -> listOf("?") - 0b01001000011 -> listOf("?") - 0b01001000100 -> listOf("?") - 0b01001000101 -> listOf("?") - 0b01001000110 -> listOf("?") - 0b01001000111 -> listOf("?") - 0b01001001000 -> listOf("?") - 0b01001001001 -> listOf("?") - 0b01001001010 -> listOf("?") - 0b01001001011 -> listOf("?") - 0b01001001100 -> listOf("?") - 0b01001001101 -> listOf("?") - 0b01001001110 -> listOf("?") - 0b01001001111 -> listOf("?") - 0b01001010000 -> listOf("?") - 0b01001010001 -> listOf("?") - 0b01001010010 -> listOf("?") - 0b01001010011 -> listOf("?") - 0b01001010100 -> listOf("?") - 0b01001010101 -> listOf("?") - 0b01001010110 -> listOf("?") - 0b01001010111 -> listOf("?") - 0b01001011000 -> listOf("?") - 0b01001011001 -> listOf("?") - 0b01001011010 -> listOf("?") - 0b01001011011 -> listOf("?") - 0b01001011100 -> listOf("?") - 0b01001011101 -> listOf("?") - 0b01001011110 -> listOf("?") - 0b01001011111 -> listOf("?") - 0b01001100000 -> listOf("?") - 0b01001100001 -> listOf("?") - 0b01001100010 -> listOf("?") - 0b01001100011 -> listOf("?") - 0b01001100100 -> listOf("?") - 0b01001100101 -> listOf("?") - 0b01001100110 -> listOf("?") - 0b01001100111 -> listOf("?") - 0b01001101000 -> listOf("?") - 0b01001101001 -> listOf("?") - 0b01001101010 -> listOf("?") - 0b01001101011 -> listOf("?") - 0b01001101100 -> listOf("?") - 0b01001101101 -> listOf("?") - 0b01001101110 -> listOf("?") - 0b01001101111 -> listOf("?") - 0b01001110000 -> listOf("?") - 0b01001110001 -> listOf("?") - 0b01001110010 -> listOf("?") - 0b01001110011 -> listOf("?") - 0b01001110100 -> listOf("?") - 0b01001110101 -> listOf("?") - 0b01001110110 -> listOf("?") - 0b01001110111 -> listOf("?") - 0b01001111000 -> listOf("?") - 0b01001111001 -> listOf("?") - 0b01001111010 -> listOf("?") - 0b01001111011 -> listOf("?") - 0b01001111100 -> listOf("?") - 0b01001111101 -> listOf("?") - 0b01001111110 -> listOf("?") - 0b01001111111 -> listOf("?") - 0b01010000000 -> listOf("?") - 0b01010000001 -> listOf("?") - 0b01010000010 -> listOf("?") - 0b01010000011 -> listOf("?") - 0b01010000100 -> listOf("?") - 0b01010000101 -> listOf("?") - 0b01010000110 -> listOf("?") - 0b01010000111 -> listOf("?") - 0b01010001000 -> listOf("?") - 0b01010001001 -> listOf("?") - 0b01010001010 -> listOf("?") - 0b01010001011 -> listOf("?") - 0b01010001100 -> listOf("?") - 0b01010001101 -> listOf("?") - 0b01010001110 -> listOf("?") - 0b01010001111 -> listOf("?") - 0b01010010000 -> listOf("?") - 0b01010010001 -> listOf("?") - 0b01010010010 -> listOf("?") - 0b01010010011 -> listOf("?") - 0b01010010100 -> listOf("?") - 0b01010010101 -> listOf("?") - 0b01010010110 -> listOf("?") - 0b01010010111 -> listOf("?") - 0b01010011000 -> listOf("?") - 0b01010011001 -> listOf("?") - 0b01010011010 -> listOf("?") - 0b01010011011 -> listOf("?") - 0b01010011100 -> listOf("?") - 0b01010011101 -> listOf("?") - 0b01010011110 -> listOf("?") - 0b01010011111 -> listOf("?") - 0b01010100000 -> listOf("?") - 0b01010100001 -> listOf("?") - 0b01010100010 -> listOf("?") - 0b01010100011 -> listOf("?") - 0b01010100100 -> listOf("?") - 0b01010100101 -> listOf("?") - 0b01010100110 -> listOf("?") - 0b01010100111 -> listOf("?") - 0b01010101000 -> listOf("?") - 0b01010101001 -> listOf("?") - 0b01010101010 -> listOf("?") - 0b01010101011 -> listOf("?") - 0b01010101100 -> listOf("?") - 0b01010101101 -> listOf("?") - 0b01010101110 -> listOf("?") - 0b01010101111 -> listOf("?") - 0b01010110000 -> listOf("?") - 0b01010110001 -> listOf("?") - 0b01010110010 -> listOf("?") - 0b01010110011 -> listOf("?") - 0b01010110100 -> listOf("?") - 0b01010110101 -> listOf("?") - 0b01010110110 -> listOf("?") - 0b01010110111 -> listOf("?") - 0b01010111000 -> listOf("?") - 0b01010111001 -> listOf("?") - 0b01010111010 -> listOf("?") - 0b01010111011 -> listOf("?") - 0b01010111100 -> listOf("?") - 0b01010111101 -> listOf("?") - 0b01010111110 -> listOf("?") - 0b01010111111 -> listOf("?") - 0b01011000000 -> listOf("?") - 0b01011000001 -> listOf("?") - 0b01011000010 -> listOf("?") - 0b01011000011 -> listOf("?") - 0b01011000100 -> listOf("?") - 0b01011000101 -> listOf("?") - 0b01011000110 -> listOf("?") - 0b01011000111 -> listOf("?") - 0b01011001000 -> listOf("?") - 0b01011001001 -> listOf("?") - 0b01011001010 -> listOf("?") - 0b01011001011 -> listOf("?") - 0b01011001100 -> listOf("?") - 0b01011001101 -> listOf("?") - 0b01011001110 -> listOf("?") - 0b01011001111 -> listOf("?") - 0b01011010000 -> listOf("?") - 0b01011010001 -> listOf("?") - 0b01011010010 -> listOf("?") - 0b01011010011 -> listOf("?") - 0b01011010100 -> listOf("?") - 0b01011010101 -> listOf("?") - 0b01011010110 -> listOf("?") - 0b01011010111 -> listOf("?") - 0b01011011000 -> listOf("?") - 0b01011011001 -> listOf("?") - 0b01011011010 -> listOf("?") - 0b01011011011 -> listOf("?") - 0b01011011100 -> listOf("?") - 0b01011011101 -> listOf("?") - 0b01011011110 -> listOf("?") - 0b01011011111 -> listOf("?") - 0b01011100000 -> listOf("?") - 0b01011100001 -> listOf("?") - 0b01011100010 -> listOf("?") - 0b01011100011 -> listOf("?") - 0b01011100100 -> listOf("?") - 0b01011100101 -> listOf("?") - 0b01011100110 -> listOf("?") - 0b01011100111 -> listOf("?") - 0b01011101000 -> listOf("?") - 0b01011101001 -> listOf("?") - 0b01011101010 -> listOf("?") - 0b01011101011 -> listOf("?") - 0b01011101100 -> listOf("?") - 0b01011101101 -> listOf("?") - 0b01011101110 -> listOf("?") - 0b01011101111 -> listOf("?") - 0b01011110000 -> listOf("?") - 0b01011110001 -> listOf("?") - 0b01011110010 -> listOf("?") - 0b01011110011 -> listOf("?") - 0b01011110100 -> listOf("?") - 0b01011110101 -> listOf("?") - 0b01011110110 -> listOf("?") - 0b01011110111 -> listOf("?") - 0b01011111000 -> listOf("?") - 0b01011111001 -> listOf("?") - 0b01011111010 -> listOf("?") - 0b01011111011 -> listOf("?") - 0b01011111100 -> listOf("?") - 0b01011111101 -> listOf("?") - 0b01011111110 -> listOf("?") - 0b01011111111 -> listOf("?") - 0b01100000000 -> listOf("?") - 0b01100000001 -> listOf("?") - 0b01100000010 -> listOf("?") - 0b01100000011 -> listOf("?") - 0b01100000100 -> listOf("?") - 0b01100000101 -> listOf("?") - 0b01100000110 -> listOf("?") - 0b01100000111 -> listOf("?") - 0b01100001000 -> listOf("?") - 0b01100001001 -> listOf("?") - 0b01100001010 -> listOf("?") - 0b01100001011 -> listOf("?") - 0b01100001100 -> listOf("?") - 0b01100001101 -> listOf("?") - 0b01100001110 -> listOf("?") - 0b01100001111 -> listOf("?") - 0b01100010000 -> listOf("?") - 0b01100010001 -> listOf("?") - 0b01100010010 -> listOf("?") - 0b01100010011 -> listOf("?") - 0b01100010100 -> listOf("?") - 0b01100010101 -> listOf("?") - 0b01100010110 -> listOf("?") - 0b01100010111 -> listOf("?") - 0b01100011000 -> listOf("?") - 0b01100011001 -> listOf("?") - 0b01100011010 -> listOf("?") - 0b01100011011 -> listOf("?") - 0b01100011100 -> listOf("?") - 0b01100011101 -> listOf("?") - 0b01100011110 -> listOf("?") - 0b01100011111 -> listOf("?") - 0b01100100000 -> listOf("?") - 0b01100100001 -> listOf("?") - 0b01100100010 -> listOf("?") - 0b01100100011 -> listOf("?") - 0b01100100100 -> listOf("?") - 0b01100100101 -> listOf("?") - 0b01100100110 -> listOf("?") - 0b01100100111 -> listOf("?") - 0b01100101000 -> listOf("?") - 0b01100101001 -> listOf("?") - 0b01100101010 -> listOf("?") - 0b01100101011 -> listOf("?") - 0b01100101100 -> listOf("?") - 0b01100101101 -> listOf("?") - 0b01100101110 -> listOf("?") - 0b01100101111 -> listOf("?") - 0b01100110000 -> listOf("?") - 0b01100110001 -> listOf("?") - 0b01100110010 -> listOf("?") - 0b01100110011 -> listOf("?") - 0b01100110100 -> listOf("?") - 0b01100110101 -> listOf("?") - 0b01100110110 -> listOf("?") - 0b01100110111 -> listOf("?") - 0b01100111000 -> listOf("?") - 0b01100111001 -> listOf("?") - 0b01100111010 -> listOf("?") - 0b01100111011 -> listOf("?") - 0b01100111100 -> listOf("?") - 0b01100111101 -> listOf("?") - 0b01100111110 -> listOf("?") - 0b01100111111 -> listOf("?") - 0b01101000000 -> listOf("?") - 0b01101000001 -> listOf("?") - 0b01101000010 -> listOf("?") - 0b01101000011 -> listOf("?") - 0b01101000100 -> listOf("?") - 0b01101000101 -> listOf("?") - 0b01101000110 -> listOf("?") - 0b01101000111 -> listOf("?") - 0b01101001000 -> listOf("?") - 0b01101001001 -> listOf("?") - 0b01101001010 -> listOf("?") - 0b01101001011 -> listOf("?") - 0b01101001100 -> listOf("?") - 0b01101001101 -> listOf("?") - 0b01101001110 -> listOf("?") - 0b01101001111 -> listOf("?") - 0b01101010000 -> listOf("?") - 0b01101010001 -> listOf("?") - 0b01101010010 -> listOf("?") - 0b01101010011 -> listOf("?") - 0b01101010100 -> listOf("?") - 0b01101010101 -> listOf("?") - 0b01101010110 -> listOf("?") - 0b01101010111 -> listOf("?") - 0b01101011000 -> listOf("?") - 0b01101011001 -> listOf("?") - 0b01101011010 -> listOf("?") - 0b01101011011 -> listOf("?") - 0b01101011100 -> listOf("?") - 0b01101011101 -> listOf("?") - 0b01101011110 -> listOf("?") - 0b01101011111 -> listOf("?") - 0b01101100000 -> listOf("?") - 0b01101100001 -> listOf("?") - 0b01101100010 -> listOf("?") - 0b01101100011 -> listOf("?") - 0b01101100100 -> listOf("?") - 0b01101100101 -> listOf("?") - 0b01101100110 -> listOf("?") - 0b01101100111 -> listOf("?") - 0b01101101000 -> listOf("?") - 0b01101101001 -> listOf("?") - 0b01101101010 -> listOf("?") - 0b01101101011 -> listOf("?") - 0b01101101100 -> listOf("?") - 0b01101101101 -> listOf("?") - 0b01101101110 -> listOf("?") - 0b01101101111 -> listOf("?") - 0b01101110000 -> listOf("?") - 0b01101110001 -> listOf("?") + 0b00100011010 -> listOf() + 0b00100011011 -> listOf() + 0b00100011100 -> listOf() + 0b00100011101 -> listOf() + 0b00100011110 -> listOf() + 0b00100011111 -> listOf() + 0b00100100000 -> listOf() + 0b00100100001 -> listOf() + 0b00100100010 -> listOf() + 0b00100100011 -> listOf() + 0b00100100100 -> listOf() + 0b00100100101 -> listOf() + 0b00100100110 -> listOf() + 0b00100100111 -> listOf() + 0b00100101000 -> listOf() + 0b00100101001 -> listOf() + 0b00100101010 -> listOf() + 0b00100101011 -> listOf() + 0b00100101100 -> listOf() + 0b00100101101 -> listOf() + 0b00100101110 -> listOf() + 0b00100101111 -> listOf() + 0b00100110000 -> listOf() + 0b00100110001 -> listOf() + 0b00100110010 -> listOf() + 0b00100110011 -> listOf() + 0b00100110100 -> listOf() + 0b00100110101 -> listOf() + 0b00100110110 -> listOf() + 0b00100110111 -> listOf() + 0b00100111000 -> listOf() + 0b00100111001 -> listOf() + 0b00100111010 -> listOf() + 0b00100111011 -> listOf() + 0b00100111100 -> listOf() + 0b00100111101 -> listOf() + 0b00100111110 -> listOf() + 0b00100111111 -> listOf() + 0b00101000000 -> listOf() + 0b00101000001 -> listOf() + 0b00101000010 -> listOf() + 0b00101000011 -> listOf() + 0b00101000100 -> listOf() + 0b00101000101 -> listOf() + 0b00101000110 -> listOf() + 0b00101000111 -> listOf() + 0b00101001000 -> listOf() + 0b00101001001 -> listOf() + 0b00101001010 -> listOf() + 0b00101001011 -> listOf() + 0b00101001100 -> listOf() + 0b00101001101 -> listOf() + 0b00101001110 -> listOf() + 0b00101001111 -> listOf() + 0b00101010000 -> listOf() + 0b00101010001 -> listOf() + 0b00101010010 -> listOf() + 0b00101010011 -> listOf() + 0b00101010100 -> listOf() + 0b00101010101 -> listOf() + 0b00101010110 -> listOf() + 0b00101010111 -> listOf() + 0b00101011000 -> listOf() + 0b00101011001 -> listOf() + 0b00101011010 -> listOf() + 0b00101011011 -> listOf() + 0b00101011100 -> listOf() + 0b00101011101 -> listOf() + 0b00101011110 -> listOf() + 0b00101011111 -> listOf() + 0b00101100000 -> listOf() + 0b00101100001 -> listOf() + 0b00101100010 -> listOf() + 0b00101100011 -> listOf() + 0b00101100100 -> listOf() + 0b00101100101 -> listOf() + 0b00101100110 -> listOf() + 0b00101100111 -> listOf() + 0b00101101000 -> listOf() + 0b00101101001 -> listOf() + 0b00101101010 -> listOf() + 0b00101101011 -> listOf() + 0b00101101100 -> listOf() + 0b00101101101 -> listOf() + 0b00101101110 -> listOf() + 0b00101101111 -> listOf() + 0b00101110000 -> listOf() + 0b00101110001 -> listOf() + 0b00101110010 -> listOf() + 0b00101110011 -> listOf() + 0b00101110100 -> listOf() + 0b00101110101 -> listOf() + 0b00101110110 -> listOf() + 0b00101110111 -> listOf() + 0b00101111000 -> listOf() + 0b00101111001 -> listOf() + 0b00101111010 -> listOf() + 0b00101111011 -> listOf() + 0b00101111100 -> listOf() + 0b00101111101 -> listOf() + 0b00101111110 -> listOf() + 0b00101111111 -> listOf() + 0b00110000000 -> listOf() + 0b00110000001 -> listOf() + 0b00110000010 -> listOf() + 0b00110000011 -> listOf() + 0b00110000100 -> listOf() + 0b00110000101 -> listOf() + 0b00110000110 -> listOf() + 0b00110000111 -> listOf() + 0b00110001000 -> listOf() + 0b00110001001 -> listOf() + 0b00110001010 -> listOf() + 0b00110001011 -> listOf() + 0b00110001100 -> listOf() + 0b00110001101 -> listOf() + 0b00110001110 -> listOf() + 0b00110001111 -> listOf() + 0b00110010000 -> listOf() + 0b00110010001 -> listOf() + 0b00110010010 -> listOf() + 0b00110010011 -> listOf() + 0b00110010100 -> listOf() + 0b00110010101 -> listOf() + 0b00110010110 -> listOf() + 0b00110010111 -> listOf() + 0b00110011000 -> listOf() + 0b00110011001 -> listOf() + 0b00110011010 -> listOf() + 0b00110011011 -> listOf() + 0b00110011100 -> listOf() + 0b00110011101 -> listOf() + 0b00110011110 -> listOf() + 0b00110011111 -> listOf() + 0b00110100000 -> listOf() + 0b00110100001 -> listOf() + 0b00110100010 -> listOf() + 0b00110100011 -> listOf() + 0b00110100100 -> listOf() + 0b00110100101 -> listOf() + 0b00110100110 -> listOf() + 0b00110100111 -> listOf() + 0b00110101000 -> listOf() + 0b00110101001 -> listOf() + 0b00110101010 -> listOf() + 0b00110101011 -> listOf() + 0b00110101100 -> listOf() + 0b00110101101 -> listOf() + 0b00110101110 -> listOf() + 0b00110101111 -> listOf() + 0b00110110000 -> listOf() + 0b00110110001 -> listOf() + 0b00110110010 -> listOf() + 0b00110110011 -> listOf() + 0b00110110100 -> listOf() + 0b00110110101 -> listOf() + 0b00110110110 -> listOf() + 0b00110110111 -> listOf() + 0b00110111000 -> listOf() + 0b00110111001 -> listOf() + 0b00110111010 -> listOf() + 0b00110111011 -> listOf() + 0b00110111100 -> listOf() + 0b00110111101 -> listOf() + 0b00110111110 -> listOf() + 0b00110111111 -> listOf() + 0b00111000000 -> listOf() + 0b00111000001 -> listOf() + 0b00111000010 -> listOf() + 0b00111000011 -> listOf() + 0b00111000100 -> listOf() + 0b00111000101 -> listOf() + 0b00111000110 -> listOf() + 0b00111000111 -> listOf() + 0b00111001000 -> listOf() + 0b00111001001 -> listOf() + 0b00111001010 -> listOf() + 0b00111001011 -> listOf() + 0b00111001100 -> listOf() + 0b00111001101 -> listOf() + 0b00111001110 -> listOf() + 0b00111001111 -> listOf() + 0b00111010000 -> listOf() + 0b00111010001 -> listOf() + 0b00111010010 -> listOf() + 0b00111010011 -> listOf() + 0b00111010100 -> listOf() + 0b00111010101 -> listOf() + 0b00111010110 -> listOf() + 0b00111010111 -> listOf() + 0b00111011000 -> listOf() + 0b00111011001 -> listOf() + 0b00111011010 -> listOf() + 0b00111011011 -> listOf() + 0b00111011100 -> listOf() + 0b00111011101 -> listOf() + 0b00111011110 -> listOf() + 0b00111011111 -> listOf() + 0b00111100000 -> listOf() + 0b00111100001 -> listOf() + 0b00111100010 -> listOf() + 0b00111100011 -> listOf() + 0b00111100100 -> listOf() + 0b00111100101 -> listOf() + 0b00111100110 -> listOf() + 0b00111100111 -> listOf() + 0b00111101000 -> listOf() + 0b00111101001 -> listOf() + 0b00111101010 -> listOf() + 0b00111101011 -> listOf() + 0b00111101100 -> listOf() + 0b00111101101 -> listOf() + 0b00111101110 -> listOf() + 0b00111101111 -> listOf() + 0b00111110000 -> listOf() + 0b00111110001 -> listOf() + 0b00111110010 -> listOf() + 0b00111110011 -> listOf() + 0b00111110100 -> listOf() + 0b00111110101 -> listOf() + 0b00111110110 -> listOf() + 0b00111110111 -> listOf() + 0b00111111000 -> listOf() + 0b00111111001 -> listOf() + 0b00111111010 -> listOf() + 0b00111111011 -> listOf() + 0b00111111100 -> listOf() + 0b00111111101 -> listOf() + 0b00111111110 -> listOf() + 0b00111111111 -> listOf() + 0b01000000000 -> listOf() + 0b01000000001 -> listOf() + 0b01000000010 -> listOf() + 0b01000000011 -> listOf() + 0b01000000100 -> listOf() + 0b01000000101 -> listOf() + 0b01000000110 -> listOf() + 0b01000000111 -> listOf() + 0b01000001000 -> listOf() + 0b01000001001 -> listOf() + 0b01000001010 -> listOf() + 0b01000001011 -> listOf() + 0b01000001100 -> listOf() + 0b01000001101 -> listOf() + 0b01000001110 -> listOf() + 0b01000001111 -> listOf() + 0b01000010000 -> listOf() + 0b01000010001 -> listOf() + 0b01000010010 -> listOf() + 0b01000010011 -> listOf() + 0b01000010100 -> listOf() + 0b01000010101 -> listOf() + 0b01000010110 -> listOf() + 0b01000010111 -> listOf() + 0b01000011000 -> listOf() + 0b01000011001 -> listOf() + 0b01000011010 -> listOf() + 0b01000011011 -> listOf() + 0b01000011100 -> listOf() + 0b01000011101 -> listOf() + 0b01000011110 -> listOf() + 0b01000011111 -> listOf() + 0b01000100000 -> listOf() + 0b01000100001 -> listOf() + 0b01000100010 -> listOf() + 0b01000100011 -> listOf() + 0b01000100100 -> listOf() + 0b01000100101 -> listOf() + 0b01000100110 -> listOf() + 0b01000100111 -> listOf() + 0b01000101000 -> listOf() + 0b01000101001 -> listOf() + 0b01000101010 -> listOf() + 0b01000101011 -> listOf() + 0b01000101100 -> listOf() + 0b01000101101 -> listOf() + 0b01000101110 -> listOf() + 0b01000101111 -> listOf() + 0b01000110000 -> listOf() + 0b01000110001 -> listOf() + 0b01000110010 -> listOf() + 0b01000110011 -> listOf() + 0b01000110100 -> listOf() + 0b01000110101 -> listOf() + 0b01000110110 -> listOf() + 0b01000110111 -> listOf() + 0b01000111000 -> listOf() + 0b01000111001 -> listOf() + 0b01000111010 -> listOf() + 0b01000111011 -> listOf() + 0b01000111100 -> listOf() + 0b01000111101 -> listOf() + 0b01000111110 -> listOf() + 0b01000111111 -> listOf() + 0b01001000000 -> listOf() + 0b01001000001 -> listOf() + 0b01001000010 -> listOf() + 0b01001000011 -> listOf() + 0b01001000100 -> listOf() + 0b01001000101 -> listOf() + 0b01001000110 -> listOf() + 0b01001000111 -> listOf() + 0b01001001000 -> listOf() + 0b01001001001 -> listOf() + 0b01001001010 -> listOf() + 0b01001001011 -> listOf() + 0b01001001100 -> listOf() + 0b01001001101 -> listOf() + 0b01001001110 -> listOf() + 0b01001001111 -> listOf() + 0b01001010000 -> listOf() + 0b01001010001 -> listOf() + 0b01001010010 -> listOf() + 0b01001010011 -> listOf() + 0b01001010100 -> listOf() + 0b01001010101 -> listOf() + 0b01001010110 -> listOf() + 0b01001010111 -> listOf() + 0b01001011000 -> listOf() + 0b01001011001 -> listOf() + 0b01001011010 -> listOf() + 0b01001011011 -> listOf() + 0b01001011100 -> listOf() + 0b01001011101 -> listOf() + 0b01001011110 -> listOf() + 0b01001011111 -> listOf() + 0b01001100000 -> listOf() + 0b01001100001 -> listOf() + 0b01001100010 -> listOf() + 0b01001100011 -> listOf() + 0b01001100100 -> listOf() + 0b01001100101 -> listOf() + 0b01001100110 -> listOf() + 0b01001100111 -> listOf() + 0b01001101000 -> listOf() + 0b01001101001 -> listOf() + 0b01001101010 -> listOf() + 0b01001101011 -> listOf() + 0b01001101100 -> listOf() + 0b01001101101 -> listOf() + 0b01001101110 -> listOf() + 0b01001101111 -> listOf() + 0b01001110000 -> listOf() + 0b01001110001 -> listOf() + 0b01001110010 -> listOf() + 0b01001110011 -> listOf() + 0b01001110100 -> listOf() + 0b01001110101 -> listOf() + 0b01001110110 -> listOf() + 0b01001110111 -> listOf() + 0b01001111000 -> listOf() + 0b01001111001 -> listOf() + 0b01001111010 -> listOf() + 0b01001111011 -> listOf() + 0b01001111100 -> listOf() + 0b01001111101 -> listOf() + 0b01001111110 -> listOf() + 0b01001111111 -> listOf() + 0b01010000000 -> listOf() + 0b01010000001 -> listOf() + 0b01010000010 -> listOf() + 0b01010000011 -> listOf() + 0b01010000100 -> listOf() + 0b01010000101 -> listOf() + 0b01010000110 -> listOf() + 0b01010000111 -> listOf() + 0b01010001000 -> listOf() + 0b01010001001 -> listOf() + 0b01010001010 -> listOf() + 0b01010001011 -> listOf() + 0b01010001100 -> listOf() + 0b01010001101 -> listOf() + 0b01010001110 -> listOf() + 0b01010001111 -> listOf() + 0b01010010000 -> listOf() + 0b01010010001 -> listOf() + 0b01010010010 -> listOf() + 0b01010010011 -> listOf() + 0b01010010100 -> listOf() + 0b01010010101 -> listOf() + 0b01010010110 -> listOf() + 0b01010010111 -> listOf() + 0b01010011000 -> listOf() + 0b01010011001 -> listOf() + 0b01010011010 -> listOf() + 0b01010011011 -> listOf() + 0b01010011100 -> listOf() + 0b01010011101 -> listOf() + 0b01010011110 -> listOf() + 0b01010011111 -> listOf() + 0b01010100000 -> listOf() + 0b01010100001 -> listOf() + 0b01010100010 -> listOf() + 0b01010100011 -> listOf() + 0b01010100100 -> listOf() + 0b01010100101 -> listOf() + 0b01010100110 -> listOf() + 0b01010100111 -> listOf() + 0b01010101000 -> listOf() + 0b01010101001 -> listOf() + 0b01010101010 -> listOf() + 0b01010101011 -> listOf() + 0b01010101100 -> listOf() + 0b01010101101 -> listOf() + 0b01010101110 -> listOf() + 0b01010101111 -> listOf() + 0b01010110000 -> listOf() + 0b01010110001 -> listOf() + 0b01010110010 -> listOf() + 0b01010110011 -> listOf() + 0b01010110100 -> listOf() + 0b01010110101 -> listOf() + 0b01010110110 -> listOf() + 0b01010110111 -> listOf() + 0b01010111000 -> listOf() + 0b01010111001 -> listOf() + 0b01010111010 -> listOf() + 0b01010111011 -> listOf() + 0b01010111100 -> listOf() + 0b01010111101 -> listOf() + 0b01010111110 -> listOf() + 0b01010111111 -> listOf() + 0b01011000000 -> listOf() + 0b01011000001 -> listOf() + 0b01011000010 -> listOf() + 0b01011000011 -> listOf() + 0b01011000100 -> listOf() + 0b01011000101 -> listOf() + 0b01011000110 -> listOf() + 0b01011000111 -> listOf() + 0b01011001000 -> listOf() + 0b01011001001 -> listOf() + 0b01011001010 -> listOf() + 0b01011001011 -> listOf() + 0b01011001100 -> listOf() + 0b01011001101 -> listOf() + 0b01011001110 -> listOf() + 0b01011001111 -> listOf() + 0b01011010000 -> listOf() + 0b01011010001 -> listOf() + 0b01011010010 -> listOf() + 0b01011010011 -> listOf() + 0b01011010100 -> listOf() + 0b01011010101 -> listOf() + 0b01011010110 -> listOf() + 0b01011010111 -> listOf() + 0b01011011000 -> listOf() + 0b01011011001 -> listOf() + 0b01011011010 -> listOf() + 0b01011011011 -> listOf() + 0b01011011100 -> listOf() + 0b01011011101 -> listOf() + 0b01011011110 -> listOf() + 0b01011011111 -> listOf() + 0b01011100000 -> listOf() + 0b01011100001 -> listOf() + 0b01011100010 -> listOf() + 0b01011100011 -> listOf() + 0b01011100100 -> listOf() + 0b01011100101 -> listOf() + 0b01011100110 -> listOf() + 0b01011100111 -> listOf() + 0b01011101000 -> listOf() + 0b01011101001 -> listOf() + 0b01011101010 -> listOf() + 0b01011101011 -> listOf() + 0b01011101100 -> listOf() + 0b01011101101 -> listOf() + 0b01011101110 -> listOf() + 0b01011101111 -> listOf() + 0b01011110000 -> listOf() + 0b01011110001 -> listOf() + 0b01011110010 -> listOf() + 0b01011110011 -> listOf() + 0b01011110100 -> listOf() + 0b01011110101 -> listOf() + 0b01011110110 -> listOf() + 0b01011110111 -> listOf() + 0b01011111000 -> listOf() + 0b01011111001 -> listOf() + 0b01011111010 -> listOf() + 0b01011111011 -> listOf() + 0b01011111100 -> listOf() + 0b01011111101 -> listOf() + 0b01011111110 -> listOf() + 0b01011111111 -> listOf() + 0b01100000000 -> listOf() + 0b01100000001 -> listOf() + 0b01100000010 -> listOf() + 0b01100000011 -> listOf() + 0b01100000100 -> listOf() + 0b01100000101 -> listOf() + 0b01100000110 -> listOf() + 0b01100000111 -> listOf() + 0b01100001000 -> listOf() + 0b01100001001 -> listOf() + 0b01100001010 -> listOf() + 0b01100001011 -> listOf() + 0b01100001100 -> listOf() + 0b01100001101 -> listOf() + 0b01100001110 -> listOf() + 0b01100001111 -> listOf() + 0b01100010000 -> listOf() + 0b01100010001 -> listOf() + 0b01100010010 -> listOf() + 0b01100010011 -> listOf() + 0b01100010100 -> listOf() + 0b01100010101 -> listOf() + 0b01100010110 -> listOf() + 0b01100010111 -> listOf() + 0b01100011000 -> listOf() + 0b01100011001 -> listOf() + 0b01100011010 -> listOf() + 0b01100011011 -> listOf() + 0b01100011100 -> listOf() + 0b01100011101 -> listOf() + 0b01100011110 -> listOf() + 0b01100011111 -> listOf() + 0b01100100000 -> listOf() + 0b01100100001 -> listOf() + 0b01100100010 -> listOf() + 0b01100100011 -> listOf() + 0b01100100100 -> listOf() + 0b01100100101 -> listOf() + 0b01100100110 -> listOf() + 0b01100100111 -> listOf() + 0b01100101000 -> listOf() + 0b01100101001 -> listOf() + 0b01100101010 -> listOf() + 0b01100101011 -> listOf() + 0b01100101100 -> listOf() + 0b01100101101 -> listOf() + 0b01100101110 -> listOf() + 0b01100101111 -> listOf() + 0b01100110000 -> listOf() + 0b01100110001 -> listOf() + 0b01100110010 -> listOf() + 0b01100110011 -> listOf() + 0b01100110100 -> listOf() + 0b01100110101 -> listOf() + 0b01100110110 -> listOf() + 0b01100110111 -> listOf() + 0b01100111000 -> listOf() + 0b01100111001 -> listOf() + 0b01100111010 -> listOf() + 0b01100111011 -> listOf() + 0b01100111100 -> listOf() + 0b01100111101 -> listOf() + 0b01100111110 -> listOf() + 0b01100111111 -> listOf() + 0b01101000000 -> listOf() + 0b01101000001 -> listOf() + 0b01101000010 -> listOf() + 0b01101000011 -> listOf() + 0b01101000100 -> listOf() + 0b01101000101 -> listOf() + 0b01101000110 -> listOf() + 0b01101000111 -> listOf() + 0b01101001000 -> listOf() + 0b01101001001 -> listOf() + 0b01101001010 -> listOf() + 0b01101001011 -> listOf() + 0b01101001100 -> listOf() + 0b01101001101 -> listOf() + 0b01101001110 -> listOf() + 0b01101001111 -> listOf() + 0b01101010000 -> listOf() + 0b01101010001 -> listOf() + 0b01101010010 -> listOf() + 0b01101010011 -> listOf() + 0b01101010100 -> listOf() + 0b01101010101 -> listOf() + 0b01101010110 -> listOf() + 0b01101010111 -> listOf() + 0b01101011000 -> listOf() + 0b01101011001 -> listOf() + 0b01101011010 -> listOf() + 0b01101011011 -> listOf() + 0b01101011100 -> listOf() + 0b01101011101 -> listOf() + 0b01101011110 -> listOf() + 0b01101011111 -> listOf() + 0b01101100000 -> listOf() + 0b01101100001 -> listOf() + 0b01101100010 -> listOf() + 0b01101100011 -> listOf() + 0b01101100100 -> listOf() + 0b01101100101 -> listOf() + 0b01101100110 -> listOf() + 0b01101100111 -> listOf() + 0b01101101000 -> listOf() + 0b01101101001 -> listOf() + 0b01101101010 -> listOf() + 0b01101101011 -> listOf() + 0b01101101100 -> listOf() + 0b01101101101 -> listOf() + 0b01101101110 -> listOf() + 0b01101101111 -> listOf() + 0b01101110000 -> listOf() + 0b01101110001 -> listOf() 0b01101110010 -> listOf("m9#11b13") - 0b01101110011 -> listOf("?") - 0b01101110100 -> listOf("?") - 0b01101110101 -> listOf("?") - 0b01101110110 -> listOf("?") - 0b01101110111 -> listOf("?") - 0b01101111000 -> listOf("?") - 0b01101111001 -> listOf("?") - 0b01101111010 -> listOf("?") - 0b01101111011 -> listOf("?") - 0b01101111100 -> listOf("?") - 0b01101111101 -> listOf("?") - 0b01101111110 -> listOf("?") - 0b01101111111 -> listOf("?") - 0b01110000000 -> listOf("?") - 0b01110000001 -> listOf("?") - 0b01110000010 -> listOf("?") - 0b01110000011 -> listOf("?") - 0b01110000100 -> listOf("?") - 0b01110000101 -> listOf("?") - 0b01110000110 -> listOf("?") - 0b01110000111 -> listOf("?") - 0b01110001000 -> listOf("?") - 0b01110001001 -> listOf("?") - 0b01110001010 -> listOf("?") - 0b01110001011 -> listOf("?") - 0b01110001100 -> listOf("?") - 0b01110001101 -> listOf("?") - 0b01110001110 -> listOf("?") - 0b01110001111 -> listOf("?") - 0b01110010000 -> listOf("?") - 0b01110010001 -> listOf("?") - 0b01110010010 -> listOf("?") - 0b01110010011 -> listOf("?") - 0b01110010100 -> listOf("?") - 0b01110010101 -> listOf("?") - 0b01110010110 -> listOf("?") - 0b01110010111 -> listOf("?") - 0b01110011000 -> listOf("?") - 0b01110011001 -> listOf("?") - 0b01110011010 -> listOf("?") - 0b01110011011 -> listOf("?") - 0b01110011100 -> listOf("?") - 0b01110011101 -> listOf("?") - 0b01110011110 -> listOf("?") - 0b01110011111 -> listOf("?") - 0b01110100000 -> listOf("?") - 0b01110100001 -> listOf("?") - 0b01110100010 -> listOf("?") - 0b01110100011 -> listOf("?") - 0b01110100100 -> listOf("?") - 0b01110100101 -> listOf("?") - 0b01110100110 -> listOf("?") - 0b01110100111 -> listOf("?") - 0b01110101000 -> listOf("?") - 0b01110101001 -> listOf("?") - 0b01110101010 -> listOf("?") - 0b01110101011 -> listOf("?") - 0b01110101100 -> listOf("?") - 0b01110101101 -> listOf("?") - 0b01110101110 -> listOf("?") - 0b01110101111 -> listOf("?") - 0b01110110000 -> listOf("?") - 0b01110110001 -> listOf("?") - 0b01110110010 -> listOf("?") - 0b01110110011 -> listOf("?") - 0b01110110100 -> listOf("?") - 0b01110110101 -> listOf("?") - 0b01110110110 -> listOf("?") - 0b01110110111 -> listOf("?") - 0b01110111000 -> listOf("?") - 0b01110111001 -> listOf("?") - 0b01110111010 -> listOf("?") - 0b01110111011 -> listOf("?") - 0b01110111100 -> listOf("?") - 0b01110111101 -> listOf("?") - 0b01110111110 -> listOf("?") - 0b01110111111 -> listOf("?") - 0b01111000000 -> listOf("?") - 0b01111000001 -> listOf("?") - 0b01111000010 -> listOf("?") - 0b01111000011 -> listOf("?") - 0b01111000100 -> listOf("?") - 0b01111000101 -> listOf("?") - 0b01111000110 -> listOf("?") - 0b01111000111 -> listOf("?") - 0b01111001000 -> listOf("?") - 0b01111001001 -> listOf("?") - 0b01111001010 -> listOf("?") - 0b01111001011 -> listOf("?") - 0b01111001100 -> listOf("?") - 0b01111001101 -> listOf("?") - 0b01111001110 -> listOf("?") - 0b01111001111 -> listOf("?") - 0b01111010000 -> listOf("?") - 0b01111010001 -> listOf("?") - 0b01111010010 -> listOf("?") - 0b01111010011 -> listOf("?") - 0b01111010100 -> listOf("?") - 0b01111010101 -> listOf("?") - 0b01111010110 -> listOf("?") - 0b01111010111 -> listOf("?") - 0b01111011000 -> listOf("?") - 0b01111011001 -> listOf("?") - 0b01111011010 -> listOf("?") - 0b01111011011 -> listOf("?") - 0b01111011100 -> listOf("?") - 0b01111011101 -> listOf("?") - 0b01111011110 -> listOf("?") - 0b01111011111 -> listOf("?") - 0b01111100000 -> listOf("?") - 0b01111100001 -> listOf("?") - 0b01111100010 -> listOf("?") - 0b01111100011 -> listOf("?") - 0b01111100100 -> listOf("?") - 0b01111100101 -> listOf("?") - 0b01111100110 -> listOf("?") - 0b01111100111 -> listOf("?") - 0b01111101000 -> listOf("?") - 0b01111101001 -> listOf("?") - 0b01111101010 -> listOf("?") - 0b01111101011 -> listOf("?") - 0b01111101100 -> listOf("?") - 0b01111101101 -> listOf("?") - 0b01111101110 -> listOf("?") - 0b01111101111 -> listOf("?") - 0b01111110000 -> listOf("?") - 0b01111110001 -> listOf("?") - 0b01111110010 -> listOf("?") - 0b01111110011 -> listOf("?") - 0b01111110100 -> listOf("?") - 0b01111110101 -> listOf("?") - 0b01111110110 -> listOf("?") - 0b01111110111 -> listOf("?") - 0b01111111000 -> listOf("?") - 0b01111111001 -> listOf("?") - 0b01111111010 -> listOf("?") - 0b01111111011 -> listOf("?") - 0b01111111100 -> listOf("?") - 0b01111111101 -> listOf("?") - 0b01111111110 -> listOf("?") - 0b01111111111 -> listOf("?") - 0b10000000000 -> listOf("?") + 0b01101110011 -> listOf() + 0b01101110100 -> listOf() + 0b01101110101 -> listOf() + 0b01101110110 -> listOf() + 0b01101110111 -> listOf() + 0b01101111000 -> listOf() + 0b01101111001 -> listOf() + 0b01101111010 -> listOf() + 0b01101111011 -> listOf() + 0b01101111100 -> listOf() + 0b01101111101 -> listOf() + 0b01101111110 -> listOf() + 0b01101111111 -> listOf() + 0b01110000000 -> listOf() + 0b01110000001 -> listOf() + 0b01110000010 -> listOf() + 0b01110000011 -> listOf() + 0b01110000100 -> listOf() + 0b01110000101 -> listOf() + 0b01110000110 -> listOf() + 0b01110000111 -> listOf() + 0b01110001000 -> listOf() + 0b01110001001 -> listOf() + 0b01110001010 -> listOf() + 0b01110001011 -> listOf() + 0b01110001100 -> listOf() + 0b01110001101 -> listOf() + 0b01110001110 -> listOf() + 0b01110001111 -> listOf() + 0b01110010000 -> listOf() + 0b01110010001 -> listOf() + 0b01110010010 -> listOf() + 0b01110010011 -> listOf() + 0b01110010100 -> listOf() + 0b01110010101 -> listOf() + 0b01110010110 -> listOf() + 0b01110010111 -> listOf() + 0b01110011000 -> listOf() + 0b01110011001 -> listOf() + 0b01110011010 -> listOf() + 0b01110011011 -> listOf() + 0b01110011100 -> listOf() + 0b01110011101 -> listOf() + 0b01110011110 -> listOf() + 0b01110011111 -> listOf() + 0b01110100000 -> listOf() + 0b01110100001 -> listOf() + 0b01110100010 -> listOf() + 0b01110100011 -> listOf() + 0b01110100100 -> listOf() + 0b01110100101 -> listOf() + 0b01110100110 -> listOf() + 0b01110100111 -> listOf() + 0b01110101000 -> listOf() + 0b01110101001 -> listOf() + 0b01110101010 -> listOf() + 0b01110101011 -> listOf() + 0b01110101100 -> listOf() + 0b01110101101 -> listOf() + 0b01110101110 -> listOf() + 0b01110101111 -> listOf() + 0b01110110000 -> listOf() + 0b01110110001 -> listOf() + 0b01110110010 -> listOf() + 0b01110110011 -> listOf() + 0b01110110100 -> listOf() + 0b01110110101 -> listOf() + 0b01110110110 -> listOf() + 0b01110110111 -> listOf() + 0b01110111000 -> listOf() + 0b01110111001 -> listOf() + 0b01110111010 -> listOf() + 0b01110111011 -> listOf() + 0b01110111100 -> listOf() + 0b01110111101 -> listOf() + 0b01110111110 -> listOf() + 0b01110111111 -> listOf() + 0b01111000000 -> listOf() + 0b01111000001 -> listOf() + 0b01111000010 -> listOf() + 0b01111000011 -> listOf() + 0b01111000100 -> listOf() + 0b01111000101 -> listOf() + 0b01111000110 -> listOf() + 0b01111000111 -> listOf() + 0b01111001000 -> listOf() + 0b01111001001 -> listOf() + 0b01111001010 -> listOf() + 0b01111001011 -> listOf() + 0b01111001100 -> listOf() + 0b01111001101 -> listOf() + 0b01111001110 -> listOf() + 0b01111001111 -> listOf() + 0b01111010000 -> listOf() + 0b01111010001 -> listOf() + 0b01111010010 -> listOf() + 0b01111010011 -> listOf() + 0b01111010100 -> listOf() + 0b01111010101 -> listOf() + 0b01111010110 -> listOf() + 0b01111010111 -> listOf() + 0b01111011000 -> listOf() + 0b01111011001 -> listOf() + 0b01111011010 -> listOf() + 0b01111011011 -> listOf() + 0b01111011100 -> listOf() + 0b01111011101 -> listOf() + 0b01111011110 -> listOf() + 0b01111011111 -> listOf() + 0b01111100000 -> listOf() + 0b01111100001 -> listOf() + 0b01111100010 -> listOf() + 0b01111100011 -> listOf() + 0b01111100100 -> listOf() + 0b01111100101 -> listOf() + 0b01111100110 -> listOf() + 0b01111100111 -> listOf() + 0b01111101000 -> listOf() + 0b01111101001 -> listOf() + 0b01111101010 -> listOf() + 0b01111101011 -> listOf() + 0b01111101100 -> listOf() + 0b01111101101 -> listOf() + 0b01111101110 -> listOf() + 0b01111101111 -> listOf() + 0b01111110000 -> listOf() + 0b01111110001 -> listOf() + 0b01111110010 -> listOf() + 0b01111110011 -> listOf() + 0b01111110100 -> listOf() + 0b01111110101 -> listOf() + 0b01111110110 -> listOf() + 0b01111110111 -> listOf() + 0b01111111000 -> listOf() + 0b01111111001 -> listOf() + 0b01111111010 -> listOf() + 0b01111111011 -> listOf() + 0b01111111100 -> listOf() + 0b01111111101 -> listOf() + 0b01111111110 -> listOf() + 0b01111111111 -> listOf() + 0b10000000000 -> listOf() 0b10000000001 -> listOf("(M7,b9 only)") 0b10000000010 -> listOf("(7,b9 only)") 0b10000000011 -> listOf("(7,M7,b9 only)") @@ -1049,869 +1051,869 @@ object ChordExtensionNames { 0b10000001011 -> listOf("M7#5b9#6(no3)") 0b10000001100 -> listOf("6#5b9(no3)") 0b10000001101 -> listOf("M13#5b9(no3)") - 0b10000001110 -> listOf("?") - 0b10000001111 -> listOf("?") - 0b10000010000 -> listOf("?") - 0b10000010001 -> listOf("?") - 0b10000010010 -> listOf("?") - 0b10000010011 -> listOf("?") - 0b10000010100 -> listOf("?") - 0b10000010101 -> listOf("?") - 0b10000010110 -> listOf("?") - 0b10000010111 -> listOf("?") - 0b10000011000 -> listOf("?") - 0b10000011001 -> listOf("?") - 0b10000011010 -> listOf("?") - 0b10000011011 -> listOf("?") - 0b10000011100 -> listOf("?") - 0b10000011101 -> listOf("?") - 0b10000011110 -> listOf("?") - 0b10000011111 -> listOf("?") - 0b10000100000 -> listOf("?") - 0b10000100001 -> listOf("?") - 0b10000100010 -> listOf("?") - 0b10000100011 -> listOf("?") - 0b10000100100 -> listOf("?") - 0b10000100101 -> listOf("?") - 0b10000100110 -> listOf("?") - 0b10000100111 -> listOf("?") - 0b10000101000 -> listOf("?") - 0b10000101001 -> listOf("?") - 0b10000101010 -> listOf("?") - 0b10000101011 -> listOf("?") - 0b10000101100 -> listOf("?") - 0b10000101101 -> listOf("?") - 0b10000101110 -> listOf("?") - 0b10000101111 -> listOf("?") - 0b10000110000 -> listOf("?") - 0b10000110001 -> listOf("?") - 0b10000110010 -> listOf("?") - 0b10000110011 -> listOf("?") - 0b10000110100 -> listOf("?") - 0b10000110101 -> listOf("?") - 0b10000110110 -> listOf("?") - 0b10000110111 -> listOf("?") - 0b10000111000 -> listOf("?") - 0b10000111001 -> listOf("?") - 0b10000111010 -> listOf("?") - 0b10000111011 -> listOf("?") - 0b10000111100 -> listOf("?") - 0b10000111101 -> listOf("?") - 0b10000111110 -> listOf("?") - 0b10000111111 -> listOf("?") - 0b10001000000 -> listOf("?") - 0b10001000001 -> listOf("?") - 0b10001000010 -> listOf("?") - 0b10001000011 -> listOf("?") - 0b10001000100 -> listOf("?") - 0b10001000101 -> listOf("?") - 0b10001000110 -> listOf("?") - 0b10001000111 -> listOf("?") - 0b10001001000 -> listOf("?") - 0b10001001001 -> listOf("?") - 0b10001001010 -> listOf("?") - 0b10001001011 -> listOf("?") - 0b10001001100 -> listOf("?") - 0b10001001101 -> listOf("?") - 0b10001001110 -> listOf("?") - 0b10001001111 -> listOf("?") - 0b10001010000 -> listOf("?") - 0b10001010001 -> listOf("?") - 0b10001010010 -> listOf("?") - 0b10001010011 -> listOf("?") - 0b10001010100 -> listOf("?") - 0b10001010101 -> listOf("?") - 0b10001010110 -> listOf("?") - 0b10001010111 -> listOf("?") - 0b10001011000 -> listOf("?") - 0b10001011001 -> listOf("?") - 0b10001011010 -> listOf("?") - 0b10001011011 -> listOf("?") - 0b10001011100 -> listOf("?") - 0b10001011101 -> listOf("?") - 0b10001011110 -> listOf("?") - 0b10001011111 -> listOf("?") - 0b10001100000 -> listOf("?") - 0b10001100001 -> listOf("?") - 0b10001100010 -> listOf("?") - 0b10001100011 -> listOf("?") - 0b10001100100 -> listOf("?") - 0b10001100101 -> listOf("?") - 0b10001100110 -> listOf("?") - 0b10001100111 -> listOf("?") - 0b10001101000 -> listOf("?") - 0b10001101001 -> listOf("?") - 0b10001101010 -> listOf("?") - 0b10001101011 -> listOf("?") - 0b10001101100 -> listOf("?") - 0b10001101101 -> listOf("?") - 0b10001101110 -> listOf("?") - 0b10001101111 -> listOf("?") - 0b10001110000 -> listOf("?") - 0b10001110001 -> listOf("?") - 0b10001110010 -> listOf("?") - 0b10001110011 -> listOf("?") - 0b10001110100 -> listOf("?") - 0b10001110101 -> listOf("?") - 0b10001110110 -> listOf("?") - 0b10001110111 -> listOf("?") - 0b10001111000 -> listOf("?") - 0b10001111001 -> listOf("?") - 0b10001111010 -> listOf("?") - 0b10001111011 -> listOf("?") - 0b10001111100 -> listOf("?") - 0b10001111101 -> listOf("?") - 0b10001111110 -> listOf("?") - 0b10001111111 -> listOf("?") - 0b10010000000 -> listOf("?") - 0b10010000001 -> listOf("?") - 0b10010000010 -> listOf("?") - 0b10010000011 -> listOf("?") - 0b10010000100 -> listOf("?") - 0b10010000101 -> listOf("?") - 0b10010000110 -> listOf("?") - 0b10010000111 -> listOf("?") - 0b10010001000 -> listOf("?") - 0b10010001001 -> listOf("?") - 0b10010001010 -> listOf("?") - 0b10010001011 -> listOf("?") - 0b10010001100 -> listOf("?") - 0b10010001101 -> listOf("?") - 0b10010001110 -> listOf("?") - 0b10010001111 -> listOf("?") - 0b10010010000 -> listOf("?") - 0b10010010001 -> listOf("?") - 0b10010010010 -> listOf("?") - 0b10010010011 -> listOf("?") - 0b10010010100 -> listOf("?") - 0b10010010101 -> listOf("?") - 0b10010010110 -> listOf("?") - 0b10010010111 -> listOf("?") - 0b10010011000 -> listOf("?") - 0b10010011001 -> listOf("?") - 0b10010011010 -> listOf("?") - 0b10010011011 -> listOf("?") - 0b10010011100 -> listOf("?") - 0b10010011101 -> listOf("?") - 0b10010011110 -> listOf("?") - 0b10010011111 -> listOf("?") - 0b10010100000 -> listOf("?") - 0b10010100001 -> listOf("?") - 0b10010100010 -> listOf("?") - 0b10010100011 -> listOf("?") - 0b10010100100 -> listOf("?") - 0b10010100101 -> listOf("?") - 0b10010100110 -> listOf("?") - 0b10010100111 -> listOf("?") - 0b10010101000 -> listOf("?") - 0b10010101001 -> listOf("?") - 0b10010101010 -> listOf("?") - 0b10010101011 -> listOf("?") - 0b10010101100 -> listOf("?") - 0b10010101101 -> listOf("?") - 0b10010101110 -> listOf("?") - 0b10010101111 -> listOf("?") - 0b10010110000 -> listOf("?") - 0b10010110001 -> listOf("?") - 0b10010110010 -> listOf("?") - 0b10010110011 -> listOf("?") - 0b10010110100 -> listOf("?") - 0b10010110101 -> listOf("?") - 0b10010110110 -> listOf("?") - 0b10010110111 -> listOf("?") - 0b10010111000 -> listOf("?") - 0b10010111001 -> listOf("?") - 0b10010111010 -> listOf("?") - 0b10010111011 -> listOf("?") - 0b10010111100 -> listOf("?") - 0b10010111101 -> listOf("?") - 0b10010111110 -> listOf("?") - 0b10010111111 -> listOf("?") - 0b10011000000 -> listOf("?") - 0b10011000001 -> listOf("?") - 0b10011000010 -> listOf("?") - 0b10011000011 -> listOf("?") - 0b10011000100 -> listOf("?") - 0b10011000101 -> listOf("?") - 0b10011000110 -> listOf("?") - 0b10011000111 -> listOf("?") - 0b10011001000 -> listOf("?") - 0b10011001001 -> listOf("?") - 0b10011001010 -> listOf("?") - 0b10011001011 -> listOf("?") - 0b10011001100 -> listOf("?") - 0b10011001101 -> listOf("?") - 0b10011001110 -> listOf("?") - 0b10011001111 -> listOf("?") - 0b10011010000 -> listOf("?") - 0b10011010001 -> listOf("?") - 0b10011010010 -> listOf("?") - 0b10011010011 -> listOf("?") - 0b10011010100 -> listOf("?") - 0b10011010101 -> listOf("?") - 0b10011010110 -> listOf("?") - 0b10011010111 -> listOf("?") - 0b10011011000 -> listOf("?") - 0b10011011001 -> listOf("?") - 0b10011011010 -> listOf("?") - 0b10011011011 -> listOf("?") - 0b10011011100 -> listOf("?") - 0b10011011101 -> listOf("?") - 0b10011011110 -> listOf("?") - 0b10011011111 -> listOf("?") - 0b10011100000 -> listOf("?") - 0b10011100001 -> listOf("?") - 0b10011100010 -> listOf("?") - 0b10011100011 -> listOf("?") - 0b10011100100 -> listOf("?") - 0b10011100101 -> listOf("?") - 0b10011100110 -> listOf("?") - 0b10011100111 -> listOf("?") - 0b10011101000 -> listOf("?") - 0b10011101001 -> listOf("?") - 0b10011101010 -> listOf("?") - 0b10011101011 -> listOf("?") - 0b10011101100 -> listOf("?") - 0b10011101101 -> listOf("?") - 0b10011101110 -> listOf("?") - 0b10011101111 -> listOf("?") - 0b10011110000 -> listOf("?") - 0b10011110001 -> listOf("?") - 0b10011110010 -> listOf("?") - 0b10011110011 -> listOf("?") - 0b10011110100 -> listOf("?") - 0b10011110101 -> listOf("?") - 0b10011110110 -> listOf("?") - 0b10011110111 -> listOf("?") - 0b10011111000 -> listOf("?") - 0b10011111001 -> listOf("?") - 0b10011111010 -> listOf("?") - 0b10011111011 -> listOf("?") - 0b10011111100 -> listOf("?") - 0b10011111101 -> listOf("?") - 0b10011111110 -> listOf("?") - 0b10011111111 -> listOf("?") - 0b10100000000 -> listOf("?") - 0b10100000001 -> listOf("?") - 0b10100000010 -> listOf("?") - 0b10100000011 -> listOf("?") - 0b10100000100 -> listOf("?") - 0b10100000101 -> listOf("?") - 0b10100000110 -> listOf("?") - 0b10100000111 -> listOf("?") - 0b10100001000 -> listOf("?") - 0b10100001001 -> listOf("?") - 0b10100001010 -> listOf("?") - 0b10100001011 -> listOf("?") - 0b10100001100 -> listOf("?") - 0b10100001101 -> listOf("?") - 0b10100001110 -> listOf("?") - 0b10100001111 -> listOf("?") - 0b10100010000 -> listOf("?") - 0b10100010001 -> listOf("?") - 0b10100010010 -> listOf("?") - 0b10100010011 -> listOf("?") - 0b10100010100 -> listOf("?") - 0b10100010101 -> listOf("?") - 0b10100010110 -> listOf("?") - 0b10100010111 -> listOf("?") - 0b10100011000 -> listOf("?") - 0b10100011001 -> listOf("?") - 0b10100011010 -> listOf("?") - 0b10100011011 -> listOf("?") - 0b10100011100 -> listOf("?") - 0b10100011101 -> listOf("?") - 0b10100011110 -> listOf("?") - 0b10100011111 -> listOf("?") - 0b10100100000 -> listOf("?") - 0b10100100001 -> listOf("?") - 0b10100100010 -> listOf("?") - 0b10100100011 -> listOf("?") - 0b10100100100 -> listOf("?") - 0b10100100101 -> listOf("?") - 0b10100100110 -> listOf("?") - 0b10100100111 -> listOf("?") - 0b10100101000 -> listOf("?") - 0b10100101001 -> listOf("?") - 0b10100101010 -> listOf("?") - 0b10100101011 -> listOf("?") - 0b10100101100 -> listOf("?") - 0b10100101101 -> listOf("?") - 0b10100101110 -> listOf("?") - 0b10100101111 -> listOf("?") - 0b10100110000 -> listOf("?") - 0b10100110001 -> listOf("?") - 0b10100110010 -> listOf("?") - 0b10100110011 -> listOf("?") - 0b10100110100 -> listOf("?") - 0b10100110101 -> listOf("?") - 0b10100110110 -> listOf("?") - 0b10100110111 -> listOf("?") - 0b10100111000 -> listOf("?") - 0b10100111001 -> listOf("?") - 0b10100111010 -> listOf("?") - 0b10100111011 -> listOf("?") - 0b10100111100 -> listOf("?") - 0b10100111101 -> listOf("?") - 0b10100111110 -> listOf("?") - 0b10100111111 -> listOf("?") - 0b10101000000 -> listOf("?") - 0b10101000001 -> listOf("?") - 0b10101000010 -> listOf("?") - 0b10101000011 -> listOf("?") - 0b10101000100 -> listOf("?") - 0b10101000101 -> listOf("?") - 0b10101000110 -> listOf("?") - 0b10101000111 -> listOf("?") - 0b10101001000 -> listOf("?") - 0b10101001001 -> listOf("?") - 0b10101001010 -> listOf("?") - 0b10101001011 -> listOf("?") - 0b10101001100 -> listOf("?") - 0b10101001101 -> listOf("?") - 0b10101001110 -> listOf("?") - 0b10101001111 -> listOf("?") - 0b10101010000 -> listOf("?") - 0b10101010001 -> listOf("?") - 0b10101010010 -> listOf("?") - 0b10101010011 -> listOf("?") - 0b10101010100 -> listOf("?") - 0b10101010101 -> listOf("?") - 0b10101010110 -> listOf("?") - 0b10101010111 -> listOf("?") - 0b10101011000 -> listOf("?") - 0b10101011001 -> listOf("?") - 0b10101011010 -> listOf("?") - 0b10101011011 -> listOf("?") - 0b10101011100 -> listOf("?") - 0b10101011101 -> listOf("?") - 0b10101011110 -> listOf("?") - 0b10101011111 -> listOf("?") - 0b10101100000 -> listOf("?") - 0b10101100001 -> listOf("?") - 0b10101100010 -> listOf("?") - 0b10101100011 -> listOf("?") - 0b10101100100 -> listOf("?") - 0b10101100101 -> listOf("?") - 0b10101100110 -> listOf("?") - 0b10101100111 -> listOf("?") - 0b10101101000 -> listOf("?") - 0b10101101001 -> listOf("?") - 0b10101101010 -> listOf("?") - 0b10101101011 -> listOf("?") - 0b10101101100 -> listOf("?") - 0b10101101101 -> listOf("?") - 0b10101101110 -> listOf("?") - 0b10101101111 -> listOf("?") - 0b10101110000 -> listOf("?") - 0b10101110001 -> listOf("?") - 0b10101110010 -> listOf("?") - 0b10101110011 -> listOf("?") - 0b10101110100 -> listOf("?") - 0b10101110101 -> listOf("?") - 0b10101110110 -> listOf("?") - 0b10101110111 -> listOf("?") - 0b10101111000 -> listOf("?") - 0b10101111001 -> listOf("?") - 0b10101111010 -> listOf("?") - 0b10101111011 -> listOf("?") - 0b10101111100 -> listOf("?") - 0b10101111101 -> listOf("?") - 0b10101111110 -> listOf("?") - 0b10101111111 -> listOf("?") - 0b10110000000 -> listOf("?") - 0b10110000001 -> listOf("?") - 0b10110000010 -> listOf("?") - 0b10110000011 -> listOf("?") - 0b10110000100 -> listOf("?") - 0b10110000101 -> listOf("?") - 0b10110000110 -> listOf("?") - 0b10110000111 -> listOf("?") - 0b10110001000 -> listOf("?") - 0b10110001001 -> listOf("?") - 0b10110001010 -> listOf("?") - 0b10110001011 -> listOf("?") - 0b10110001100 -> listOf("?") - 0b10110001101 -> listOf("?") - 0b10110001110 -> listOf("?") - 0b10110001111 -> listOf("?") - 0b10110010000 -> listOf("?") - 0b10110010001 -> listOf("?") - 0b10110010010 -> listOf("?") - 0b10110010011 -> listOf("?") - 0b10110010100 -> listOf("?") - 0b10110010101 -> listOf("?") - 0b10110010110 -> listOf("?") - 0b10110010111 -> listOf("?") - 0b10110011000 -> listOf("?") - 0b10110011001 -> listOf("?") - 0b10110011010 -> listOf("?") - 0b10110011011 -> listOf("?") - 0b10110011100 -> listOf("?") - 0b10110011101 -> listOf("?") - 0b10110011110 -> listOf("?") - 0b10110011111 -> listOf("?") - 0b10110100000 -> listOf("?") - 0b10110100001 -> listOf("?") - 0b10110100010 -> listOf("?") - 0b10110100011 -> listOf("?") - 0b10110100100 -> listOf("?") - 0b10110100101 -> listOf("?") - 0b10110100110 -> listOf("?") - 0b10110100111 -> listOf("?") - 0b10110101000 -> listOf("?") - 0b10110101001 -> listOf("?") - 0b10110101010 -> listOf("?") - 0b10110101011 -> listOf("?") - 0b10110101100 -> listOf("?") - 0b10110101101 -> listOf("?") - 0b10110101110 -> listOf("?") - 0b10110101111 -> listOf("?") - 0b10110110000 -> listOf("?") - 0b10110110001 -> listOf("?") - 0b10110110010 -> listOf("?") - 0b10110110011 -> listOf("?") - 0b10110110100 -> listOf("?") - 0b10110110101 -> listOf("?") - 0b10110110110 -> listOf("?") - 0b10110110111 -> listOf("?") - 0b10110111000 -> listOf("?") - 0b10110111001 -> listOf("?") - 0b10110111010 -> listOf("?") - 0b10110111011 -> listOf("?") - 0b10110111100 -> listOf("?") - 0b10110111101 -> listOf("?") - 0b10110111110 -> listOf("?") - 0b10110111111 -> listOf("?") - 0b10111000000 -> listOf("?") - 0b10111000001 -> listOf("?") - 0b10111000010 -> listOf("?") - 0b10111000011 -> listOf("?") - 0b10111000100 -> listOf("?") - 0b10111000101 -> listOf("?") - 0b10111000110 -> listOf("?") - 0b10111000111 -> listOf("?") - 0b10111001000 -> listOf("?") - 0b10111001001 -> listOf("?") - 0b10111001010 -> listOf("?") - 0b10111001011 -> listOf("?") - 0b10111001100 -> listOf("?") - 0b10111001101 -> listOf("?") - 0b10111001110 -> listOf("?") - 0b10111001111 -> listOf("?") - 0b10111010000 -> listOf("?") - 0b10111010001 -> listOf("?") - 0b10111010010 -> listOf("?") - 0b10111010011 -> listOf("?") - 0b10111010100 -> listOf("?") - 0b10111010101 -> listOf("?") - 0b10111010110 -> listOf("?") - 0b10111010111 -> listOf("?") - 0b10111011000 -> listOf("?") - 0b10111011001 -> listOf("?") - 0b10111011010 -> listOf("?") - 0b10111011011 -> listOf("?") - 0b10111011100 -> listOf("?") - 0b10111011101 -> listOf("?") - 0b10111011110 -> listOf("?") - 0b10111011111 -> listOf("?") - 0b10111100000 -> listOf("?") - 0b10111100001 -> listOf("?") - 0b10111100010 -> listOf("?") - 0b10111100011 -> listOf("?") - 0b10111100100 -> listOf("?") - 0b10111100101 -> listOf("?") - 0b10111100110 -> listOf("?") - 0b10111100111 -> listOf("?") - 0b10111101000 -> listOf("?") - 0b10111101001 -> listOf("?") - 0b10111101010 -> listOf("?") - 0b10111101011 -> listOf("?") - 0b10111101100 -> listOf("?") - 0b10111101101 -> listOf("?") - 0b10111101110 -> listOf("?") - 0b10111101111 -> listOf("?") - 0b10111110000 -> listOf("?") - 0b10111110001 -> listOf("?") - 0b10111110010 -> listOf("?") - 0b10111110011 -> listOf("?") - 0b10111110100 -> listOf("?") - 0b10111110101 -> listOf("?") - 0b10111110110 -> listOf("?") - 0b10111110111 -> listOf("?") - 0b10111111000 -> listOf("?") - 0b10111111001 -> listOf("?") - 0b10111111010 -> listOf("?") - 0b10111111011 -> listOf("?") - 0b10111111100 -> listOf("?") - 0b10111111101 -> listOf("?") - 0b10111111110 -> listOf("?") - 0b10111111111 -> listOf("?") - 0b11000000000 -> listOf("?") - 0b11000000001 -> listOf("?") - 0b11000000010 -> listOf("?") - 0b11000000011 -> listOf("?") - 0b11000000100 -> listOf("?") - 0b11000000101 -> listOf("?") - 0b11000000110 -> listOf("?") - 0b11000000111 -> listOf("?") - 0b11000001000 -> listOf("?") - 0b11000001001 -> listOf("?") - 0b11000001010 -> listOf("?") - 0b11000001011 -> listOf("?") - 0b11000001100 -> listOf("?") - 0b11000001101 -> listOf("?") - 0b11000001110 -> listOf("?") - 0b11000001111 -> listOf("?") - 0b11000010000 -> listOf("?") - 0b11000010001 -> listOf("?") - 0b11000010010 -> listOf("?") - 0b11000010011 -> listOf("?") - 0b11000010100 -> listOf("?") - 0b11000010101 -> listOf("?") - 0b11000010110 -> listOf("?") - 0b11000010111 -> listOf("?") - 0b11000011000 -> listOf("?") - 0b11000011001 -> listOf("?") - 0b11000011010 -> listOf("?") - 0b11000011011 -> listOf("?") - 0b11000011100 -> listOf("?") - 0b11000011101 -> listOf("?") - 0b11000011110 -> listOf("?") - 0b11000011111 -> listOf("?") - 0b11000100000 -> listOf("?") - 0b11000100001 -> listOf("?") - 0b11000100010 -> listOf("?") - 0b11000100011 -> listOf("?") - 0b11000100100 -> listOf("?") - 0b11000100101 -> listOf("?") - 0b11000100110 -> listOf("?") - 0b11000100111 -> listOf("?") - 0b11000101000 -> listOf("?") - 0b11000101001 -> listOf("?") - 0b11000101010 -> listOf("?") - 0b11000101011 -> listOf("?") - 0b11000101100 -> listOf("?") - 0b11000101101 -> listOf("?") - 0b11000101110 -> listOf("?") - 0b11000101111 -> listOf("?") - 0b11000110000 -> listOf("?") - 0b11000110001 -> listOf("?") - 0b11000110010 -> listOf("?") - 0b11000110011 -> listOf("?") - 0b11000110100 -> listOf("?") - 0b11000110101 -> listOf("?") - 0b11000110110 -> listOf("?") - 0b11000110111 -> listOf("?") - 0b11000111000 -> listOf("?") - 0b11000111001 -> listOf("?") - 0b11000111010 -> listOf("?") - 0b11000111011 -> listOf("?") - 0b11000111100 -> listOf("?") - 0b11000111101 -> listOf("?") - 0b11000111110 -> listOf("?") - 0b11000111111 -> listOf("?") - 0b11001000000 -> listOf("?") - 0b11001000001 -> listOf("?") - 0b11001000010 -> listOf("?") - 0b11001000011 -> listOf("?") - 0b11001000100 -> listOf("?") - 0b11001000101 -> listOf("?") - 0b11001000110 -> listOf("?") - 0b11001000111 -> listOf("?") - 0b11001001000 -> listOf("?") - 0b11001001001 -> listOf("?") - 0b11001001010 -> listOf("?") - 0b11001001011 -> listOf("?") - 0b11001001100 -> listOf("?") - 0b11001001101 -> listOf("?") - 0b11001001110 -> listOf("?") - 0b11001001111 -> listOf("?") - 0b11001010000 -> listOf("?") - 0b11001010001 -> listOf("?") - 0b11001010010 -> listOf("?") - 0b11001010011 -> listOf("?") - 0b11001010100 -> listOf("?") - 0b11001010101 -> listOf("?") - 0b11001010110 -> listOf("?") - 0b11001010111 -> listOf("?") - 0b11001011000 -> listOf("?") - 0b11001011001 -> listOf("?") - 0b11001011010 -> listOf("?") - 0b11001011011 -> listOf("?") - 0b11001011100 -> listOf("?") - 0b11001011101 -> listOf("?") - 0b11001011110 -> listOf("?") - 0b11001011111 -> listOf("?") - 0b11001100000 -> listOf("?") - 0b11001100001 -> listOf("?") - 0b11001100010 -> listOf("?") - 0b11001100011 -> listOf("?") - 0b11001100100 -> listOf("?") - 0b11001100101 -> listOf("?") - 0b11001100110 -> listOf("?") - 0b11001100111 -> listOf("?") - 0b11001101000 -> listOf("?") - 0b11001101001 -> listOf("?") - 0b11001101010 -> listOf("?") - 0b11001101011 -> listOf("?") - 0b11001101100 -> listOf("?") - 0b11001101101 -> listOf("?") - 0b11001101110 -> listOf("?") - 0b11001101111 -> listOf("?") - 0b11001110000 -> listOf("?") - 0b11001110001 -> listOf("?") - 0b11001110010 -> listOf("?") - 0b11001110011 -> listOf("?") - 0b11001110100 -> listOf("?") - 0b11001110101 -> listOf("?") - 0b11001110110 -> listOf("?") - 0b11001110111 -> listOf("?") - 0b11001111000 -> listOf("?") - 0b11001111001 -> listOf("?") - 0b11001111010 -> listOf("?") - 0b11001111011 -> listOf("?") - 0b11001111100 -> listOf("?") - 0b11001111101 -> listOf("?") - 0b11001111110 -> listOf("?") - 0b11001111111 -> listOf("?") - 0b11010000000 -> listOf("?") - 0b11010000001 -> listOf("?") - 0b11010000010 -> listOf("?") - 0b11010000011 -> listOf("?") - 0b11010000100 -> listOf("?") - 0b11010000101 -> listOf("?") - 0b11010000110 -> listOf("?") - 0b11010000111 -> listOf("?") - 0b11010001000 -> listOf("?") - 0b11010001001 -> listOf("?") - 0b11010001010 -> listOf("?") - 0b11010001011 -> listOf("?") - 0b11010001100 -> listOf("?") - 0b11010001101 -> listOf("?") - 0b11010001110 -> listOf("?") - 0b11010001111 -> listOf("?") - 0b11010010000 -> listOf("?") - 0b11010010001 -> listOf("?") - 0b11010010010 -> listOf("?") - 0b11010010011 -> listOf("?") - 0b11010010100 -> listOf("?") - 0b11010010101 -> listOf("?") - 0b11010010110 -> listOf("?") - 0b11010010111 -> listOf("?") - 0b11010011000 -> listOf("?") - 0b11010011001 -> listOf("?") - 0b11010011010 -> listOf("?") - 0b11010011011 -> listOf("?") - 0b11010011100 -> listOf("?") - 0b11010011101 -> listOf("?") - 0b11010011110 -> listOf("?") - 0b11010011111 -> listOf("?") - 0b11010100000 -> listOf("?") - 0b11010100001 -> listOf("?") - 0b11010100010 -> listOf("?") - 0b11010100011 -> listOf("?") - 0b11010100100 -> listOf("?") - 0b11010100101 -> listOf("?") - 0b11010100110 -> listOf("?") - 0b11010100111 -> listOf("?") - 0b11010101000 -> listOf("?") - 0b11010101001 -> listOf("?") - 0b11010101010 -> listOf("?") - 0b11010101011 -> listOf("?") - 0b11010101100 -> listOf("?") - 0b11010101101 -> listOf("?") - 0b11010101110 -> listOf("?") - 0b11010101111 -> listOf("?") - 0b11010110000 -> listOf("?") - 0b11010110001 -> listOf("?") - 0b11010110010 -> listOf("?") - 0b11010110011 -> listOf("?") - 0b11010110100 -> listOf("?") - 0b11010110101 -> listOf("?") - 0b11010110110 -> listOf("?") - 0b11010110111 -> listOf("?") - 0b11010111000 -> listOf("?") - 0b11010111001 -> listOf("?") - 0b11010111010 -> listOf("?") - 0b11010111011 -> listOf("?") - 0b11010111100 -> listOf("?") - 0b11010111101 -> listOf("?") - 0b11010111110 -> listOf("?") - 0b11010111111 -> listOf("?") - 0b11011000000 -> listOf("?") - 0b11011000001 -> listOf("?") - 0b11011000010 -> listOf("?") - 0b11011000011 -> listOf("?") - 0b11011000100 -> listOf("?") - 0b11011000101 -> listOf("?") - 0b11011000110 -> listOf("?") - 0b11011000111 -> listOf("?") - 0b11011001000 -> listOf("?") - 0b11011001001 -> listOf("?") - 0b11011001010 -> listOf("?") - 0b11011001011 -> listOf("?") - 0b11011001100 -> listOf("?") - 0b11011001101 -> listOf("?") - 0b11011001110 -> listOf("?") - 0b11011001111 -> listOf("?") - 0b11011010000 -> listOf("?") - 0b11011010001 -> listOf("?") - 0b11011010010 -> listOf("?") - 0b11011010011 -> listOf("?") - 0b11011010100 -> listOf("?") - 0b11011010101 -> listOf("?") - 0b11011010110 -> listOf("?") - 0b11011010111 -> listOf("?") - 0b11011011000 -> listOf("?") - 0b11011011001 -> listOf("?") - 0b11011011010 -> listOf("?") - 0b11011011011 -> listOf("?") - 0b11011011100 -> listOf("?") - 0b11011011101 -> listOf("?") - 0b11011011110 -> listOf("?") - 0b11011011111 -> listOf("?") - 0b11011100000 -> listOf("?") - 0b11011100001 -> listOf("?") - 0b11011100010 -> listOf("?") - 0b11011100011 -> listOf("?") - 0b11011100100 -> listOf("?") - 0b11011100101 -> listOf("?") - 0b11011100110 -> listOf("?") - 0b11011100111 -> listOf("?") - 0b11011101000 -> listOf("?") - 0b11011101001 -> listOf("?") - 0b11011101010 -> listOf("?") - 0b11011101011 -> listOf("?") - 0b11011101100 -> listOf("?") - 0b11011101101 -> listOf("?") - 0b11011101110 -> listOf("?") - 0b11011101111 -> listOf("?") - 0b11011110000 -> listOf("?") - 0b11011110001 -> listOf("?") - 0b11011110010 -> listOf("?") - 0b11011110011 -> listOf("?") - 0b11011110100 -> listOf("?") - 0b11011110101 -> listOf("?") - 0b11011110110 -> listOf("?") - 0b11011110111 -> listOf("?") - 0b11011111000 -> listOf("?") - 0b11011111001 -> listOf("?") - 0b11011111010 -> listOf("?") - 0b11011111011 -> listOf("?") - 0b11011111100 -> listOf("?") - 0b11011111101 -> listOf("?") - 0b11011111110 -> listOf("?") - 0b11011111111 -> listOf("?") - 0b11100000000 -> listOf("?") - 0b11100000001 -> listOf("?") - 0b11100000010 -> listOf("?") - 0b11100000011 -> listOf("?") - 0b11100000100 -> listOf("?") - 0b11100000101 -> listOf("?") - 0b11100000110 -> listOf("?") - 0b11100000111 -> listOf("?") - 0b11100001000 -> listOf("?") - 0b11100001001 -> listOf("?") - 0b11100001010 -> listOf("?") - 0b11100001011 -> listOf("?") - 0b11100001100 -> listOf("?") - 0b11100001101 -> listOf("?") - 0b11100001110 -> listOf("?") - 0b11100001111 -> listOf("?") - 0b11100010000 -> listOf("?") - 0b11100010001 -> listOf("?") - 0b11100010010 -> listOf("?") - 0b11100010011 -> listOf("?") - 0b11100010100 -> listOf("?") - 0b11100010101 -> listOf("?") - 0b11100010110 -> listOf("?") - 0b11100010111 -> listOf("?") - 0b11100011000 -> listOf("?") - 0b11100011001 -> listOf("?") - 0b11100011010 -> listOf("?") - 0b11100011011 -> listOf("?") - 0b11100011100 -> listOf("?") - 0b11100011101 -> listOf("?") - 0b11100011110 -> listOf("?") - 0b11100011111 -> listOf("?") - 0b11100100000 -> listOf("?") - 0b11100100001 -> listOf("?") - 0b11100100010 -> listOf("?") - 0b11100100011 -> listOf("?") - 0b11100100100 -> listOf("?") - 0b11100100101 -> listOf("?") - 0b11100100110 -> listOf("?") - 0b11100100111 -> listOf("?") - 0b11100101000 -> listOf("?") - 0b11100101001 -> listOf("?") - 0b11100101010 -> listOf("?") - 0b11100101011 -> listOf("?") - 0b11100101100 -> listOf("?") - 0b11100101101 -> listOf("?") - 0b11100101110 -> listOf("?") - 0b11100101111 -> listOf("?") - 0b11100110000 -> listOf("?") - 0b11100110001 -> listOf("?") - 0b11100110010 -> listOf("?") - 0b11100110011 -> listOf("?") - 0b11100110100 -> listOf("?") - 0b11100110101 -> listOf("?") - 0b11100110110 -> listOf("?") - 0b11100110111 -> listOf("?") - 0b11100111000 -> listOf("?") - 0b11100111001 -> listOf("?") - 0b11100111010 -> listOf("?") - 0b11100111011 -> listOf("?") - 0b11100111100 -> listOf("?") - 0b11100111101 -> listOf("?") - 0b11100111110 -> listOf("?") - 0b11100111111 -> listOf("?") - 0b11101000000 -> listOf("?") - 0b11101000001 -> listOf("?") - 0b11101000010 -> listOf("?") - 0b11101000011 -> listOf("?") - 0b11101000100 -> listOf("?") - 0b11101000101 -> listOf("?") - 0b11101000110 -> listOf("?") - 0b11101000111 -> listOf("?") - 0b11101001000 -> listOf("?") - 0b11101001001 -> listOf("?") - 0b11101001010 -> listOf("?") - 0b11101001011 -> listOf("?") - 0b11101001100 -> listOf("?") - 0b11101001101 -> listOf("?") - 0b11101001110 -> listOf("?") - 0b11101001111 -> listOf("?") - 0b11101010000 -> listOf("?") - 0b11101010001 -> listOf("?") - 0b11101010010 -> listOf("?") - 0b11101010011 -> listOf("?") - 0b11101010100 -> listOf("?") - 0b11101010101 -> listOf("?") - 0b11101010110 -> listOf("?") - 0b11101010111 -> listOf("?") - 0b11101011000 -> listOf("?") - 0b11101011001 -> listOf("?") - 0b11101011010 -> listOf("?") - 0b11101011011 -> listOf("?") - 0b11101011100 -> listOf("?") - 0b11101011101 -> listOf("?") - 0b11101011110 -> listOf("?") - 0b11101011111 -> listOf("?") - 0b11101100000 -> listOf("?") - 0b11101100001 -> listOf("?") - 0b11101100010 -> listOf("?") - 0b11101100011 -> listOf("?") - 0b11101100100 -> listOf("?") - 0b11101100101 -> listOf("?") - 0b11101100110 -> listOf("?") - 0b11101100111 -> listOf("?") - 0b11101101000 -> listOf("?") - 0b11101101001 -> listOf("?") - 0b11101101010 -> listOf("?") - 0b11101101011 -> listOf("?") - 0b11101101100 -> listOf("?") + 0b10000001110 -> listOf() + 0b10000001111 -> listOf() + 0b10000010000 -> listOf() + 0b10000010001 -> listOf() + 0b10000010010 -> listOf() + 0b10000010011 -> listOf() + 0b10000010100 -> listOf() + 0b10000010101 -> listOf() + 0b10000010110 -> listOf() + 0b10000010111 -> listOf() + 0b10000011000 -> listOf() + 0b10000011001 -> listOf() + 0b10000011010 -> listOf() + 0b10000011011 -> listOf() + 0b10000011100 -> listOf() + 0b10000011101 -> listOf() + 0b10000011110 -> listOf() + 0b10000011111 -> listOf() + 0b10000100000 -> listOf() + 0b10000100001 -> listOf() + 0b10000100010 -> listOf() + 0b10000100011 -> listOf() + 0b10000100100 -> listOf() + 0b10000100101 -> listOf() + 0b10000100110 -> listOf() + 0b10000100111 -> listOf() + 0b10000101000 -> listOf() + 0b10000101001 -> listOf() + 0b10000101010 -> listOf() + 0b10000101011 -> listOf() + 0b10000101100 -> listOf() + 0b10000101101 -> listOf() + 0b10000101110 -> listOf() + 0b10000101111 -> listOf() + 0b10000110000 -> listOf() + 0b10000110001 -> listOf() + 0b10000110010 -> listOf() + 0b10000110011 -> listOf() + 0b10000110100 -> listOf() + 0b10000110101 -> listOf() + 0b10000110110 -> listOf() + 0b10000110111 -> listOf() + 0b10000111000 -> listOf() + 0b10000111001 -> listOf() + 0b10000111010 -> listOf() + 0b10000111011 -> listOf() + 0b10000111100 -> listOf() + 0b10000111101 -> listOf() + 0b10000111110 -> listOf() + 0b10000111111 -> listOf() + 0b10001000000 -> listOf() + 0b10001000001 -> listOf() + 0b10001000010 -> listOf() + 0b10001000011 -> listOf() + 0b10001000100 -> listOf() + 0b10001000101 -> listOf() + 0b10001000110 -> listOf() + 0b10001000111 -> listOf() + 0b10001001000 -> listOf() + 0b10001001001 -> listOf() + 0b10001001010 -> listOf() + 0b10001001011 -> listOf() + 0b10001001100 -> listOf() + 0b10001001101 -> listOf() + 0b10001001110 -> listOf() + 0b10001001111 -> listOf() + 0b10001010000 -> listOf() + 0b10001010001 -> listOf() + 0b10001010010 -> listOf() + 0b10001010011 -> listOf() + 0b10001010100 -> listOf() + 0b10001010101 -> listOf() + 0b10001010110 -> listOf() + 0b10001010111 -> listOf() + 0b10001011000 -> listOf() + 0b10001011001 -> listOf() + 0b10001011010 -> listOf() + 0b10001011011 -> listOf() + 0b10001011100 -> listOf() + 0b10001011101 -> listOf() + 0b10001011110 -> listOf() + 0b10001011111 -> listOf() + 0b10001100000 -> listOf() + 0b10001100001 -> listOf() + 0b10001100010 -> listOf() + 0b10001100011 -> listOf() + 0b10001100100 -> listOf() + 0b10001100101 -> listOf() + 0b10001100110 -> listOf() + 0b10001100111 -> listOf() + 0b10001101000 -> listOf() + 0b10001101001 -> listOf() + 0b10001101010 -> listOf() + 0b10001101011 -> listOf() + 0b10001101100 -> listOf() + 0b10001101101 -> listOf() + 0b10001101110 -> listOf() + 0b10001101111 -> listOf() + 0b10001110000 -> listOf() + 0b10001110001 -> listOf() + 0b10001110010 -> listOf() + 0b10001110011 -> listOf() + 0b10001110100 -> listOf() + 0b10001110101 -> listOf() + 0b10001110110 -> listOf() + 0b10001110111 -> listOf() + 0b10001111000 -> listOf() + 0b10001111001 -> listOf() + 0b10001111010 -> listOf() + 0b10001111011 -> listOf() + 0b10001111100 -> listOf() + 0b10001111101 -> listOf() + 0b10001111110 -> listOf() + 0b10001111111 -> listOf() + 0b10010000000 -> listOf() + 0b10010000001 -> listOf() + 0b10010000010 -> listOf() + 0b10010000011 -> listOf() + 0b10010000100 -> listOf() + 0b10010000101 -> listOf() + 0b10010000110 -> listOf() + 0b10010000111 -> listOf() + 0b10010001000 -> listOf() + 0b10010001001 -> listOf() + 0b10010001010 -> listOf() + 0b10010001011 -> listOf() + 0b10010001100 -> listOf() + 0b10010001101 -> listOf() + 0b10010001110 -> listOf() + 0b10010001111 -> listOf() + 0b10010010000 -> listOf() + 0b10010010001 -> listOf() + 0b10010010010 -> listOf() + 0b10010010011 -> listOf() + 0b10010010100 -> listOf() + 0b10010010101 -> listOf() + 0b10010010110 -> listOf() + 0b10010010111 -> listOf() + 0b10010011000 -> listOf() + 0b10010011001 -> listOf() + 0b10010011010 -> listOf() + 0b10010011011 -> listOf() + 0b10010011100 -> listOf() + 0b10010011101 -> listOf() + 0b10010011110 -> listOf() + 0b10010011111 -> listOf() + 0b10010100000 -> listOf() + 0b10010100001 -> listOf() + 0b10010100010 -> listOf() + 0b10010100011 -> listOf() + 0b10010100100 -> listOf() + 0b10010100101 -> listOf() + 0b10010100110 -> listOf() + 0b10010100111 -> listOf() + 0b10010101000 -> listOf() + 0b10010101001 -> listOf() + 0b10010101010 -> listOf() + 0b10010101011 -> listOf() + 0b10010101100 -> listOf() + 0b10010101101 -> listOf() + 0b10010101110 -> listOf() + 0b10010101111 -> listOf() + 0b10010110000 -> listOf() + 0b10010110001 -> listOf() + 0b10010110010 -> listOf() + 0b10010110011 -> listOf() + 0b10010110100 -> listOf() + 0b10010110101 -> listOf() + 0b10010110110 -> listOf() + 0b10010110111 -> listOf() + 0b10010111000 -> listOf() + 0b10010111001 -> listOf() + 0b10010111010 -> listOf() + 0b10010111011 -> listOf() + 0b10010111100 -> listOf() + 0b10010111101 -> listOf() + 0b10010111110 -> listOf() + 0b10010111111 -> listOf() + 0b10011000000 -> listOf() + 0b10011000001 -> listOf() + 0b10011000010 -> listOf() + 0b10011000011 -> listOf() + 0b10011000100 -> listOf() + 0b10011000101 -> listOf() + 0b10011000110 -> listOf() + 0b10011000111 -> listOf() + 0b10011001000 -> listOf() + 0b10011001001 -> listOf() + 0b10011001010 -> listOf() + 0b10011001011 -> listOf() + 0b10011001100 -> listOf() + 0b10011001101 -> listOf() + 0b10011001110 -> listOf() + 0b10011001111 -> listOf() + 0b10011010000 -> listOf() + 0b10011010001 -> listOf() + 0b10011010010 -> listOf() + 0b10011010011 -> listOf() + 0b10011010100 -> listOf() + 0b10011010101 -> listOf() + 0b10011010110 -> listOf() + 0b10011010111 -> listOf() + 0b10011011000 -> listOf() + 0b10011011001 -> listOf() + 0b10011011010 -> listOf() + 0b10011011011 -> listOf() + 0b10011011100 -> listOf() + 0b10011011101 -> listOf() + 0b10011011110 -> listOf() + 0b10011011111 -> listOf() + 0b10011100000 -> listOf() + 0b10011100001 -> listOf() + 0b10011100010 -> listOf() + 0b10011100011 -> listOf() + 0b10011100100 -> listOf() + 0b10011100101 -> listOf() + 0b10011100110 -> listOf() + 0b10011100111 -> listOf() + 0b10011101000 -> listOf() + 0b10011101001 -> listOf() + 0b10011101010 -> listOf() + 0b10011101011 -> listOf() + 0b10011101100 -> listOf() + 0b10011101101 -> listOf() + 0b10011101110 -> listOf() + 0b10011101111 -> listOf() + 0b10011110000 -> listOf() + 0b10011110001 -> listOf() + 0b10011110010 -> listOf() + 0b10011110011 -> listOf() + 0b10011110100 -> listOf() + 0b10011110101 -> listOf() + 0b10011110110 -> listOf() + 0b10011110111 -> listOf() + 0b10011111000 -> listOf() + 0b10011111001 -> listOf() + 0b10011111010 -> listOf() + 0b10011111011 -> listOf() + 0b10011111100 -> listOf() + 0b10011111101 -> listOf() + 0b10011111110 -> listOf() + 0b10011111111 -> listOf() + 0b10100000000 -> listOf() + 0b10100000001 -> listOf() + 0b10100000010 -> listOf() + 0b10100000011 -> listOf() + 0b10100000100 -> listOf() + 0b10100000101 -> listOf() + 0b10100000110 -> listOf() + 0b10100000111 -> listOf() + 0b10100001000 -> listOf() + 0b10100001001 -> listOf() + 0b10100001010 -> listOf() + 0b10100001011 -> listOf() + 0b10100001100 -> listOf() + 0b10100001101 -> listOf() + 0b10100001110 -> listOf() + 0b10100001111 -> listOf() + 0b10100010000 -> listOf() + 0b10100010001 -> listOf() + 0b10100010010 -> listOf() + 0b10100010011 -> listOf() + 0b10100010100 -> listOf() + 0b10100010101 -> listOf() + 0b10100010110 -> listOf() + 0b10100010111 -> listOf() + 0b10100011000 -> listOf() + 0b10100011001 -> listOf() + 0b10100011010 -> listOf() + 0b10100011011 -> listOf() + 0b10100011100 -> listOf() + 0b10100011101 -> listOf() + 0b10100011110 -> listOf() + 0b10100011111 -> listOf() + 0b10100100000 -> listOf() + 0b10100100001 -> listOf() + 0b10100100010 -> listOf() + 0b10100100011 -> listOf() + 0b10100100100 -> listOf() + 0b10100100101 -> listOf() + 0b10100100110 -> listOf() + 0b10100100111 -> listOf() + 0b10100101000 -> listOf() + 0b10100101001 -> listOf() + 0b10100101010 -> listOf() + 0b10100101011 -> listOf() + 0b10100101100 -> listOf() + 0b10100101101 -> listOf() + 0b10100101110 -> listOf() + 0b10100101111 -> listOf() + 0b10100110000 -> listOf() + 0b10100110001 -> listOf() + 0b10100110010 -> listOf() + 0b10100110011 -> listOf() + 0b10100110100 -> listOf() + 0b10100110101 -> listOf() + 0b10100110110 -> listOf() + 0b10100110111 -> listOf() + 0b10100111000 -> listOf() + 0b10100111001 -> listOf() + 0b10100111010 -> listOf() + 0b10100111011 -> listOf() + 0b10100111100 -> listOf() + 0b10100111101 -> listOf() + 0b10100111110 -> listOf() + 0b10100111111 -> listOf() + 0b10101000000 -> listOf() + 0b10101000001 -> listOf() + 0b10101000010 -> listOf() + 0b10101000011 -> listOf() + 0b10101000100 -> listOf() + 0b10101000101 -> listOf() + 0b10101000110 -> listOf() + 0b10101000111 -> listOf() + 0b10101001000 -> listOf() + 0b10101001001 -> listOf() + 0b10101001010 -> listOf() + 0b10101001011 -> listOf() + 0b10101001100 -> listOf() + 0b10101001101 -> listOf() + 0b10101001110 -> listOf() + 0b10101001111 -> listOf() + 0b10101010000 -> listOf() + 0b10101010001 -> listOf() + 0b10101010010 -> listOf() + 0b10101010011 -> listOf() + 0b10101010100 -> listOf() + 0b10101010101 -> listOf() + 0b10101010110 -> listOf() + 0b10101010111 -> listOf() + 0b10101011000 -> listOf() + 0b10101011001 -> listOf() + 0b10101011010 -> listOf() + 0b10101011011 -> listOf() + 0b10101011100 -> listOf() + 0b10101011101 -> listOf() + 0b10101011110 -> listOf() + 0b10101011111 -> listOf() + 0b10101100000 -> listOf() + 0b10101100001 -> listOf() + 0b10101100010 -> listOf() + 0b10101100011 -> listOf() + 0b10101100100 -> listOf() + 0b10101100101 -> listOf() + 0b10101100110 -> listOf() + 0b10101100111 -> listOf() + 0b10101101000 -> listOf() + 0b10101101001 -> listOf() + 0b10101101010 -> listOf() + 0b10101101011 -> listOf() + 0b10101101100 -> listOf() + 0b10101101101 -> listOf() + 0b10101101110 -> listOf() + 0b10101101111 -> listOf() + 0b10101110000 -> listOf() + 0b10101110001 -> listOf() + 0b10101110010 -> listOf() + 0b10101110011 -> listOf() + 0b10101110100 -> listOf() + 0b10101110101 -> listOf() + 0b10101110110 -> listOf() + 0b10101110111 -> listOf() + 0b10101111000 -> listOf() + 0b10101111001 -> listOf() + 0b10101111010 -> listOf() + 0b10101111011 -> listOf() + 0b10101111100 -> listOf() + 0b10101111101 -> listOf() + 0b10101111110 -> listOf() + 0b10101111111 -> listOf() + 0b10110000000 -> listOf() + 0b10110000001 -> listOf() + 0b10110000010 -> listOf() + 0b10110000011 -> listOf() + 0b10110000100 -> listOf() + 0b10110000101 -> listOf() + 0b10110000110 -> listOf() + 0b10110000111 -> listOf() + 0b10110001000 -> listOf() + 0b10110001001 -> listOf() + 0b10110001010 -> listOf() + 0b10110001011 -> listOf() + 0b10110001100 -> listOf() + 0b10110001101 -> listOf() + 0b10110001110 -> listOf() + 0b10110001111 -> listOf() + 0b10110010000 -> listOf() + 0b10110010001 -> listOf() + 0b10110010010 -> listOf() + 0b10110010011 -> listOf() + 0b10110010100 -> listOf() + 0b10110010101 -> listOf() + 0b10110010110 -> listOf() + 0b10110010111 -> listOf() + 0b10110011000 -> listOf() + 0b10110011001 -> listOf() + 0b10110011010 -> listOf() + 0b10110011011 -> listOf() + 0b10110011100 -> listOf() + 0b10110011101 -> listOf() + 0b10110011110 -> listOf() + 0b10110011111 -> listOf() + 0b10110100000 -> listOf() + 0b10110100001 -> listOf() + 0b10110100010 -> listOf() + 0b10110100011 -> listOf() + 0b10110100100 -> listOf() + 0b10110100101 -> listOf() + 0b10110100110 -> listOf() + 0b10110100111 -> listOf() + 0b10110101000 -> listOf() + 0b10110101001 -> listOf() + 0b10110101010 -> listOf() + 0b10110101011 -> listOf() + 0b10110101100 -> listOf() + 0b10110101101 -> listOf() + 0b10110101110 -> listOf() + 0b10110101111 -> listOf() + 0b10110110000 -> listOf() + 0b10110110001 -> listOf() + 0b10110110010 -> listOf() + 0b10110110011 -> listOf() + 0b10110110100 -> listOf() + 0b10110110101 -> listOf() + 0b10110110110 -> listOf() + 0b10110110111 -> listOf() + 0b10110111000 -> listOf() + 0b10110111001 -> listOf() + 0b10110111010 -> listOf() + 0b10110111011 -> listOf() + 0b10110111100 -> listOf() + 0b10110111101 -> listOf() + 0b10110111110 -> listOf() + 0b10110111111 -> listOf() + 0b10111000000 -> listOf() + 0b10111000001 -> listOf() + 0b10111000010 -> listOf() + 0b10111000011 -> listOf() + 0b10111000100 -> listOf() + 0b10111000101 -> listOf() + 0b10111000110 -> listOf() + 0b10111000111 -> listOf() + 0b10111001000 -> listOf() + 0b10111001001 -> listOf() + 0b10111001010 -> listOf() + 0b10111001011 -> listOf() + 0b10111001100 -> listOf() + 0b10111001101 -> listOf() + 0b10111001110 -> listOf() + 0b10111001111 -> listOf() + 0b10111010000 -> listOf() + 0b10111010001 -> listOf() + 0b10111010010 -> listOf() + 0b10111010011 -> listOf() + 0b10111010100 -> listOf() + 0b10111010101 -> listOf() + 0b10111010110 -> listOf() + 0b10111010111 -> listOf() + 0b10111011000 -> listOf() + 0b10111011001 -> listOf() + 0b10111011010 -> listOf() + 0b10111011011 -> listOf() + 0b10111011100 -> listOf() + 0b10111011101 -> listOf() + 0b10111011110 -> listOf() + 0b10111011111 -> listOf() + 0b10111100000 -> listOf() + 0b10111100001 -> listOf() + 0b10111100010 -> listOf() + 0b10111100011 -> listOf() + 0b10111100100 -> listOf() + 0b10111100101 -> listOf() + 0b10111100110 -> listOf() + 0b10111100111 -> listOf() + 0b10111101000 -> listOf() + 0b10111101001 -> listOf() + 0b10111101010 -> listOf() + 0b10111101011 -> listOf() + 0b10111101100 -> listOf() + 0b10111101101 -> listOf() + 0b10111101110 -> listOf() + 0b10111101111 -> listOf() + 0b10111110000 -> listOf() + 0b10111110001 -> listOf() + 0b10111110010 -> listOf() + 0b10111110011 -> listOf() + 0b10111110100 -> listOf() + 0b10111110101 -> listOf() + 0b10111110110 -> listOf() + 0b10111110111 -> listOf() + 0b10111111000 -> listOf() + 0b10111111001 -> listOf() + 0b10111111010 -> listOf() + 0b10111111011 -> listOf() + 0b10111111100 -> listOf() + 0b10111111101 -> listOf() + 0b10111111110 -> listOf() + 0b10111111111 -> listOf() + 0b11000000000 -> listOf() + 0b11000000001 -> listOf() + 0b11000000010 -> listOf() + 0b11000000011 -> listOf() + 0b11000000100 -> listOf() + 0b11000000101 -> listOf() + 0b11000000110 -> listOf() + 0b11000000111 -> listOf() + 0b11000001000 -> listOf() + 0b11000001001 -> listOf() + 0b11000001010 -> listOf() + 0b11000001011 -> listOf() + 0b11000001100 -> listOf() + 0b11000001101 -> listOf() + 0b11000001110 -> listOf() + 0b11000001111 -> listOf() + 0b11000010000 -> listOf() + 0b11000010001 -> listOf() + 0b11000010010 -> listOf() + 0b11000010011 -> listOf() + 0b11000010100 -> listOf() + 0b11000010101 -> listOf() + 0b11000010110 -> listOf() + 0b11000010111 -> listOf() + 0b11000011000 -> listOf() + 0b11000011001 -> listOf() + 0b11000011010 -> listOf() + 0b11000011011 -> listOf() + 0b11000011100 -> listOf() + 0b11000011101 -> listOf() + 0b11000011110 -> listOf() + 0b11000011111 -> listOf() + 0b11000100000 -> listOf() + 0b11000100001 -> listOf() + 0b11000100010 -> listOf() + 0b11000100011 -> listOf() + 0b11000100100 -> listOf() + 0b11000100101 -> listOf() + 0b11000100110 -> listOf() + 0b11000100111 -> listOf() + 0b11000101000 -> listOf() + 0b11000101001 -> listOf() + 0b11000101010 -> listOf() + 0b11000101011 -> listOf() + 0b11000101100 -> listOf() + 0b11000101101 -> listOf() + 0b11000101110 -> listOf() + 0b11000101111 -> listOf() + 0b11000110000 -> listOf() + 0b11000110001 -> listOf() + 0b11000110010 -> listOf() + 0b11000110011 -> listOf() + 0b11000110100 -> listOf() + 0b11000110101 -> listOf() + 0b11000110110 -> listOf() + 0b11000110111 -> listOf() + 0b11000111000 -> listOf() + 0b11000111001 -> listOf() + 0b11000111010 -> listOf() + 0b11000111011 -> listOf() + 0b11000111100 -> listOf() + 0b11000111101 -> listOf() + 0b11000111110 -> listOf() + 0b11000111111 -> listOf() + 0b11001000000 -> listOf() + 0b11001000001 -> listOf() + 0b11001000010 -> listOf() + 0b11001000011 -> listOf() + 0b11001000100 -> listOf() + 0b11001000101 -> listOf() + 0b11001000110 -> listOf() + 0b11001000111 -> listOf() + 0b11001001000 -> listOf() + 0b11001001001 -> listOf() + 0b11001001010 -> listOf() + 0b11001001011 -> listOf() + 0b11001001100 -> listOf() + 0b11001001101 -> listOf() + 0b11001001110 -> listOf() + 0b11001001111 -> listOf() + 0b11001010000 -> listOf() + 0b11001010001 -> listOf() + 0b11001010010 -> listOf() + 0b11001010011 -> listOf() + 0b11001010100 -> listOf() + 0b11001010101 -> listOf() + 0b11001010110 -> listOf() + 0b11001010111 -> listOf() + 0b11001011000 -> listOf() + 0b11001011001 -> listOf() + 0b11001011010 -> listOf() + 0b11001011011 -> listOf() + 0b11001011100 -> listOf() + 0b11001011101 -> listOf() + 0b11001011110 -> listOf() + 0b11001011111 -> listOf() + 0b11001100000 -> listOf() + 0b11001100001 -> listOf() + 0b11001100010 -> listOf() + 0b11001100011 -> listOf() + 0b11001100100 -> listOf() + 0b11001100101 -> listOf() + 0b11001100110 -> listOf() + 0b11001100111 -> listOf() + 0b11001101000 -> listOf() + 0b11001101001 -> listOf() + 0b11001101010 -> listOf() + 0b11001101011 -> listOf() + 0b11001101100 -> listOf() + 0b11001101101 -> listOf() + 0b11001101110 -> listOf() + 0b11001101111 -> listOf() + 0b11001110000 -> listOf() + 0b11001110001 -> listOf() + 0b11001110010 -> listOf() + 0b11001110011 -> listOf() + 0b11001110100 -> listOf() + 0b11001110101 -> listOf() + 0b11001110110 -> listOf() + 0b11001110111 -> listOf() + 0b11001111000 -> listOf() + 0b11001111001 -> listOf() + 0b11001111010 -> listOf() + 0b11001111011 -> listOf() + 0b11001111100 -> listOf() + 0b11001111101 -> listOf() + 0b11001111110 -> listOf() + 0b11001111111 -> listOf() + 0b11010000000 -> listOf() + 0b11010000001 -> listOf() + 0b11010000010 -> listOf() + 0b11010000011 -> listOf() + 0b11010000100 -> listOf() + 0b11010000101 -> listOf() + 0b11010000110 -> listOf() + 0b11010000111 -> listOf() + 0b11010001000 -> listOf() + 0b11010001001 -> listOf() + 0b11010001010 -> listOf() + 0b11010001011 -> listOf() + 0b11010001100 -> listOf() + 0b11010001101 -> listOf() + 0b11010001110 -> listOf() + 0b11010001111 -> listOf() + 0b11010010000 -> listOf() + 0b11010010001 -> listOf() + 0b11010010010 -> listOf() + 0b11010010011 -> listOf() + 0b11010010100 -> listOf() + 0b11010010101 -> listOf() + 0b11010010110 -> listOf() + 0b11010010111 -> listOf() + 0b11010011000 -> listOf() + 0b11010011001 -> listOf() + 0b11010011010 -> listOf() + 0b11010011011 -> listOf() + 0b11010011100 -> listOf() + 0b11010011101 -> listOf() + 0b11010011110 -> listOf() + 0b11010011111 -> listOf() + 0b11010100000 -> listOf() + 0b11010100001 -> listOf() + 0b11010100010 -> listOf() + 0b11010100011 -> listOf() + 0b11010100100 -> listOf() + 0b11010100101 -> listOf() + 0b11010100110 -> listOf() + 0b11010100111 -> listOf() + 0b11010101000 -> listOf() + 0b11010101001 -> listOf() + 0b11010101010 -> listOf() + 0b11010101011 -> listOf() + 0b11010101100 -> listOf() + 0b11010101101 -> listOf() + 0b11010101110 -> listOf() + 0b11010101111 -> listOf() + 0b11010110000 -> listOf() + 0b11010110001 -> listOf() + 0b11010110010 -> listOf() + 0b11010110011 -> listOf() + 0b11010110100 -> listOf() + 0b11010110101 -> listOf() + 0b11010110110 -> listOf() + 0b11010110111 -> listOf() + 0b11010111000 -> listOf() + 0b11010111001 -> listOf() + 0b11010111010 -> listOf() + 0b11010111011 -> listOf() + 0b11010111100 -> listOf() + 0b11010111101 -> listOf() + 0b11010111110 -> listOf() + 0b11010111111 -> listOf() + 0b11011000000 -> listOf() + 0b11011000001 -> listOf() + 0b11011000010 -> listOf() + 0b11011000011 -> listOf() + 0b11011000100 -> listOf() + 0b11011000101 -> listOf() + 0b11011000110 -> listOf() + 0b11011000111 -> listOf() + 0b11011001000 -> listOf() + 0b11011001001 -> listOf() + 0b11011001010 -> listOf() + 0b11011001011 -> listOf() + 0b11011001100 -> listOf() + 0b11011001101 -> listOf() + 0b11011001110 -> listOf() + 0b11011001111 -> listOf() + 0b11011010000 -> listOf() + 0b11011010001 -> listOf() + 0b11011010010 -> listOf() + 0b11011010011 -> listOf() + 0b11011010100 -> listOf() + 0b11011010101 -> listOf() + 0b11011010110 -> listOf() + 0b11011010111 -> listOf() + 0b11011011000 -> listOf() + 0b11011011001 -> listOf() + 0b11011011010 -> listOf() + 0b11011011011 -> listOf() + 0b11011011100 -> listOf() + 0b11011011101 -> listOf() + 0b11011011110 -> listOf() + 0b11011011111 -> listOf() + 0b11011100000 -> listOf() + 0b11011100001 -> listOf() + 0b11011100010 -> listOf() + 0b11011100011 -> listOf() + 0b11011100100 -> listOf() + 0b11011100101 -> listOf() + 0b11011100110 -> listOf() + 0b11011100111 -> listOf() + 0b11011101000 -> listOf() + 0b11011101001 -> listOf() + 0b11011101010 -> listOf() + 0b11011101011 -> listOf() + 0b11011101100 -> listOf() + 0b11011101101 -> listOf() + 0b11011101110 -> listOf() + 0b11011101111 -> listOf() + 0b11011110000 -> listOf() + 0b11011110001 -> listOf() + 0b11011110010 -> listOf() + 0b11011110011 -> listOf() + 0b11011110100 -> listOf() + 0b11011110101 -> listOf() + 0b11011110110 -> listOf() + 0b11011110111 -> listOf() + 0b11011111000 -> listOf() + 0b11011111001 -> listOf() + 0b11011111010 -> listOf() + 0b11011111011 -> listOf() + 0b11011111100 -> listOf() + 0b11011111101 -> listOf() + 0b11011111110 -> listOf() + 0b11011111111 -> listOf() + 0b11100000000 -> listOf() + 0b11100000001 -> listOf() + 0b11100000010 -> listOf() + 0b11100000011 -> listOf() + 0b11100000100 -> listOf() + 0b11100000101 -> listOf() + 0b11100000110 -> listOf() + 0b11100000111 -> listOf() + 0b11100001000 -> listOf() + 0b11100001001 -> listOf() + 0b11100001010 -> listOf() + 0b11100001011 -> listOf() + 0b11100001100 -> listOf() + 0b11100001101 -> listOf() + 0b11100001110 -> listOf() + 0b11100001111 -> listOf() + 0b11100010000 -> listOf() + 0b11100010001 -> listOf() + 0b11100010010 -> listOf() + 0b11100010011 -> listOf() + 0b11100010100 -> listOf() + 0b11100010101 -> listOf() + 0b11100010110 -> listOf() + 0b11100010111 -> listOf() + 0b11100011000 -> listOf() + 0b11100011001 -> listOf() + 0b11100011010 -> listOf() + 0b11100011011 -> listOf() + 0b11100011100 -> listOf() + 0b11100011101 -> listOf() + 0b11100011110 -> listOf() + 0b11100011111 -> listOf() + 0b11100100000 -> listOf() + 0b11100100001 -> listOf() + 0b11100100010 -> listOf() + 0b11100100011 -> listOf() + 0b11100100100 -> listOf() + 0b11100100101 -> listOf() + 0b11100100110 -> listOf() + 0b11100100111 -> listOf() + 0b11100101000 -> listOf() + 0b11100101001 -> listOf() + 0b11100101010 -> listOf() + 0b11100101011 -> listOf() + 0b11100101100 -> listOf() + 0b11100101101 -> listOf() + 0b11100101110 -> listOf() + 0b11100101111 -> listOf() + 0b11100110000 -> listOf() + 0b11100110001 -> listOf() + 0b11100110010 -> listOf() + 0b11100110011 -> listOf() + 0b11100110100 -> listOf() + 0b11100110101 -> listOf() + 0b11100110110 -> listOf() + 0b11100110111 -> listOf() + 0b11100111000 -> listOf() + 0b11100111001 -> listOf() + 0b11100111010 -> listOf() + 0b11100111011 -> listOf() + 0b11100111100 -> listOf() + 0b11100111101 -> listOf() + 0b11100111110 -> listOf() + 0b11100111111 -> listOf() + 0b11101000000 -> listOf() + 0b11101000001 -> listOf() + 0b11101000010 -> listOf() + 0b11101000011 -> listOf() + 0b11101000100 -> listOf() + 0b11101000101 -> listOf() + 0b11101000110 -> listOf() + 0b11101000111 -> listOf() + 0b11101001000 -> listOf() + 0b11101001001 -> listOf() + 0b11101001010 -> listOf() + 0b11101001011 -> listOf() + 0b11101001100 -> listOf() + 0b11101001101 -> listOf() + 0b11101001110 -> listOf() + 0b11101001111 -> listOf() + 0b11101010000 -> listOf() + 0b11101010001 -> listOf() + 0b11101010010 -> listOf() + 0b11101010011 -> listOf() + 0b11101010100 -> listOf() + 0b11101010101 -> listOf() + 0b11101010110 -> listOf() + 0b11101010111 -> listOf() + 0b11101011000 -> listOf() + 0b11101011001 -> listOf() + 0b11101011010 -> listOf() + 0b11101011011 -> listOf() + 0b11101011100 -> listOf() + 0b11101011101 -> listOf() + 0b11101011110 -> listOf() + 0b11101011111 -> listOf() + 0b11101100000 -> listOf() + 0b11101100001 -> listOf() + 0b11101100010 -> listOf() + 0b11101100011 -> listOf() + 0b11101100100 -> listOf() + 0b11101100101 -> listOf() + 0b11101100110 -> listOf() + 0b11101100111 -> listOf() + 0b11101101000 -> listOf() + 0b11101101001 -> listOf() + 0b11101101010 -> listOf() + 0b11101101011 -> listOf() + 0b11101101100 -> listOf() 0b11101101101 -> listOf(" Chrom. (no 3,5,7)") 0b11101101110 -> listOf(" Chrom. (no 3,5,M7)") 0b11101101111 -> listOf(" Chrom. (no 3,5)") @@ -1930,71 +1932,71 @@ object ChordExtensionNames { 0b11101111100 -> listOf(" Chrom. (no M3,7,M7)") 0b11101111101 -> listOf(" Chrom. (no M3,7)") 0b11101111110 -> listOf(" Chrom. (no M3,M7)") - 0b11101111111 -> listOf("?") - 0b11110000000 -> listOf("?") - 0b11110000001 -> listOf("?") - 0b11110000010 -> listOf("?") - 0b11110000011 -> listOf("?") - 0b11110000100 -> listOf("?") - 0b11110000101 -> listOf("?") - 0b11110000110 -> listOf("?") - 0b11110000111 -> listOf("?") - 0b11110001000 -> listOf("?") - 0b11110001001 -> listOf("?") - 0b11110001010 -> listOf("?") - 0b11110001011 -> listOf("?") - 0b11110001100 -> listOf("?") - 0b11110001101 -> listOf("?") - 0b11110001110 -> listOf("?") + 0b11101111111 -> listOf() + 0b11110000000 -> listOf() + 0b11110000001 -> listOf() + 0b11110000010 -> listOf() + 0b11110000011 -> listOf() + 0b11110000100 -> listOf() + 0b11110000101 -> listOf() + 0b11110000110 -> listOf() + 0b11110000111 -> listOf() + 0b11110001000 -> listOf() + 0b11110001001 -> listOf() + 0b11110001010 -> listOf() + 0b11110001011 -> listOf() + 0b11110001100 -> listOf() + 0b11110001101 -> listOf() + 0b11110001110 -> listOf() 0b11110001111 -> listOf(" Chrom. (no 4,#4,5)") - 0b11110010000 -> listOf("?") - 0b11110010001 -> listOf("?") - 0b11110010010 -> listOf("?") - 0b11110010011 -> listOf("?") - 0b11110010100 -> listOf("?") - 0b11110010101 -> listOf("?") - 0b11110010110 -> listOf("?") - 0b11110010111 -> listOf("?") - 0b11110011000 -> listOf("?") - 0b11110011001 -> listOf("?") - 0b11110011010 -> listOf("?") - 0b11110011011 -> listOf("?") - 0b11110011100 -> listOf("?") - 0b11110011101 -> listOf("?") - 0b11110011110 -> listOf("?") - 0b11110011111 -> listOf("?") - 0b11110100000 -> listOf("?") - 0b11110100001 -> listOf("?") - 0b11110100010 -> listOf("?") - 0b11110100011 -> listOf("?") - 0b11110100100 -> listOf("?") - 0b11110100101 -> listOf("?") - 0b11110100110 -> listOf("?") - 0b11110100111 -> listOf("?") - 0b11110101000 -> listOf("?") - 0b11110101001 -> listOf("?") - 0b11110101010 -> listOf("?") - 0b11110101011 -> listOf("?") - 0b11110101100 -> listOf("?") - 0b11110101101 -> listOf("?") - 0b11110101110 -> listOf("?") - 0b11110101111 -> listOf("?") - 0b11110110000 -> listOf("?") - 0b11110110001 -> listOf("?") - 0b11110110010 -> listOf("?") - 0b11110110011 -> listOf("?") - 0b11110110100 -> listOf("?") - 0b11110110101 -> listOf("?") - 0b11110110110 -> listOf("?") - 0b11110110111 -> listOf("?") - 0b11110111000 -> listOf("?") - 0b11110111001 -> listOf("?") - 0b11110111010 -> listOf("?") - 0b11110111011 -> listOf("?") - 0b11110111100 -> listOf("?") - 0b11110111101 -> listOf("?") - 0b11110111110 -> listOf("?") - 0b11110111111 -> listOf("?") + 0b11110010000 -> listOf() + 0b11110010001 -> listOf() + 0b11110010010 -> listOf() + 0b11110010011 -> listOf() + 0b11110010100 -> listOf() + 0b11110010101 -> listOf() + 0b11110010110 -> listOf() + 0b11110010111 -> listOf() + 0b11110011000 -> listOf() + 0b11110011001 -> listOf() + 0b11110011010 -> listOf() + 0b11110011011 -> listOf() + 0b11110011100 -> listOf() + 0b11110011101 -> listOf() + 0b11110011110 -> listOf() + 0b11110011111 -> listOf() + 0b11110100000 -> listOf() + 0b11110100001 -> listOf() + 0b11110100010 -> listOf() + 0b11110100011 -> listOf() + 0b11110100100 -> listOf() + 0b11110100101 -> listOf() + 0b11110100110 -> listOf() + 0b11110100111 -> listOf() + 0b11110101000 -> listOf() + 0b11110101001 -> listOf() + 0b11110101010 -> listOf() + 0b11110101011 -> listOf() + 0b11110101100 -> listOf() + 0b11110101101 -> listOf() + 0b11110101110 -> listOf() + 0b11110101111 -> listOf() + 0b11110110000 -> listOf() + 0b11110110001 -> listOf() + 0b11110110010 -> listOf() + 0b11110110011 -> listOf() + 0b11110110100 -> listOf() + 0b11110110101 -> listOf() + 0b11110110110 -> listOf() + 0b11110110111 -> listOf() + 0b11110111000 -> listOf() + 0b11110111001 -> listOf() + 0b11110111010 -> listOf() + 0b11110111011 -> listOf() + 0b11110111100 -> listOf() + 0b11110111101 -> listOf() + 0b11110111110 -> listOf() + 0b11110111111 -> listOf() 0b11111000000 -> listOf("M(b9,9,#9,11)(no5)") 0b11111000001 -> listOf("M7(b9,9,#9,11)(no5)") 0b11111000010 -> listOf("7(b9,9,#9,11)(no5)") @@ -2030,18 +2032,18 @@ object ChordExtensionNames { 0b11111100000 -> listOf(" Chrom. ") 0b11111100001 -> listOf(" Chrom. (no 5,#5,6,7)") 0b11111100010 -> listOf(" Chrom. (no 5,#5,6,M7)") - 0b11111100011 -> listOf(" Chrom. (no 5)") - 0b11111100100 -> listOf(" Chrom. (no 5)") - 0b11111100101 -> listOf(" Chrom. (no 5)") - 0b11111100110 -> listOf(" Chrom. (no 5)") - 0b11111100111 -> listOf(" Chrom. (no 5)") - 0b11111101000 -> listOf(" Chrom. (no 5)") - 0b11111101001 -> listOf(" Chrom. (no 5)") - 0b11111101010 -> listOf(" Chrom. (no 5)") - 0b11111101011 -> listOf(" Chrom. (no 5)") - 0b11111101100 -> listOf(" Chrom. (no 5)") - 0b11111101101 -> listOf(" Chrom. (no 5)") - 0b11111101110 -> listOf(" Chrom. (no 5)") + 0b11111100011 -> listOf(" Chrom. (no 5,#5,6)") + 0b11111100100 -> listOf(" Chrom. (no 5,b6,7,M7)") + 0b11111100101 -> listOf(" Chrom. (no 5,b6,7)") + 0b11111100110 -> listOf(" Chrom. (no 5,b6,M7)") + 0b11111100111 -> listOf(" Chrom. (no 5,b6)") + 0b11111101000 -> listOf(" Chrom. (no 5,6,7,M7)") + 0b11111101001 -> listOf(" Chrom. (no 5,6,7)") + 0b11111101010 -> listOf(" Chrom. (no 5,6,M7)") + 0b11111101011 -> listOf(" Chrom. (no 5,6)") + 0b11111101100 -> listOf(" Chrom. (no 5,7,M7)") + 0b11111101101 -> listOf(" Chrom. (no 5,7)") + 0b11111101110 -> listOf(" Chrom. (no 5,M7)") 0b11111101111 -> listOf(" Chrom. (no 5)") 0b11111110000 -> listOf(" Chrom. (no #5,6,7,M7)") 0b11111110001 -> listOf(" Chrom. (no #5,6,M7)") diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/storage/Storage.kt b/app/src/main/kotlin/com/jonlatane/beatpad/storage/Storage.kt index ae8c40c6..2c626abb 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/storage/Storage.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/storage/Storage.kt @@ -98,6 +98,7 @@ interface Storage : AnkoLogger { toast("Welcome! Starting you off with ${preset.title}.") openPaletteFile = preset.title startWithPresetPalette = false + BeatClockPaletteConsumer.viewModel?.saveAfterDelay() preset.palette } else { error("Failed to load any palette data, starting from scratch...", t) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/util/smartrecycler/RecyclerViewExtensions.kt b/app/src/main/kotlin/com/jonlatane/beatpad/util/smartrecycler/RecyclerViewExtensions.kt index b6af937b..14dec8b1 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/util/smartrecycler/RecyclerViewExtensions.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/util/smartrecycler/RecyclerViewExtensions.kt @@ -13,7 +13,7 @@ fun RecyclerView.applyToHolders( ) { viewHolders() .forEach { mutation(it) } - adapter.notifyDataSetChanged() + adapter!!.notifyDataSetChanged() } @Suppress("UNCHECKED_CAST") diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/InstrumentConfiguration.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/InstrumentConfiguration.kt index aa6c30ac..413a27e7 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/InstrumentConfiguration.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/InstrumentConfiguration.kt @@ -79,7 +79,7 @@ interface InstrumentConfiguration: BaseConfiguration { } } ) - adapter = recycler.adapter + adapter = recycler.adapter!! recycler.scrollToPosition(initialPosition) applyConstraintSet { diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/beat/BeatAdapter.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/beat/BeatAdapter.kt index 92191e38..2cdd494d 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/beat/BeatAdapter.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/beat/BeatAdapter.kt @@ -71,7 +71,7 @@ class BeatAdapter fun invalidate(position: Int) { - recyclerView.layoutManager.findViewByPosition(position)?.invalidate() + recyclerView.layoutManager!!.findViewByPosition(position)?.invalidate() } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BeatHolder { diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/harmony/ChordTextPositioner.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/harmony/ChordTextPositioner.kt index c0c58e08..9058795b 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/harmony/ChordTextPositioner.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/harmony/ChordTextPositioner.kt @@ -89,7 +89,7 @@ interface ChordTextPositioner: AnkoLogger { (recycler.layoutManager as LinearLayoutManager) .run { findViewByPosition(beatPosition)?.let { it to false } ?: - if(beatPosition < firstBeatPosition)findViewByPosition(firstBeatPosition) to true + if(beatPosition < firstBeatPosition)findViewByPosition(firstBeatPosition)!! to true else null }?.let { (beatView: View, isFakeFirstBeat) -> beatView.getLocationOnScreen(locationOnScreen) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/harmony/HarmonyBeatAdapter.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/harmony/HarmonyBeatAdapter.kt index 85055e13..e2873aba 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/harmony/HarmonyBeatAdapter.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/harmony/HarmonyBeatAdapter.kt @@ -55,8 +55,8 @@ class HarmonyBeatAdapter( } } - override fun onBindViewHolder(holder: HarmonyBeatHolder, beatPosition: Int) { - holder.element.beatPosition = beatPosition + override fun onBindViewHolder(holder: HarmonyBeatHolder, position: Int) { + holder.element.beatPosition = position holder.element.layoutWidth = elementWidth holder.element.invalidate() } @@ -66,6 +66,6 @@ class HarmonyBeatAdapter( }?: 16 // Always render at least one item, for layout sanity. 16 is kind of a hack though. override fun invalidate(beatPosition: Int) { - recyclerView.layoutManager.findViewByPosition(beatPosition)?.invalidate() + recyclerView.layoutManager!!.findViewByPosition(beatPosition)?.invalidate() } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatAdapter.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatAdapter.kt index 18a91730..763ff583 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatAdapter.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatAdapter.kt @@ -290,7 +290,7 @@ class MelodyBeatAdapter( harmonyBeatView.invalidate() melodyBeatView.invalidate() } - (recyclerView.layoutManager.findViewByPosition(beatPosition) as? ViewGroup)?.apply { + (recyclerView.layoutManager!!.findViewByPosition(beatPosition) as? ViewGroup)?.apply { (0 until childCount).map { getChildAt(it) }.forEach { it.invalidate() } } } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyView.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyView.kt index e4bfdc05..992ed006 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyView.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyView.kt @@ -142,7 +142,7 @@ class MelodyView( overScrollMode = View.OVER_SCROLL_NEVER viewModel.melodyBeatAdapter = MelodyBeatAdapter(this@with, this) adapter = viewModel.melodyBeatAdapter - adapter.registerAdapterDataObserver( + adapter!!.registerAdapterDataObserver( object : RecyclerView.AdapterDataObserver() { override fun onItemRangeInserted(start: Int, count: Int) { //updateEmptyViewVisibility(this@recyclerView) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt index ea7a9a24..09bd83d8 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt @@ -10,7 +10,9 @@ import android.view.View import android.widget.ImageButton import android.widget.ImageView import android.widget.PopupMenu +import com.firebase.ui.auth.AuthUI import com.jonlatane.beatpad.BuildConfig +import com.jonlatane.beatpad.PaletteEditorActivity.Companion.RC_SIGN_IN import com.jonlatane.beatpad.R import com.jonlatane.beatpad.model.Palette import com.jonlatane.beatpad.storage.Storage @@ -73,6 +75,7 @@ class BeatScratchToolbar( R.id.copyPalette -> copyPalette() R.id.exportMusicXml, R.id.exportMidi -> context.toast("TODO for subscription 💸!") R.id.configureMidiSynthesizers -> midiOutputConfigurationAlert.show() + R.id.signIn -> viewModel.activity.signIn() else -> context.toast("TODO!") } true @@ -101,7 +104,7 @@ class BeatScratchToolbar( when { // verticalSectionsVisible && !horizontalSectionsVisible -> { - viewModel.sectionListRecyclerHorizontal.adapter.notifyDataSetChanged() + viewModel.sectionListRecyclerHorizontal.adapter!!.notifyDataSetChanged() viewModel.sectionListRecyclerHorizontalRotator.show( animation = if(portrait) HideAnimation.VERTICAL else HideAnimation.HORIZONTAL ) @@ -114,7 +117,7 @@ class BeatScratchToolbar( } //horizontalSectionsVisible && !verticalSectionsVisible else -> { - viewModel.sectionListRecyclerVertical.adapter.notifyDataSetChanged() + viewModel.sectionListRecyclerVertical.adapter!!.notifyDataSetChanged() viewModel.sectionListRecyclerHorizontalRotator.hide( animation = if(portrait) HideAnimation.VERTICAL else HideAnimation.HORIZONTAL ) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/MelodyReferenceAdapter.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/MelodyReferenceAdapter.kt index 0d0c8870..d81987f8 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/MelodyReferenceAdapter.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/MelodyReferenceAdapter.kt @@ -28,16 +28,16 @@ class MelodyReferenceAdapter( init { } override fun getMovementFlags( - recyclerView: RecyclerView?, + recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder ): Int { return makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) } override fun onMove( - recyclerView: RecyclerView?, - viewHolder: RecyclerView.ViewHolder?, - target: RecyclerView.ViewHolder? + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder ): Boolean { if(viewHolder == null || target == null) return false val fromPosition = viewHolder.adapterPosition @@ -61,7 +61,7 @@ class MelodyReferenceAdapter( } ?: false } - override fun onSwiped(viewHolder: RecyclerView.ViewHolder?, direction: Int) { + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { // TODO("not implemented") } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt index e1da0b2a..ded0ba7e 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt @@ -5,6 +5,7 @@ import BeatClockPaletteConsumer import android.content.Context import android.support.v7.widget.RecyclerView import android.widget.TextView +import com.jonlatane.beatpad.PaletteEditorActivity import com.jonlatane.beatpad.R import com.jonlatane.beatpad.model.Melody import com.jonlatane.beatpad.model.Palette @@ -34,8 +35,9 @@ import kotlin.properties.Delegates.observable * The PaletteViewModel still assumes we'll only be editing * one Melody at a time. */ -class PaletteViewModel( - override val storageContext: Context +class PaletteViewModel constructor( + override val storageContext: Context, + val activity: PaletteEditorActivity ) : AnkoLogger, Storage { init { //BeatClockPaletteConsumer.viewModel = this diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PartListAdapter.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PartListAdapter.kt index cd0006fd..2c626d16 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PartListAdapter.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PartListAdapter.kt @@ -34,16 +34,16 @@ class PartListAdapter( init { } override fun getMovementFlags( - recyclerView: RecyclerView?, + recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder ): Int { return makeMovementFlags(ItemTouchHelper.START or ItemTouchHelper.END, 0) } override fun onMove( - recyclerView: RecyclerView?, - viewHolder: RecyclerView.ViewHolder?, - target: RecyclerView.ViewHolder? + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder ): Boolean { if(viewHolder == null || target == null) return false val fromPosition = viewHolder.adapterPosition @@ -67,7 +67,7 @@ class PartListAdapter( return true } - override fun onSwiped(viewHolder: RecyclerView.ViewHolder?, direction: Int) { + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { // TODO("not implemented") } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionListAdapter.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionListAdapter.kt index 44f441be..6a72ebb0 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionListAdapter.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionListAdapter.kt @@ -21,7 +21,7 @@ class SectionListAdapter( init { } override fun getMovementFlags( - recyclerView: RecyclerView?, + recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder ): Int { val dragFlags = when(orientation) { @@ -32,9 +32,9 @@ class SectionListAdapter( } override fun onMove( - recyclerView: RecyclerView?, - viewHolder: RecyclerView.ViewHolder?, - target: RecyclerView.ViewHolder? + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder ): Boolean { if(viewHolder == null || target == null) return false val fromPosition = viewHolder.adapterPosition @@ -65,7 +65,7 @@ class SectionListAdapter( return true } - override fun onSwiped(viewHolder: RecyclerView.ViewHolder?, direction: Int) { + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { // TODO("not implemented") } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionListView.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionListView.kt index b46aec6b..921358be 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionListView.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionListView.kt @@ -32,7 +32,7 @@ inline fun ViewManager.sectionListView( isItemPrefetchEnabled = false } overScrollMode = View.OVER_SCROLL_NEVER - adapter.registerAdapterDataObserver( + adapter!!.registerAdapterDataObserver( object : RecyclerView.AdapterDataObserver() { override fun onItemRangeInserted(start: Int, count: Int) { //updateEmptyViewVisibility(this@recyclerView) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/filemanagement/PaletteManagementDialog.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/filemanagement/PaletteManagementDialog.kt index 49c88be3..423c074f 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/filemanagement/PaletteManagementDialog.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/filemanagement/PaletteManagementDialog.kt @@ -132,7 +132,7 @@ class PaletteManagementDialog( saveButton.onClick { val name = editPaletteName.text.toString() mode.run { onSubmit(name) } - paletteRecycler.adapter.notifyDataSetChanged() + paletteRecycler.adapter!!.notifyDataSetChanged() paletteViewModel.beatScratchToolbar.paletteTitleMenuItem.title = name //(paletteRecycler.adapter as SmartAdapter).updateSmartHolders() } @@ -162,7 +162,7 @@ class PaletteManagementDialog( editPaletteName.isEnabled = mode.textEditable editPaletteName.text.clear() editPaletteName.text.append(mode.defaultText(storageContext)) - paletteRecycler.adapter.notifyDataSetChanged() + paletteRecycler.adapter!!.notifyDataSetChanged() (alert.show() as AlertDialog).apply { setOnCancelListener { MainApplication.intentPalette = null } setOnDismissListener { MainApplication.intentPalette = null } diff --git a/app/src/main/res/menu/beatscratch_app_menu.xml b/app/src/main/res/menu/beatscratch_app_menu.xml index 52f33009..28088204 100644 --- a/app/src/main/res/menu/beatscratch_app_menu.xml +++ b/app/src/main/res/menu/beatscratch_app_menu.xml @@ -20,6 +20,8 @@ android:id="@+id/configureMidiSynthesizers"/> + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 6f681214..52ebf216 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,8 @@ buildscript { // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files + classpath 'com.google.gms:google-services:4.2.0' // Google Services plugin + } } From cb02dbf6b648e213788d961dae3bce9cb8d61185 Mon Sep 17 00:00:00 2001 From: Jon Latane Date: Sun, 8 Sep 2019 14:06:14 -0400 Subject: [PATCH 2/4] initial steps for view mode --- .../beatpad/PaletteEditorActivity.kt | 12 ++++- .../beatpad/output/service/PlaybackThread.kt | 4 +- .../jonlatane/beatpad/util/ViewExtensions.kt | 12 ++++- .../view/palette/BeatScratchToolbar.kt | 47 ++++++++++++++---- .../beatpad/view/palette/PaletteToolbar.kt | 9 +++- .../beatpad/view/palette/PaletteUI.kt | 14 +++--- .../beatpad/view/palette/PaletteViewModel.kt | 48 +++++++++++++------ .../filemanagement/PaletteManagementDialog.kt | 2 +- 8 files changed, 109 insertions(+), 39 deletions(-) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt b/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt index ff00a7ff..6ee8f404 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt @@ -210,7 +210,7 @@ class PaletteEditorActivity : Activity(), Storage, AnkoLogger, InstrumentConfigu outState.putBoolean("keyboardOpen", !viewModel.keyboardView.isHidden) outState.putBoolean("colorboardOpen", !viewModel.colorboardView.isHidden) outState.putBoolean("orbifoldOpen", !viewModel.orbifold.isHidden) - outState.putBoolean("melodyOpen", viewModel.melodyViewModel.melodyView.translationX == 0f) + outState.putBoolean("melodyOpen", viewModel.melodyViewVisible) outState.putString("editingMelodyId", viewModel.editingMelody?.id.toString()) outState.putInt("beatWidth", viewModel.melodyBeatAdapter.elementWidth) outState.putInt("beatHeight", viewModel.melodyBeatAdapter.elementHeight) @@ -231,6 +231,15 @@ class PaletteEditorActivity : Activity(), Storage, AnkoLogger, InstrumentConfigu .build(), RC_SIGN_IN) } + + fun signOut() { + AuthUI.getInstance() + .signOut(this) + .addOnCompleteListener { + viewModel.beatScratchToolbar.updateAppMenu() + } + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) @@ -240,6 +249,7 @@ class PaletteEditorActivity : Activity(), Storage, AnkoLogger, InstrumentConfigu if (resultCode == Activity.RESULT_OK) { // Successfully signed in val user = FirebaseAuth.getInstance().currentUser + viewModel.beatScratchToolbar.updateAppMenu() // ... } else { // Sign in failed. If response is null the user canceled the diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/output/service/PlaybackThread.kt b/app/src/main/kotlin/com/jonlatane/beatpad/output/service/PlaybackThread.kt index b99bee8e..b2a451b0 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/output/service/PlaybackThread.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/output/service/PlaybackThread.kt @@ -1,11 +1,9 @@ package com.jonlatane.beatpad.output.service -import BeatClockPaletteConsumer.tickPosition import com.jonlatane.beatpad.R import com.jonlatane.beatpad.midi.AndroidMidi import com.jonlatane.beatpad.midi.MidiSynthesizers import org.jetbrains.anko.* -import java.util.* internal class PlaybackThread : Thread(), AnkoLogger { companion object { @@ -27,7 +25,7 @@ internal class PlaybackThread : Thread(), AnkoLogger { sleep(3L) } } else { - BeatClockPaletteConsumer.viewModel?.toolbarView?.playButton?.imageResource = R.drawable.icons8_play_100 + BeatClockPaletteConsumer.viewModel?.paletteToolbar?.playButton?.imageResource = R.drawable.icons8_play_100 BeatClockPaletteConsumer.clearActiveAttacks() AndroidMidi.flushSendStream() if(MidiSynthesizers.synthesizers.size > 0) { diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/util/ViewExtensions.kt b/app/src/main/kotlin/com/jonlatane/beatpad/util/ViewExtensions.kt index ba1c3b7e..82738f1a 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/util/ViewExtensions.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/util/ViewExtensions.kt @@ -288,8 +288,16 @@ enum class HideAnimation: AnkoLogger { fun View.setupHiding() { if ((this as HideableView).initialWidth == null || (this as HideableView).initialHeight == null) { measure(width, height) - initialWidth = if (measuredWidth > 0) measuredWidth else layoutWidth - initialHeight = if (measuredHeight > 0) measuredHeight else layoutHeight + initialWidth = when { + layoutWidth >= 1 -> layoutWidth + measuredWidth > 0 -> measuredWidth + else -> layoutWidth + } + initialHeight = when { + layoutHeight >= 1 -> layoutHeight + measuredHeight > 0 -> measuredHeight + else -> layoutHeight + } initialTopMargin = topMargin initialBottomMargin = bottomMargin initialLeftMargin = leftMargin diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt index 09bd83d8..305fe6ed 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt @@ -10,14 +10,16 @@ import android.view.View import android.widget.ImageButton import android.widget.ImageView import android.widget.PopupMenu -import com.firebase.ui.auth.AuthUI +import com.google.firebase.auth.FirebaseAuth import com.jonlatane.beatpad.BuildConfig -import com.jonlatane.beatpad.PaletteEditorActivity.Companion.RC_SIGN_IN import com.jonlatane.beatpad.R import com.jonlatane.beatpad.model.Palette +import com.jonlatane.beatpad.showConfirmDialog import com.jonlatane.beatpad.storage.Storage -import com.jonlatane.beatpad.util.* -import com.jonlatane.beatpad.util.smartrecycler.updateSmartHolders +import com.jonlatane.beatpad.util.HideAnimation +import com.jonlatane.beatpad.util.applyTypeface +import com.jonlatane.beatpad.util.color +import com.jonlatane.beatpad.util.isHidden import com.jonlatane.beatpad.view.midi.MidiOutputConfiguration import com.jonlatane.beatpad.view.palette.filemanagement.PaletteManagementDialog import io.multifunctions.let @@ -53,11 +55,21 @@ class BeatScratchToolbar( padding = dip(0) scaleType = ImageView.ScaleType.FIT_CENTER onClick { + updateAppMenu() appMenu.show() } }.beatScratchToolbarStyle() - val paletteTitleMenuItem: MenuItem get() = appMenu.menu.findItem(R.id.paletteName) + fun updateAppMenu() { + paletteTitleMenuItem.title = Storage.openPaletteFile + signInMenuItem.title = FirebaseAuth.getInstance().currentUser?.let { + "Sign out ${it.displayName ?: "user"}..." + } ?: "Sign in..." + appMenu.applyTypeface() + } + + private val paletteTitleMenuItem: MenuItem get() = appMenu.menu.findItem(R.id.paletteName) + private val signInMenuItem: MenuItem get() = appMenu.menu.findItem(R.id.signIn) private val appMenu = PopupMenu(context, appButton).apply { inflate(R.menu.beatscratch_app_menu) @@ -75,7 +87,9 @@ class BeatScratchToolbar( R.id.copyPalette -> copyPalette() R.id.exportMusicXml, R.id.exportMidi -> context.toast("TODO for subscription 💸!") R.id.configureMidiSynthesizers -> midiOutputConfigurationAlert.show() - R.id.signIn -> viewModel.activity.signIn() + R.id.signIn -> FirebaseAuth.getInstance().currentUser?.let { + showConfirmDialog(context, "Really sign out?") { viewModel.activity.signOut() } + } ?: viewModel.activity.signIn() else -> context.toast("TODO!") } true @@ -133,15 +147,20 @@ class BeatScratchToolbar( }.beatScratchToolbarStyle() fun updateButtonColors() { - viewMode = viewMode + interactionMode = interactionMode menuButton.image ?.setColorFilter(BeatClockPaletteConsumer.currentSectionColor, PorterDuff.Mode.SRC_IN) } - var viewMode = false + enum class InteractionMode { VIEW, EDIT } + var interactionMode: InteractionMode = InteractionMode.EDIT set(value) { + val changed = field != value field = value - if(value) { viewModeButton to editModeButton } else { editModeButton to viewModeButton }.let { + when(value) { + InteractionMode.VIEW -> viewModeButton to editModeButton + InteractionMode.EDIT -> editModeButton to viewModeButton + }.let { activeModeButton, inactiveModeButton -> inactiveModeButton?.backgroundResource = R.drawable.toolbar_button_beatscratch inactiveModeButton?.image @@ -151,18 +170,26 @@ class BeatScratchToolbar( } viewModeButton.padding = dip(9) editModeButton.padding = dip(9) + if(changed) { + viewModel.notifyInteractionModeChanged() + } } val viewModeButton: ImageButton = imageButton { imageResource = R.drawable.view_score padding = dip(7) scaleType = ImageView.ScaleType.FIT_CENTER isClickable = true - onClick { context.toast("TODO!") } + onClick { + interactionMode = InteractionMode.VIEW + } }.beatScratchToolbarStyle() val editModeButton: ImageButton = imageButton { imageResource = R.drawable.edit_black padding = dip(10) scaleType = ImageView.ScaleType.FIT_CENTER + onClick { + interactionMode = InteractionMode.EDIT + } }.beatScratchToolbarStyle() init { updateButtonColors() } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteToolbar.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteToolbar.kt index 856b10f6..c05761c0 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteToolbar.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteToolbar.kt @@ -13,6 +13,7 @@ import com.jonlatane.beatpad.MainApplication.Companion.chordTypefaceBold import com.jonlatane.beatpad.R import com.jonlatane.beatpad.output.service.PlaybackService import com.jonlatane.beatpad.storage.Storage +import com.jonlatane.beatpad.util.HideableView import com.jonlatane.beatpad.util.color import com.jonlatane.beatpad.util.isHidden import com.jonlatane.beatpad.view.colorboard.ColorboardConfiguration @@ -28,7 +29,13 @@ import org.jetbrains.anko.sdk25.coroutines.onLongClick class PaletteToolbar( override val configurationContext: Context, override val viewModel: PaletteViewModel -) : _LinearLayout(configurationContext), AnkoLogger, TempoConfiguration, OrbifoldConfiguration, ColorboardConfiguration, KeyboardConfiguration, Storage { +) : _LinearLayout(configurationContext), AnkoLogger, TempoConfiguration, OrbifoldConfiguration, ColorboardConfiguration, KeyboardConfiguration, Storage, HideableView { + override var initialHeight: Int? = null + override var initialWidth: Int? = null + override var initialTopMargin: Int? = null + override var initialBottomMargin: Int? = null + override var initialLeftMargin: Int? = null + override var initialRightMargin: Int? = null override val storageContext: Context get() = configurationContext private val metronomeImage = context.resources.getDrawable(R.drawable.noun_metronome_415494_000000, null).apply { setBounds(0, 0, 60, 60) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteUI.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteUI.kt index 23195ccf..107468e8 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteUI.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteUI.kt @@ -47,8 +47,8 @@ class PaletteUI constructor( viewModel.apply { orbifold.onChordChangedListener = { chord -> - toolbarView.orbifoldText.text = chord.name - toolbarView.orbifoldText.textColor = context.color(OrbifoldView.colorResourceFor(chord)) + paletteToolbar.orbifoldText.text = chord.name + paletteToolbar.orbifoldText.textColor = context.color(OrbifoldView.colorResourceFor(chord)) val keyboardDrumTrack = (keyboardPart?.instrument as? MIDIInstrument)?.drumTrack == true if(!harmonyViewModel.isChoosingHarmonyChord) { colorboardView.chord = chord @@ -159,7 +159,7 @@ class PaletteUI constructor( alignParentTop() } - viewModel.toolbarView = paletteToolbar(viewModel = viewModel) { + viewModel.paletteToolbar = paletteToolbar(viewModel = viewModel) { id = R.id.toolbar }.lparams(matchParent, dip(48)) { below(viewModel.beatScratchToolbar) @@ -172,7 +172,7 @@ class PaletteUI constructor( id = View.generateViewId() }.lparams(dip(200), matchParent) }.lparams(dip(200), matchParent) { - below(viewModel.toolbarView) + below(viewModel.paletteToolbar) alignParentLeft() alignParentBottom() } @@ -184,7 +184,7 @@ class PaletteUI constructor( id = View.generateViewId() }.lparams(matchParent, dip(40)) }.lparams(matchParent, dip(40)) { - below(viewModel.toolbarView) + below(viewModel.paletteToolbar) alignParentLeft() alignParentRight() } @@ -285,7 +285,7 @@ class PaletteUI constructor( alignParentTop() } - viewModel.toolbarView = paletteToolbar(viewModel = viewModel) { + viewModel.paletteToolbar = paletteToolbar(viewModel = viewModel) { id = R.id.toolbar orientation = LinearLayout.HORIZONTAL }.lparams(matchParent, if(context.configuration.tablet) dip(48) else dip(36)) { @@ -301,7 +301,7 @@ class PaletteUI constructor( id = R.id.harmony }.lparams(matchParent, dip(36)) { rightOf(viewModel.beatScratchToolbar) - below(viewModel.toolbarView) + below(viewModel.paletteToolbar) alignParentRight() bottomMargin = dip(4) } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt index ded0ba7e..5da10049 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt @@ -43,6 +43,26 @@ class PaletteViewModel constructor( //BeatClockPaletteConsumer.viewModel = this } + val interactionMode get() = beatScratchToolbar.interactionMode + fun notifyInteractionModeChanged() { + when(interactionMode) { + BeatScratchToolbar.InteractionMode.EDIT -> { + melodyViewVisible = false + listOf( + paletteToolbar, + sectionListRecyclerHorizontalRotator + ).forEach { it.show() } + } + BeatScratchToolbar.InteractionMode.VIEW -> { + melodyViewVisible = true + listOf( + paletteToolbar, + sectionListRecyclerHorizontalRotator + ).forEach { it.hide() } + sectionListRecyclerVerticalRotator.hide(animation = HideAnimation.HORIZONTAL) + } + } + } fun save(showSuccessToast: Boolean = false) = storageContext.storePalette(palette, showSuccessToast = showSuccessToast) private var lastSaveTime = System.currentTimeMillis() private var lastSaveRequestTime = System.currentTimeMillis() @@ -101,7 +121,7 @@ class PaletteViewModel constructor( splatPart = new.splatPart ?: new.parts[0] orbifold.orbifold = new.orbifold orbifold.chord = new.chord - toolbarView.updateTempoDisplay() + paletteToolbar.updateTempoDisplay() partListAdapters.forEach { it.notifyDataSetChanged() } sectionListAdapters.forEach { it.notifyDataSetChanged() } if(!new.sections.contains(BeatClockPaletteConsumer.section)) { @@ -156,7 +176,7 @@ class PaletteViewModel constructor( lateinit var partListView: PartListView lateinit var partListTransitionView: TextView lateinit var beatScratchToolbar: BeatScratchToolbar - lateinit var toolbarView: PaletteToolbar + lateinit var paletteToolbar: PaletteToolbar lateinit var keyboardView: KeyboardView lateinit var colorboardView: ColorboardInputView var keyboardPart by observable(null) { _, _, new -> @@ -350,8 +370,8 @@ class PaletteViewModel constructor( } else false } } - toolbarView.orbifoldButton.backgroundResource = R.drawable.toolbar_button_active_instrument - toolbarView.updateInstrumentButtonPaddings() + paletteToolbar.orbifoldButton.backgroundResource = R.drawable.toolbar_button_active_instrument + paletteToolbar.updateInstrumentButtonPaddings() orbifold.conditionallyAnimateToSelectionState() orbifold.show( animation = if (orbifold.context.configuration.portrait) { @@ -365,8 +385,8 @@ class PaletteViewModel constructor( } fun hideOrbifold(animated: Boolean = true) { - toolbarView.orbifoldButton.backgroundResource = R.drawable.toolbar_button - toolbarView.updateInstrumentButtonPaddings() + paletteToolbar.orbifoldButton.backgroundResource = R.drawable.toolbar_button + paletteToolbar.updateInstrumentButtonPaddings() harmonyViewModel.isChoosingHarmonyChord = false harmonyViewModel.selectedHarmonyElements = null orbifold.hide( @@ -385,14 +405,14 @@ class PaletteViewModel constructor( } else false } keyboardView.show(animated) - toolbarView.keysButton.backgroundResource = R.drawable.toolbar_button_active_instrument - toolbarView.updateInstrumentButtonPaddings() + paletteToolbar.keysButton.backgroundResource = R.drawable.toolbar_button_active_instrument + paletteToolbar.updateInstrumentButtonPaddings() } fun hideKeyboard(animated: Boolean = true) { - toolbarView.keysButton.backgroundResource = R.drawable.toolbar_button - toolbarView.updateInstrumentButtonPaddings() + paletteToolbar.keysButton.backgroundResource = R.drawable.toolbar_button + paletteToolbar.updateInstrumentButtonPaddings() orbifold.customChordMode = false keyboardView.hide(animated) } @@ -405,13 +425,13 @@ class PaletteViewModel constructor( } else false } colorboardView.show(animated) - toolbarView.colorsButton.backgroundResource = R.drawable.toolbar_button_active_instrument - toolbarView.updateInstrumentButtonPaddings() + paletteToolbar.colorsButton.backgroundResource = R.drawable.toolbar_button_active_instrument + paletteToolbar.updateInstrumentButtonPaddings() } fun hideColorboard(animated: Boolean = true) { - toolbarView.colorsButton.backgroundResource = R.drawable.toolbar_button - toolbarView.updateInstrumentButtonPaddings() + paletteToolbar.colorsButton.backgroundResource = R.drawable.toolbar_button + paletteToolbar.updateInstrumentButtonPaddings() colorboardView.hide(animated) } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/filemanagement/PaletteManagementDialog.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/filemanagement/PaletteManagementDialog.kt index 423c074f..31387681 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/filemanagement/PaletteManagementDialog.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/filemanagement/PaletteManagementDialog.kt @@ -133,7 +133,7 @@ class PaletteManagementDialog( val name = editPaletteName.text.toString() mode.run { onSubmit(name) } paletteRecycler.adapter!!.notifyDataSetChanged() - paletteViewModel.beatScratchToolbar.paletteTitleMenuItem.title = name + paletteViewModel.beatScratchToolbar.updateAppMenu() //(paletteRecycler.adapter as SmartAdapter).updateSmartHolders() } From 874105c7f5f4356caa0406a569cb43f48d71a839 Mon Sep 17 00:00:00 2001 From: Jon Latane Date: Sat, 14 Sep 2019 14:09:23 -0400 Subject: [PATCH 3/4] fix native midi implementation yay --- .../beatpad/PaletteEditorActivity.kt | 3 +- .../com/jonlatane/beatpad/midi/AndroidMidi.kt | 1 - .../jonlatane/beatpad/midi/MidiControllers.kt | 129 +++++++++--------- .../com/jonlatane/beatpad/midi/MidiDevices.kt | 37 +++-- .../beatpad/midi/MidiSynthesizers.kt | 70 +++------- .../output/instrument/MIDIInstrument.kt | 1 - .../beatpad/output/service/PlaybackThread.kt | 3 - .../beatpad/view/melody/MelodyBeatAdapter.kt | 38 +++++- .../beatpad/view/melody/MelodyBeatHolder.kt | 4 +- .../beatpad/view/melody/MelodyBeatView.kt | 2 + .../beatpad/view/melody/MelodyViewModel.kt | 12 +- .../input/MelodyBeatEventHandlerBase.kt | 3 + .../renderer/MelodyBeatNotationRenderer.kt | 4 +- .../melody/toolbar/MelodyReferenceToolbar.kt | 40 ++++-- .../view/palette/BeatScratchToolbar.kt | 2 +- .../beatpad/view/palette/PaletteViewModel.kt | 17 ++- .../beatpad/view/palette/SectionHolder.kt | 14 +- .../res/drawable/toolbar_button_active.xml | 32 +++-- .../res/drawable/toolbar_button_bg_active.xml | 15 ++ ...xml => toolbar_button_bg_active_inset.xml} | 2 +- ...t.xml => toolbar_melody_button_active.xml} | 8 +- .../toolbar_melody_button_bg_active.xml | 14 ++ .../toolbar_melody_button_bg_active_inset.xml | 7 + 23 files changed, 273 insertions(+), 185 deletions(-) create mode 100644 app/src/main/res/drawable/toolbar_button_bg_active.xml rename app/src/main/res/drawable/{toolbar_button_active_inset.xml => toolbar_button_bg_active_inset.xml} (79%) rename app/src/main/res/drawable/{toolbar_button_active_instrument.xml => toolbar_melody_button_active.xml} (62%) create mode 100644 app/src/main/res/drawable/toolbar_melody_button_bg_active.xml create mode 100644 app/src/main/res/drawable/toolbar_melody_button_bg_active_inset.xml diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt b/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt index 6ee8f404..a9bf7b24 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/PaletteEditorActivity.kt @@ -24,6 +24,7 @@ import com.jonlatane.beatpad.util.smartrecycler.viewHolders //import com.jonlatane.beatpad.util.show import com.jonlatane.beatpad.view.InstrumentConfiguration import com.jonlatane.beatpad.view.melody.MelodyViewModel +import com.jonlatane.beatpad.view.palette.BeatScratchToolbar import com.jonlatane.beatpad.view.palette.PaletteUI import com.jonlatane.beatpad.view.palette.PaletteViewModel import com.jonlatane.beatpad.view.palette.PartHolder @@ -183,7 +184,7 @@ class PaletteEditorActivity : Activity(), Storage, AnkoLogger, InstrumentConfigu if (savedInstanceState.getBoolean("melodyOpen", false)) { viewModel.melodyView.post { viewModel.backStack.push { - if (viewModel.melodyViewVisible) { + if (viewModel.melodyViewVisible && viewModel.isInEditMode) { viewModel.melodyViewVisible = false true } else false diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/midi/AndroidMidi.kt b/app/src/main/kotlin/com/jonlatane/beatpad/midi/AndroidMidi.kt index 82a9466b..f5379c35 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/midi/AndroidMidi.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/midi/AndroidMidi.kt @@ -43,7 +43,6 @@ object AndroidMidi : AnkoLogger { ) } fun send(bytes: ByteArray) { - info("MIDI send: $bytes") if(sendToInternalSynth) { ONBOARD_DRIVER.write(bytes) } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiControllers.kt b/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiControllers.kt index b9b5bde7..f59c8b0e 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiControllers.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiControllers.kt @@ -1,5 +1,6 @@ package com.jonlatane.beatpad.midi +import android.media.midi.MidiDevice import android.media.midi.MidiDeviceInfo import android.media.midi.MidiOutputPort import android.media.midi.MidiReceiver @@ -7,6 +8,9 @@ import android.os.Build import android.support.annotation.RequiresApi import android.view.InputDevice import com.jonlatane.beatpad.MainApplication +import com.jonlatane.beatpad.midi.MidiConstants.leftHalf +import com.jonlatane.beatpad.midi.MidiConstants.leftHalfMatchesAny +import com.jonlatane.beatpad.midi.MidiConstants.rightHalf import com.jonlatane.beatpad.midi.MidiDevices.name import com.jonlatane.beatpad.util.hexString //import kotlinx.coroutines.experimental.* @@ -15,76 +19,71 @@ import kotlin.experimental.and object MidiControllers: AnkoLogger { // ..and receiving input via devices' output ports - val receivers: MutableList<(InputDevice, ByteArray) -> Unit> = mutableListOf() - private val inputDevices = mutableMapOf() - val controllers get() = inputDevices.keys +// val receivers: MutableList<(InputDevice, ByteArray) -> Unit> = mutableListOf() +// private val inputDevices = mutableMapOf() +// val controllers get() = inputDevices.keys @RequiresApi(Build.VERSION_CODES.M) - internal fun setupController(deviceInfo: MidiDeviceInfo) = with(MidiConstants) { - val portNumber = deviceInfo.ports.find { + internal fun setupController(info: MidiDeviceInfo, device: MidiDevice): MidiOutputPort? = with(MidiConstants) { + val portNumber = info.ports.find { it.type == MidiDeviceInfo.PortInfo.TYPE_OUTPUT }!!.portNumber - MidiDevices.manager.openDevice(deviceInfo, { device -> - device?.openOutputPort(portNumber)?.let { outputPort -> - MainApplication.instance.toast("Connected to ${deviceInfo.name} output!") - inputDevices[deviceInfo] = outputPort - outputPort.connect(object : MidiReceiver() { - override fun onSend(msg: ByteArray, offset: Int, count: Int, timestamp: Long) { - //info("MIDI data: ${msg.hexString(offset, count)}") - var byteIndex = offset - do { - when { - msg[byteIndex] == TICK -> { - //info("Received beatclock tick ${BeatClockPaletteConsumer.tickPosition}") - if(AndroidMidi.isPlayingFromExternalDevice) { - //BeatClockPaletteConsumer.tickPosition++ - //doAsync { - BeatClockPaletteConsumer.tick() - //} - } - } - msg[byteIndex] == PLAY -> { - //info("Received play") - BeatClockPaletteConsumer.tickPosition = 0 - AndroidMidi.isPlayingFromExternalDevice = true - } - msg[byteIndex] == STOP -> { - //info("Received stop") - AndroidMidi.isPlayingFromExternalDevice = false - BeatClockPaletteConsumer.tickPosition = 0 - } - msg[byteIndex] == SYNC -> { - //info("Received sync") - AndroidMidi.lastMidiSyncTime = System.currentTimeMillis() - } - msg[byteIndex].leftHalfMatchesAny(NOTE_ON, NOTE_OFF) -> { - //info("Received note on") - val noteOnOrOff = msg[byteIndex].leftHalf - val channel = msg[byteIndex].rightHalf - val midiTone = msg[++byteIndex] - val velocity = msg[++byteIndex] - BeatClockPaletteConsumer.palette?.keyboardPart?.instrument?.let { instrument -> - when(noteOnOrOff) { - NOTE_ON -> { instrument.play(midiTone.toInt() - 60, velocity.toInt()) } - NOTE_OFF -> { instrument.stop(midiTone.toInt() - 60) } - } - AndroidMidi.flushSendStream() - } - } - else -> { - error("Unable to parse MIDI: ${msg.hexString(offset, count)}@byte ${byteIndex - offset}") - return - } - } - } while(++byteIndex < offset + count) - } - }) - } - }, MidiDevices.handler) + device.openOutputPort(portNumber)?.let { outputPort -> + MainApplication.instance.toast("Controller ${info.name} connected!") + outputPort.connect(Receiver()) + outputPort + } } - @RequiresApi(Build.VERSION_CODES.M) - internal fun destroyController(info: MidiDeviceInfo) { - inputDevices.remove(info) + class Receiver : MidiReceiver() { + override fun onSend(msg: ByteArray, offset: Int, count: Int, timestamp: Long) { + //info("MIDI data: ${msg.hexString(offset, count)}") + var byteIndex = offset + do { + when { + msg[byteIndex] == MidiConstants.TICK -> { + //info("Received beatclock tick ${BeatClockPaletteConsumer.tickPosition}") + if(AndroidMidi.isPlayingFromExternalDevice) { + //BeatClockPaletteConsumer.tickPosition++ + //doAsync { + BeatClockPaletteConsumer.tick() + //} + } + } + msg[byteIndex] == MidiConstants.PLAY -> { + //info("Received play") + BeatClockPaletteConsumer.tickPosition = 0 + AndroidMidi.isPlayingFromExternalDevice = true + } + msg[byteIndex] == MidiConstants.STOP -> { + //info("Received stop") + AndroidMidi.isPlayingFromExternalDevice = false + BeatClockPaletteConsumer.tickPosition = 0 + } + msg[byteIndex] == MidiConstants.SYNC -> { + //info("Received sync") + AndroidMidi.lastMidiSyncTime = System.currentTimeMillis() + } + msg[byteIndex].leftHalfMatchesAny(MidiConstants.NOTE_ON, MidiConstants.NOTE_OFF) -> { + //info("Received note on") + val noteOnOrOff = msg[byteIndex].leftHalf + val channel = msg[byteIndex].rightHalf + val midiTone = msg[++byteIndex] + val velocity = msg[++byteIndex] + BeatClockPaletteConsumer.palette?.keyboardPart?.instrument?.let { instrument -> + when(noteOnOrOff) { + MidiConstants.NOTE_ON -> { instrument.play(midiTone.toInt() - 60, velocity.toInt()) } + MidiConstants.NOTE_OFF -> { instrument.stop(midiTone.toInt() - 60) } + } + AndroidMidi.flushSendStream() + } + } + else -> { + error("Unable to parse MIDI: ${msg.hexString(offset, count)}@byte ${byteIndex - offset}") + return + } + } + } while(++byteIndex < offset + count) + } } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiDevices.kt b/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiDevices.kt index 93190d2d..88bbcfe1 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiDevices.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiDevices.kt @@ -9,9 +9,25 @@ import android.support.annotation.RequiresApi import com.jonlatane.beatpad.MainApplication import android.os.HandlerThread import com.jonlatane.beatpad.output.instrument.MIDIInstrument +import com.jonlatane.beatpad.view.input +import io.multifunctions.models.Quad +import kotlinx.io.core.Closeable import org.jetbrains.anko.* object MidiDevices : AnkoLogger { + data class BSMidiDevice( + val info: MidiDeviceInfo, + val device: MidiDevice, + val inputPort: MidiInputPort?, + val outputPort: MidiOutputPort? + ): Closeable { + override fun close() { + device.close() + inputPort?.close() + outputPort?.close() + } + } + val devices = mutableListOf() @get:RequiresApi(Build.VERSION_CODES.M) internal val manager: MidiManager by lazy { @@ -54,8 +70,7 @@ object MidiDevices : AnkoLogger { @RequiresApi(Build.VERSION_CODES.M) override fun onDeviceRemoved(info: MidiDeviceInfo) { context.toast("Disconnected from ${info.name}.") - MidiSynthesizers.destroySynthesizer(info) - MidiControllers.destroyController(info) + devices.find { it.info == info }?.close() } override fun onDeviceStatusChanged(status: MidiDeviceStatus) {} @@ -66,13 +81,17 @@ object MidiDevices : AnkoLogger { @RequiresApi(Build.VERSION_CODES.M) private fun setupDevice(info: MidiDeviceInfo) { - // Again, kinda weirdly, we'll be using input ports to set up output devices - if (info.inputPortCount > 0) { - MidiSynthesizers.setupSynthesizer(info) - } - if (info.outputPortCount > 0) { - MidiControllers.setupController(info) - } + manager.openDevice(info, { device -> + // Again, kinda weirdly, we'll be using input ports to set up output devices + val inputPort = if (info.inputPortCount > 0) { + MidiSynthesizers.setupSynthesizer(info, device) + } else null + val outputPort = if (info.outputPortCount > 0) { + MidiControllers.setupController(info, device) + } else null + devices += BSMidiDevice(info, device, inputPort, outputPort) + refreshInstruments() + }, handler) } @get:RequiresApi(Build.VERSION_CODES.M) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiSynthesizers.kt b/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiSynthesizers.kt index 097f0363..1443c66b 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiSynthesizers.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiSynthesizers.kt @@ -1,5 +1,6 @@ package com.jonlatane.beatpad.midi +import android.media.midi.MidiDevice import android.media.midi.MidiDeviceInfo import android.media.midi.MidiInputPort import android.os.Build @@ -16,64 +17,35 @@ import org.jetbrains.anko.warn */ @RequiresApi(Build.VERSION_CODES.M) object MidiSynthesizers: AnkoLogger { - private const val maxSendRetries = 1000 - - // Counterintuitively, we will be outputting via devices' input ports... - private val outputDevices = mutableMapOf() - val synthesizers get() = outputDevices.keys - - internal fun setupSynthesizer(info: MidiDeviceInfo) { - val portNumber = info.ports.find { - it.type == MidiDeviceInfo.PortInfo.TYPE_INPUT - }!!.portNumber - MidiDevices.manager.openDevice(info, { device -> - device?.openInputPort(portNumber)?.let { inputPort -> - MainApplication.instance.toast("Connected to ${info.name} input!") - outputDevices[info] = inputPort - MidiDevices.refreshInstruments() + internal fun setupSynthesizer(info: MidiDeviceInfo, device: MidiDevice): MidiInputPort? { + return if (info.inputPortCount > 0) { + val portNumber = info.ports.find { + it.type == MidiDeviceInfo.PortInfo.TYPE_INPUT + }!!.portNumber + device.openInputPort(portNumber)?.let { inputPort -> + inputPort.send(byteArrayOf(123.toByte()), 0, 1) //All notes off + MainApplication.instance.toast("Synthesizer ${info.name} connected!") + inputPort } - }, MidiDevices.handler) - } - - @RequiresApi(Build.VERSION_CODES.M) - internal fun destroySynthesizer(info: MidiDeviceInfo) { - outputDevices.remove(info) + } else null } /** * Basically, skip everything in the Google guide required to reach the * "Sending Play ON" section. Send away! Your signals will go to all - * [synthesizers] or you can specify the one it should go to. + * synthesizers or you can specify the one it should go to. */ - internal fun send( - data: ByteArray, - device: MidiDeviceInfo? = null - ) { + internal fun send(data: ByteArray) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (device == null) { - outputDevices.entries.forEach { (deviceInfo, inputPort) -> - var port = inputPort - var retries = 0 - var success = false - var error: Throwable? = null - do { - retries++ - try { - port.send(data, 0, data.size) - success = true - } catch (t: Throwable) { - port.close() - setupSynthesizer(deviceInfo) - port = outputDevices[deviceInfo]!! - error = t - } - } while( !success && retries < maxSendRetries) - if(!success) { - error("Failed to send midi data", error) - } + MidiDevices.devices.mapNotNull { it.inputPort }.forEach { port -> + var error: Throwable? = null + try { + port.send(data, 0, data.size) + } catch (t: Throwable) { + port.close() + error("Failed to send midi data", error) + error = t } - } else { - outputDevices[device]?.send(data, 0, data.size) } } } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/output/instrument/MIDIInstrument.kt b/app/src/main/kotlin/com/jonlatane/beatpad/output/instrument/MIDIInstrument.kt index 390cdd2f..0203489d 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/output/instrument/MIDIInstrument.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/output/instrument/MIDIInstrument.kt @@ -29,7 +29,6 @@ class MIDIInstrument constructor( @Transient override val tones: MutableList = Collections.synchronizedList(mutableListOf()) override fun send(data: ByteArray) { - info("MIDI send: $data") AndroidMidi.sendStream.write(data) } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/output/service/PlaybackThread.kt b/app/src/main/kotlin/com/jonlatane/beatpad/output/service/PlaybackThread.kt index b2a451b0..dbee37ed 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/output/service/PlaybackThread.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/output/service/PlaybackThread.kt @@ -28,9 +28,6 @@ internal class PlaybackThread : Thread(), AnkoLogger { BeatClockPaletteConsumer.viewModel?.paletteToolbar?.playButton?.imageResource = R.drawable.icons8_play_100 BeatClockPaletteConsumer.clearActiveAttacks() AndroidMidi.flushSendStream() - if(MidiSynthesizers.synthesizers.size > 0) { - - } synchronized(PlaybackThread) { (PlaybackThread as java.lang.Object).wait() } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatAdapter.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatAdapter.kt index 763ff583..c5fc3d65 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatAdapter.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatAdapter.kt @@ -12,11 +12,14 @@ import android.view.View import android.view.ViewGroup import android.view.animation.LinearInterpolator import android.widget.LinearLayout +import com.jonlatane.beatpad.model.Palette import com.jonlatane.beatpad.model.Pattern +import com.jonlatane.beatpad.model.Section import com.jonlatane.beatpad.util.* import com.jonlatane.beatpad.util.smartrecycler.SmartAdapter import com.jonlatane.beatpad.util.smartrecycler.applyToHolders import com.jonlatane.beatpad.view.harmony.HarmonyBeatView +import com.jonlatane.beatpad.view.palette.BeatScratchToolbar import org.jetbrains.anko.* import org.jetbrains.anko.recyclerview.v7._RecyclerView import kotlin.math.ceil @@ -34,6 +37,14 @@ class MelodyBeatAdapter( const val initialBeatHeightDp: Float = 400f const val minimumBeatWidthDp: Float = 30f const val maximumBeatHeightDp: Float = 10000f + fun sectionAndStartBeat(palette: Palette, beatPosition: Int) + = palette.sections.fold>(null to 0) { (sectionAtPosition: Section?, sum), section -> + val sectionBeatLength = section.harmony.run { length / subdivisionsPerBeat } + when { + sum + sectionBeatLength <= beatPosition -> section to sum + sectionBeatLength + else -> sectionAtPosition to sum + } + } } private val axis get() = viewModel.verticalAxis!! @@ -259,6 +270,22 @@ class MelodyBeatAdapter( override fun onBindViewHolder(holder: MelodyBeatHolder, position: Int) = with(holder) { // element.layoutWidth = elementWidth // element.layoutHeight = elementHeight + harmonyViewHeight + melodyBeatView.sectionStartBeatPosition = when(viewModel.paletteViewModel.interactionMode) { + BeatScratchToolbar.InteractionMode.EDIT -> 0 + BeatScratchToolbar.InteractionMode.VIEW -> sectionAndStartBeat( + viewModel.paletteViewModel.palette, + position + ).second + /*{ + viewModel.paletteViewModel.palette.sections.fold(0) { sum, section -> + val sectionBeatLength = section.harmony.run { length / subdivisionsPerBeat } + when { + sum + sectionBeatLength <= position -> sum + sectionBeatLength + else -> sum + } + } + }*/ + } melodyBeatView.beatPosition = position melodyBeatView.layoutWidth = elementWidth melodyBeatView.layoutHeight = elementHeight @@ -272,17 +299,17 @@ class MelodyBeatAdapter( val Pattern<*>.itemCount get() = ceil(length.toDouble()/subdivisionsPerBeat).toInt() - override fun getItemCount(): Int = viewModel.run { - when(sectionLayoutType) { - MelodyViewModel.SectionLayoutType.SINGLE_SECTION -> + override fun getItemCount(): Int = with(viewModel) { with(viewModel.paletteViewModel) { + when(interactionMode) { + BeatScratchToolbar.InteractionMode.EDIT -> harmony?.itemCount ?: openedMelody?.itemCount ?: 0 - MelodyViewModel.SectionLayoutType.FULL_PALETTE -> + BeatScratchToolbar.InteractionMode.VIEW -> paletteViewModel.palette.sections.fold(0) { sum, section -> sum + section.harmony.itemCount } - } + } } } override fun invalidate(beatPosition: Int) { @@ -294,5 +321,4 @@ class MelodyBeatAdapter( (0 until childCount).map { getChildAt(it) }.forEach { it.invalidate() } } } - } \ No newline at end of file diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatHolder.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatHolder.kt index 687519c1..4e0c6428 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatHolder.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatHolder.kt @@ -5,6 +5,7 @@ import android.view.View import android.widget.LinearLayout import com.jonlatane.beatpad.util.smartrecycler.SmartAdapter import com.jonlatane.beatpad.view.harmony.HarmonyBeatView +import com.jonlatane.beatpad.view.palette.BeatScratchToolbar import org.jetbrains.anko._LinearLayout import org.jetbrains.anko.recyclerview.v7._RecyclerView @@ -22,8 +23,7 @@ class MelodyBeatHolder constructor( private val adapter: MelodyBeatAdapter ) : RecyclerView.ViewHolder(element), SmartAdapter.Holder { override fun updateSmartHolder() { - harmonyBeatView.invalidate() - melodyBeatView.invalidate() + adapter.onBindViewHolder(this, adapterPosition) } private val context get() = melodyBeatView.context diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatView.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatView.kt index c09f9f23..2fd9eb34 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatView.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyBeatView.kt @@ -46,7 +46,9 @@ class MelodyBeatView constructor( showSteps = true } + override var sectionStartBeatPosition: Int = 0 override var beatPosition = 0 + override val palette get() = viewModel.paletteViewModel.palette override val melody: Melody<*>? get() = viewModel.openedMelody override val downPointers = SparseArray() diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyViewModel.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyViewModel.kt index 302ad1a7..232d4c01 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyViewModel.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/MelodyViewModel.kt @@ -26,9 +26,9 @@ import kotlin.properties.Delegates.observable class MelodyViewModel( val paletteViewModel: PaletteViewModel ): AnkoLogger { - var openedMelody: Melody<*>? by observable?>(null) { _, _, _ -> + val openedMelody: Melody<*>? get() = paletteViewModel.editingMelody/* by observable?>(null) { _, _, _ -> updateToolbarsAndMelody() - } + }*/ var openedPart: Part? by observable(null) { _, _, _ -> updateToolbarsAndMelody() } @@ -122,9 +122,11 @@ class MelodyViewModel( } else { linearLayout() } - melodyReferenceToolbar.layoutTypeButton.imageResource = when(value) { - LayoutType.GRID -> R.drawable.grid - else -> R.drawable.line + listOf(melodyReferenceToolbar.layoutTypeButton, sectionToolbar.layoutTypeButton).forEach { + it.imageResource = when(value) { + LayoutType.GRID -> R.drawable.grid + else -> R.drawable.line + } } } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/input/MelodyBeatEventHandlerBase.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/input/MelodyBeatEventHandlerBase.kt index 014fe3cb..672b1686 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/input/MelodyBeatEventHandlerBase.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/input/MelodyBeatEventHandlerBase.kt @@ -4,6 +4,7 @@ import android.graphics.PointF import android.util.SparseArray import com.jonlatane.beatpad.model.Harmony import com.jonlatane.beatpad.model.Melody +import com.jonlatane.beatpad.model.Palette import com.jonlatane.beatpad.model.Transposable import com.jonlatane.beatpad.model.dsl.Patterns import com.jonlatane.beatpad.util.vibrate @@ -22,7 +23,9 @@ interface MelodyBeatEventHandlerBase: Patterns, AnkoLogger { */ val displayType: MelodyViewModel.DisplayType fun getPositionAndElement(x: Float): Pair?>? + val sectionStartBeatPosition: Int val beatPosition: Int + val palette: Palette val downPointers: SparseArray val melody: Melody<*>? val harmony: Harmony diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/renderer/MelodyBeatNotationRenderer.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/renderer/MelodyBeatNotationRenderer.kt index b787cfec..cd0517ec 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/renderer/MelodyBeatNotationRenderer.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/renderer/MelodyBeatNotationRenderer.kt @@ -7,6 +7,7 @@ import android.graphics.drawable.Drawable import com.jonlatane.beatpad.model.Harmony import com.jonlatane.beatpad.model.Melody import com.jonlatane.beatpad.model.melody.RationalMelody +import com.jonlatane.beatpad.view.melody.MelodyBeatAdapter import kotlinx.io.pool.DefaultPool import org.jetbrains.anko.warn import org.jetbrains.anko.withAlpha @@ -91,7 +92,8 @@ interface MelodyBeatNotationRenderer : BaseMelodyBeatRenderer, MelodyBeatRhythmR val Melody<*>.averageTone get() = (this as? RationalMelody)?.changes?.values?.flatMap { it.tones }?.average() - override val harmony: Harmony get() = viewModel.harmony!! + override val harmony: Harmony get() = viewModel.harmony ?: + MelodyBeatAdapter.sectionAndStartBeat(palette, beatPosition).first!!.harmony val meter: Harmony.Meter get() = harmony.meter val isFinalBeat: Boolean get() = (beatPosition + 1) % meter.defaultBeatsPerMeasure == 0 diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/toolbar/MelodyReferenceToolbar.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/toolbar/MelodyReferenceToolbar.kt index 7798b651..df65af17 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/toolbar/MelodyReferenceToolbar.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/melody/toolbar/MelodyReferenceToolbar.kt @@ -68,15 +68,19 @@ class MelodyReferenceToolbar(context: Context, viewModel: PaletteViewModel) setPadding(padding,padding,padding,padding) }.flexStyle() - private val editButton = imageButton { - imageResource = R.drawable.edit_black - backgroundResource = R.drawable.toolbar_melody_button - padding = dip(10) - scaleType = ImageView.ScaleType.FIT_CENTER - onClick { - if (melodyViewModel.melodyEditingToolbar.isHidden) { - melodyViewModel.melodyEditingToolbar.show() - melodyViewModel.melodyEditingModifiers.show() + var editModeActive: Boolean = false + set(value) { + val changed = field != value + field = value + editButton.apply { + backgroundResource = if(value) R.drawable.toolbar_melody_button_active + else R.drawable.toolbar_melody_button + padding = dip(10) + } + if (value) { + melodyViewModel.melodyEditingToolbar.show() + melodyViewModel.melodyEditingModifiers.show() + melodyViewModel.layoutType = MelodyViewModel.LayoutType.LINEAR // viewModel.backStack.push { // if (!melodyViewModel.melodyEditingToolbar.isHidden) { // melodyViewModel.melodyEditingToolbar.hide() @@ -84,12 +88,18 @@ class MelodyReferenceToolbar(context: Context, viewModel: PaletteViewModel) // true // } else false // } - } else { - melodyViewModel.melodyEditingToolbar.hide() - melodyViewModel.melodyEditingModifiers.hide() - } - // melodyViewModel.openedMelody?.transposeInPlace(-1) -// updateMelody() + } else { + melodyViewModel.melodyEditingToolbar.hide() + melodyViewModel.melodyEditingModifiers.hide() + } + } + private val editButton = imageButton { + imageResource = R.drawable.edit_black + backgroundResource = R.drawable.toolbar_melody_button + padding = dip(10) + scaleType = ImageView.ScaleType.FIT_CENTER + onClick { + editModeActive = !editModeActive } onLongClick(returnValue = true) { // melodyViewModel.openedMelody?.transposeInPlace(-12) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt index 305fe6ed..57304394 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/BeatScratchToolbar.kt @@ -165,7 +165,7 @@ class BeatScratchToolbar( inactiveModeButton?.backgroundResource = R.drawable.toolbar_button_beatscratch inactiveModeButton?.image ?.setColorFilter(BeatClockPaletteConsumer.currentSectionColor, PorterDuff.Mode.SRC_IN) - activeModeButton?.backgroundResource = R.drawable.toolbar_button_active_instrument + activeModeButton?.backgroundResource = R.drawable.toolbar_button_active activeModeButton?.image?.colorFilter = null } viewModeButton.padding = dip(9) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt index 5da10049..8a39d704 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/PaletteViewModel.kt @@ -44,6 +44,8 @@ class PaletteViewModel constructor( } val interactionMode get() = beatScratchToolbar.interactionMode + val isInEditMode get() = interactionMode == BeatScratchToolbar.InteractionMode.EDIT + val isInViewMode get() = !isInEditMode fun notifyInteractionModeChanged() { when(interactionMode) { BeatScratchToolbar.InteractionMode.EDIT -> { @@ -52,6 +54,7 @@ class PaletteViewModel constructor( paletteToolbar, sectionListRecyclerHorizontalRotator ).forEach { it.show() } + BeatClockPaletteConsumer.section = BeatClockPaletteConsumer.palette?.sections?.first() } BeatScratchToolbar.InteractionMode.VIEW -> { melodyViewVisible = true @@ -60,6 +63,9 @@ class PaletteViewModel constructor( sectionListRecyclerHorizontalRotator ).forEach { it.hide() } sectionListRecyclerVerticalRotator.hide(animation = HideAnimation.HORIZONTAL) + editingMelody = null + BeatClockPaletteConsumer.section = null + melodyViewModel.layoutType = MelodyViewModel.LayoutType.GRID } } } @@ -144,7 +150,7 @@ class PaletteViewModel constructor( } var editingMelody: Melody<*>? by observable?>(null) { _, old, new -> - melodyViewModel.openedMelody = new + melodyViewModel.updateToolbarsAndMelody() if (new != null && !melodyViewVisible) { colorboardView.hide() keyboardView.hide() @@ -152,12 +158,13 @@ class PaletteViewModel constructor( .syncPositionTo(melodyViewModel.melodyRecyclerView) backStack.push { - if(melodyViewVisible) { + if(melodyViewVisible && isInEditMode) { melodyViewVisible = false editingMelody = null true } else false } + melodyViewModel.melodyReferenceToolbar.apply { editModeActive = editModeActive } melodyViewVisible = true } else { if(old != new) { @@ -370,7 +377,7 @@ class PaletteViewModel constructor( } else false } } - paletteToolbar.orbifoldButton.backgroundResource = R.drawable.toolbar_button_active_instrument + paletteToolbar.orbifoldButton.backgroundResource = R.drawable.toolbar_button_active paletteToolbar.updateInstrumentButtonPaddings() orbifold.conditionallyAnimateToSelectionState() orbifold.show( @@ -405,7 +412,7 @@ class PaletteViewModel constructor( } else false } keyboardView.show(animated) - paletteToolbar.keysButton.backgroundResource = R.drawable.toolbar_button_active_instrument + paletteToolbar.keysButton.backgroundResource = R.drawable.toolbar_button_active paletteToolbar.updateInstrumentButtonPaddings() } @@ -425,7 +432,7 @@ class PaletteViewModel constructor( } else false } colorboardView.show(animated) - paletteToolbar.colorsButton.backgroundResource = R.drawable.toolbar_button_active_instrument + paletteToolbar.colorsButton.backgroundResource = R.drawable.toolbar_button_active paletteToolbar.updateInstrumentButtonPaddings() } diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionHolder.kt b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionHolder.kt index a1bc61ad..8c50b40b 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionHolder.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/view/palette/SectionHolder.kt @@ -245,10 +245,18 @@ class SectionHolder constructor( val previouslyEditingMelody = viewModel.editingMelody viewModel.backStack.push { when { - previouslyEditingMelody != null -> viewModel.editingMelody = previouslyEditingMelody - else -> viewModel.melodyViewVisible = false + previouslyEditingMelody != null -> { + viewModel.editingMelody = previouslyEditingMelody + true + } + viewModel.isInEditMode -> { + viewModel.melodyViewVisible = false + true + } + else -> { + false + } } - true } viewModel.editingMelody = null viewModel.melodyViewVisible = true diff --git a/app/src/main/res/drawable/toolbar_button_active.xml b/app/src/main/res/drawable/toolbar_button_active.xml index f78d2971..ed4bb50d 100644 --- a/app/src/main/res/drawable/toolbar_button_active.xml +++ b/app/src/main/res/drawable/toolbar_button_active.xml @@ -1,15 +1,21 @@ - - - - + + + - - + + + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/drawable/toolbar_button_bg_active.xml b/app/src/main/res/drawable/toolbar_button_bg_active.xml new file mode 100644 index 00000000..f78d2971 --- /dev/null +++ b/app/src/main/res/drawable/toolbar_button_bg_active.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/toolbar_button_active_inset.xml b/app/src/main/res/drawable/toolbar_button_bg_active_inset.xml similarity index 79% rename from app/src/main/res/drawable/toolbar_button_active_inset.xml rename to app/src/main/res/drawable/toolbar_button_bg_active_inset.xml index 230cdeaf..1a09f7b3 100644 --- a/app/src/main/res/drawable/toolbar_button_active_inset.xml +++ b/app/src/main/res/drawable/toolbar_button_bg_active_inset.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/toolbar_melody_button_bg_active.xml b/app/src/main/res/drawable/toolbar_melody_button_bg_active.xml new file mode 100644 index 00000000..8677e272 --- /dev/null +++ b/app/src/main/res/drawable/toolbar_melody_button_bg_active.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/toolbar_melody_button_bg_active_inset.xml b/app/src/main/res/drawable/toolbar_melody_button_bg_active_inset.xml new file mode 100644 index 00000000..fbd4c2ed --- /dev/null +++ b/app/src/main/res/drawable/toolbar_melody_button_bg_active_inset.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file From 2e264092b3884230c349751875da4c1678d02a61 Mon Sep 17 00:00:00 2001 From: Jon Latane Date: Fri, 20 Sep 2019 10:26:07 -0400 Subject: [PATCH 4/4] Some stuff --- .../kotlin/com/jonlatane/beatpad/midi/MidiDevices.kt | 9 +++++---- .../com/jonlatane/beatpad/midi/MidiSynthesizers.kt | 1 - 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiDevices.kt b/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiDevices.kt index 88bbcfe1..ce53f87c 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiDevices.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiDevices.kt @@ -1,18 +1,18 @@ package com.jonlatane.beatpad.midi +import BeatClockPaletteConsumer import android.content.Context import android.content.pm.PackageManager import android.media.midi.* import android.os.Build import android.os.Handler +import android.os.HandlerThread import android.support.annotation.RequiresApi import com.jonlatane.beatpad.MainApplication -import android.os.HandlerThread import com.jonlatane.beatpad.output.instrument.MIDIInstrument -import com.jonlatane.beatpad.view.input -import io.multifunctions.models.Quad import kotlinx.io.core.Closeable -import org.jetbrains.anko.* +import org.jetbrains.anko.AnkoLogger +import org.jetbrains.anko.toast object MidiDevices : AnkoLogger { data class BSMidiDevice( @@ -71,6 +71,7 @@ object MidiDevices : AnkoLogger { override fun onDeviceRemoved(info: MidiDeviceInfo) { context.toast("Disconnected from ${info.name}.") devices.find { it.info == info }?.close() + devices.removeAll { it.info == info } } override fun onDeviceStatusChanged(status: MidiDeviceStatus) {} diff --git a/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiSynthesizers.kt b/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiSynthesizers.kt index 1443c66b..69ff7c70 100644 --- a/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiSynthesizers.kt +++ b/app/src/main/kotlin/com/jonlatane/beatpad/midi/MidiSynthesizers.kt @@ -44,7 +44,6 @@ object MidiSynthesizers: AnkoLogger { } catch (t: Throwable) { port.close() error("Failed to send midi data", error) - error = t } } }