diff --git a/.github/workflows/android_cd.yml b/.github/workflows/android_cd.yml index 8601af45..c00a6bba 100644 --- a/.github/workflows/android_cd.yml +++ b/.github/workflows/android_cd.yml @@ -45,50 +45,72 @@ jobs: - name: Install Firebase CLI run: curl -sL https://firebase.tools | bash - # 6. Decode google-services.json - - name: Decode google-services.json + # 6. Decode google-services.json for debug + - name: Decode google-services.json (debug) env: - FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET }} + FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_DEBUG }} + run: | + mkdir -p app/src/dev + echo $FIREBASE_SECRET | base64 --decode > app/src/dev/google-services.json + + # 7. Decode google-services.json for release + - name: Decode google-services.json (release) + env: + FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_RELEASE }} run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json - # 7. local.properties - - name: Add local.properties + # 8. Add Local Properties + - name: Add Local Properties env: BASE_URL: ${{ secrets.BASE_URL }} + AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} + ADMOB_APP_ID_DEBUG: ${{ secrets.ADMOB_APP_ID_DEBUG }} + ADMOB_APP_ID_RELEASE: ${{ secrets.ADMOB_APP_ID_RELEASE }} + ADMOB_AD_UNIT_ID_DEBUG: ${{ secrets.ADMOB_AD_UNIT_ID_DEBUG }} + ADMOB_AD_UNIT_ID_RELEASE: ${{ secrets.ADMOB_AD_UNIT_ID_RELEASE }} run: | - echo "base.url=\"$BASE_URL\"" >> app/local.properties - - # 8. Ktlint + echo -e "baseUrl=$BASE_URL" > local.properties + echo -e "amplitudeApiKey=$AMPLITUDE_API_KEY" >> local.properties + echo -e "admobAppIdDebug=$ADMOB_APP_ID_DEBUG" >> local.properties + echo -e "admobAppIdRelease=$ADMOB_APP_ID_RELEASE" >> local.properties + echo -e "admobAdUnitIdDebug=$ADMOB_AD_UNIT_ID_DEBUG" >> local.properties + echo -e "admobAdUnitIdRelease=$ADMOB_AD_UNIT_ID_RELEASE" >> local.properties + + # 9. Debug Local Properties Check + - name: Debug Local Properties + run: cat local.properties + + # 10. Ktlint - name: Run Ktlint Check run: ./gradlew ktlintCheck --stacktrace - # 9. Debug APK Build + # 11. Debug APK Build - name: Build Debug APK run: ./gradlew assembleDebug --stacktrace - # 10. Release AAB Build + # 12. Release AAB Build - name: Build Release AAB run: ./gradlew bundleRelease --stacktrace - # 11. Release APK Build + # 13. Release APK Build - name: Build Release APK run: ./gradlew assembleRelease --stacktrace - # 12. AAB Artifact Upload + # 14. AAB Artifact Upload - name: Upload Release AAB uses: actions/upload-artifact@v4 with: name: release-aab path: app/build/outputs/bundle/release/app-release.aab - # 13. APK Artifact Upload + # 15. APK Artifact Upload - name: Upload Release APK uses: actions/upload-artifact@v4 with: name: release-apk path: app/build/outputs/apk/release/app-release.apk - # 14. Set up Firebase Service Account Credentials + # 16. Set up Firebase Service Account Credentials - name: Set up Firebase Service Account Credentials env: GOOGLE_APPLICATION_CREDENTIALS_JSON: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS_JSON }} @@ -99,7 +121,7 @@ jobs: export GOOGLE_APPLICATION_CREDENTIALS=$HOME/firebase-credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_APPLICATION_CREDENTIALS" - # 15. Firebase CLI 인증 확인 + # 17. Firebase CLI 인증 확인 - name: Check Firebase CLI Authentication run: | export GOOGLE_APPLICATION_CREDENTIALS=$HOME/firebase-credentials.json @@ -111,7 +133,7 @@ jobs: echo "📌 현재 Firebase 프로젝트 목록 확인:" firebase projects:list || (echo "❌ Firebase 인증 실패!"; exit 1) - # 16. Firebase App Distribution Upload + # 18. Firebase App Distribution Upload - name: Upload APK to Firebase App Distribution env: GOOGLE_APPLICATION_CREDENTIALS: $HOME/firebase-credentials.json @@ -134,7 +156,7 @@ jobs: --release-notes "🚀 새로운 데모 버전이 배포되었습니다!" \ --groups "orbit-tester-group" - # 17. Notify Discord + # 19. Notify Discord - name: Notify Discord env: DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml index 89bba90a..b8974a0d 100644 --- a/.github/workflows/android_ci.yml +++ b/.github/workflows/android_ci.yml @@ -14,7 +14,7 @@ jobs: steps: # Gradle Cache - name: Cache Gradle packages - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: | ~/.gradle/caches @@ -42,21 +42,40 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - # Decode google-services.json - - name: Decode google-services.json + # Decode google-services.json for debug + - name: Decode google-services.json (debug) env: - FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET }} - run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json + FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_DEBUG }} + run: | + mkdir -p app/src/dev + echo $FIREBASE_SECRET | base64 --decode > app/src/dev/google-services.json - # Debug google-services.json - - name: Debug google-services.json - run: cat app/google-services.json + # Decode google-services.json for release + - name: Decode google-services.json (release) + env: + FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_RELEASE }} + run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json # Add Local Properties - name: Add Local Properties env: - BASE_URL: ${{ secrets.BASE_URL }} - run: echo "baseUrl=$BASE_URL" >> local.properties + BASE_URL: ${{ secrets.BASE_URL }} + AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} + ADMOB_APP_ID_DEBUG: ${{ secrets.ADMOB_APP_ID_DEBUG }} + ADMOB_APP_ID_RELEASE: ${{ secrets.ADMOB_APP_ID_RELEASE }} + ADMOB_AD_UNIT_ID_DEBUG: ${{ secrets.ADMOB_AD_UNIT_ID_DEBUG }} + ADMOB_AD_UNIT_ID_RELEASE: ${{ secrets.ADMOB_AD_UNIT_ID_RELEASE }} + run: | + echo -e "baseUrl=$BASE_URL" > local.properties + echo -e "amplitudeApiKey=$AMPLITUDE_API_KEY" >> local.properties + echo -e "admobAppIdDebug=$ADMOB_APP_ID_DEBUG" >> local.properties + echo -e "admobAppIdRelease=$ADMOB_APP_ID_RELEASE" >> local.properties + echo -e "admobAdUnitIdDebug=$ADMOB_AD_UNIT_ID_DEBUG" >> local.properties + echo -e "admobAdUnitIdRelease=$ADMOB_AD_UNIT_ID_RELEASE" >> local.properties + + # Debug Local Properties Check + - name: Debug Local Properties + run: cat local.properties # Run Lint and Build - name: Run lint and build diff --git a/README.md b/README.md new file mode 100644 index 00000000..eb422992 --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# 아침을 깨우는 새로운 알람! + +![store_graphic](https://github.com/user-attachments/assets/b583be67-47ba-4a02-a255-441757d11f7b) + + + solution + + +## 🚀 핵심 기능 + +### 메인 화면 + +https://github.com/user-attachments/assets/d41dbd9c-5fba-4ca2-aad5-6d6211a36108 + +- **알람 삭제**: 편집 모드로 전환하여 선택한 알람을 삭제하거나, 길게 눌러 개별 알람을 삭제할 수 있습니다. +- **알람 정렬 순서 변경**: 정렬 옵션을 변경하여 활성화된 알람을 우선적으로 표시할 수 있습니다. + +### 알람 설정/수정 + +https://github.com/user-attachments/assets/0f8083f5-3aba-439a-a124-2c6ffc81fde4 + +- **시간 설정**: 원하는 시간에 알람이 울리도록 설정할 수 있습니다. +- **반복 요일 설정**: 특정 요일에 반복되는 알람을 설정할 수 있으며, 공휴일에만 알람이 울리지 않도록 설정할 수도 있습니다. +- **알람 미루기 설정**: 알람 미루기 기능을 활성화하고, 몇 분 간격으로 몇 회까지 미룰 수 있는지 설정할 수 있습니다. +- **사운드 설정**: 진동, 소리 여부 및 음량을 조절할 수 있습니다. + +### 알람 끄기 - 미션 + +https://github.com/user-attachments/assets/3c1596e9-7cdc-4c8e-8327-aefedf48ffd5 + +- **알람 끄기**: 울리는 알람을 끌 수 있습니다. +- **알람 미루기**: 설정한 미루기 옵션에 따라 알람을 일정 시간 뒤로 미룰 수 있습니다. +- **미션 수행**: 당일 첫 알람 해제 시 미션을 수행하여 알람을 끌 수 있습니다. + +### 운세 + +![운세 확인](https://github.com/user-attachments/assets/d5de5237-e716-4a04-aa2f-00f8fbbc4e3c) + +- **행운의 편지**: 사용자에게 오늘의 종합 운세가 담긴 편지를 제공합니다. +- **세부 운세**: 학업/직장운, 재물운, 건강운, 애정운 등의 운세 정보를 제공합니다. +- **부적 제공**: 당일 첫 알람 해제 시 미션을 수행하면, 랜덤한 부적을 받을 수 있습니다. + +
+ +## 👨‍👦‍👦 팀원 + +||| +|:-:|:-:| +|Donghyeon Kim
[@DongChyeon](https://github.com/DongChyeon)|Moonsu Kang
[@MoonsuKang](https://github.com/MoonsuKang)| + +
+ +## 🛠️ 기술 스택 + +| 카테고리 | 스택 | +| --- | --- | +| Language | Kotlin | +| Architecture | Orbit-MVI | +| DI | Hilt | +| Networking | Retrofit, OkHttp, GSON | +| Asynchronous | Coroutine, Flow | +| JetPack | AAC, ViewModel, Navigation, Repository | +| Local DB | DataStore, Room | +| Image | Coil | + +
+ +## 📊 모듈 의존성 그래프 + +![Project Dependency Graph](project.dot.png) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2c391bf4..4acc31ae 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,18 +3,24 @@ plugins { id("orbit.android.compose") alias(libs.plugins.google.service) alias(libs.plugins.firebase.app.distribution) + alias(libs.plugins.firebase.crashlytics) } android { namespace = "com.yapp.orbit" defaultConfig { - versionCode = 1 - versionName = "0.0.2" + versionCode = 5 + versionName = "1.0.3" targetSdk = 34 } buildTypes { + debug { + applicationIdSuffix = ".dev" + isDebuggable = true + } + release { signingConfig = signingConfigs.getByName("debug") } @@ -38,4 +44,7 @@ dependencies { implementation(projects.feature.mission) implementation(projects.feature.setting) implementation(projects.feature.navigator) + implementation(libs.firebase.analytics) + implementation(libs.firebase.crashlytics) + implementation(libs.play.services.ads) } diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml new file mode 100644 index 00000000..1ccceb99 --- /dev/null +++ b/app/src/debug/res/values/strings.xml @@ -0,0 +1,3 @@ + + 오르비 알람 DEV + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3bdddf10..51ec3303 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + @@ -24,6 +25,10 @@ android:usesCleartextTraffic="true" tools:targetApi="31"> + + .addBuildConfigFields(project: Project) { val baseUrl = project.getLocalProperty("baseUrl", "https://default.example.com") - val isDebug = project.providers.gradleProperty("isDebug").orNull?.toBoolean() ?: false + val amplitudeApikey = project.getLocalProperty("amplitudeApiKey", "") buildTypes { getByName("debug") { buildConfigField("String", "BASE_URL", "\"$baseUrl\"") - buildConfigField("boolean", "DEBUG", isDebug.toString()) + buildConfigField("String", "AMPLITUDE_API_KEY", "\"$amplitudeApikey\"") + buildConfigField("boolean", "DEBUG", "true") } getByName("release") { buildConfigField("String", "BASE_URL", "\"$baseUrl\"") + buildConfigField("String", "AMPLITUDE_API_KEY", "\"$amplitudeApikey\"") buildConfigField("boolean", "DEBUG", "false") } } } +internal fun CommonExtension<*, *, *, *, *, *>.addResValues(project: Project) { + val admobAppIdDebug = project.getLocalProperty("admobAppIdDebug", "") + val admobAppIdRelease = project.getLocalProperty("admobAppIdRelease", "") + val admobAdUnitIdDebug = project.getLocalProperty("admobAdUnitIdDebug", "") + val admobAdUnitIdRelease = project.getLocalProperty("admobAdUnitIdRelease", "") + + buildTypes { + getByName("debug") { + resValue("string", "admob_app_id", admobAppIdDebug) + resValue("string", "admob_ad_unit_id", admobAdUnitIdDebug) + } + getByName("release") { + resValue("string", "admob_app_id", admobAppIdRelease) + resValue("string", "admob_ad_unit_id", admobAdUnitIdRelease) + } + } +} + internal fun Project.getLocalProperty(key: String, defaultValue: String? = null): String { val propertiesFile = rootProject.file("local.properties") if (propertiesFile.exists()) { diff --git a/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt b/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt index 8a658a2d..b842ac37 100644 --- a/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt +++ b/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt @@ -41,6 +41,7 @@ internal fun Project.configureKotlinAndroid() { } addBuildConfigFields(project) + addResValues(project) } configureKotlin() diff --git a/build.gradle.kts b/build.gradle.kts index 693d3170..46e42947 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,7 @@ plugins { alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.google.service) apply false alias(libs.plugins.firebase.app.distribution) apply false + alias(libs.plugins.firebase.crashlytics) apply false // alias(libs.plugins.sentry) apply false } diff --git a/core/alarm/build.gradle.kts b/core/alarm/build.gradle.kts index 0bce88ba..0747052e 100644 --- a/core/alarm/build.gradle.kts +++ b/core/alarm/build.gradle.kts @@ -10,6 +10,7 @@ android { } dependencies { + implementation(projects.core.analytics) implementation(projects.core.datastore) implementation(projects.core.designsystem) implementation(projects.core.media) diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt index 3a1e95fb..67d359f1 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt @@ -9,7 +9,19 @@ object AlarmConstants { const val EXTRA_NOTIFICATION_ID = "com.yapp.orbit.EXTRA_NOTIFICATION_ID" const val EXTRA_ALARM = "com.yapp.orbit.EXTRA_ALARM" + const val EXTRA_ALARM_DAY = "com.yapp.orbit.EXTRA_ALARM_DAY" const val EXTRA_IS_SNOOZED = "com.yapp.orbit.EXTRA_IS_SNOOZED" const val EXTRA_IS_DISMISS = "com.yapp.orbit.EXTRA_IS_DISMISS" + + const val SNOOZE_ID_OFFSET = 10000 + + const val WEEK_INTERVAL_MILLIS: Long = 7 * 24 * 60 * 60 * 1000 + + val HOLIDAYS_2025 = setOf( + "2025-01-01", "2025-01-27", "2025-01-28", "2025-01-29", "2025-01-30", + "2025-03-01", "2025-03-03", "2025-05-05", "2025-05-06", "2025-06-06", + "2025-08-15", "2025-10-03", "2025-10-05", "2025-10-06", "2025-10-07", + "2025-10-08", "2025-10-09", "2025-12-25", + ) } diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt index b79d722e..4823278e 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt @@ -2,17 +2,17 @@ package com.yapp.alarm import android.app.AlarmManager import android.app.Application -import android.content.Intent import android.util.Log import com.yapp.alarm.pendingIntent.schedule.createAlarmReceiverPendingIntentForSchedule import com.yapp.alarm.pendingIntent.schedule.createAlarmReceiverPendingIntentForUnSchedule -import com.yapp.alarm.services.AlarmService import com.yapp.domain.model.Alarm import com.yapp.domain.model.AlarmDay import com.yapp.domain.model.toAlarmDays import com.yapp.domain.model.toDayOfWeek +import java.time.Instant import java.time.LocalDateTime import java.time.ZoneId +import java.time.format.DateTimeFormatter import javax.inject.Inject class AlarmHelper @Inject constructor( @@ -31,6 +31,21 @@ class AlarmHelper @Inject constructor( } } + fun scheduleWeeklyAlarm(alarm: Alarm, day: AlarmDay) { + val initialTriggerMillis = getNextAlarmTimeMillis(alarm, day) + AlarmConstants.WEEK_INTERVAL_MILLIS + val triggerMillis = findNextNonHolidayDate(initialTriggerMillis) + + val pendingIntent = createAlarmReceiverPendingIntentForSchedule(app, alarm, day) + + alarmManager.setExactAndAllowWhileIdle( + AlarmManager.RTC_WAKEUP, + triggerMillis, + pendingIntent, + ) + + Log.d("AlarmHelper", "Scheduled weekly alarm for $day at: $triggerMillis") + } + fun unScheduleAlarm(alarm: Alarm) { val selectedDays = alarm.repeatDays.toAlarmDays() @@ -53,8 +68,11 @@ class AlarmHelper @Inject constructor( } } - fun stopAlarm() { - app.stopService(Intent(app, AlarmService::class.java)) + fun cancelSnoozedAlarm(alarmId: Long) { + val snoozedAlarmId = alarmId + AlarmConstants.SNOOZE_ID_OFFSET + val pendingIntent = createAlarmReceiverPendingIntentForUnSchedule(app, Alarm(id = snoozedAlarmId)) + alarmManager.cancel(pendingIntent) + Log.d("AlarmHelper", "Canceled snoozed alarm with id: $snoozedAlarmId") } private fun setRepeatingAlarm(day: AlarmDay, alarm: Alarm) { @@ -62,7 +80,7 @@ class AlarmHelper @Inject constructor( createAlarmReceiverPendingIntentForSchedule(app, alarm, day) val firstAlarmTriggerMillis = getNextAlarmTimeMillis(alarm, day) - Log.d("AlarmHelper", "Setting repeating alarm at: $firstAlarmTriggerMillis") + Log.d("AlarmHelper", "Setting repeating alarm id: ${alarm.id} at: $firstAlarmTriggerMillis") alarmManager.setExactAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, @@ -114,4 +132,25 @@ class AlarmHelper @Inject constructor( return epochMillis } + + private fun findNextNonHolidayDate(initialMillis: Long): Long { + val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + + var adjustedMillis = initialMillis + + while (true) { + val localDate = Instant.ofEpochMilli(adjustedMillis) + .atZone(ZoneId.systemDefault()) + .toLocalDate() + + val dateString = localDate.format(dateFormatter) + + if (!AlarmConstants.HOLIDAYS_2025.contains(dateString)) { + return adjustedMillis // 공휴일이 아니라면 해당 날짜 반환 + } + + // 공휴일이라면 다음 1주 뒤로 이동 + adjustedMillis += AlarmConstants.WEEK_INTERVAL_MILLIS + } + } } diff --git a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt index 0511f673..cdb80e2c 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt @@ -12,6 +12,7 @@ fun createAlarmAlertPendingIntent( alarm: Alarm, ): PendingIntent { val alarmAlertIntent = createAlarmAlertIntent( + context, alarm.id, alarm, ) @@ -24,6 +25,7 @@ fun createAlarmAlertPendingIntent( } private fun createAlarmAlertIntent( + context: Context, notificationId: Long, alarm: Alarm, ): Intent { @@ -31,5 +33,6 @@ private fun createAlarmAlertIntent( putExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, notificationId) putExtra(AlarmConstants.EXTRA_ALARM, alarm) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) + setPackage(context.packageName) } } diff --git a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt index c68f575d..3bd687df 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt @@ -5,6 +5,7 @@ import android.app.PendingIntent.FLAG_IMMUTABLE import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.content.Context import android.content.Intent +import androidx.core.net.toUri import com.yapp.alarm.AlarmConstants import com.yapp.alarm.receivers.AlarmReceiver @@ -30,3 +31,26 @@ fun createAlarmDismissIntent( putExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, notificationId) } } + +fun createNavigateToMissionPendingIntent( + applicationContext: Context, + notificationId: Long, +): PendingIntent { + val navigateToMissionIntent = createNavigateToMissionIntent(applicationContext, notificationId) + return PendingIntent.getActivity( + applicationContext, + notificationId.toInt(), + navigateToMissionIntent, + FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE, + ) +} + +fun createNavigateToMissionIntent( + context: Context, + notificationId: Long, +): Intent { + return Intent(Intent.ACTION_VIEW, "orbitapp://mission?notificationId=$notificationId".toUri()).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + setPackage(context.packageName) + } +} diff --git a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt index 2e8967ca..517eedbd 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt @@ -13,10 +13,7 @@ fun createAlarmReceiverPendingIntentForSchedule( alarm: Alarm, day: AlarmDay? = null, ): PendingIntent { - val alarmReceiverIntent = createAlarmReceiverIntent( - app, - alarm, - ) + val alarmReceiverIntent = createAlarmReceiverIntent(app, alarm, day) return PendingIntent.getBroadcast( app, generateAlarmIntentId(alarm.id.toInt(), day), @@ -28,15 +25,17 @@ fun createAlarmReceiverPendingIntentForSchedule( private fun createAlarmReceiverIntent( app: Application, alarm: Alarm, + day: AlarmDay? = null, ): Intent { return Intent(AlarmConstants.ACTION_ALARM_TRIGGERED).apply { setClass(app, AlarmReceiver::class.java) putExtra(AlarmConstants.EXTRA_ALARM, alarm) + day?.let { putExtra(AlarmConstants.EXTRA_ALARM_DAY, it.name) } } } fun generateAlarmIntentId(id: Int, day: AlarmDay?): Int { return day?.let { - (id * 10) + it.ordinal + 1 + (id * 10) + ((day.ordinal + 6) % 7) + 1 } ?: id } diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt index 88f7d9fd..4b703bf9 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt @@ -3,9 +3,8 @@ package com.yapp.alarm.receivers import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.net.Uri -import android.util.Log import androidx.activity.ComponentActivity +import androidx.core.net.toUri import com.yapp.alarm.AlarmConstants import com.yapp.datastore.UserPreferences import dagger.hilt.android.AndroidEntryPoint @@ -24,7 +23,6 @@ class AlarmInteractionActivityReceiver(private val activity: ComponentActivity) lateinit var userPreferences: UserPreferences override fun onReceive(context: Context?, intent: Intent?) { - Log.d("AlarmInteractionActivityReceiver", "알람 수신, AlarmAlertActivity 종료") val isSnoozed = intent?.getBooleanExtra(AlarmConstants.EXTRA_IS_SNOOZED, false) ?: false if (intent?.action == AlarmConstants.ACTION_ALARM_INTERACTION_ACTIVITY_CLOSE) { @@ -35,13 +33,12 @@ class AlarmInteractionActivityReceiver(private val activity: ComponentActivity) val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) - Log.d("AlarmReceiver", "fortuneDate: $fortuneDate, todayDate: $todayDate") - if (fortuneDate != todayDate) { context?.let { val missionIntent = - Intent(Intent.ACTION_VIEW, Uri.parse("orbitapp://mission")).apply { + Intent(Intent.ACTION_VIEW, "orbitapp://mission".toUri()).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + setPackage(context.packageName) } it.startActivity(missionIntent) } diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt index b7a3c68a..2e97ee68 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt @@ -5,20 +5,40 @@ import android.content.Context import android.content.Intent import android.os.Build import android.util.Log +import android.widget.Toast import com.yapp.alarm.AlarmConstants import com.yapp.alarm.AlarmHelper import com.yapp.alarm.services.AlarmService +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.AnalyticsHelper +import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm +import com.yapp.domain.model.toTimeString +import com.yapp.domain.usecase.AlarmUseCase import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.launch import java.time.LocalDateTime import javax.inject.Inject @AndroidEntryPoint class AlarmReceiver : BroadcastReceiver() { + @Inject + lateinit var analyticsHelper: AnalyticsHelper + @Inject lateinit var alarmHelper: AlarmHelper + @Inject + lateinit var userPreferences: UserPreferences + + @Inject + lateinit var alarmUseCase: AlarmUseCase + override fun onReceive(context: Context?, intent: Intent?) { context ?: return intent ?: return @@ -27,25 +47,85 @@ class AlarmReceiver : BroadcastReceiver() { when (intent.action) { AlarmConstants.ACTION_ALARM_TRIGGERED -> { Log.d("AlarmReceiver", "Alarm Triggered") + + val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + alarmServiceIntent.getParcelableExtra(AlarmConstants.EXTRA_ALARM, Alarm::class.java) + } else { + @Suppress("DEPRECATION") + alarmServiceIntent.getParcelableExtra(AlarmConstants.EXTRA_ALARM) + } + analyticsHelper.logEvent( + AnalyticsEvent( + type = "alarm_ring", + properties = mapOf( + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "${alarm?.id}", + AnalyticsEvent.AlarmPropertiesKeys.ALARM_TIME to alarm?.toTimeString(), + ), + ), + ) + context.startForegroundService(alarmServiceIntent) } AlarmConstants.ACTION_ALARM_SNOOZED -> { Log.d("AlarmReceiver", "Alarm Snoozed") + val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM, Alarm::class.java) } else { @Suppress("DEPRECATION") intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM) } - + analyticsHelper.logEvent( + AnalyticsEvent( + type = "alarm_snooze", + properties = mapOf( + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "${alarm?.id}", + ), + ), + ) alarm?.let { handleSnooze(context, it) } + + Toast.makeText(context, "알람이 ${alarm?.snoozeInterval}분 후 다시 울려요", Toast.LENGTH_SHORT).show() } AlarmConstants.ACTION_ALARM_DISMISSED -> { Log.d("AlarmReceiver", "Alarm Dismissed") + + val alarmId = intent.getLongExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, -1L) + if (alarmId != -1L) { + CoroutineScope(Dispatchers.IO).launch { + val alarms = alarmUseCase.getAllAlarms().first().sortedBy { it.isAlarmActive } + val isFirstAlarm = alarms.firstOrNull()?.id == alarmId + + analyticsHelper.logEvent( + AnalyticsEvent( + type = "alarm_dismiss", + properties = mapOf( + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "$alarmId", + AnalyticsEvent.AlarmPropertiesKeys.DISMISS_IS_FIRST_ALARM to isFirstAlarm, + ), + ), + ) + val existingId = userPreferences.firstDismissedAlarmIdFlow.firstOrNull() + if (existingId == null) { + // 첫 번째 알람 해제 기록 + userPreferences.saveFirstDismissedAlarmId(alarmId) + } else if (existingId != alarmId) { + // 두 번째 알람 해제 감지 - 기존 기록 삭제 + userPreferences.clearDismissedAlarmId() + } + } + + alarmHelper.cancelSnoozedAlarm(alarmId) + } else { + Log.e("AlarmReceiver", "알람 ID 수신 실패") + } + alarmHelper.cancelSnoozedAlarm(alarmId) context.stopService(alarmServiceIntent) sendBroadCastToCloseAlarmInteractionActivity(context) + + Toast.makeText(context, "알람이 해제되었어요", Toast.LENGTH_SHORT).show() } } } @@ -76,12 +156,14 @@ class AlarmReceiver : BroadcastReceiver() { hour = if (snoozeDateTime.hour == 0) 12 else if (snoozeDateTime.hour > 12) snoozeDateTime.hour - 12 else snoozeDateTime.hour, minute = snoozeDateTime.minute, second = snoozeDateTime.second, + repeatDays = 0, snoozeCount = newSnoozeCount, + id = alarm.id + AlarmConstants.SNOOZE_ID_OFFSET, ) Log.d( "AlarmReceiver", - "Scheduling snooze alarm: alarmId=${alarm.id}, newTime=${updatedAlarm.hour}:${updatedAlarm.minute}, remaining snoozeCount=$newSnoozeCount", + "Scheduling snooze alarm: alarmId=${updatedAlarm.id}, newTime=${updatedAlarm.hour}:${updatedAlarm.minute}, remaining snoozeCount=$newSnoozeCount", ) context.stopService(Intent(context, AlarmService::class.java)) diff --git a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt index f719e769..c982fe7e 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt @@ -10,37 +10,38 @@ import android.graphics.BitmapFactory import android.media.RingtoneManager import android.net.Uri import android.os.Build -import android.os.Handler -import android.os.HandlerThread import android.os.IBinder -import android.os.Looper -import android.os.Message -import android.os.Process.THREAD_PRIORITY_BACKGROUND import android.os.VibrationEffect import android.os.Vibrator import android.os.VibratorManager import android.util.Log import androidx.core.app.NotificationCompat +import androidx.core.net.toUri import com.yapp.alarm.AlarmConstants import com.yapp.alarm.AlarmHelper import com.yapp.alarm.pendingIntent.interaction.createAlarmAlertPendingIntent import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissPendingIntent import com.yapp.alarm.pendingIntent.interaction.createAlarmSnoozePendingIntent +import com.yapp.alarm.pendingIntent.interaction.createNavigateToMissionPendingIntent +import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm +import com.yapp.domain.model.AlarmDay import com.yapp.domain.usecase.AlarmUseCase import com.yapp.media.sound.SoundPlayer import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch +import java.time.LocalDate +import java.time.format.DateTimeFormatter import javax.inject.Inject @AndroidEntryPoint class AlarmService : Service() { - private var serviceLooper: Looper? = null - private var serviceHandler: ServiceHandler? = null - @Inject lateinit var alarmUseCase: AlarmUseCase @@ -52,68 +53,20 @@ class AlarmService : Service() { @Inject lateinit var alarmHelper: AlarmHelper - private inner class ServiceHandler(looper: Looper) : Handler(looper) { - - override fun handleMessage(message: Message) { - super.handleMessage(message) - - val bundle = message.data - val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - bundle?.getParcelable(AlarmConstants.EXTRA_ALARM, Alarm::class.java) - } else { - @Suppress("DEPRECATION") - bundle?.getParcelable(AlarmConstants.EXTRA_ALARM) - } - - if (alarm == null) { - Log.e("AlarmService", "Failed to retrieve Alarm object from intent") - return - } + @Inject + lateinit var userPreferences: UserPreferences - val notificationId = alarm.id - val isDismiss = bundle.getBoolean(AlarmConstants.EXTRA_IS_DISMISS, false) - val isOneTimeAlarm = alarm.repeatDays == 0 - - when (isDismiss) { - true -> { - stopSelf() - } - - false -> { - startForeground( - notificationId.toInt(), - createNotification(alarm), - ) - if (alarm.isVibrationEnabled) startVibration() - if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume) - } - } - - if (isOneTimeAlarm) { - turnOffAlarm(alarmId = notificationId) - } - } - } + private val serviceScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) override fun onCreate() { super.onCreate() - createNotificationChannel() - setupVibrator() - - HandlerThread("AlarmServiceThread", THREAD_PRIORITY_BACKGROUND).apply { - start() - serviceLooper = looper - serviceHandler = ServiceHandler(looper) - } } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - serviceHandler?.obtainMessage()?.also { message -> - message.arg1 = startId - message.data = intent?.extras - serviceHandler?.sendMessage(message) + serviceScope.launch { + handleIntent(intent ?: return@launch) } return START_NOT_STICKY } @@ -123,31 +76,79 @@ class AlarmService : Service() { override fun onDestroy() { stopVibration() stopSound() - // remove notification stopForeground(STOP_FOREGROUND_REMOVE) - stopSelf() + serviceScope.cancel() + super.onDestroy() } - private fun createNotification( - alarm: Alarm, - ): Notification { - Log.d("AlarmForegroundService", "createNotification()") + private suspend fun handleIntent(intent: Intent) { + val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM, Alarm::class.java) + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM) + } + + if (alarm == null) { + Log.e("AlarmService", "Failed to retrieve Alarm object from intent") + return + } + + val notificationId = alarm.id + val isDismiss = intent.getBooleanExtra(AlarmConstants.EXTRA_IS_DISMISS, false) + val isOneTimeAlarm = alarm.repeatDays == 0 + + Log.d("AlarmService", "AlarmService started for alarm: $alarm") + + // 반복 요일 알람 시, 다음 주 동일 요일 알람 예약 + if (!isOneTimeAlarm) { + intent.getStringExtra(AlarmConstants.EXTRA_ALARM_DAY)?.let { + alarmHelper.scheduleWeeklyAlarm(alarm, AlarmDay.valueOf(it)) + } + } - val closeIntent = Intent(AlarmConstants.ACTION_ALARM_INTERACTION_ACTIVITY_CLOSE).apply { - putExtra(AlarmConstants.EXTRA_IS_SNOOZED, true) + // 알람 해제 여부에 따른 처리 + when (isDismiss) { + true -> stopSelf() + false -> { + startForeground( + notificationId.toInt(), + createNotification(alarm, shouldNavigateToMission()), + ) + if (alarm.isVibrationEnabled) startVibration() + if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume) + } } - applicationContext.sendBroadcast(closeIntent) + if (isOneTimeAlarm) { + turnOffAlarm(alarmId = notificationId) + } + } + + private suspend fun shouldNavigateToMission(): Boolean { + val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + return fortuneDate != todayDate + } + + private fun createNotification(alarm: Alarm, shouldNavigateToMission: Boolean): Notification { val alarmAlertPendingIntent = createAlarmAlertPendingIntent(applicationContext, alarm) - val alarmDismissPendingIntent = - createAlarmDismissPendingIntent(applicationContext, pendingIntentId = alarm.id) - val snoozePendingIntent = if (alarm.isSnoozeEnabled && alarm.snoozeCount != 0) { - createAlarmSnoozePendingIntent( - applicationContext, - alarm, + val alarmDismissPendingIntent = if (shouldNavigateToMission) { + createNavigateToMissionPendingIntent( + applicationContext = applicationContext, + notificationId = alarm.id, ) + } else { + createAlarmDismissPendingIntent( + applicationContext = applicationContext, + pendingIntentId = alarm.id, + ) + } + + val snoozePendingIntent = if (alarm.isSnoozeEnabled && alarm.snoozeCount != 0) { + createAlarmSnoozePendingIntent(applicationContext, alarm) } else { null } @@ -160,10 +161,13 @@ class AlarmService : Service() { .setPriority(NotificationCompat.PRIORITY_HIGH) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setFullScreenIntent(alarmAlertPendingIntent, true) + .setDeleteIntent( + snoozePendingIntent ?: alarmDismissPendingIntent, + ) .addAction(core.designsystem.R.drawable.ic_cancel, "알람 해제", alarmDismissPendingIntent) - if (snoozePendingIntent != null) { - builder.addAction(core.designsystem.R.drawable.ic_cancel, "미루기", snoozePendingIntent) + snoozePendingIntent?.let { + builder.addAction(core.designsystem.R.drawable.ic_cancel, "미루기", it) } return builder.build() @@ -218,7 +222,7 @@ class AlarmService : Service() { private fun startSound(soundUri: String, volume: Int) { val uri: Uri = if (soundUri.isNotEmpty()) { - Uri.parse(soundUri) + soundUri.toUri() } else { RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM) } diff --git a/core/analytics/.gitignore b/core/analytics/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/core/analytics/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/analytics/build.gradle.kts b/core/analytics/build.gradle.kts new file mode 100644 index 00000000..2bfdbe5a --- /dev/null +++ b/core/analytics/build.gradle.kts @@ -0,0 +1,16 @@ +import com.yapp.convention.setNamespace + +plugins { + id("orbit.android.library") + id("orbit.android.hilt") + id("orbit.android.compose") +} + +android { + setNamespace("com.yapp.analytics") +} + +dependencies { + implementation(projects.core.common) + implementation(libs.amplitude.analytics) +} diff --git a/core/analytics/consumer-rules.pro b/core/analytics/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/core/analytics/proguard-rules.pro b/core/analytics/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/core/analytics/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/core/analytics/src/main/AndroidManifest.xml b/core/analytics/src/main/AndroidManifest.xml new file mode 100644 index 00000000..e1000761 --- /dev/null +++ b/core/analytics/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt new file mode 100644 index 00000000..a19a3ea9 --- /dev/null +++ b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt @@ -0,0 +1,24 @@ +package com.yapp.analytics + +import com.amplitude.android.Amplitude +import com.amplitude.core.events.BaseEvent +import javax.inject.Inject + +class AmplitudeAnalyticsHelper @Inject constructor( + private val amplitude: Amplitude, +) : AnalyticsHelper() { + override fun logEvent(event: AnalyticsEvent) { + amplitude.track(event.toAmplitudeEvent()) + } + + override fun setUserId(userId: Long?) { + amplitude.setUserId("ORBIT_$userId") + } + + private fun AnalyticsEvent.toAmplitudeEvent(): BaseEvent { + return BaseEvent().apply { + this.eventType = type + this.eventProperties = properties?.toMutableMap() + } + } +} diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt new file mode 100644 index 00000000..3c278d90 --- /dev/null +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt @@ -0,0 +1,29 @@ +package com.yapp.analytics + +data class AnalyticsEvent( + val type: String, + val properties: Map? = null, +) { + object OnboardingPropertiesKeys { + const val STEP = "step" + const val GENDER = "gender" + const val IS_PERMISSION_GRANTED = "permission" + } + + object AlarmPropertiesKeys { + const val ALARM_ID = "alarm_id" + const val ALARM_TIME = "alarm_time" + const val REPEAT_DAYS = "repeat_days" + const val SNOOZE_OPTION = "snooze_option" + const val DISMISS_IS_FIRST_ALARM = "dismiss_is_first_alarm" + } + + object MissionPropertiesKeys { + const val MISSION_TYPE = "mission_type" + } + + object FortunePropertiesKeys { + const val FORTUNE_PAGE_NUMBER = "fortune_page_number" + const val DURATION = "duration" + } +} diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt new file mode 100644 index 00000000..2026c842 --- /dev/null +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt @@ -0,0 +1,12 @@ +package com.yapp.analytics + +import androidx.compose.runtime.staticCompositionLocalOf + +abstract class AnalyticsHelper { + abstract fun logEvent(event: AnalyticsEvent) + abstract fun setUserId(userId: Long?) +} + +val LocalAnalyticsHelper = staticCompositionLocalOf { + DebugAnalyticsHelper() +} diff --git a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt new file mode 100644 index 00000000..b4ef3424 --- /dev/null +++ b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt @@ -0,0 +1,16 @@ +package com.yapp.analytics + +import android.util.Log + +class DebugAnalyticsHelper : AnalyticsHelper() { + private var userId: String = "" + + override fun logEvent(event: AnalyticsEvent) { + Log.d("DebugAnalyticsHelper", "userId: $userId logEvent: $event") + } + + override fun setUserId(userId: Long?) { + this.userId = "ORBIT_$userId" + Log.d("DebugAnalyticsHelper", "setUserId: $userId") + } +} diff --git a/core/analytics/src/main/java/com/yapp/analytics/di/AnalyticsModule.kt b/core/analytics/src/main/java/com/yapp/analytics/di/AnalyticsModule.kt new file mode 100644 index 00000000..caef0cf5 --- /dev/null +++ b/core/analytics/src/main/java/com/yapp/analytics/di/AnalyticsModule.kt @@ -0,0 +1,59 @@ +package com.yapp.analytics.di + +import android.content.Context +import com.amplitude.android.Amplitude +import com.amplitude.android.Configuration +import com.yapp.analytics.AmplitudeAnalyticsHelper +import com.yapp.analytics.AnalyticsHelper +import com.yapp.analytics.BuildConfig +import com.yapp.analytics.DebugAnalyticsHelper +import com.yapp.common.buildconfig.BuildConfigFieldProvider +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Qualifier +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object AnalyticsModule { + + @Provides + @Singleton + fun providesAmplitude( + @ApplicationContext context: Context, + buildConfigFieldProvider: BuildConfigFieldProvider, + ): Amplitude = Amplitude( + Configuration( + apiKey = buildConfigFieldProvider.get().amplitudeApiKey, + context = context, + ), + ) + + @Provides + @Singleton + @Debug + fun provideDebugAnalyticsHelper(): AnalyticsHelper = DebugAnalyticsHelper() + + @Provides + @Singleton + @Release + fun provideReleaseAnalyticsHelper(amplitude: Amplitude): AnalyticsHelper = AmplitudeAnalyticsHelper(amplitude) + + @Provides + @Singleton + fun provideAnalyticsHelper( + @Debug debugAnalyticsHelper: AnalyticsHelper, + @Release releaseAnalyticsHelper: AnalyticsHelper, + ): AnalyticsHelper = if (BuildConfig.DEBUG) debugAnalyticsHelper else releaseAnalyticsHelper +} + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class Debug + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class Release diff --git a/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt b/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt index 1017778a..ae3ddfe4 100644 --- a/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt +++ b/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt @@ -2,6 +2,7 @@ package com.yapp.buildconfig import com.yapp.common.buildconfig.BuildConfigFieldProvider import com.yapp.common.buildconfig.BuildConfigFields +import core.buildconfig.BuildConfig.AMPLITUDE_API_KEY import core.buildconfig.BuildConfig.BASE_URL import core.buildconfig.BuildConfig.DEBUG import javax.inject.Inject @@ -10,6 +11,7 @@ class BuildConfigFieldsProviderImpl @Inject constructor() : BuildConfigFieldProv override fun get(): BuildConfigFields = BuildConfigFields( baseUrl = BASE_URL, + amplitudeApiKey = AMPLITUDE_API_KEY, isDebug = DEBUG, ) } diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index c856674a..a01d2fa2 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -12,6 +12,8 @@ android { dependencies { implementation(projects.core.designsystem) + implementation(projects.domain) implementation(libs.compose.navigation) implementation(libs.hilt.navigation.compose) + implementation(libs.kotlinx.serialization.json) } diff --git a/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt b/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt index 30e0e506..a7edf3e0 100644 --- a/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt +++ b/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt @@ -2,5 +2,6 @@ package com.yapp.common.buildconfig data class BuildConfigFields( val baseUrl: String, + val amplitudeApiKey: String, val isDebug: Boolean, ) diff --git a/core/common/src/main/java/com/yapp/common/navigation/JsonNavType.kt b/core/common/src/main/java/com/yapp/common/navigation/JsonNavType.kt deleted file mode 100644 index 4cc9ac3f..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/JsonNavType.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.yapp.common.navigation - -import android.os.Bundle -import androidx.navigation.NavType - -abstract class JsonNavType : NavType(isNullableAllowed = false) { - abstract fun fromJsonParse(value: String): T - abstract fun T.getJsonParse(): String - - override fun get(bundle: Bundle, key: String): T? = - bundle.getString(key)?.let { parseValue(it) } - - override fun parseValue(value: String): T = fromJsonParse(value) - - override fun put(bundle: Bundle, key: String, value: T) { - bundle.putString(key, value.getJsonParse()) - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt index bfbd7ec8..34ceed6f 100644 --- a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt +++ b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt @@ -1,63 +1,88 @@ package com.yapp.common.navigation +import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import androidx.navigation.NavDestination import androidx.navigation.NavHostController -import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.NavOptions import androidx.navigation.compose.rememberNavController -import androidx.navigation.navOptions -import com.yapp.common.navigation.destination.HomeDestination -import com.yapp.common.navigation.destination.OnboardingDestination -import com.yapp.common.navigation.destination.TopLevelDestination +import com.yapp.common.navigation.route.AlarmInteractionDestination +import com.yapp.common.navigation.route.FortuneBaseRoute +import com.yapp.common.navigation.route.FortuneDestination +import com.yapp.common.navigation.route.HomeBaseRoute +import com.yapp.common.navigation.route.HomeDestination +import com.yapp.common.navigation.route.OnboardingBaseRoute +import com.yapp.common.navigation.route.OnboardingDestination +import com.yapp.common.navigation.route.SettingBaseRoute +import com.yapp.common.navigation.route.SettingDestination +import com.yapp.common.navigation.route.SplashRoute +import com.yapp.common.navigation.route.WebViewRoute +import com.yapp.domain.model.Alarm class OrbitNavigator( val navController: NavHostController, ) { - val startDestination = OnboardingDestination.Route.route - - private val currentDestination: NavDestination? - @Composable get() = navController - .currentBackStackEntryAsState().value?.destination - - val currentTab: TopLevelDestination? - @Composable get() = currentDestination - ?.route - ?.let(TopLevelDestination.Companion::find) - - fun navigateTo(route: String, popUpTo: String? = null, inclusive: Boolean = false) { - navController.navigate(route) { - popUpTo?.let { - popUpTo(it) { this.inclusive = inclusive } - } - launchSingleTop = true - restoreState = true + val startDestination = SplashRoute + + fun navigateToOnboarding(navOptions: NavOptions? = null) { + navController.navigate(OnboardingBaseRoute, navOptions) + } + + fun navigateToOnboardingNextStep(currentStep: Int, navOptions: NavOptions? = null) { + val instance = OnboardingDestination.getNextRouteForStep(currentStep)?.objectInstance + if (instance != null) { + navController.navigate(instance, navOptions) + } else { + Log.e("Navigator", "Invalid route at step: $currentStep") } } - fun navigateBack() { - navController.popBackStack() + fun navigateToAddAlarm(navOptions: NavOptions? = null) { + navController.navigate(HomeDestination.AlarmAddEdit(-1), navOptions) } - fun navigateToTopLevelDestination(tab: TopLevelDestination) { - val navOptions = navOptions { - popUpTo(Routes.Home.ROUTE) { - saveState = true - } - launchSingleTop = true - restoreState = true - } + fun navigateToEditAlarm(alarmId: Long, navOptions: NavOptions? = null) { + navController.navigate(HomeDestination.AlarmAddEdit(alarmId), navOptions) + } - when (tab) { - TopLevelDestination.HOME -> navController.navigate(Routes.Home.ROUTE, navOptions) - TopLevelDestination.MYPAGE -> navController.navigate(Routes.MyPage.ROUTE, navOptions) - } + fun navigateToHome(navOptions: NavOptions? = null) { + navController.navigate(HomeBaseRoute, navOptions) + } + + fun navigateToAlarmAction(alarm: Alarm, navOptions: NavOptions? = null) { + navController.navigate(AlarmInteractionDestination.AlarmAction(alarm), navOptions) + } + + fun navigateToAlarmSnoozeTimer(alarm: Alarm, navOptions: NavOptions? = null) { + navController.navigate(AlarmInteractionDestination.AlarmSnoozeTimer(alarm), navOptions) + } + + fun navigateToFortune(navOptions: NavOptions? = null) { + navController.navigate(FortuneBaseRoute, navOptions) + } + + fun navigateToFortuneReward(navOptions: NavOptions? = null) { + navController.navigate(FortuneDestination.Reward, navOptions) + } + + fun navigateToSetting(navOptions: NavOptions? = null) { + navController.navigate(SettingBaseRoute, navOptions) + } + + fun navigateToEditProfile(navOptions: NavOptions? = null) { + navController.navigate(SettingDestination.EditProfile, navOptions) } - @Composable - fun shouldHaveNavigationBarsPadding(): Boolean { - val currentRoute = currentDestination?.route ?: return false - return currentRoute !in HomeDestination.Home.route + fun navigateToEditBirthDay(navOptions: NavOptions? = null) { + navController.navigate(SettingDestination.EditBirthday, navOptions) + } + + fun navigateToWebView(url: String, navOptions: NavOptions? = null) { + navController.navigate(WebViewRoute(url), navOptions) + } + + fun navigateBack() { + navController.popBackStack() } } diff --git a/core/common/src/main/java/com/yapp/common/navigation/Routes.kt b/core/common/src/main/java/com/yapp/common/navigation/Routes.kt deleted file mode 100644 index d8fcb620..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/Routes.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.yapp.common.navigation - -object Routes { - object Onboarding { - const val ROUTE = "onboarding_route" - const val EXPLAIN = "onboarding_explain" - const val ALARM_TIME_SELECTION = "onboarding_alarm_time_selection" - const val BIRTHDAY = "onboarding_birthday" - const val TIME_OF_BIRTH = "onboarding_time_of_birth" - const val NAME = "onboarding_name" - const val GENDER = "onboarding_gender" - const val ACCESS = "onboarding_access" - const val COMPLETE_FIRST = "onboarding_complete_first" - const val COMPLETE_SECOND = "onboarding_complete_second" - } - - object Home { - const val ROUTE = "home_route" - const val HOME = "home" - const val ALARM_ADD_EDIT = "alarm_add_edit" - } - - object AlarmInteraction { - const val ROUTE = "alarm_interaction_route" - const val ALARM_ACTION = "alarm_action" - const val ALARM_SNOOZE_TIMER = "alarm_snooze_timer" - } - - object MyPage { - const val ROUTE = "mypage_route" - const val MYPAGE = "mypage" - } - - object Mission { - const val ROUTE = "mission_route" - const val MISSION = "mission_main" - const val PROGRESS = "mission_progress" - } - - object Fortune { - const val ROUTE = "fortune_route" - const val FORTUNE = "fortune_main" - const val REWARD = "fortune_reward" - } - - object Setting { - const val ROUTE = "setting_route" - const val SETTING = "setting_main" - const val EDIT_PROFILE = "setting_edit_profile" - const val EDIT_BIRTHDAY = "setting_edit_birthday" - } - - object Splash { - const val ROUTE = "splash_route" - const val SPLASH = "splash" - } - - object WebView { - const val ROUTE = "webview_route" - const val WEBVIEW = "webview" - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/AlarmInteractionDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/AlarmInteractionDestination.kt deleted file mode 100644 index 47b8d731..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/AlarmInteractionDestination.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class AlarmInteractionDestination(val route: String) { - data object Route : AlarmInteractionDestination(Routes.AlarmInteraction.ROUTE) - data object AlarmAction : HomeDestination(Routes.AlarmInteraction.ALARM_ACTION) - data object AlarmSnoozeTimer : HomeDestination(Routes.AlarmInteraction.ALARM_SNOOZE_TIMER) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/FortuneDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/FortuneDestination.kt deleted file mode 100644 index 808c3f62..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/FortuneDestination.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class FortuneDestination(val route: String) { - data object Route : FortuneDestination(Routes.Fortune.ROUTE) - data object Fortune : FortuneDestination(Routes.Fortune.FORTUNE) - data object Reward : FortuneDestination(Routes.Fortune.REWARD) - - companion object { - val routes = listOf(Fortune, Reward) - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/HomeDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/HomeDestination.kt deleted file mode 100644 index 81a71aed..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/HomeDestination.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class HomeDestination(val route: String) { - data object Route : HomeDestination(Routes.Home.ROUTE) - data object Home : HomeDestination(Routes.Home.HOME) - data object AlarmAddEdit : HomeDestination(Routes.Home.ALARM_ADD_EDIT) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt deleted file mode 100644 index fd742d70..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class MissionDestination(val route: String) { - data object Route : MissionDestination(Routes.Mission.ROUTE) - data object Mission : MissionDestination(Routes.Mission.MISSION) - data object Progress : MissionDestination(Routes.Mission.PROGRESS) - - companion object { - val routes = listOf(Mission, Progress) - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/MyPageDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/MyPageDestination.kt deleted file mode 100644 index 9ccb7d9c..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/MyPageDestination.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class MyPageDestination(val route: String) { - data object Route : MyPageDestination(Routes.MyPage.ROUTE) - data object MyPage : MyPageDestination(Routes.MyPage.MYPAGE) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/OnboardingDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/OnboardingDestination.kt deleted file mode 100644 index 89c4afe8..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/OnboardingDestination.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class OnboardingDestination(val route: String) { - data object Route : OnboardingDestination(Routes.Onboarding.ROUTE) - data object Explain : OnboardingDestination(Routes.Onboarding.EXPLAIN) - data object AlarmTimeSelection : OnboardingDestination(Routes.Onboarding.ALARM_TIME_SELECTION) - data object Birthday : OnboardingDestination(Routes.Onboarding.BIRTHDAY) - data object TimeOfBirth : OnboardingDestination(Routes.Onboarding.TIME_OF_BIRTH) - data object Name : OnboardingDestination(Routes.Onboarding.NAME) - data object Gender : OnboardingDestination(Routes.Onboarding.GENDER) - data object Access : OnboardingDestination(Routes.Onboarding.ACCESS) - data object Complete1 : OnboardingDestination(Routes.Onboarding.COMPLETE_FIRST) - data object Complete2 : OnboardingDestination(Routes.Onboarding.COMPLETE_SECOND) - - companion object { - val routes = listOf(Explain, AlarmTimeSelection, Birthday, TimeOfBirth, Name, Gender, Access, Complete1, Complete2) - - fun nextRoute(currentStep: Int): String? { - return routes.getOrNull(currentStep)?.route - } - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/SettingDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/SettingDestination.kt deleted file mode 100644 index 0b1f8e8f..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/SettingDestination.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class SettingDestination(val route: String) { - data object Route : SettingDestination(Routes.Setting.ROUTE) - data object Setting : SettingDestination(Routes.Setting.SETTING) - data object EditProfile : SettingDestination(Routes.Setting.EDIT_PROFILE) - data object EditBirthday : SettingDestination(Routes.Setting.EDIT_BIRTHDAY) - - companion object { - val routes = listOf(Setting, EditProfile, EditBirthday) - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/SplashDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/SplashDestination.kt deleted file mode 100644 index 9ea3934f..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/SplashDestination.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class SplashDestination(val route: String) { - data object Route : SplashDestination(Routes.Splash.ROUTE) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/TopLevelDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/TopLevelDestination.kt deleted file mode 100644 index 3a9fcc52..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/TopLevelDestination.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.yapp.common.navigation.destination - -import androidx.annotation.DrawableRes -import androidx.annotation.StringRes -import com.yapp.common.navigation.Routes - -enum class TopLevelDestination( - @DrawableRes val iconId: Int, - @StringRes val titleId: Int, - val route: String, -) { - HOME( - iconId = core.designsystem.R.drawable.ic_launcher_foreground, - titleId = core.designsystem.R.string.app_name, - route = Routes.Home.ROUTE, - ), - MYPAGE( - iconId = core.designsystem.R.drawable.ic_launcher_foreground, - titleId = core.designsystem.R.string.app_name, - route = Routes.MyPage.MYPAGE, - ), - ; - - companion object { - operator fun contains(route: String): Boolean = entries.any { it.route == route } - fun find(route: String): TopLevelDestination? = entries.find { it.route == route } - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/WebViewDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/WebViewDestination.kt deleted file mode 100644 index 9533099b..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/WebViewDestination.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class WebViewDestination(val route: String) { - object Route : WebViewDestination(Routes.WebView.ROUTE) - object WebView : WebViewDestination(Routes.WebView.WEBVIEW) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/AlarmInteractionRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/AlarmInteractionRoute.kt new file mode 100644 index 00000000..21310ba9 --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/AlarmInteractionRoute.kt @@ -0,0 +1,18 @@ +package com.yapp.common.navigation.route + +import com.yapp.domain.model.Alarm +import kotlinx.serialization.Serializable + +@Serializable +data object AlarmInteractionBaseRoute + +sealed interface AlarmInteractionDestination { + @Serializable + data object Route : AlarmInteractionDestination + + @Serializable + data class AlarmAction(val alarm: Alarm) : AlarmInteractionDestination + + @Serializable + data class AlarmSnoozeTimer(val alarm: Alarm) : AlarmInteractionDestination +} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/FortuneRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/FortuneRoute.kt new file mode 100644 index 00000000..c581c8ed --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/FortuneRoute.kt @@ -0,0 +1,14 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data object FortuneBaseRoute + +sealed interface FortuneDestination { + @Serializable + data object Fortune : FortuneDestination + + @Serializable + data object Reward : FortuneDestination +} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/HomeRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/HomeRoute.kt new file mode 100644 index 00000000..04b8b4da --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/HomeRoute.kt @@ -0,0 +1,14 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data object HomeBaseRoute + +sealed interface HomeDestination { + @Serializable + data object Route : HomeDestination + + @Serializable + data class AlarmAddEdit(val alarmId: Long? = null) : HomeDestination +} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt new file mode 100644 index 00000000..d5a04949 --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt @@ -0,0 +1,6 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data object MissionRoute diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt new file mode 100644 index 00000000..ff4faea4 --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt @@ -0,0 +1,55 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable +import kotlin.reflect.KClass + +@Serializable +data object OnboardingBaseRoute + +sealed class OnboardingDestination { + @Serializable + data object Explain : OnboardingDestination() + + @Serializable + data object AlarmTimeSelection : OnboardingDestination() + + @Serializable + data object Birthday : OnboardingDestination() + + @Serializable + data object TimeOfBirth : OnboardingDestination() + + @Serializable + data object Name : OnboardingDestination() + + @Serializable + data object Gender : OnboardingDestination() + + @Serializable + data object Access : OnboardingDestination() + + @Serializable + data object Complete1 : OnboardingDestination() + + @Serializable + data object Complete2 : OnboardingDestination() + + companion object { + val routes: List> = listOf( + Explain::class, + AlarmTimeSelection::class, + Birthday::class, + TimeOfBirth::class, + Name::class, + Gender::class, + Access::class, + Complete1::class, + Complete2::class, + ) + + fun getNextRouteForStep(currentStep: Int): KClass? { + val nextRoute = routes.getOrNull(currentStep + 1) + return nextRoute + } + } +} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/SettingRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/SettingRoute.kt new file mode 100644 index 00000000..9246eed0 --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/SettingRoute.kt @@ -0,0 +1,18 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data object SettingBaseRoute + +@Serializable +sealed interface SettingDestination { + @Serializable + data object Setting : SettingDestination + + @Serializable + data object EditProfile : SettingDestination + + @Serializable + data object EditBirthday : SettingDestination +} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/SplashRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/SplashRoute.kt new file mode 100644 index 00000000..81724c65 --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/SplashRoute.kt @@ -0,0 +1,6 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data object SplashRoute diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/WebViewRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/WebViewRoute.kt new file mode 100644 index 00000000..9ced251c --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/WebViewRoute.kt @@ -0,0 +1,6 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data class WebViewRoute(val url: String) diff --git a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt index 47a6492e..35298556 100644 --- a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt +++ b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt @@ -1,5 +1,6 @@ package com.yapp.datastore +import android.util.Log import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey @@ -23,10 +24,15 @@ class UserPreferences @Inject constructor( ) { private object Keys { val USER_ID = longPreferencesKey("user_id") + val USER_NAME = stringPreferencesKey("user_name") val ONBOARDING_COMPLETED = booleanPreferencesKey("onboarding_completed") val FORTUNE_ID = longPreferencesKey("fortune_id") val FORTUNE_DATE = stringPreferencesKey("fortune_date") val FORTUNE_IMAGE_ID = intPreferencesKey("fortune_image_id") + val FORTUNE_SCORE = intPreferencesKey("fortune_score") + val FORTUNE_CHECKED = booleanPreferencesKey("fortune_checked") + val FIRST_DISMISSED_ALARM_ID = longPreferencesKey("first_dismissed_alarm_id") + val DISMISSED_DATE = stringPreferencesKey("dismissed_date") } val userIdFlow: Flow = dataStore.data @@ -34,6 +40,11 @@ class UserPreferences @Inject constructor( .map { it[Keys.USER_ID] } .distinctUntilChanged() + val userNameFlow: Flow = dataStore.data + .catch { emit(emptyPreferences()) } + .map { it[Keys.USER_NAME] } + .distinctUntilChanged() + val onboardingCompletedFlow: Flow = dataStore.data .catch { emit(emptyPreferences()) } .map { it[Keys.ONBOARDING_COMPLETED] ?: false } @@ -54,17 +65,59 @@ class UserPreferences @Inject constructor( .map { it[Keys.FORTUNE_IMAGE_ID] } .distinctUntilChanged() + val fortuneScoreFlow: Flow = dataStore.data + .catch { emit(emptyPreferences()) } + .map { it[Keys.FORTUNE_SCORE] } + .distinctUntilChanged() + + val hasNewFortuneFlow: Flow = dataStore.data + .catch { emit(emptyPreferences()) } + .map { preferences -> + val savedDate = preferences[Keys.FORTUNE_DATE] + val isChecked = preferences[Keys.FORTUNE_CHECKED] ?: true + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + savedDate == todayDate && !isChecked + } + .distinctUntilChanged() + + val firstDismissedAlarmIdFlow: Flow = dataStore.data + .catch { emit(emptyPreferences()) } + .map { preferences -> + val savedDate = preferences[Keys.DISMISSED_DATE] + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + + if (savedDate == todayDate) { + preferences[Keys.FIRST_DISMISSED_ALARM_ID] + } else { + null + } + } + .distinctUntilChanged() + suspend fun saveUserId(userId: Long) { dataStore.edit { preferences -> preferences[Keys.USER_ID] = userId } } + suspend fun saveUserName(userName: String) { + dataStore.edit { preferences -> + preferences[Keys.USER_NAME] = userName + } + } + suspend fun saveFortuneId(fortuneId: Long) { val currentDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) dataStore.edit { preferences -> preferences[Keys.FORTUNE_ID] = fortuneId preferences[Keys.FORTUNE_DATE] = currentDate + preferences[Keys.FORTUNE_CHECKED] = false + } + } + + suspend fun markFortuneAsChecked() { + dataStore.edit { preferences -> + preferences[Keys.FORTUNE_CHECKED] = true } } @@ -74,12 +127,38 @@ class UserPreferences @Inject constructor( } } + suspend fun saveFortuneScore(score: Int) { + dataStore.edit { preferences -> + preferences[Keys.FORTUNE_SCORE] = score + } + } + + suspend fun saveFirstDismissedAlarmId(alarmId: Long) { + dataStore.edit { preferences -> + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + if (preferences[Keys.FIRST_DISMISSED_ALARM_ID] == null) { + preferences[Keys.FIRST_DISMISSED_ALARM_ID] = alarmId + preferences[Keys.DISMISSED_DATE] = todayDate + Log.d("UserPreferences", "첫 해제된 알람 ID 저장 완료: $alarmId (날짜: $todayDate)") + } else { + Log.d("UserPreferences", "이미 첫 알람 해제 ID가 저장되어 있음)") + } + } + } + suspend fun setOnboardingCompleted() { dataStore.edit { preferences -> preferences[Keys.ONBOARDING_COMPLETED] = true } } + suspend fun clearDismissedAlarmId() { + dataStore.edit { preferences -> + preferences.remove(Keys.FIRST_DISMISSED_ALARM_ID) + preferences.remove(Keys.DISMISSED_DATE) + } + } + suspend fun clearUserData() { dataStore.edit { preferences -> preferences.clear() @@ -91,6 +170,8 @@ class UserPreferences @Inject constructor( preferences.remove(Keys.FORTUNE_ID) preferences.remove(Keys.FORTUNE_DATE) preferences.remove(Keys.FORTUNE_IMAGE_ID) + preferences.remove(Keys.FORTUNE_SCORE) + preferences.remove(Keys.FORTUNE_CHECKED) } } } diff --git a/core/designsystem/src/main/res/drawable-xhdpi/ic_mission_main_letter.png b/core/designsystem/src/main/res/drawable-xhdpi/ic_mission_main_letter.png new file mode 100644 index 00000000..ceeac7b7 Binary files /dev/null and b/core/designsystem/src/main/res/drawable-xhdpi/ic_mission_main_letter.png differ diff --git a/core/designsystem/src/main/res/drawable-xxhdpi/ic_mission_main_letter.png b/core/designsystem/src/main/res/drawable-xxhdpi/ic_mission_main_letter.png new file mode 100644 index 00000000..52b8f24d Binary files /dev/null and b/core/designsystem/src/main/res/drawable-xxhdpi/ic_mission_main_letter.png differ diff --git a/core/designsystem/src/main/res/drawable/ic_character_no_alarm.xml b/core/designsystem/src/main/res/drawable/ic_character_no_alarm.xml new file mode 100644 index 00000000..69255ae7 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_character_no_alarm.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/designsystem/src/main/res/drawable/ic_check.xml b/core/designsystem/src/main/res/drawable/ic_check.xml index eaa1bbcd..1412ec7b 100644 --- a/core/designsystem/src/main/res/drawable/ic_check.xml +++ b/core/designsystem/src/main/res/drawable/ic_check.xml @@ -1,9 +1,9 @@ + android:width="21dp" + android:height="20dp" + android:viewportWidth="21" + android:viewportHeight="20"> + android:pathData="M16.503,5.244C16.828,5.57 16.828,6.097 16.503,6.423L8.864,14.061C8.707,14.218 8.495,14.306 8.274,14.306C8.053,14.306 7.841,14.218 7.685,14.061L4.213,10.589C3.887,10.264 3.887,9.736 4.213,9.411C4.538,9.085 5.066,9.085 5.391,9.411L8.274,12.294L15.324,5.244C15.649,4.919 16.177,4.919 16.503,5.244Z" + android:fillColor="#ffffff"/> diff --git a/core/designsystem/src/main/res/drawable/ic_filter.xml b/core/designsystem/src/main/res/drawable/ic_filter.xml new file mode 100644 index 00000000..9a284caa --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_filter.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/designsystem/src/main/res/drawable/ic_mission_main_letter.png b/core/designsystem/src/main/res/drawable/ic_mission_main_letter.png new file mode 100644 index 00000000..6c421ae1 Binary files /dev/null and b/core/designsystem/src/main/res/drawable/ic_mission_main_letter.png differ diff --git a/core/designsystem/src/main/res/drawable/ic_trash.xml b/core/designsystem/src/main/res/drawable/ic_trash.xml new file mode 100644 index 00000000..541852eb --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_trash.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/designsystem/src/main/res/raw/fortune_preload.json b/core/designsystem/src/main/res/raw/fortune_preload.json index 54154ad5..5a989fc7 100644 --- a/core/designsystem/src/main/res/raw/fortune_preload.json +++ b/core/designsystem/src/main/res/raw/fortune_preload.json @@ -1 +1 @@ -{"ddd":0,"h":550,"w":550,"meta":{"g":"@lottiefiles/toolkit-js 0.57.2-beta.0","tc":"#232323"},"layers":[{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"128","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[61.5,60.5]},"s":{"a":0,"k":[100,100]},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[424,88,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[426,76,0],"t":40},{"s":[424,88,0],"t":81}],"x":"var $bm_rt;\n$bm_rt = transform.position;"},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[10],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"1","ind":1},{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"126","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[34,34.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[159.75,367.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[12],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"2","ind":2},{"ty":2,"sr":1,"st":0,"op":82,"ip":0,"ln":"99","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[32,84]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[157.5,368.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-7],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[3],"t":40},{"s":[-7],"t":82}]},"o":{"a":0,"k":100}},"refId":"3","ind":3},{"ty":2,"sr":1,"st":0,"op":15,"ip":0,"ln":"103","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"4","ind":4},{"ty":2,"sr":1,"st":15,"op":21,"ip":15,"ln":"107","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":5},{"ty":2,"sr":1,"st":21,"op":55,"ip":21,"ln":"114","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"4","ind":6},{"ty":2,"sr":1,"st":49,"op":61,"ip":55,"ln":"131","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":7},{"ty":2,"sr":1,"st":72,"op":82,"ip":61,"ln":"133","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"4","ind":8}],"v":"5.7.0","fr":25,"op":82,"ip":0,"assets":[{"id":"1","e":1,"w":123,"h":121,"p":"data:image/png;base64,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","u":""},{"id":"2","e":1,"w":68,"h":69,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABFCAMAAADEkbAlAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABaUExURUdwTP////3+/v////////////////////////////3+/v39/v////f5+v////////j5+////////////////////////////9Xc5NXc5P///9Xc5O7x9OPo7S4sF6sAAAAadFJOUwAJEN4t6vT7AQQgPNBOF7eCp4xYZZvFcd7Fv+W+XAAAA0BJREFUWMPlmOuSoyAQhQOiKIqigiYxef/X3G6IShLxlv2xVdupmZqaqv7Sp0Hpw+Xyn0UKkY2RpicAkEcIpbQsSwE/lJBjHPh+zC+FYIzlNhgTwIF69gIyAl8vMF3KVuseQutW5sAheyhYA7UAm66axpgawphG9a1kUsotUSMil5gP2VXVdYWNrqvqRl2HYbjKNQrqeBEAAPlFEUUxRJIkcRxFRTW4AMwGotUKCJ3Nh2w+BoCiYQyVBhiECiZbKAIJCMDU+xycPybIcBNriLqyhA+ACw8yXMUCoxT5iMAa7osx+BT6zWBSK4fgIQQo8im3BUbfvBBezjfFV6Q+Ga0yVREn4SIm7HOm5N4Gs4y6wzLuW8H9YmZBKaFMImOzjDHmWuQIyaiQvTnA8Gq5ToWUuW6qKNmLQMrzvStpZsUU8XIdAXLy3pWUiFybLj5SiN8W6joChYTEhMHcb63tCBRyrA6vFOXUYEf2iuFfC3R1alpcmmNifD0IKdkpNfMD7VrS4/oehzw9iLBrs9oE/iskHI8Zgn3tIr53Ubw/PyFnWvIBMf8EBPaa/h2Ce+3UNvGW+C9B8nMQ7m37LQgP/2f4vZK79yo435PH/JK1SzxB+Lk3WxbebOtE7p0Z2fezww+pGXBi2vcUh9XcLj+8T55vJ4bA12NyVM0EEfYQPbhR+Ps56obIV2eT+6HW8ntip9EbHY/i8Cm6QomL2ihJ0nmwWNGzfETzJKqalpWjWRiPQH7gAeZJ3Jk+FySbZhzhjq8DghIQoySjs2vxStnHgToKEJOXZJ7vMzfl7BUECxNDQ3QuvELmeWvf4MeRYbR8Y9gFwjG22DVxWS2mh4aQd7OCgqAte+ZpWFvoh5asnFbGm2RhCq2LjVGWo5Suhn5AHV9+EmZqqOU1mIc4FgFSVAs9JemSZbIUE3QqzrwVYCVBCvQ0W/Zu6Lu0b7u4m2/g4wgRutG+zVnYGlu74qyXtZDJFLEzol1lLELQFXvtTCBgnBVFM/sKsMRVDZZYt86hZ2vGOnOY2Va7AHPeIMGZfLJ15ZA6jDX4fa8UWHz41fcAsISd1w3uqkEIvKiQrxgvLOiBiw/LwTsLQMEHokRAmPAH3uowRR/Tl6YAAAAASUVORK5CYII=","u":""},{"id":"3","e":1,"w":64,"h":168,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACoCAMAAABnoBgDAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABRUExURUdwTI60532v7H6w7X6w7X6w7H6w7X6u632v7ISy6svLyz5/0H2v632v68LHzDx+0MnJy8rKyjt/z8vLy8nJyX+w7cvLyz5/0KK83oyv22GSz9D6oqIAAAAVdFJOUwAQgJ+579skZUcqzZCg8Yyiez3JkLnlnz4AAAJPSURBVGje5ZjrTuswEAYdXzZ26qSFYkJ5/wcFeuBIpXG0zigCif2/07U1n7eKMb+1uhSz89dyNvaNzdFJuSnf0p58uSvR/7gNpQBAJ2W51BNU+ov6FmUvQNQCPAWMFUCmAKcF2ApALULcC6A2KVGT+t0AiYZBbVKoACwNg6Nh8BQgNAyBhqF01OWeAhINQ6QuWwrQmtQValKgJgk1SahJnpo0UpMyNclSQDUMmYbBU4DQMAgNQ6GrRW2S7AaINAyRhiHTMDgaBk/DIBRQaBi0IvT7ARINQ4SrRb0ehZrkqUmemlRNU6Bh0K7HSE2K1KRETaq7bCnA0TB4GgahYQgUUGgYtCaN1KRMTbIUUA9DpmFwFCA0DEpA/X9WoWnSmiT7ASINQ6RhyBTgaBg8DYNQQKBhUK7Hnqq4Akg0DBGuFu16FGqSpyZ5atJITbLUpEhNitSkRE1acdlSgKOrxdM0CQ0DBhQaBqVJIzUpU5MsBayEIVOAo2kSGgYMKDQMSpMCBQhVUahJnpo0UpMyfdQsNWklDIECdOsxURXXAOmnJxD6omxa8JeX/zUNbS/Ke+vzbQ363XT53nst7Uf66Xm5ztqP9KcK4KQFDBXAg4EjDAaO0Bk2wlnfvzzCqQFgHhYAqQWw5MJg2Ajnpv6FEZ7aAPf3ODQCzPm2f2rtN8OETnB3j0M74OYQpw39pv88xDRtG+D9efzovszz/LppgOs1TK/zRx3MVsJl/lfdVsLhE3D8ccDhDwOO9BIfKeDrDL1hI2y+gq9beAQA0x+Pi/1vhq86U19TQfcAAAAASUVORK5CYII=","u":""},{"id":"4","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""},{"id":"5","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""}]} \ No newline at end of file +{"ddd":0,"h":550,"w":550,"meta":{"g":"@lottiefiles/toolkit-js 0.57.2-beta.0","tc":"#172b4c"},"layers":[{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"207","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[210,210]},"s":{"a":0,"k":[130,130,92.857]},"p":{"a":0,"k":[275.5,280.5,0]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"1","ind":1},{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"115","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[61.5,60.5]},"s":{"a":0,"k":[100,100]},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[424,88,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[426,76,0],"t":40},{"s":[424,88,0],"t":81}],"x":"var $bm_rt;\n$bm_rt = transform.position;"},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[10],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"2","ind":2},{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"116","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[34,34.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[159.75,367.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[12],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"3","ind":3},{"ty":2,"sr":1,"st":0,"op":82,"ip":0,"ln":"117","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[32,84]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[157.5,368.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-7],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[3],"t":40},{"s":[-7],"t":82}]},"o":{"a":0,"k":100}},"refId":"4","ind":4},{"ty":2,"sr":1,"st":0,"op":15,"ip":0,"ln":"118","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":5},{"ty":2,"sr":1,"st":15,"op":21,"ip":15,"ln":"119","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"6","ind":6},{"ty":2,"sr":1,"st":21,"op":55,"ip":21,"ln":"120","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":7},{"ty":2,"sr":1,"st":49,"op":61,"ip":55,"ln":"121","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"6","ind":8},{"ty":2,"sr":1,"st":72,"op":82,"ip":61,"ln":"122","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":9}],"v":"5.7.0","fr":25,"op":82,"ip":0,"assets":[{"id":"1","e":1,"w":420,"h":420,"p":"data:image/png;base64,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","u":""},{"id":"2","e":1,"w":123,"h":121,"p":"data:image/png;base64,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","u":""},{"id":"3","e":1,"w":68,"h":69,"p":"data:image/png;base64,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","u":""},{"id":"4","e":1,"w":64,"h":168,"p":"data:image/png;base64,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","u":""},{"id":"5","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""},{"id":"6","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""}]} \ No newline at end of file diff --git a/core/designsystem/src/main/res/raw/mission_letter_open.json b/core/designsystem/src/main/res/raw/mission_letter_open.json new file mode 100644 index 00000000..0e60c6cc --- /dev/null +++ b/core/designsystem/src/main/res/raw/mission_letter_open.json @@ -0,0 +1 @@ +{"assets":[{"id":"el-151-_-Uo","layers":[{"ddd":0,"ind":17,"ty":4,"nm":"Layer 1","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]},{"id":"el-159-_-Uo","layers":[{"ddd":0,"ind":28,"ty":4,"nm":"Layer 1","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]}],"ddd":0,"fr":30,"h":375,"ip":0,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":16.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.543,187.398],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[187.541,187.403],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[187.535,187.399],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[187.544,187.696],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[187.589,191.314],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[187.605,198.909],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[187.577,204.509],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[187.545,213.621],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":30,"s":[187.546,231.124],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[187.547,248.964],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[187.547,239.201],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[-3],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":1,"k":[{"t":0,"s":[139.605,139.605],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[139.456,139.456],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[141.715,141.715],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[141.395,141.395],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[141.751,141.751],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[185.454,185.454],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"열리는 부분 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"열리는부분_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[141.098,430.387],[137.967,433.165],[160.276,440.363],[179.5,450.912],[198.531,461.681],[214.947,475.284],[237.458,482.263],[253.681,496.078],[274.977,504.386],[295.325,513.719],[313.913,524.961],[332.245,536.472],[350.484,548.103],[371.89,556.284],[390.387,567.625],[407.438,580.542],[428.209,589.43],[446.946,600.516],[467.385,609.758],[485.394,621.636],[507.224,629.364],[525.353,641.122],[548.241,650.271],[574.168,649.805],[599.129,643.257],[617.635,632.722],[636.813,622.909],[655.825,612.925],[673.199,601.139],[690.84,589.656],[712.182,582.204],[730.909,571.895],[746.239,557.889],[767.995,550.889],[784.07,537.695],[805.163,529.974],[824.167,519.97],[841.319,507.957],[863.333,501.226],[878.138,486.647],[900.613,480.425],[918.778,469.501],[935.747,457.276],[955.017,447.554],[976.092,439.804],[969.444,428.987],[946.436,426.321],[923.428,427.735],[900.419,430.125],[877.42,428.393],[854.412,427.495],[831.403,429.581],[808.395,426.095],[785.396,425.954],[762.378,428.188],[739.379,429.729],[716.371,426.159],[693.362,426.66],[670.354,426.936],[647.346,429.736],[624.337,427.516],[601.329,428.294],[578.321,427.057],[555.312,428.669],[532.304,428.513],[509.296,428.273],[486.278,425.423],[463.27,425.558],[440.261,430.436],[417.253,429.015],[394.236,426.738],[371.227,425.564],[348.219,425.063],[325.211,425.126],[302.202,429.694],[279.185,429.213],[256.176,427.375],[233.159,425.678],[210.15,429.093],[187.133,425.635],[163.959,426.116]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,187.819],[132.503,189.032],[153.928,192.173],[172.391,196.777],[190.668,201.476],[206.434,207.412],[228.054,210.458],[243.634,216.487],[264.086,220.112],[283.628,224.185],[301.48,229.091],[319.086,234.115],[336.602,239.19],[357.161,242.76],[374.925,247.709],[391.301,253.347],[411.25,257.225],[429.244,262.063],[448.874,266.096],[466.17,271.28],[487.135,274.652],[504.545,279.783],[526.528,283.776],[551.428,283.572],[575.399,280.715],[593.173,276.118],[611.591,271.835],[629.851,267.478],[646.536,262.335],[663.478,257.324],[683.975,254.072],[701.96,249.573],[716.683,243.461],[737.577,240.406],[753.016,234.648],[773.274,231.279],[791.525,226.913],[807.998,221.671],[829.14,218.733],[843.359,212.371],[864.943,209.656],[882.389,204.888],[898.685,199.553],[917.192,195.311],[937.432,191.929],[931.048,187.208],[908.951,186.045],[886.854,186.662],[864.757,187.705],[842.669,186.949],[820.571,186.557],[798.475,187.467],[776.378,185.946],[754.289,185.885],[732.183,186.86],[710.095,187.532],[687.998,185.974],[665.901,186.193],[643.804,186.313],[621.707,187.535],[599.61,186.566],[577.513,186.906],[555.416,186.366],[533.318,187.069],[511.221,187.001],[489.124,186.897],[467.018,185.653],[444.921,185.712],[422.824,187.841],[400.727,187.221],[378.621,186.227],[356.524,185.715],[334.427,185.496],[312.33,185.524],[290.233,187.517],[268.127,187.307],[246.03,186.505],[223.924,185.764],[201.827,187.255],[179.721,185.746],[157.465,185.955]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,79.805],[132.503,80.321],[153.928,81.655],[172.391,83.611],[190.668,85.608],[206.434,88.13],[228.054,89.424],[243.634,91.986],[264.086,93.527],[283.628,95.257],[301.48,97.342],[319.086,99.476],[336.602,101.633],[357.161,103.15],[374.925,105.253],[391.301,107.648],[411.25,109.296],[429.244,111.352],[448.874,113.065],[466.17,115.268],[487.135,116.701],[504.545,118.881],[526.528,120.578],[551.428,120.491],[575.399,119.277],[593.173,117.324],[611.591,115.504],[629.851,113.653],[646.536,111.467],[663.478,109.338],[683.975,107.956],[701.96,106.045],[716.683,103.448],[737.577,102.15],[753.016,99.703],[773.274,98.272],[791.525,96.416],[807.998,94.189],[829.14,92.941],[843.359,90.237],[864.943,89.084],[882.389,87.058],[898.685,84.791],[917.192,82.988],[937.432,81.552],[931.048,79.546],[908.951,79.051],[886.854,79.314],[864.757,79.757],[842.669,79.436],[820.571,79.269],[798.475,79.656],[776.378,79.009],[754.289,78.983],[732.183,79.398],[710.095,79.683],[687.998,79.021],[665.901,79.114],[643.804,79.165],[621.707,79.685],[599.61,79.273],[577.513,79.417],[555.416,79.188],[533.318,79.487],[511.221,79.458],[489.124,79.413],[467.018,78.885],[444.921,78.91],[422.824,79.814],[400.727,79.551],[378.621,79.129],[356.524,78.911],[334.427,78.818],[312.33,78.83],[290.233,79.677],[268.127,79.588],[246.03,79.247],[223.924,78.932],[201.827,79.565],[179.721,78.924],[157.465,79.013]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,41.767],[132.503,42.037],[153.928,42.735],[172.391,43.759],[190.668,44.804],[206.434,46.124],[228.054,46.801],[243.634,48.142],[264.086,48.948],[283.628,49.854],[301.48,50.945],[319.086,52.062],[336.602,53.191],[357.161,53.985],[374.925,55.085],[391.301,56.339],[411.25,57.201],[429.244,58.277],[448.874,59.174],[466.17,60.327],[487.135,61.077],[504.545,62.218],[526.528,63.106],[551.428,63.06],[575.399,62.425],[593.173,61.403],[611.591,60.45],[629.851,59.481],[646.536,58.338],[663.478,57.223],[683.975,56.5],[701.96,55.5],[716.683,54.14],[737.577,53.461],[753.016,52.181],[773.274,51.431],[791.525,50.461],[807.998,49.295],[829.14,48.642],[843.359,47.227],[864.943,46.623],[882.389,45.563],[898.685,44.376],[917.192,43.433],[937.432,42.681],[931.048,41.631],[908.951,41.372],[886.854,41.51],[864.757,41.742],[842.669,41.573],[820.571,41.486],[798.475,41.689],[776.378,41.35],[754.289,41.337],[732.183,41.554],[710.095,41.703],[687.998,41.357],[665.901,41.405],[643.804,41.432],[621.707,41.704],[599.61,41.488],[577.513,41.564],[555.416,41.444],[533.318,41.6],[511.221,41.585],[489.124,41.562],[467.018,41.285],[444.921,41.298],[422.824,41.772],[400.727,41.634],[378.621,41.413],[356.524,41.299],[334.427,41.25],[312.33,41.256],[290.233,41.7],[268.127,41.653],[246.03,41.475],[223.924,41.31],[201.827,41.641],[179.721,41.306],[157.465,41.353]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,164.924],[132.503,165.989],[153.928,168.747],[172.391,172.789],[190.668,176.916],[206.434,182.128],[228.054,184.803],[243.634,190.097],[264.086,193.28],[283.628,196.857],[301.48,201.165],[319.086,205.576],[336.602,210.033],[357.161,213.167],[374.925,217.513],[391.301,222.463],[411.25,225.869],[429.244,230.117],[448.874,233.659],[466.17,238.21],[487.135,241.172],[504.545,245.677],[526.528,249.183],[551.428,249.005],[575.399,246.496],[593.173,242.459],[611.591,238.698],[629.851,234.872],[646.536,230.356],[663.478,225.956],[683.975,223.1],[701.96,219.15],[716.683,213.782],[737.577,211.1],[753.016,206.044],[773.274,203.086],[791.525,199.252],[807.998,194.649],[829.14,192.069],[843.359,186.482],[864.943,184.098],[882.389,179.912],[898.685,175.228],[917.192,171.502],[937.432,168.533],[931.048,164.387],[908.951,163.366],[886.854,163.908],[864.757,164.824],[842.669,164.16],[820.571,163.816],[798.475,164.615],[776.378,163.279],[754.289,163.225],[732.183,164.081],[710.095,164.672],[687.998,163.304],[665.901,163.496],[643.804,163.602],[621.707,164.675],[599.61,163.824],[577.513,164.122],[555.416,163.648],[533.318,164.265],[511.221,164.206],[489.124,164.114],[467.018,163.022],[444.921,163.073],[422.824,164.943],[400.727,164.398],[378.621,163.526],[356.524,163.076],[334.427,162.884],[312.33,162.908],[290.233,164.658],[268.127,164.474],[246.03,163.77],[223.924,163.119],[201.827,164.428],[179.721,163.103],[157.465,163.287]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[123.934,148.774],[121.185,149.735],[140.78,152.223],[157.665,155.869],[174.381,159.592],[188.801,164.294],[208.573,166.706],[222.823,171.482],[241.528,174.354],[259.401,177.58],[275.728,181.466],[291.83,185.445],[307.85,189.466],[326.653,192.294],[342.899,196.214],[357.877,200.679],[376.121,203.752],[392.578,207.584],[410.532,210.778],[426.35,214.884],[445.524,217.556],[461.448,221.62],[481.552,224.783],[504.325,224.622],[526.249,222.358],[542.504,218.717],[559.35,215.324],[576.049,211.873],[591.31,207.799],[606.804,203.83],[625.55,201.254],[641.999,197.69],[655.464,192.848],[674.574,190.429],[688.694,185.868],[707.221,183.199],[723.913,179.741],[738.979,175.588],[758.315,173.262],[771.32,168.222],[791.06,166.071],[807.016,162.295],[821.92,158.069],[838.846,154.708],[857.358,152.03],[851.519,148.29],[831.309,147.369],[811.1,147.858],[790.89,148.684],[770.689,148.085],[750.479,147.775],[730.27,148.495],[710.06,147.291],[689.858,147.242],[669.641,148.014],[649.439,148.547],[629.23,147.313],[609.02,147.486],[588.811,147.581],[568.601,148.549],[548.392,147.782],[528.182,148.051],[507.973,147.623],[487.763,148.18],[467.553,148.126],[447.344,148.043],[427.126,147.058],[406.917,147.105],[386.707,148.791],[366.497,148.3],[346.28,147.513],[326.07,147.107],[305.861,146.934],[285.651,146.956],[265.442,148.535],[245.224,148.368],[225.014,147.733],[204.797,147.146],[184.587,148.327],[164.369,147.132],[144.014,147.298]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":10.96}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-578.404,-631.493],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[-557.029,-537.667],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-534.968,-234.636],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[-534.968,-99.698],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[-534.968,-52.178],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-534.968,-206.034],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-489.271,-185.858],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"열리는부분_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[141.098,430.387],[137.967,433.165],[160.276,440.363],[179.5,450.912],[198.531,461.681],[214.947,475.284],[237.458,482.263],[253.681,496.078],[274.977,504.386],[295.325,513.719],[313.913,524.961],[332.245,536.472],[350.484,548.103],[371.89,556.284],[390.387,567.625],[407.438,580.542],[428.209,589.43],[446.946,600.516],[467.385,609.758],[485.394,621.636],[507.224,629.364],[525.353,641.122],[548.241,650.271],[574.168,649.805],[599.129,643.257],[617.635,632.722],[636.813,622.909],[655.825,612.925],[673.199,601.139],[690.84,589.656],[712.182,582.204],[730.909,571.895],[746.239,557.889],[767.995,550.889],[784.07,537.695],[805.163,529.974],[824.167,519.97],[841.319,507.957],[863.333,501.226],[878.138,486.647],[900.613,480.425],[918.778,469.501],[935.747,457.276],[955.017,447.554],[976.092,439.804],[969.444,428.987],[946.436,426.321],[923.428,427.735],[900.419,430.125],[877.42,428.393],[854.412,427.495],[831.403,429.581],[808.395,426.095],[785.396,425.954],[762.378,428.188],[739.379,429.729],[716.371,426.159],[693.362,426.66],[670.354,426.936],[647.346,429.736],[624.337,427.516],[601.329,428.294],[578.321,427.057],[555.312,428.669],[532.304,428.513],[509.296,428.273],[486.278,425.423],[463.27,425.558],[440.261,430.436],[417.253,429.015],[394.236,426.738],[371.227,425.564],[348.219,425.063],[325.211,425.126],[302.202,429.694],[279.185,429.213],[256.176,427.375],[233.159,425.678],[210.15,429.093],[187.133,425.635],[163.959,426.116]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,187.819],[132.503,189.032],[153.928,192.173],[172.391,196.777],[190.668,201.476],[206.434,207.412],[228.054,210.458],[243.634,216.487],[264.086,220.112],[283.628,224.185],[301.48,229.091],[319.086,234.115],[336.602,239.19],[357.161,242.76],[374.925,247.709],[391.301,253.347],[411.25,257.225],[429.244,262.063],[448.874,266.096],[466.17,271.28],[487.135,274.652],[504.545,279.783],[526.528,283.776],[551.428,283.572],[575.399,280.715],[593.173,276.118],[611.591,271.835],[629.851,267.478],[646.536,262.335],[663.478,257.324],[683.975,254.072],[701.96,249.573],[716.683,243.461],[737.577,240.406],[753.016,234.648],[773.274,231.279],[791.525,226.913],[807.998,221.671],[829.14,218.733],[843.359,212.371],[864.943,209.656],[882.389,204.888],[898.685,199.553],[917.192,195.311],[937.432,191.929],[931.048,187.208],[908.951,186.045],[886.854,186.662],[864.757,187.705],[842.669,186.949],[820.571,186.557],[798.475,187.467],[776.378,185.946],[754.289,185.885],[732.183,186.86],[710.095,187.532],[687.998,185.974],[665.901,186.193],[643.804,186.313],[621.707,187.535],[599.61,186.566],[577.513,186.906],[555.416,186.366],[533.318,187.069],[511.221,187.001],[489.124,186.897],[467.018,185.653],[444.921,185.712],[422.824,187.841],[400.727,187.221],[378.621,186.227],[356.524,185.715],[334.427,185.496],[312.33,185.524],[290.233,187.517],[268.127,187.307],[246.03,186.505],[223.924,185.764],[201.827,187.255],[179.721,185.746],[157.465,185.955]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,79.805],[132.503,80.321],[153.928,81.655],[172.391,83.611],[190.668,85.608],[206.434,88.13],[228.054,89.424],[243.634,91.986],[264.086,93.527],[283.628,95.257],[301.48,97.342],[319.086,99.476],[336.602,101.633],[357.161,103.15],[374.925,105.253],[391.301,107.648],[411.25,109.296],[429.244,111.352],[448.874,113.065],[466.17,115.268],[487.135,116.701],[504.545,118.881],[526.528,120.578],[551.428,120.491],[575.399,119.277],[593.173,117.324],[611.591,115.504],[629.851,113.653],[646.536,111.467],[663.478,109.338],[683.975,107.956],[701.96,106.045],[716.683,103.448],[737.577,102.15],[753.016,99.703],[773.274,98.272],[791.525,96.416],[807.998,94.189],[829.14,92.941],[843.359,90.237],[864.943,89.084],[882.389,87.058],[898.685,84.791],[917.192,82.988],[937.432,81.552],[931.048,79.546],[908.951,79.051],[886.854,79.314],[864.757,79.757],[842.669,79.436],[820.571,79.269],[798.475,79.656],[776.378,79.009],[754.289,78.983],[732.183,79.398],[710.095,79.683],[687.998,79.021],[665.901,79.114],[643.804,79.165],[621.707,79.685],[599.61,79.273],[577.513,79.417],[555.416,79.188],[533.318,79.487],[511.221,79.458],[489.124,79.413],[467.018,78.885],[444.921,78.91],[422.824,79.814],[400.727,79.551],[378.621,79.129],[356.524,78.911],[334.427,78.818],[312.33,78.83],[290.233,79.677],[268.127,79.588],[246.03,79.247],[223.924,78.932],[201.827,79.565],[179.721,78.924],[157.465,79.013]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,41.767],[132.503,42.037],[153.928,42.735],[172.391,43.759],[190.668,44.804],[206.434,46.124],[228.054,46.801],[243.634,48.142],[264.086,48.948],[283.628,49.854],[301.48,50.945],[319.086,52.062],[336.602,53.191],[357.161,53.985],[374.925,55.085],[391.301,56.339],[411.25,57.201],[429.244,58.277],[448.874,59.174],[466.17,60.327],[487.135,61.077],[504.545,62.218],[526.528,63.106],[551.428,63.06],[575.399,62.425],[593.173,61.403],[611.591,60.45],[629.851,59.481],[646.536,58.338],[663.478,57.223],[683.975,56.5],[701.96,55.5],[716.683,54.14],[737.577,53.461],[753.016,52.181],[773.274,51.431],[791.525,50.461],[807.998,49.295],[829.14,48.642],[843.359,47.227],[864.943,46.623],[882.389,45.563],[898.685,44.376],[917.192,43.433],[937.432,42.681],[931.048,41.631],[908.951,41.372],[886.854,41.51],[864.757,41.742],[842.669,41.573],[820.571,41.486],[798.475,41.689],[776.378,41.35],[754.289,41.337],[732.183,41.554],[710.095,41.703],[687.998,41.357],[665.901,41.405],[643.804,41.432],[621.707,41.704],[599.61,41.488],[577.513,41.564],[555.416,41.444],[533.318,41.6],[511.221,41.585],[489.124,41.562],[467.018,41.285],[444.921,41.298],[422.824,41.772],[400.727,41.634],[378.621,41.413],[356.524,41.299],[334.427,41.25],[312.33,41.256],[290.233,41.7],[268.127,41.653],[246.03,41.475],[223.924,41.31],[201.827,41.641],[179.721,41.306],[157.465,41.353]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,164.924],[132.503,165.989],[153.928,168.747],[172.391,172.789],[190.668,176.916],[206.434,182.128],[228.054,184.803],[243.634,190.097],[264.086,193.28],[283.628,196.857],[301.48,201.165],[319.086,205.576],[336.602,210.033],[357.161,213.167],[374.925,217.513],[391.301,222.463],[411.25,225.869],[429.244,230.117],[448.874,233.659],[466.17,238.21],[487.135,241.172],[504.545,245.677],[526.528,249.183],[551.428,249.005],[575.399,246.496],[593.173,242.459],[611.591,238.698],[629.851,234.872],[646.536,230.356],[663.478,225.956],[683.975,223.1],[701.96,219.15],[716.683,213.782],[737.577,211.1],[753.016,206.044],[773.274,203.086],[791.525,199.252],[807.998,194.649],[829.14,192.069],[843.359,186.482],[864.943,184.098],[882.389,179.912],[898.685,175.228],[917.192,171.502],[937.432,168.533],[931.048,164.387],[908.951,163.366],[886.854,163.908],[864.757,164.824],[842.669,164.16],[820.571,163.816],[798.475,164.615],[776.378,163.279],[754.289,163.225],[732.183,164.081],[710.095,164.672],[687.998,163.304],[665.901,163.496],[643.804,163.602],[621.707,164.675],[599.61,163.824],[577.513,164.122],[555.416,163.648],[533.318,164.265],[511.221,164.206],[489.124,164.114],[467.018,163.022],[444.921,163.073],[422.824,164.943],[400.727,164.398],[378.621,163.526],[356.524,163.076],[334.427,162.884],[312.33,162.908],[290.233,164.658],[268.127,164.474],[246.03,163.77],[223.924,163.119],[201.827,164.428],[179.721,163.103],[157.465,163.287]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[123.934,148.774],[121.185,149.735],[140.78,152.223],[157.665,155.869],[174.381,159.592],[188.801,164.294],[208.573,166.706],[222.823,171.482],[241.528,174.354],[259.401,177.58],[275.728,181.466],[291.83,185.445],[307.85,189.466],[326.653,192.294],[342.899,196.214],[357.877,200.679],[376.121,203.752],[392.578,207.584],[410.532,210.778],[426.35,214.884],[445.524,217.556],[461.448,221.62],[481.552,224.783],[504.325,224.622],[526.249,222.358],[542.504,218.717],[559.35,215.324],[576.049,211.873],[591.31,207.799],[606.804,203.83],[625.55,201.254],[641.999,197.69],[655.464,192.848],[674.574,190.429],[688.694,185.868],[707.221,183.199],[723.913,179.741],[738.979,175.588],[758.315,173.262],[771.32,168.222],[791.06,166.071],[807.016,162.295],[821.92,158.069],[838.846,154.708],[857.358,152.03],[851.519,148.29],[831.309,147.369],[811.1,147.858],[790.89,148.684],[770.689,148.085],[750.479,147.775],[730.27,148.495],[710.06,147.291],[689.858,147.242],[669.641,148.014],[649.439,148.547],[629.23,147.313],[609.02,147.486],[588.811,147.581],[568.601,148.549],[548.392,147.782],[528.182,148.051],[507.973,147.623],[487.763,148.18],[467.553,148.126],[447.344,148.043],[427.126,147.058],[406.917,147.105],[386.707,148.791],[366.497,148.3],[346.28,147.513],[326.07,147.107],[305.861,146.934],[285.651,146.956],[265.442,148.535],[245.224,148.368],[225.014,147.733],[204.797,147.146],[184.587,148.327],[164.369,147.132],[144.014,147.298]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-578.404,-631.493],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[-557.029,-537.667],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-534.968,-234.636],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[-534.968,-99.698],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[-534.968,-52.178],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-534.968,-206.034],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-489.271,-185.858],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[0,-112.605],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,-49.14],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[0,-20.88],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[0,-15.193],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,-43.15],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,-38.925],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[100],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[0.832,-26.592],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[0.797,-29.327],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[-0.179,-57.637],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[0.737,-57.637],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[0.737,-55.475],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[0.737,-57.711],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[0.737,-56.813],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[0.737,-50.611],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[0.674,-45.655],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"센터_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,1101.741],[929.439,1096.691],[907.395,1082.518],[889.392,1063.817],[871.654,1044.831],[857.321,1022.01],[835.011,1008.132],[820.934,985.036],[800.234,969.354],[780.754,952.304],[763.592,932.673],[746.738,912.681],[730.035,892.518],[709.167,877.026],[692.119,857.262],[676.954,835.371],[656.944,818.92],[639.577,799.498],[619.991,782.563],[603.571,762.068],[582.164,747.173],[565.593,726.849],[544.884,711.148],[519.454,711.831],[496.013,723.944],[477.842,743.452],[458.795,761.982],[439.97,780.75],[423.293,801.938],[406.254,822.717],[384.387,838.068],[365.932,857.262],[351.917,881.45],[329.511,896.192],[314.523,919.279],[292.974,934.989],[274.166,953.776],[257.764,975.277],[235.021,989.649],[221.696,1014.616],[198.343,1028.304],[180.623,1048.325],[164.477,1070.12],[145.315,1088.536],[149.295,1109.44],[174.354,1103.877],[199.413,1107.949],[224.464,1105.785],[249.523,1102.14],[274.573,1104.788],[299.624,1106.155],[324.683,1102.975],[349.733,1108.301],[374.793,1108.509],[399.843,1105.101],[424.902,1102.747],[449.962,1108.196],[475.012,1107.427],[500.071,1107],[525.13,1102.738],[550.19,1106.127],[575.24,1104.94],[600.299,1106.82],[625.359,1104.361],[650.418,1104.608],[675.477,1104.969],[700.537,1109.316],[725.587,1109.117],[750.646,1101.665],[775.706,1103.839],[800.765,1107.304],[825.824,1109.098],[850.892,1109.867],[875.951,1109.772],[900.816,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,967.437],[929.439,963.003],[907.395,950.558],[889.392,934.136],[871.654,917.465],[857.321,897.426],[835.011,885.239],[820.934,864.959],[800.234,851.188],[780.754,836.217],[763.592,818.979],[746.738,801.424],[730.035,783.719],[709.167,770.115],[692.119,752.761],[676.954,733.539],[656.944,719.093],[639.577,702.038],[619.991,687.167],[603.571,669.171],[582.164,656.092],[565.593,638.245],[544.884,624.458],[519.454,625.058],[496.013,635.695],[477.842,652.824],[458.795,669.096],[439.97,685.575],[423.293,704.18],[406.254,722.427],[384.387,735.906],[365.932,752.761],[351.917,774],[329.511,786.945],[314.523,807.218],[292.974,821.013],[274.166,837.509],[257.764,856.39],[235.021,869.01],[221.696,890.933],[198.343,902.953],[180.623,920.533],[164.477,939.671],[145.315,955.842],[149.295,974.198],[174.354,969.313],[199.413,972.889],[224.464,970.988],[249.523,967.787],[274.573,970.113],[299.624,971.313],[324.683,968.521],[349.733,973.197],[374.793,973.381],[399.843,970.388],[424.902,968.321],[449.962,973.106],[475.012,972.43],[500.071,972.055],[525.13,968.313],[550.19,971.288],[575.24,970.246],[600.299,971.897],[625.359,969.738],[650.418,969.955],[675.477,970.271],[700.537,974.089],[725.587,973.914],[750.646,967.371],[775.706,969.28],[800.765,972.322],[825.824,973.897],[850.892,974.573],[875.951,974.489],[900.816,968.379]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[846.974,872.704],[850.047,868.704],[829.886,857.477],[813.421,842.664],[797.198,827.625],[784.089,809.549],[763.685,798.555],[750.811,780.26],[731.879,767.838],[714.063,754.333],[698.366,738.783],[682.952,722.947],[667.676,706.976],[648.59,694.704],[632.998,679.049],[619.129,661.709],[600.828,648.678],[584.945,633.293],[567.032,619.879],[552.015,603.644],[532.436,591.846],[517.281,575.747],[498.341,563.31],[475.082,563.851],[453.644,573.446],[437.025,588.899],[419.605,603.577],[402.388,618.442],[387.136,635.226],[371.552,651.686],[351.553,663.845],[334.675,679.049],[321.857,698.208],[301.364,709.886],[287.657,728.173],[267.948,740.618],[250.747,755.499],[235.746,772.53],[214.946,783.915],[202.759,803.691],[181.401,814.534],[165.194,830.392],[150.427,847.657],[132.903,862.245],[136.542,878.802],[159.461,874.396],[182.379,877.622],[205.29,875.907],[228.209,873.02],[251.119,875.118],[274.03,876.201],[296.949,873.682],[319.859,877.9],[342.778,878.065],[365.689,875.366],[388.607,873.501],[411.526,877.818],[434.437,877.208],[457.356,876.87],[480.274,873.494],[503.193,876.178],[526.104,875.238],[549.022,876.727],[571.941,874.78],[594.86,874.975],[617.779,875.261],[640.697,878.705],[663.608,878.547],[686.527,872.644],[709.445,874.366],[732.364,877.111],[755.283,878.532],[778.21,879.141],[801.128,879.066],[823.869,873.554]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":12.46}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-581.009,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-537.377,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-537.377,-799.515],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-491.475,-721.225],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,1101.741],[929.439,1096.691],[907.395,1082.518],[889.392,1063.817],[871.654,1044.831],[857.321,1022.01],[835.011,1008.132],[820.934,985.036],[800.234,969.354],[780.754,952.304],[763.592,932.673],[746.738,912.681],[730.035,892.518],[709.167,877.026],[692.119,857.262],[676.954,835.371],[656.944,818.92],[639.577,799.498],[619.991,782.563],[603.571,762.068],[582.164,747.173],[565.593,726.849],[544.884,711.148],[519.454,711.831],[496.013,723.944],[477.842,743.452],[458.795,761.982],[439.97,780.75],[423.293,801.938],[406.254,822.717],[384.387,838.068],[365.932,857.262],[351.917,881.45],[329.511,896.192],[314.523,919.279],[292.974,934.989],[274.166,953.776],[257.764,975.277],[235.021,989.649],[221.696,1014.616],[198.343,1028.304],[180.623,1048.325],[164.477,1070.12],[145.315,1088.536],[149.295,1109.44],[174.354,1103.877],[199.413,1107.949],[224.464,1105.785],[249.523,1102.14],[274.573,1104.788],[299.624,1106.155],[324.683,1102.975],[349.733,1108.301],[374.793,1108.509],[399.843,1105.101],[424.902,1102.747],[449.962,1108.196],[475.012,1107.427],[500.071,1107],[525.13,1102.738],[550.19,1106.127],[575.24,1104.94],[600.299,1106.82],[625.359,1104.361],[650.418,1104.608],[675.477,1104.969],[700.537,1109.316],[725.587,1109.117],[750.646,1101.665],[775.706,1103.839],[800.765,1107.304],[825.824,1109.098],[850.892,1109.867],[875.951,1109.772],[900.816,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,967.437],[929.439,963.003],[907.395,950.558],[889.392,934.136],[871.654,917.465],[857.321,897.426],[835.011,885.239],[820.934,864.959],[800.234,851.188],[780.754,836.217],[763.592,818.979],[746.738,801.424],[730.035,783.719],[709.167,770.115],[692.119,752.761],[676.954,733.539],[656.944,719.093],[639.577,702.038],[619.991,687.167],[603.571,669.171],[582.164,656.092],[565.593,638.245],[544.884,624.458],[519.454,625.058],[496.013,635.695],[477.842,652.824],[458.795,669.096],[439.97,685.575],[423.293,704.18],[406.254,722.427],[384.387,735.906],[365.932,752.761],[351.917,774],[329.511,786.945],[314.523,807.218],[292.974,821.013],[274.166,837.509],[257.764,856.39],[235.021,869.01],[221.696,890.933],[198.343,902.953],[180.623,920.533],[164.477,939.671],[145.315,955.842],[149.295,974.198],[174.354,969.313],[199.413,972.889],[224.464,970.988],[249.523,967.787],[274.573,970.113],[299.624,971.313],[324.683,968.521],[349.733,973.197],[374.793,973.381],[399.843,970.388],[424.902,968.321],[449.962,973.106],[475.012,972.43],[500.071,972.055],[525.13,968.313],[550.19,971.288],[575.24,970.246],[600.299,971.897],[625.359,969.738],[650.418,969.955],[675.477,970.271],[700.537,974.089],[725.587,973.914],[750.646,967.371],[775.706,969.28],[800.765,972.322],[825.824,973.897],[850.892,974.573],[875.951,974.489],[900.816,968.379]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[846.974,872.704],[850.047,868.704],[829.886,857.477],[813.421,842.664],[797.198,827.625],[784.089,809.549],[763.685,798.555],[750.811,780.26],[731.879,767.838],[714.063,754.333],[698.366,738.783],[682.952,722.947],[667.676,706.976],[648.59,694.704],[632.998,679.049],[619.129,661.709],[600.828,648.678],[584.945,633.293],[567.032,619.879],[552.015,603.644],[532.436,591.846],[517.281,575.747],[498.341,563.31],[475.082,563.851],[453.644,573.446],[437.025,588.899],[419.605,603.577],[402.388,618.442],[387.136,635.226],[371.552,651.686],[351.553,663.845],[334.675,679.049],[321.857,698.208],[301.364,709.886],[287.657,728.173],[267.948,740.618],[250.747,755.499],[235.746,772.53],[214.946,783.915],[202.759,803.691],[181.401,814.534],[165.194,830.392],[150.427,847.657],[132.903,862.245],[136.542,878.802],[159.461,874.396],[182.379,877.622],[205.29,875.907],[228.209,873.02],[251.119,875.118],[274.03,876.201],[296.949,873.682],[319.859,877.9],[342.778,878.065],[365.689,875.366],[388.607,873.501],[411.526,877.818],[434.437,877.208],[457.356,876.87],[480.274,873.494],[503.193,876.178],[526.104,875.238],[549.022,876.727],[571.941,874.78],[594.86,874.975],[617.779,875.261],[640.697,878.705],[663.608,878.547],[686.527,872.644],[709.445,874.366],[732.364,877.111],[755.283,878.532],[778.21,879.141],[801.128,879.066],[823.869,873.554]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-581.009,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-537.377,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-537.377,-799.515],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-491.475,-721.225],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[1.414,15.889],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[1.355,15.102],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[1.253,15.102],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[1.253,13.261],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[1.146,11.963],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"왼쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,817.411],[477.276,800.219],[451.889,792.264],[431.888,774.902],[408.544,763.368],[387.587,747.667],[365.756,733.494],[344.578,718.173],[325.001,700.041],[303.134,685.944],[279.658,674.648],[259.099,658.244],[234.199,649.444],[214.569,631.408],[194.152,614.738],[171.135,602.645],[149.135,588.747],[128.648,576.814],[128.648,601.154],[125.668,627.953],[123.731,654.751],[127.834,681.549],[129.063,708.357],[131.309,735.155],[127.746,761.954],[128.842,788.762],[126.711,815.56],[126.304,842.368],[128.86,869.166],[126.994,895.964],[126.879,922.763],[130.062,949.57],[125.624,976.378],[127.763,1003.186],[124.775,1029.994],[124.324,1056.802],[124.147,1083.61],[141.708,1094.612],[165.511,1082.594],[185.433,1064.823],[206.195,1048.306],[226.975,1031.798],[248.718,1016.704],[269.577,1000.319],[287.333,979.388],[307.82,962.443],[329.511,947.283],[353.191,935.027],[374.448,919.222],[391.31,896.971],[412.992,881.792],[435.761,868.179],[456.708,851.927],[474.8,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,717.768],[477.276,702.672],[451.889,695.686],[431.888,680.44],[408.544,670.313],[387.587,656.525],[365.756,644.08],[344.578,630.627],[325.001,614.706],[303.134,602.327],[279.658,592.408],[259.099,578.003],[234.199,570.276],[214.569,554.438],[194.152,539.801],[171.135,529.181],[149.135,516.978],[128.648,506.5],[128.648,527.873],[125.668,551.404],[123.731,574.936],[127.834,598.467],[129.063,622.007],[131.309,645.539],[127.746,669.071],[128.842,692.611],[126.711,716.142],[126.304,739.682],[128.86,763.214],[126.994,786.745],[126.879,810.277],[130.062,833.817],[125.624,857.357],[127.763,880.896],[124.775,904.437],[124.324,927.977],[124.147,951.516],[141.708,961.177],[165.511,950.624],[185.433,935.02],[206.195,920.516],[226.975,906.02],[248.718,892.766],[269.577,878.379],[287.333,859.999],[307.82,845.12],[329.511,831.808],[353.191,821.047],[374.448,807.168],[391.31,787.629],[412.992,774.3],[435.761,762.347],[456.708,748.076],[474.8,729.963]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[457.477,647.483],[436.507,633.865],[413.289,627.564],[394.996,613.811],[373.646,604.675],[354.48,592.237],[334.513,581.011],[315.145,568.875],[297.24,554.513],[277.241,543.346],[255.769,534.398],[236.967,521.404],[214.194,514.434],[196.241,500.147],[177.568,486.943],[156.517,477.363],[136.396,466.355],[117.659,456.903],[117.659,476.183],[114.933,497.41],[113.162,518.637],[116.915,539.865],[118.039,561.099],[120.093,582.327],[116.834,603.554],[117.837,624.789],[115.888,646.016],[115.516,667.251],[117.853,688.478],[116.146,709.706],[116.041,730.933],[118.953,752.168],[114.893,773.403],[116.85,794.637],[114.116,815.873],[113.704,837.107],[113.542,858.342],[129.603,867.057],[151.374,857.538],[169.594,843.461],[188.582,830.378],[207.587,817.301],[227.473,805.345],[246.55,792.367],[262.789,775.786],[281.527,762.364],[301.364,750.356],[323.021,740.648],[342.463,728.128],[357.885,710.503],[377.714,698.479],[398.538,687.696],[417.697,674.823],[434.243,658.483]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-337.298,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-311.968,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-311.968,-733.839],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-285.32,-661.98],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,817.411],[477.276,800.219],[451.889,792.264],[431.888,774.902],[408.544,763.368],[387.587,747.667],[365.756,733.494],[344.578,718.173],[325.001,700.041],[303.134,685.944],[279.658,674.648],[259.099,658.244],[234.199,649.444],[214.569,631.408],[194.152,614.738],[171.135,602.645],[149.135,588.747],[128.648,576.814],[128.648,601.154],[125.668,627.953],[123.731,654.751],[127.834,681.549],[129.063,708.357],[131.309,735.155],[127.746,761.954],[128.842,788.762],[126.711,815.56],[126.304,842.368],[128.86,869.166],[126.994,895.964],[126.879,922.763],[130.062,949.57],[125.624,976.378],[127.763,1003.186],[124.775,1029.994],[124.324,1056.802],[124.147,1083.61],[141.708,1094.612],[165.511,1082.594],[185.433,1064.823],[206.195,1048.306],[226.975,1031.798],[248.718,1016.704],[269.577,1000.319],[287.333,979.388],[307.82,962.443],[329.511,947.283],[353.191,935.027],[374.448,919.222],[391.31,896.971],[412.992,881.792],[435.761,868.179],[456.708,851.927],[474.8,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,717.768],[477.276,702.672],[451.889,695.686],[431.888,680.44],[408.544,670.313],[387.587,656.525],[365.756,644.08],[344.578,630.627],[325.001,614.706],[303.134,602.327],[279.658,592.408],[259.099,578.003],[234.199,570.276],[214.569,554.438],[194.152,539.801],[171.135,529.181],[149.135,516.978],[128.648,506.5],[128.648,527.873],[125.668,551.404],[123.731,574.936],[127.834,598.467],[129.063,622.007],[131.309,645.539],[127.746,669.071],[128.842,692.611],[126.711,716.142],[126.304,739.682],[128.86,763.214],[126.994,786.745],[126.879,810.277],[130.062,833.817],[125.624,857.357],[127.763,880.896],[124.775,904.437],[124.324,927.977],[124.147,951.516],[141.708,961.177],[165.511,950.624],[185.433,935.02],[206.195,920.516],[226.975,906.02],[248.718,892.766],[269.577,878.379],[287.333,859.999],[307.82,845.12],[329.511,831.808],[353.191,821.047],[374.448,807.168],[391.31,787.629],[412.992,774.3],[435.761,762.347],[456.708,748.076],[474.8,729.963]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[457.477,647.483],[436.507,633.865],[413.289,627.564],[394.996,613.811],[373.646,604.675],[354.48,592.237],[334.513,581.011],[315.145,568.875],[297.24,554.513],[277.241,543.346],[255.769,534.398],[236.967,521.404],[214.194,514.434],[196.241,500.147],[177.568,486.943],[156.517,477.363],[136.396,466.355],[117.659,456.903],[117.659,476.183],[114.933,497.41],[113.162,518.637],[116.915,539.865],[118.039,561.099],[120.093,582.327],[116.834,603.554],[117.837,624.789],[115.888,646.016],[115.516,667.251],[117.853,688.478],[116.146,709.706],[116.041,730.933],[118.953,752.168],[114.893,773.403],[116.85,794.637],[114.116,815.873],[113.704,837.107],[113.542,858.342],[129.603,867.057],[151.374,857.538],[169.594,843.461],[188.582,830.378],[207.587,817.301],[227.473,805.345],[246.55,792.367],[262.789,775.786],[281.527,762.364],[301.364,750.356],[323.021,740.648],[342.463,728.128],[357.885,710.503],[377.714,698.479],[398.538,687.696],[417.697,674.823],[434.243,658.483]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-337.298,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-311.968,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-311.968,-733.839],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-285.32,-661.98],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-53.049,-0.955],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-50.813,-0.908],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-46.997,-0.908],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-46.997,-0.797],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-42.983,-0.719],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"오른쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,817.364],[587.275,803.741],[610.3,791.657],[629.506,772.899],[653.84,763.112],[675.247,748.189],[695.594,731.415],[719.477,720.831],[741.273,706.601],[760.408,687.701],[781.374,672.009],[804.222,659.63],[825.47,644.413],[847.859,631.218],[869.125,616.039],[891.708,603.176],[913.381,588.719],[936.928,570.796],[932.543,601.467],[938.883,628.588],[934.117,655.71],[931.402,682.84],[938.334,709.961],[933.851,737.082],[936.575,764.203],[932.286,791.334],[936.044,818.455],[934.771,845.576],[936.946,872.697],[939.059,899.818],[932.419,926.949],[936.522,954.07],[936.159,981.201],[938.069,1008.322],[937.875,1035.452],[937.424,1062.583],[932.136,1089.714],[923.709,1099.121],[904.3,1082.736],[883.759,1068.013],[863.165,1053.365],[841.67,1040.028],[822.093,1023.89],[804.558,1004.753],[784.212,989.744],[765.36,972.543],[745.633,956.624],[723.712,943.922],[705.745,925.411],[685.611,910.099],[664.495,896.211],[644.573,880.567],[625.633,863.48],[605.11,848.728],[587.222,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,717.726],[587.275,705.764],[610.3,695.153],[629.506,678.682],[653.84,670.087],[675.247,656.984],[695.594,642.255],[719.477,632.96],[741.273,620.465],[760.408,603.869],[781.374,590.09],[804.222,579.22],[825.47,565.858],[847.859,554.272],[869.125,540.943],[891.708,529.648],[913.381,516.953],[936.928,501.215],[932.543,528.148],[938.883,551.963],[934.117,575.778],[931.402,599.601],[938.334,623.416],[933.851,647.231],[936.575,671.046],[932.286,694.87],[936.044,718.684],[934.771,742.499],[936.946,766.314],[939.059,790.129],[932.419,813.953],[936.522,837.768],[936.159,861.591],[938.069,885.406],[937.875,909.229],[937.424,933.053],[932.136,956.876],[923.709,965.137],[904.3,950.749],[883.759,937.82],[863.165,924.959],[841.67,913.247],[822.093,899.076],[804.558,882.272],[784.212,869.093],[765.36,853.989],[745.633,840.01],[723.712,828.857],[705.745,812.602],[685.611,799.157],[664.495,786.962],[644.573,773.225],[625.633,758.22],[605.11,745.267],[587.222,728.771]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[515.073,647.445],[537.11,636.654],[558.169,627.082],[575.734,612.224],[597.99,604.471],[617.568,592.651],[636.177,579.364],[658.02,570.98],[677.954,559.708],[695.455,544.737],[714.629,532.307],[735.526,522.502],[754.96,510.449],[775.436,499.997],[794.885,487.973],[815.539,477.784],[835.361,466.332],[856.897,452.135],[852.886,476.431],[858.684,497.914],[854.325,519.397],[851.842,540.887],[858.183,562.37],[854.082,583.853],[856.573,605.336],[852.651,626.827],[856.088,648.31],[854.924,669.793],[856.913,691.276],[858.846,712.759],[852.772,734.249],[856.525,755.732],[856.193,777.223],[857.94,798.706],[857.762,820.196],[857.35,841.687],[852.514,863.177],[844.807,870.629],[827.056,857.65],[808.269,845.988],[789.435,834.385],[769.775,823.82],[751.87,811.037],[735.834,795.878],[717.225,783.99],[699.983,770.365],[681.941,757.755],[661.893,747.694],[645.461,733.031],[627.046,720.902],[607.734,709.901],[589.514,697.509],[572.192,683.974],[553.422,672.289],[537.062,657.408]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-812.106,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-751.119,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-751.119,-733.176],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-686.959,-661.382],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,817.364],[587.275,803.741],[610.3,791.657],[629.506,772.899],[653.84,763.112],[675.247,748.189],[695.594,731.415],[719.477,720.831],[741.273,706.601],[760.408,687.701],[781.374,672.009],[804.222,659.63],[825.47,644.413],[847.859,631.218],[869.125,616.039],[891.708,603.176],[913.381,588.719],[936.928,570.796],[932.543,601.467],[938.883,628.588],[934.117,655.71],[931.402,682.84],[938.334,709.961],[933.851,737.082],[936.575,764.203],[932.286,791.334],[936.044,818.455],[934.771,845.576],[936.946,872.697],[939.059,899.818],[932.419,926.949],[936.522,954.07],[936.159,981.201],[938.069,1008.322],[937.875,1035.452],[937.424,1062.583],[932.136,1089.714],[923.709,1099.121],[904.3,1082.736],[883.759,1068.013],[863.165,1053.365],[841.67,1040.028],[822.093,1023.89],[804.558,1004.753],[784.212,989.744],[765.36,972.543],[745.633,956.624],[723.712,943.922],[705.745,925.411],[685.611,910.099],[664.495,896.211],[644.573,880.567],[625.633,863.48],[605.11,848.728],[587.222,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,717.726],[587.275,705.764],[610.3,695.153],[629.506,678.682],[653.84,670.087],[675.247,656.984],[695.594,642.255],[719.477,632.96],[741.273,620.465],[760.408,603.869],[781.374,590.09],[804.222,579.22],[825.47,565.858],[847.859,554.272],[869.125,540.943],[891.708,529.648],[913.381,516.953],[936.928,501.215],[932.543,528.148],[938.883,551.963],[934.117,575.778],[931.402,599.601],[938.334,623.416],[933.851,647.231],[936.575,671.046],[932.286,694.87],[936.044,718.684],[934.771,742.499],[936.946,766.314],[939.059,790.129],[932.419,813.953],[936.522,837.768],[936.159,861.591],[938.069,885.406],[937.875,909.229],[937.424,933.053],[932.136,956.876],[923.709,965.137],[904.3,950.749],[883.759,937.82],[863.165,924.959],[841.67,913.247],[822.093,899.076],[804.558,882.272],[784.212,869.093],[765.36,853.989],[745.633,840.01],[723.712,828.857],[705.745,812.602],[685.611,799.157],[664.495,786.962],[644.573,773.225],[625.633,758.22],[605.11,745.267],[587.222,728.771]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[515.073,647.445],[537.11,636.654],[558.169,627.082],[575.734,612.224],[597.99,604.471],[617.568,592.651],[636.177,579.364],[658.02,570.98],[677.954,559.708],[695.455,544.737],[714.629,532.307],[735.526,522.502],[754.96,510.449],[775.436,499.997],[794.885,487.973],[815.539,477.784],[835.361,466.332],[856.897,452.135],[852.886,476.431],[858.684,497.914],[854.325,519.397],[851.842,540.887],[858.183,562.37],[854.082,583.853],[856.573,605.336],[852.651,626.827],[856.088,648.31],[854.924,669.793],[856.913,691.276],[858.846,712.759],[852.772,734.249],[856.525,755.732],[856.193,777.223],[857.94,798.706],[857.762,820.196],[857.35,841.687],[852.514,863.177],[844.807,870.629],[827.056,857.65],[808.269,845.988],[789.435,834.385],[769.775,823.82],[751.87,811.037],[735.834,795.878],[717.225,783.99],[699.983,770.365],[681.941,757.755],[661.893,747.694],[645.461,733.031],[627.046,720.902],[607.734,709.901],[589.514,697.509],[572.192,683.974],[553.422,672.289],[537.062,657.408]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-812.106,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-751.119,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-751.119,-733.176],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-686.959,-661.382],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"종이_half Group","bm":0,"it":[{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,2.725],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,2.59],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,2.002],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,1.806],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-246.071,25.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-235.697,30.119],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-235.697,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-217.997,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-217.997,9.582],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-199.376,8.644],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[53.059,-1.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[50.822,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[47.005,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[47.005,-0.939],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[42.99,-0.847],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":15,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[53.059,-1.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[50.822,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[47.005,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[47.005,-0.939],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[42.99,-0.847],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":16,"ty":4,"nm":"종이_half","parent":15,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,2.725],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,2.59],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,2.002],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,1.806],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-246.071,25.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-235.697,30.119],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-235.697,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-217.997,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-217.997,9.582],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-199.376,8.644],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":20,"ty":0,"nm":"to","parent":16,"hd":false,"sr":1,"ks":{"a":{"a":0,"k":[38.427,28.464]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-33.946,-41.944],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-32.515,-39.867],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-23.024,-32.813],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[-23.692,-49.423],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-25.624,-61.983],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-18.274,-89.382],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[-18.274,-79.382],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":46.5,"s":[-18.274,-82.382],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"h":56.928199768066406,"refId":"el-151-_-Uo","w":76.85435485839844},{"ddd":0,"ind":21,"ty":4,"nm":"종이_half","parent":15,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,2.725],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,2.59],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,2.002],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,1.806],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-246.071,25.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-235.697,30.119],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-235.697,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-217.997,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-217.997,9.582],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-199.376,8.644],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"종이_half Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[178.726,189.879],[178.692,178.952],[178.851,165.753],[176.987,152.554],[177.7,139.355],[178.929,126.156],[179.148,112.957],[179.03,99.759],[177.146,86.3],[192.092,86.928],[206.778,86.688],[221.465,87.427],[236.152,84.589],[250.82,85.678],[264.631,85.678],[280.196,86.23],[294.883,86.23],[309.569,84.7],[324.256,87.981],[338.807,86.709],[337.618,99.761],[339.184,114.46],[339.184,128.074],[338.809,141.349],[339.184,152.559],[338.57,165.758],[338.809,177.732],[338.65,191.157]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[171.192,180.477],[171.159,170.09],[171.311,157.545],[169.526,145],[170.209,132.455],[171.386,119.909],[171.596,107.364],[171.483,94.819],[169.678,82.027],[183.994,82.623],[198.061,82.396],[212.129,83.098],[226.196,80.4],[240.247,81.435],[253.475,81.435],[268.384,81.96],[282.452,81.96],[296.519,80.506],[310.587,83.625],[324.524,82.415],[323.385,94.821],[324.886,108.792],[324.886,121.732],[324.526,134.35],[324.886,145.005],[324.297,157.55],[324.526,168.931],[324.374,181.691]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[139.412,158.907],[139.386,149.762],[139.51,138.716],[138.056,127.67],[138.612,116.624],[139.571,105.579],[139.741,94.533],[139.649,83.487],[138.18,72.223],[149.838,72.749],[161.294,72.548],[172.75,73.166],[184.206,70.791],[195.648,71.702],[206.421,71.702],[218.562,72.164],[230.018,72.164],[241.474,70.884],[252.93,73.63],[264.28,72.565],[263.353,83.489],[264.575,95.79],[264.575,107.184],[264.282,118.293],[264.575,127.675],[264.096,138.72],[264.282,148.741],[264.158,159.976]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[139.412,139.536],[139.386,131.506],[139.51,121.807],[138.056,112.107],[138.612,102.408],[139.571,92.708],[139.741,83.009],[139.649,73.31],[138.18,63.419],[149.838,63.881],[161.294,63.705],[172.75,64.247],[184.206,62.162],[195.648,62.962],[206.421,62.962],[218.562,63.367],[230.018,63.367],[241.474,62.243],[252.93,64.655],[264.28,63.719],[263.353,73.311],[264.575,84.113],[264.575,94.118],[264.282,103.873],[264.575,112.111],[264.096,121.81],[264.282,130.61],[264.158,140.475]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[128.911,173.198],[128.887,165.954],[127.593,109.879],[126.263,101.129],[126.772,92.38],[127.649,83.63],[127.805,74.881],[127.72,66.131],[126.376,57.209],[137.039,57.625],[147.516,57.466],[157.994,57.956],[168.471,56.075],[178.936,56.797],[188.788,56.797],[199.893,57.162],[210.37,57.162],[220.848,56.148],[231.325,58.324],[241.706,57.48],[240.858,66.133],[241.975,75.876],[241.975,84.902],[241.707,93.701],[241.975,101.133],[241.537,109.882],[243.115,165.145],[243.002,174.044]]}],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":46.5,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[128.911,149.493],[128.887,142.248],[127.593,109.879],[126.263,101.129],[126.772,92.38],[127.649,83.63],[127.805,74.881],[127.72,66.131],[126.376,57.209],[137.039,57.625],[147.516,57.466],[157.994,57.956],[168.471,56.075],[178.936,56.797],[188.788,56.797],[199.893,57.162],[210.37,57.162],[220.848,56.148],[231.325,58.324],[241.706,57.48],[240.858,66.133],[241.975,75.876],[241.975,84.902],[241.707,93.701],[241.975,101.133],[241.537,109.882],[243.115,141.44],[243.002,150.339]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0.048,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0.039,33.27],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0.039,29.214],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0.036,26.353],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0.048,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[0.039,33.27],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[0.039,29.214],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[0.036,26.353],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[258.086,137.873],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[247.206,131.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[201.315,115.384],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[201.315,101.318],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[184.119,91.397],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0,-0.082],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[0,-0.573],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[0,8.301],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[0,-27.835],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[0,-60.706],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[0,-50.706],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":46.5,"s":[0,-53.706],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":24,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[53.059,-1.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[50.822,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[47.005,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[47.005,-0.939],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[42.99,-0.847],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"뒷면bg Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"뒷면bg","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.974,-56.459],[91.974,56.459],[-91.974,56.459],[-91.974,-56.459]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[88.096,-53.664],[88.096,53.664],[-88.096,53.664],[-88.096,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[81.481,-53.664],[81.481,53.664],[-81.481,53.664],[-81.481,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[81.481,-47.122],[81.481,47.122],[-81.481,47.122],[-81.481,-47.122]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[74.521,-42.508],[74.521,42.508],[-74.521,42.508],[-74.521,-42.508]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-250.023,8.152],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-239.483,7.748],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-221.499,-2.252],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-221.499,-0.196],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-202.578,6.137],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":26,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":16.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.543,187.398],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[187.541,187.403],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[187.535,187.399],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[187.544,187.696],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[187.589,191.314],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[187.605,198.909],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[187.577,204.509],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[187.545,213.621],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":30,"s":[187.546,231.124],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[187.547,248.964],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[187.547,239.201],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[-3],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":1,"k":[{"t":0,"s":[139.605,139.605],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[139.456,139.456],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[141.715,141.715],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[141.395,141.395],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[141.751,141.751],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[185.454,185.454],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":27,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":31,"ty":0,"nm":"to","parent":27,"hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.5,28.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[-34,-89.302]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"h":57,"refId":"el-159-_-Uo","w":77},{"ddd":0,"ind":32,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"종이_전체 Group","bm":0,"it":[{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[339.825,284.126],[324.871,284.404],[310.156,284.126],[295.442,283.591],[280.727,283.203],[266.03,285.436],[251.314,286.009],[237.23,286.009],[221.882,285.325],[207.168,284.255],[192.453,285.105],[178.433,284.237],[177.3,271.686],[178.433,258.47],[179.367,245.255],[177.759,232.039],[177.759,220.928],[177.938,205.608],[178.435,192.393],[179.031,179.177],[179.19,165.962],[177.323,152.746],[178.037,139.531],[179.268,126.315],[179.488,113.1],[179.369,99.884],[177.482,86.409],[192.456,87.037],[207.17,86.798],[221.885,87.537],[236.599,84.696],[251.296,85.786],[265.132,85.786],[280.727,86.338],[295.442,86.338],[310.156,84.807],[324.871,88.092],[339.449,86.818],[338.258,99.887],[339.827,114.604],[339.827,128.236],[339.451,141.527],[339.827,152.751],[339.211,165.967],[339.451,177.956],[339.292,192.398],[339.133,205.613],[339.769,218.829],[338.916,232.044],[338.24,245.26],[339.83,260.004],[339.83,284.131]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[258.565,185.352]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,9.931]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":35,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":36,"ty":4,"nm":"뒷면","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[600.945,736.025],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[543.874,666.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[530.625,649.898],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[526.549,644.906],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[526.549,605.871],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[1127.494,1341.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":38.4,"s":[1127.494,1341.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":42.6,"s":[1127.494,1341.896],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[187.817,139.527],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[254.855,223],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[288.103,260.401],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[186.079,150.013],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":20.7,"s":[187.968,157.745],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[187.251,161.749],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[187.493,163.924],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[187.856,172.187],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":30,"s":[300.69,326.133],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[408.801,476.212],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[407.801,465.212],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":42.6,"s":[410.801,468.212],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0.595],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-2],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":38.4,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":42.6,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":1,"k":[{"t":0,"s":[30.328,30.328],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[29.649,29.649],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[30.757,30.757],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[30.429,30.429],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[31.641,31.641],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[32.156,32.156],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[35.4,35.4],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[36.743,36.743],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":38.4,"s":[36.703,36.703],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":42.6,"s":[37.02,37.02],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"sh","hd":false,"nm":"뒷면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1058.32,594.37],[1057.48,622.15],[1057.34,649.5],[1058.3,676.85],[1057.04,704.21],[1059.07,731.56],[1056.29,758.92],[1057.99,786.27],[1057.43,813.63],[1055.89,840.99],[1059.2,868.34],[1057.45,895.69],[1057.22,923.05],[1058.97,950.4],[1056.85,977.76],[1058.41,1005.12],[1056.57,1032.48],[1059.58,1059.84],[1057.82,1087.2],[1058.23,1114.57],[1046.38,1143.91],[1019.81,1158.06],[991.87,1157.56],[963.95,1159.39],[936.02,1158.26],[908.09,1160.52],[880.16,1158.63],[852.23,1160.65],[824.31,1161.22],[796.38,1161.03],[768.44,1158.15],[740.51,1157.24],[712.58,1160.4],[684.65,1158.68],[656.72,1160.43],[628.79,1161.27],[600.86,1157.92],[572.92,1161.33],[544.99,1161.39],[517.06,1160.13],[489.13,1161.39],[461.19,1158.47],[433.26,1161.08],[405.33,1158.52],[377.4,1159.73],[349.46,1160.71],[321.53,1161.44],[293.59,1157.4],[265.66,1161.14],[237.72,1159.04],[209.78,1159.17],[181.84,1160.67],[153.67,1145.14],[142.48,1114.57],[144.38,1087.21],[146,1059.86],[145.06,1032.51],[142.89,1005.15],[142.66,977.8],[146.25,950.44],[142.31,923.09],[142.52,895.73],[145.53,868.37],[142.74,841.02],[143.73,813.67],[145.36,786.31],[144.83,758.96],[142.47,731.6],[145.87,704.24],[142.63,676.88],[146,649.52],[145.79,622.16],[144.5,595],[166.34,578.64],[189.51,563.89],[213.91,551],[235.73,534.22],[258.06,518.2],[281.66,504.11],[304.11,488.29],[326.82,472.84],[350.12,458.29],[373.46,443.82],[395.37,427.17],[417.69,411.13],[441.72,397.68],[464.47,382.29],[487.66,367.58],[511.03,353.12],[534.44,338.72],[556.65,322.51],[585.3,310.61],[616.16,311.53],[644.51,323.23],[668.37,336.94],[691.71,351.43],[713.81,367.79],[737.31,382.03],[760.76,396.36],[783,412.51],[805.26,428.62],[829.47,441.79],[852.31,457.04],[874.08,473.9],[897.34,488.5],[919.09,505.39],[942.45,519.86],[965.45,534.87],[987.69,551.03],[1011.76,564.42],[1034.79,579.38]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[927.301,520.788],[926.565,545.128],[926.442,569.092],[927.284,593.057],[926.179,617.029],[927.958,640.993],[925.522,664.966],[927.012,688.931],[926.521,712.904],[925.172,736.876],[928.072,760.84],[926.539,784.805],[926.337,808.777],[927.87,832.741],[926.013,856.714],[927.38,880.687],[925.768,904.66],[928.405,928.633],[926.863,952.606],[927.222,976.587],[916.839,1002.295],[893.559,1014.693],[869.078,1014.256],[844.614,1015.859],[820.141,1014.868],[795.669,1016.849],[771.197,1015.193],[746.725,1016.963],[722.261,1017.462],[697.789,1017.296],[673.308,1014.772],[648.835,1013.975],[624.363,1016.744],[599.891,1015.237],[575.419,1016.77],[550.946,1017.506],[526.474,1014.571],[501.993,1017.558],[477.521,1017.611],[453.048,1016.507],[428.576,1017.611],[404.095,1015.052],[379.623,1017.339],[355.15,1015.096],[330.678,1016.157],[306.197,1017.015],[281.725,1017.654],[257.244,1014.115],[232.772,1017.392],[208.29,1015.552],[183.809,1015.666],[159.328,1016.98],[134.646,1003.373],[124.841,976.587],[126.506,952.614],[127.925,928.65],[127.102,904.686],[125.2,880.713],[124.999,856.749],[128.144,832.777],[124.692,808.812],[124.876,784.84],[127.513,760.867],[125.069,736.903],[125.936,712.939],[127.365,688.966],[126.9,665.002],[124.832,641.029],[127.811,617.056],[124.973,593.083],[127.925,569.11],[127.741,545.137],[126.611,521.34],[145.747,507.005],[166.049,494.081],[187.428,482.787],[206.547,468.084],[226.112,454.047],[246.791,441.702],[266.462,427.84],[286.36,414.303],[306.775,401.554],[327.226,388.876],[346.424,374.287],[365.98,360.232],[387.035,348.448],[406.969,334.963],[427.288,322.074],[447.765,309.404],[468.277,296.787],[487.737,282.584],[512.84,272.157],[539.88,272.963],[564.72,283.214],[585.626,295.227],[606.077,307.923],[625.441,322.258],[646.032,334.735],[666.579,347.291],[686.065,361.442],[705.569,375.557],[726.782,387.097],[746.795,400.459],[765.87,415.232],[786.25,428.024],[805.308,442.823],[825.776,455.502],[845.928,468.654],[865.415,482.813],[886.505,494.545],[906.684,507.653]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[927.301,489.266],[926.565,512.133],[926.442,534.647],[927.284,557.16],[926.179,579.682],[927.958,602.196],[925.522,624.718],[927.012,647.232],[926.521,669.753],[925.172,692.275],[928.072,714.789],[926.539,737.302],[926.337,759.824],[927.87,782.338],[926.013,804.86],[927.38,827.382],[925.768,849.903],[928.405,872.425],[926.863,894.947],[927.222,917.477],[916.839,941.629],[893.559,953.277],[869.078,952.865],[844.614,954.372],[820.141,953.441],[795.669,955.302],[771.197,953.746],[746.725,955.409],[722.261,955.878],[697.789,955.722],[673.308,953.351],[648.835,952.602],[624.363,955.203],[599.891,953.787],[575.419,955.228],[550.946,955.919],[526.474,953.162],[501.993,955.968],[477.521,956.018],[453.048,954.98],[428.576,956.018],[404.095,953.614],[379.623,955.762],[355.15,953.655],[330.678,954.652],[306.197,955.458],[281.725,956.059],[257.244,952.734],[232.772,955.812],[208.29,954.083],[183.809,954.19],[159.328,955.425],[134.646,942.641],[124.841,917.477],[126.506,894.955],[127.925,872.441],[127.102,849.928],[125.2,827.406],[124.999,804.892],[128.144,782.371],[124.692,759.857],[124.876,737.335],[127.513,714.814],[125.069,692.3],[125.936,669.786],[127.365,647.265],[126.9,624.751],[124.832,602.229],[127.811,579.707],[124.973,557.185],[127.925,534.663],[127.741,512.141],[126.611,489.784],[145.747,476.317],[166.049,464.176],[187.428,453.565],[206.547,439.752],[226.112,426.565],[246.791,414.967],[266.462,401.944],[286.36,389.226],[306.775,377.249],[327.226,365.338],[346.424,351.632],[365.98,338.429],[387.035,327.357],[406.969,314.688],[427.288,302.58],[447.765,290.677],[468.277,278.823],[487.737,265.48],[512.84,255.684],[539.88,256.441],[564.72,266.072],[585.626,277.358],[606.077,289.285],[625.441,302.752],[646.032,314.474],[666.579,326.27],[686.065,339.565],[705.569,352.826],[726.782,363.667],[746.795,376.22],[765.87,390.099],[786.25,402.117],[805.308,416.02],[825.776,427.931],[845.928,440.287],[865.415,453.59],[886.505,464.612],[906.684,476.926]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}}]},{"ddd":0,"ind":37,"ty":4,"nm":"Screen","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[187.5,187.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Screen Group","bm":0,"it":[{"ty":"rc","hd":false,"nm":"Screen","d":1,"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[375,375]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0,0,0]},"r":1,"o":{"a":0,"k":0}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}],"meta":{"g":"@phase-software/lottie-exporter 0.7.0"},"nm":"","op":60,"v":"5.6.0","w":375} \ No newline at end of file diff --git a/core/designsystem/src/main/res/raw/mission_letter_tap.json b/core/designsystem/src/main/res/raw/mission_letter_tap.json new file mode 100644 index 00000000..a308b021 --- /dev/null +++ b/core/designsystem/src/main/res/raw/mission_letter_tap.json @@ -0,0 +1 @@ +{"assets":[{"id":"el-151-_-Uo","layers":[{"ddd":0,"ind":17,"ty":4,"nm":"Layer 1","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]},{"id":"el-159-_-Uo","layers":[{"ddd":0,"ind":28,"ty":4,"nm":"Layer 1","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]}],"ddd":0,"fr":30,"h":375,"ip":0,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,-13.874],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.544,167.891],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":3.9,"s":[187.886,167.899],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[187.506,167.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[186.512,167.921],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[187.542,167.896],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":3.9,"s":[1],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-3],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":0,"k":[140.592,140.592]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"열리는 부분 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"열리는부분_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,406.676],[149.567,409.302],[173.751,416.103],[194.591,426.071],[215.222,436.246],[233.018,449.1],[257.422,455.694],[275.009,468.749],[298.095,476.599],[320.153,485.418],[340.305,496.041],[360.177,506.917],[379.95,517.908],[403.156,525.638],[423.208,536.354],[441.693,548.56],[464.21,556.958],[484.522,567.433],[506.68,576.165],[526.203,587.389],[549.868,594.692],[569.521,605.802],[594.334,614.447],[622.44,614.006],[649.499,607.82],[669.561,597.865],[690.352,588.592],[710.963,579.159],[729.797,568.021],[748.921,557.171],[772.057,550.13],[792.358,540.389],[808.977,527.154],[832.562,520.54],[849.989,508.073],[872.856,500.778],[893.457,491.324],[912.052,479.973],[935.916,473.613],[951.966,459.837],[976.33,453.958],[996.022,443.635],[1014.418,432.084],[1035.308,422.897],[1058.155,415.575],[1050.948,405.353],[1026.006,402.835],[1001.063,404.171],[976.12,406.429],[951.187,404.792],[926.245,403.944],[901.302,405.915],[876.359,402.621],[851.427,402.487],[826.474,404.598],[801.541,406.055],[776.598,402.681],[751.656,403.155],[726.713,403.416],[701.77,406.062],[676.827,403.964],[651.885,404.699],[626.942,403.53],[601.999,405.053],[577.056,404.906],[552.114,404.679],[527.161,401.986],[502.218,402.113],[477.276,406.723],[452.333,405.38],[427.38,403.229],[402.437,402.12],[377.495,401.645],[352.552,401.706],[327.609,406.021],[302.656,405.567],[277.714,403.83],[252.761,402.227],[227.818,405.454],[202.866,402.187],[177.743,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[134.343,406.676],[131.362,409.302],[152.603,416.103],[170.907,426.071],[189.027,436.246],[204.657,449.1],[226.091,455.694],[241.537,468.749],[261.813,476.599],[281.187,485.418],[298.886,496.041],[316.339,506.917],[333.705,517.908],[354.087,525.638],[371.698,536.354],[387.934,548.56],[407.71,556.958],[425.55,567.433],[445.011,576.165],[462.158,587.389],[482.942,594.692],[500.203,605.802],[521.996,614.447],[546.682,614.006],[570.447,607.82],[588.067,597.865],[606.328,588.592],[624.43,579.159],[640.972,568.021],[657.768,557.171],[678.088,550.13],[695.919,540.389],[710.515,527.154],[731.229,520.54],[746.535,508.073],[766.619,500.778],[784.712,491.324],[801.044,479.973],[822.004,473.613],[836.1,459.837],[857.499,453.958],[874.794,443.635],[890.951,432.084],[909.298,422.897],[929.364,415.575],[923.035,405.353],[901.128,402.835],[879.221,404.171],[857.314,406.429],[835.416,404.792],[813.509,403.944],[791.603,405.915],[769.696,402.621],[747.797,402.487],[725.882,404.598],[703.984,406.055],[682.077,402.681],[660.17,403.155],[638.263,403.416],[616.356,406.062],[594.449,403.964],[572.542,404.699],[550.635,403.53],[528.729,405.053],[506.822,404.906],[484.915,404.679],[462.999,401.986],[441.092,402.113],[419.185,406.723],[397.278,405.38],[375.363,403.229],[353.456,402.12],[331.549,401.645],[309.642,401.706],[287.735,406.021],[265.819,405.567],[243.913,403.83],[221.997,402.227],[200.09,405.454],[178.174,402.187],[156.11,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":10.96}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-603.861,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-530.363,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-578.404,-631.493],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"열리는부분_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,406.676],[149.567,409.302],[173.751,416.103],[194.591,426.071],[215.222,436.246],[233.018,449.1],[257.422,455.694],[275.009,468.749],[298.095,476.599],[320.153,485.418],[340.305,496.041],[360.177,506.917],[379.95,517.908],[403.156,525.638],[423.208,536.354],[441.693,548.56],[464.21,556.958],[484.522,567.433],[506.68,576.165],[526.203,587.389],[549.868,594.692],[569.521,605.802],[594.334,614.447],[622.44,614.006],[649.499,607.82],[669.561,597.865],[690.352,588.592],[710.963,579.159],[729.797,568.021],[748.921,557.171],[772.057,550.13],[792.358,540.389],[808.977,527.154],[832.562,520.54],[849.989,508.073],[872.856,500.778],[893.457,491.324],[912.052,479.973],[935.916,473.613],[951.966,459.837],[976.33,453.958],[996.022,443.635],[1014.418,432.084],[1035.308,422.897],[1058.155,415.575],[1050.948,405.353],[1026.006,402.835],[1001.063,404.171],[976.12,406.429],[951.187,404.792],[926.245,403.944],[901.302,405.915],[876.359,402.621],[851.427,402.487],[826.474,404.598],[801.541,406.055],[776.598,402.681],[751.656,403.155],[726.713,403.416],[701.77,406.062],[676.827,403.964],[651.885,404.699],[626.942,403.53],[601.999,405.053],[577.056,404.906],[552.114,404.679],[527.161,401.986],[502.218,402.113],[477.276,406.723],[452.333,405.38],[427.38,403.229],[402.437,402.12],[377.495,401.645],[352.552,401.706],[327.609,406.021],[302.656,405.567],[277.714,403.83],[252.761,402.227],[227.818,405.454],[202.866,402.187],[177.743,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[134.343,406.676],[131.362,409.302],[152.603,416.103],[170.907,426.071],[189.027,436.246],[204.657,449.1],[226.091,455.694],[241.537,468.749],[261.813,476.599],[281.187,485.418],[298.886,496.041],[316.339,506.917],[333.705,517.908],[354.087,525.638],[371.698,536.354],[387.934,548.56],[407.71,556.958],[425.55,567.433],[445.011,576.165],[462.158,587.389],[482.942,594.692],[500.203,605.802],[521.996,614.447],[546.682,614.006],[570.447,607.82],[588.067,597.865],[606.328,588.592],[624.43,579.159],[640.972,568.021],[657.768,557.171],[678.088,550.13],[695.919,540.389],[710.515,527.154],[731.229,520.54],[746.535,508.073],[766.619,500.778],[784.712,491.324],[801.044,479.973],[822.004,473.613],[836.1,459.837],[857.499,453.958],[874.794,443.635],[890.951,432.084],[909.298,422.897],[929.364,415.575],[923.035,405.353],[901.128,402.835],[879.221,404.171],[857.314,406.429],[835.416,404.792],[813.509,403.944],[791.603,405.915],[769.696,402.621],[747.797,402.487],[725.882,404.598],[703.984,406.055],[682.077,402.681],[660.17,403.155],[638.263,403.416],[616.356,406.062],[594.449,403.964],[572.542,404.699],[550.635,403.53],[528.729,405.053],[506.822,404.906],[484.915,404.679],[462.999,401.986],[441.092,402.113],[419.185,406.723],[397.278,405.38],[375.363,403.229],[353.456,402.12],[331.549,401.645],[309.642,401.706],[287.735,406.021],[265.819,405.567],[243.913,403.83],[221.997,402.227],[200.09,405.454],[178.174,402.187],[156.11,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-603.861,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-530.363,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-578.404,-631.493],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,5.274],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,5.274],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,5.274],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0.832,-25.463],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[0.832,-33.732],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[0.731,-33.732],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[0.797,-28.198],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"센터_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1101.741],[1049.132,1096.691],[1024.249,1082.518],[1003.928,1063.817],[983.905,1044.831],[967.726,1022.01],[942.544,1008.132],[926.654,985.036],[903.288,969.354],[881.3,952.304],[861.927,932.673],[842.903,912.681],[824.048,892.518],[800.493,877.026],[781.249,857.262],[764.132,835.371],[741.545,818.92],[721.942,799.498],[699.834,782.563],[681.299,762.068],[657.135,747.173],[638.43,726.849],[615.054,711.148],[586.349,711.831],[559.889,723.944],[539.378,743.452],[517.879,761.982],[496.629,780.75],[477.805,801.938],[458.571,822.717],[433.888,838.068],[413.057,857.262],[397.237,881.45],[371.945,896.192],[355.027,919.279],[330.703,934.989],[309.474,953.776],[290.959,975.277],[265.287,989.649],[250.246,1014.616],[223.886,1028.304],[203.884,1048.325],[185.658,1070.12],[164.029,1088.536],[168.521,1109.44],[196.807,1103.877],[225.093,1107.949],[253.37,1105.785],[281.656,1102.14],[309.933,1104.788],[338.209,1106.155],[366.495,1102.975],[394.772,1108.301],[423.058,1108.509],[451.335,1105.101],[479.621,1102.747],[507.908,1108.196],[536.184,1107.427],[564.47,1107],[592.757,1102.738],[621.043,1106.127],[649.32,1104.94],[677.606,1106.82],[705.892,1104.361],[734.179,1104.608],[762.465,1104.969],[790.751,1109.316],[819.028,1109.117],[847.314,1101.665],[875.601,1103.839],[903.887,1107.304],[932.174,1109.098],[960.47,1109.867],[988.756,1109.772],[1016.823,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[918.108,1101.741],[921.44,1096.691],[899.585,1082.518],[881.737,1063.817],[864.152,1044.831],[849.942,1022.01],[827.825,1008.132],[813.869,985.036],[793.347,969.354],[774.035,952.304],[757.02,932.673],[740.311,912.681],[723.752,892.518],[703.063,877.026],[686.162,857.262],[671.128,835.371],[651.29,818.92],[634.073,799.498],[614.655,782.563],[598.376,762.068],[577.153,747.173],[560.725,726.849],[540.195,711.148],[514.983,711.831],[491.744,723.944],[473.729,743.452],[454.846,761.982],[436.183,780.75],[419.65,801.938],[402.757,822.717],[381.078,838.068],[362.783,857.262],[348.889,881.45],[326.675,896.192],[311.816,919.279],[290.453,934.989],[271.807,953.776],[255.545,975.277],[232.999,989.649],[219.788,1014.616],[196.636,1028.304],[179.069,1048.325],[163.061,1070.12],[144.065,1088.536],[148.01,1109.44],[172.853,1103.877],[197.697,1107.949],[222.532,1105.785],[247.375,1102.14],[272.21,1104.788],[297.045,1106.155],[321.888,1102.975],[346.723,1108.301],[371.567,1108.509],[396.402,1105.101],[421.245,1102.747],[446.089,1108.196],[470.924,1107.427],[495.767,1107],[520.611,1102.738],[545.455,1106.127],[570.289,1104.94],[595.133,1106.82],[619.977,1104.361],[644.82,1104.608],[669.664,1104.969],[694.507,1109.316],[719.342,1109.117],[744.186,1101.665],[769.029,1103.839],[793.873,1107.304],[818.717,1109.098],[843.569,1109.867],[868.412,1109.772],[893.063,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":12.46}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-606.581,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-532.752,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-581.009,-910.507],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1101.741],[1049.132,1096.691],[1024.249,1082.518],[1003.928,1063.817],[983.905,1044.831],[967.726,1022.01],[942.544,1008.132],[926.654,985.036],[903.288,969.354],[881.3,952.304],[861.927,932.673],[842.903,912.681],[824.048,892.518],[800.493,877.026],[781.249,857.262],[764.132,835.371],[741.545,818.92],[721.942,799.498],[699.834,782.563],[681.299,762.068],[657.135,747.173],[638.43,726.849],[615.054,711.148],[586.349,711.831],[559.889,723.944],[539.378,743.452],[517.879,761.982],[496.629,780.75],[477.805,801.938],[458.571,822.717],[433.888,838.068],[413.057,857.262],[397.237,881.45],[371.945,896.192],[355.027,919.279],[330.703,934.989],[309.474,953.776],[290.959,975.277],[265.287,989.649],[250.246,1014.616],[223.886,1028.304],[203.884,1048.325],[185.658,1070.12],[164.029,1088.536],[168.521,1109.44],[196.807,1103.877],[225.093,1107.949],[253.37,1105.785],[281.656,1102.14],[309.933,1104.788],[338.209,1106.155],[366.495,1102.975],[394.772,1108.301],[423.058,1108.509],[451.335,1105.101],[479.621,1102.747],[507.908,1108.196],[536.184,1107.427],[564.47,1107],[592.757,1102.738],[621.043,1106.127],[649.32,1104.94],[677.606,1106.82],[705.892,1104.361],[734.179,1104.608],[762.465,1104.969],[790.751,1109.316],[819.028,1109.117],[847.314,1101.665],[875.601,1103.839],[903.887,1107.304],[932.174,1109.098],[960.47,1109.867],[988.756,1109.772],[1016.823,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[918.108,1101.741],[921.44,1096.691],[899.585,1082.518],[881.737,1063.817],[864.152,1044.831],[849.942,1022.01],[827.825,1008.132],[813.869,985.036],[793.347,969.354],[774.035,952.304],[757.02,932.673],[740.311,912.681],[723.752,892.518],[703.063,877.026],[686.162,857.262],[671.128,835.371],[651.29,818.92],[634.073,799.498],[614.655,782.563],[598.376,762.068],[577.153,747.173],[560.725,726.849],[540.195,711.148],[514.983,711.831],[491.744,723.944],[473.729,743.452],[454.846,761.982],[436.183,780.75],[419.65,801.938],[402.757,822.717],[381.078,838.068],[362.783,857.262],[348.889,881.45],[326.675,896.192],[311.816,919.279],[290.453,934.989],[271.807,953.776],[255.545,975.277],[232.999,989.649],[219.788,1014.616],[196.636,1028.304],[179.069,1048.325],[163.061,1070.12],[144.065,1088.536],[148.01,1109.44],[172.853,1103.877],[197.697,1107.949],[222.532,1105.785],[247.375,1102.14],[272.21,1104.788],[297.045,1106.155],[321.888,1102.975],[346.723,1108.301],[371.567,1108.509],[396.402,1105.101],[421.245,1102.747],[446.089,1108.196],[470.924,1107.427],[495.767,1107],[520.611,1102.738],[545.455,1106.127],[570.289,1104.94],[595.133,1106.82],[619.977,1104.361],[644.82,1104.608],[669.664,1104.969],[694.507,1109.316],[719.342,1109.117],[744.186,1101.665],[769.029,1103.839],[793.873,1107.304],[818.717,1109.098],[843.569,1109.867],[868.412,1109.772],[893.063,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-606.581,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-532.752,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-581.009,-910.507],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,13.331],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,13.331],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,13.331],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,13.331],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[1.414,18.743],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[1.414,17.956],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[1.242,17.956],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[1.355,17.956],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"왼쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,817.411],[538.739,800.219],[510.083,792.264],[487.506,774.902],[461.156,763.368],[437.501,747.667],[412.858,733.494],[388.953,718.173],[366.855,700.041],[342.172,685.944],[315.672,674.648],[292.466,658.244],[264.359,649.444],[242.201,631.408],[219.155,614.738],[193.174,602.645],[168.341,588.747],[145.215,576.814],[145.215,601.154],[141.851,627.953],[139.665,654.751],[144.297,681.549],[145.684,708.357],[148.219,735.155],[144.197,761.954],[145.434,788.762],[143.029,815.56],[142.57,842.368],[145.454,869.166],[143.348,895.964],[143.219,922.763],[146.812,949.57],[141.801,976.378],[144.217,1003.186],[140.843,1029.994],[140.334,1056.802],[140.134,1083.61],[159.957,1094.612],[186.826,1082.594],[209.313,1064.823],[232.749,1048.306],[256.204,1031.798],[280.748,1016.704],[304.293,1000.319],[324.335,979.388],[347.462,962.443],[371.945,947.283],[398.674,935.027],[422.669,919.222],[441.703,896.971],[466.177,881.792],[491.878,868.179],[515.523,851.927],[535.944,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[495.899,817.411],[473.168,800.219],[448,792.264],[428.171,774.902],[405.028,763.368],[384.252,747.667],[362.608,733.494],[341.613,718.173],[322.204,700.041],[300.525,685.944],[277.251,674.648],[256.869,658.244],[232.183,649.444],[212.722,631.408],[192.481,614.738],[169.662,602.645],[147.852,588.747],[127.54,576.814],[127.54,601.154],[124.586,627.953],[122.666,654.751],[126.734,681.549],[127.952,708.357],[130.179,735.155],[126.646,761.954],[127.733,788.762],[125.621,815.56],[125.217,842.368],[127.751,869.166],[125.901,895.964],[125.787,922.763],[128.943,949.57],[124.542,976.378],[126.664,1003.186],[123.701,1029.994],[123.254,1056.802],[123.078,1083.61],[140.488,1094.612],[164.087,1082.594],[183.837,1064.823],[204.421,1048.306],[225.021,1031.798],[246.578,1016.704],[267.257,1000.319],[284.86,979.388],[305.171,962.443],[326.675,947.283],[350.151,935.027],[371.225,919.222],[387.942,896.971],[409.437,881.792],[432.01,868.179],[452.778,851.927],[470.713,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-352.143,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-309.283,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-337.298,-835.713],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,817.411],[538.739,800.219],[510.083,792.264],[487.506,774.902],[461.156,763.368],[437.501,747.667],[412.858,733.494],[388.953,718.173],[366.855,700.041],[342.172,685.944],[315.672,674.648],[292.466,658.244],[264.359,649.444],[242.201,631.408],[219.155,614.738],[193.174,602.645],[168.341,588.747],[145.215,576.814],[145.215,601.154],[141.851,627.953],[139.665,654.751],[144.297,681.549],[145.684,708.357],[148.219,735.155],[144.197,761.954],[145.434,788.762],[143.029,815.56],[142.57,842.368],[145.454,869.166],[143.348,895.964],[143.219,922.763],[146.812,949.57],[141.801,976.378],[144.217,1003.186],[140.843,1029.994],[140.334,1056.802],[140.134,1083.61],[159.957,1094.612],[186.826,1082.594],[209.313,1064.823],[232.749,1048.306],[256.204,1031.798],[280.748,1016.704],[304.293,1000.319],[324.335,979.388],[347.462,962.443],[371.945,947.283],[398.674,935.027],[422.669,919.222],[441.703,896.971],[466.177,881.792],[491.878,868.179],[515.523,851.927],[535.944,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[495.899,817.411],[473.168,800.219],[448,792.264],[428.171,774.902],[405.028,763.368],[384.252,747.667],[362.608,733.494],[341.613,718.173],[322.204,700.041],[300.525,685.944],[277.251,674.648],[256.869,658.244],[232.183,649.444],[212.722,631.408],[192.481,614.738],[169.662,602.645],[147.852,588.747],[127.54,576.814],[127.54,601.154],[124.586,627.953],[122.666,654.751],[126.734,681.549],[127.952,708.357],[130.179,735.155],[126.646,761.954],[127.733,788.762],[125.621,815.56],[125.217,842.368],[127.751,869.166],[125.901,895.964],[125.787,922.763],[128.943,949.57],[124.542,976.378],[126.664,1003.186],[123.701,1029.994],[123.254,1056.802],[123.078,1083.61],[140.488,1094.612],[164.087,1082.594],[183.837,1064.823],[204.421,1048.306],[225.021,1031.798],[246.578,1016.704],[267.257,1000.319],[284.86,979.388],[305.171,962.443],[326.675,947.283],[350.151,935.027],[371.225,919.222],[387.942,896.971],[409.437,881.792],[432.01,868.179],[452.778,851.927],[470.713,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-352.143,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-309.283,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-337.298,-835.713],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,8.281],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,8.281],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,8.281],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,8.281],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-53.049,0.818],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-53.049,0.865],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-46.593,0.865],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-50.813,0.865],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"오른쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,817.364],[662.904,803.741],[688.895,791.657],[710.573,772.899],[738.041,763.112],[762.206,748.189],[785.172,731.415],[812.131,720.831],[836.734,706.601],[858.333,687.701],[881.999,672.009],[907.79,659.63],[931.774,644.413],[957.046,631.218],[981.051,616.039],[1006.543,603.176],[1031.006,588.719],[1057.586,570.796],[1052.635,601.467],[1059.792,628.588],[1054.412,655.71],[1051.348,682.84],[1059.173,709.961],[1054.112,737.082],[1057.187,764.203],[1052.346,791.334],[1056.588,818.455],[1055.151,845.576],[1057.606,872.697],[1059.991,899.818],[1052.495,926.949],[1057.127,954.07],[1056.717,981.201],[1058.873,1008.322],[1058.654,1035.452],[1058.145,1062.583],[1052.176,1089.714],[1042.664,1099.121],[1020.756,1082.736],[997.57,1068.013],[974.324,1053.365],[950.06,1040.028],[927.961,1023.89],[908.169,1004.753],[885.203,989.744],[863.923,972.543],[841.655,956.624],[816.912,943.922],[796.63,925.411],[773.903,910.099],[750.069,896.211],[727.581,880.567],[706.202,863.48],[683.036,848.728],[662.844,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[558.332,817.364],[582.22,803.741],[605.048,791.657],[624.088,772.899],[648.213,763.112],[669.436,748.189],[689.607,731.415],[713.285,720.831],[734.893,706.601],[753.864,687.701],[774.648,672.009],[797.301,659.63],[818.366,644.413],[840.562,631.218],[861.645,616.039],[884.034,603.176],[905.52,588.719],[928.865,570.796],[924.517,601.467],[930.802,628.588],[926.077,655.71],[923.386,682.84],[930.258,709.961],[925.814,737.082],[928.514,764.203],[924.262,791.334],[927.988,818.455],[926.726,845.576],[928.882,872.697],[930.977,899.818],[924.394,926.949],[928.461,954.07],[928.102,981.201],[929.995,1008.322],[929.803,1035.452],[929.356,1062.583],[924.113,1089.714],[915.759,1099.121],[896.517,1082.736],[876.153,1068.013],[855.736,1053.365],[834.426,1040.028],[815.017,1023.89],[797.634,1004.753],[777.463,989.744],[758.773,972.543],[739.215,956.624],[717.484,943.922],[699.671,925.411],[679.71,910.099],[658.776,896.211],[639.026,880.567],[620.248,863.48],[599.902,848.728],[582.168,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-847.848,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-744.655,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-812.106,-834.959],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,817.364],[662.904,803.741],[688.895,791.657],[710.573,772.899],[738.041,763.112],[762.206,748.189],[785.172,731.415],[812.131,720.831],[836.734,706.601],[858.333,687.701],[881.999,672.009],[907.79,659.63],[931.774,644.413],[957.046,631.218],[981.051,616.039],[1006.543,603.176],[1031.006,588.719],[1057.586,570.796],[1052.635,601.467],[1059.792,628.588],[1054.412,655.71],[1051.348,682.84],[1059.173,709.961],[1054.112,737.082],[1057.187,764.203],[1052.346,791.334],[1056.588,818.455],[1055.151,845.576],[1057.606,872.697],[1059.991,899.818],[1052.495,926.949],[1057.127,954.07],[1056.717,981.201],[1058.873,1008.322],[1058.654,1035.452],[1058.145,1062.583],[1052.176,1089.714],[1042.664,1099.121],[1020.756,1082.736],[997.57,1068.013],[974.324,1053.365],[950.06,1040.028],[927.961,1023.89],[908.169,1004.753],[885.203,989.744],[863.923,972.543],[841.655,956.624],[816.912,943.922],[796.63,925.411],[773.903,910.099],[750.069,896.211],[727.581,880.567],[706.202,863.48],[683.036,848.728],[662.844,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[558.332,817.364],[582.22,803.741],[605.048,791.657],[624.088,772.899],[648.213,763.112],[669.436,748.189],[689.607,731.415],[713.285,720.831],[734.893,706.601],[753.864,687.701],[774.648,672.009],[797.301,659.63],[818.366,644.413],[840.562,631.218],[861.645,616.039],[884.034,603.176],[905.52,588.719],[928.865,570.796],[924.517,601.467],[930.802,628.588],[926.077,655.71],[923.386,682.84],[930.258,709.961],[925.814,737.082],[928.514,764.203],[924.262,791.334],[927.988,818.455],[926.726,845.576],[928.882,872.697],[930.977,899.818],[924.394,926.949],[928.461,954.07],[928.102,981.201],[929.995,1008.322],[929.803,1035.452],[929.356,1062.583],[924.113,1089.714],[915.759,1099.121],[896.517,1082.736],[876.153,1068.013],[855.736,1053.365],[834.426,1040.028],[815.017,1023.89],[797.634,1004.753],[777.463,989.744],[758.773,972.543],[739.215,956.624],[717.484,943.922],[699.671,925.411],[679.71,910.099],[658.776,896.211],[639.026,880.567],[620.248,863.48],[599.902,848.728],[582.168,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-847.848,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-744.655,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-812.106,-834.958],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"종이_half Group","bm":0,"it":[{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[-17.839,-1.257],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[-17.839,-1.701],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-333.819,-103.625],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-333.819,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-303.869,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-323.445,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.3,"s":[-323.445,-8.67],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[37.148,59.94],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[61.01,11.705],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[61.01,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[54.552,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[58.774,11.761],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":15,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[37.148,59.94],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[61.01,11.705],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[61.01,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[54.552,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[58.774,11.761],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":16,"ty":4,"nm":"종이_half","parent":15,"hd":true,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[-17.839,-1.257],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[-17.839,-1.701],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-333.819,-103.625],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-333.819,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-303.869,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-323.445,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.3,"s":[-323.445,-8.67],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":20,"ty":0,"nm":"to","parent":16,"hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.427,28.464]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-33.946,-41.944],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-33.946,-39.867],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-29.814,-39.867],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-32.515,-39.867],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"h":56.928199768066406,"refId":"el-151-_-Uo","w":76.85435485839844},{"ddd":0,"ind":21,"ty":4,"nm":"종이_half","parent":15,"hd":true,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[-17.839,-1.257],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[-17.839,-1.701],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-333.819,-103.625],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-333.819,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-303.869,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-323.445,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.3,"s":[-323.445,-8.67],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"종이_half Group","bm":0,"it":[{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[178.726,189.879],[178.692,178.952],[178.851,165.753],[176.987,152.554],[177.7,139.355],[178.929,126.156],[179.148,112.957],[179.03,99.759],[177.146,86.3],[192.092,86.928],[206.778,86.688],[221.465,87.427],[236.152,84.589],[250.82,85.678],[264.631,85.678],[280.196,86.23],[294.883,86.23],[309.569,84.7],[324.256,87.981],[338.807,86.709],[337.618,99.761],[339.184,114.46],[339.184,128.074],[338.809,141.349],[339.184,152.559],[338.57,165.758],[338.809,177.732],[338.65,191.157]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[178.726,180.477],[178.692,170.09],[178.851,157.545],[176.987,145],[177.7,132.455],[178.929,119.909],[179.148,107.364],[179.03,94.819],[177.146,82.027],[192.092,82.623],[206.778,82.396],[221.465,83.098],[236.152,80.4],[250.82,81.435],[264.631,81.435],[280.196,81.96],[294.883,81.96],[309.569,80.506],[324.256,83.625],[338.807,82.415],[337.618,94.821],[339.184,108.792],[339.184,121.732],[338.809,134.35],[339.184,145.005],[338.57,157.55],[338.809,168.931],[338.65,181.691]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[156.973,180.477],[156.943,170.09],[157.083,157.545],[155.446,145],[156.072,132.455],[157.151,119.909],[157.344,107.364],[157.24,94.819],[155.585,82.027],[168.712,82.623],[181.611,82.396],[194.51,83.098],[207.409,80.4],[220.293,81.435],[232.422,81.435],[246.093,81.96],[258.992,81.96],[271.891,80.506],[284.79,83.625],[297.57,82.415],[296.526,94.821],[297.901,108.792],[297.901,121.732],[297.572,134.35],[297.901,145.005],[297.362,157.55],[297.572,168.931],[297.432,181.691]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[171.192,180.477],[171.159,170.09],[171.311,157.545],[169.526,145],[170.209,132.455],[171.386,119.909],[171.596,107.364],[171.483,94.819],[169.678,82.027],[183.994,82.623],[198.061,82.396],[212.129,83.098],[226.196,80.4],[240.247,81.435],[253.475,81.435],[268.384,81.96],[282.452,81.96],[296.519,80.506],[310.587,83.625],[324.524,82.415],[323.385,94.821],[324.886,108.792],[324.886,121.732],[324.526,134.35],[324.886,145.005],[324.297,157.55],[324.526,168.931],[324.374,181.691]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0.05,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0.044,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0.048,37.786],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0.05,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[0.044,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[0.048,37.786],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[240.247,129.182],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[240.247,122.354],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[208.835,122.354],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[229.367,122.354],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-17.839,1.227],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,0.736],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-17.839,0.736],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-17.839,0.736],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":24,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[37.148,59.94],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[61.01,11.705],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[61.01,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[54.552,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[58.774,11.761],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"뒷면bg Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"뒷면bg","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.974,-56.459],[91.974,56.459],[-91.974,56.459],[-91.974,-56.459]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.974,-53.664],[91.974,53.664],[-91.974,53.664],[-91.974,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80.779,-53.664],[80.779,53.664],[-80.779,53.664],[-80.779,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[88.096,-53.664],[88.096,53.664],[-88.096,53.664],[-88.096,-53.664]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-250.023,8.152],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-250.023,7.748],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-219.592,7.748],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-239.483,7.748],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":26,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,-13.874],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.544,167.891],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":3.9,"s":[187.886,167.899],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[187.506,167.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[186.512,167.921],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[187.542,167.896],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":3.9,"s":[1],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-3],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":0,"k":[140.592,140.592]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":27,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":31,"ty":0,"nm":"to","parent":27,"hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.5,28.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[-34,-89.302]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"h":57,"refId":"el-159-_-Uo","w":77},{"ddd":0,"ind":32,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"종이_전체 Group","bm":0,"it":[{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[339.825,284.126],[324.871,284.404],[310.156,284.126],[295.442,283.591],[280.727,283.203],[266.03,285.436],[251.314,286.009],[237.23,286.009],[221.882,285.325],[207.168,284.255],[192.453,285.105],[178.433,284.237],[177.3,271.686],[178.433,258.47],[179.367,245.255],[177.759,232.039],[177.759,220.928],[177.938,205.608],[178.435,192.393],[179.031,179.177],[179.19,165.962],[177.323,152.746],[178.037,139.531],[179.268,126.315],[179.488,113.1],[179.369,99.884],[177.482,86.409],[192.456,87.037],[207.17,86.798],[221.885,87.537],[236.599,84.696],[251.296,85.786],[265.132,85.786],[280.727,86.338],[295.442,86.338],[310.156,84.807],[324.871,88.092],[339.449,86.818],[338.258,99.887],[339.827,114.604],[339.827,128.236],[339.451,141.527],[339.827,152.751],[339.211,165.967],[339.451,177.956],[339.292,192.398],[339.133,205.613],[339.769,218.829],[338.916,232.044],[338.24,245.26],[339.83,260.004],[339.83,284.131]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[258.565,185.352]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,9.931]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":35,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":36,"ty":4,"nm":"뒷면","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[35.002,80.037]},"r":{"a":0,"k":0},"s":{"a":0,"k":[25.311,25.311]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"sh","hd":true,"nm":"뒷면","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1058.32,594.37],[1057.48,622.15],[1057.34,649.5],[1058.3,676.85],[1057.04,704.21],[1059.07,731.56],[1056.29,758.92],[1057.99,786.27],[1057.43,813.63],[1055.89,840.99],[1059.2,868.34],[1057.45,895.69],[1057.22,923.05],[1058.97,950.4],[1056.85,977.76],[1058.41,1005.12],[1056.57,1032.48],[1059.58,1059.84],[1057.82,1087.2],[1058.23,1114.57],[1046.38,1143.91],[1019.81,1158.06],[991.87,1157.56],[963.95,1159.39],[936.02,1158.26],[908.09,1160.52],[880.16,1158.63],[852.23,1160.65],[824.31,1161.22],[796.38,1161.03],[768.44,1158.15],[740.51,1157.24],[712.58,1160.4],[684.65,1158.68],[656.72,1160.43],[628.79,1161.27],[600.86,1157.92],[572.92,1161.33],[544.99,1161.39],[517.06,1160.13],[489.13,1161.39],[461.19,1158.47],[433.26,1161.08],[405.33,1158.52],[377.4,1159.73],[349.46,1160.71],[321.53,1161.44],[293.59,1157.4],[265.66,1161.14],[237.72,1159.04],[209.78,1159.17],[181.84,1160.67],[153.67,1145.14],[142.48,1114.57],[144.38,1087.21],[146,1059.86],[145.06,1032.51],[142.89,1005.15],[142.66,977.8],[146.25,950.44],[142.31,923.09],[142.52,895.73],[145.53,868.37],[142.74,841.02],[143.73,813.67],[145.36,786.31],[144.83,758.96],[142.47,731.6],[145.87,704.24],[142.63,676.88],[146,649.52],[145.79,622.16],[144.5,595],[166.34,578.64],[189.51,563.89],[213.91,551],[235.73,534.22],[258.06,518.2],[281.66,504.11],[304.11,488.29],[326.82,472.84],[350.12,458.29],[373.46,443.82],[395.37,427.17],[417.69,411.13],[441.72,397.68],[464.47,382.29],[487.66,367.58],[511.03,353.12],[534.44,338.72],[556.65,322.51],[585.3,310.61],[616.16,311.53],[644.51,323.23],[668.37,336.94],[691.71,351.43],[713.81,367.79],[737.31,382.03],[760.76,396.36],[783,412.51],[805.26,428.62],[829.47,441.79],[852.31,457.04],[874.08,473.9],[897.34,488.5],[919.09,505.39],[942.45,519.86],[965.45,534.87],[987.69,551.03],[1011.76,564.42],[1034.79,579.38]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}}]},{"ddd":0,"ind":37,"ty":4,"nm":"Screen","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[187.5,187.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Screen Group","bm":0,"it":[{"ty":"rc","hd":false,"nm":"Screen","d":1,"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[375,375]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.142,0.142,0.142]},"r":1,"o":{"a":0,"k":0}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}],"meta":{"g":"@phase-software/lottie-exporter 0.7.0"},"nm":"","op":15,"v":"5.6.0","w":375} \ No newline at end of file diff --git a/core/remoteconfig/.gitignore b/core/remoteconfig/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/core/remoteconfig/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/remoteconfig/build.gradle.kts b/core/remoteconfig/build.gradle.kts new file mode 100644 index 00000000..61a87620 --- /dev/null +++ b/core/remoteconfig/build.gradle.kts @@ -0,0 +1,15 @@ +import com.yapp.convention.setNamespace + +plugins { + id("orbit.android.library") + id("orbit.android.hilt") +} + +android { + setNamespace("core.remoteconfig") +} + +dependencies { + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.config) +} diff --git a/core/remoteconfig/consumer-rules.pro b/core/remoteconfig/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/core/remoteconfig/proguard-rules.pro b/core/remoteconfig/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/core/remoteconfig/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/core/remoteconfig/src/main/AndroidManifest.xml b/core/remoteconfig/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8bdb7e14 --- /dev/null +++ b/core/remoteconfig/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/core/remoteconfig/src/main/java/com/yapp/remoteconfig/FirebaseRemoteConfigManager.kt b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/FirebaseRemoteConfigManager.kt new file mode 100644 index 00000000..7427b54f --- /dev/null +++ b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/FirebaseRemoteConfigManager.kt @@ -0,0 +1,26 @@ +package com.yapp.remoteconfig + +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import kotlinx.coroutines.tasks.await +import javax.inject.Inject + +class FirebaseRemoteConfigManager @Inject constructor( + private val remoteConfig: FirebaseRemoteConfig, +) { + suspend fun fetchAndActivate(): Boolean { + return try { + remoteConfig.fetchAndActivate().await() + } catch (e: Exception) { + false + } + } + + fun getRawMissionType(): String { + val rawValue = remoteConfig.getString(KEY_MISSION_TYPE) + return rawValue + } + + companion object { + private const val KEY_MISSION_TYPE = "alarm_mission_type" + } +} diff --git a/core/remoteconfig/src/main/java/com/yapp/remoteconfig/di/RemoteConfigModule.kt b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/di/RemoteConfigModule.kt new file mode 100644 index 00000000..0b2928b1 --- /dev/null +++ b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/di/RemoteConfigModule.kt @@ -0,0 +1,35 @@ +package com.yapp.remoteconfig.di + +import com.google.firebase.ktx.Firebase +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import com.google.firebase.remoteconfig.ktx.remoteConfig +import com.google.firebase.remoteconfig.ktx.remoteConfigSettings +import com.yapp.remoteconfig.FirebaseRemoteConfigManager +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object RemoteConfigModule { + + @Provides + @Singleton + fun provideFirebaseRemoteConfig(): FirebaseRemoteConfig { + return Firebase.remoteConfig.apply { + setConfigSettingsAsync( + remoteConfigSettings { + minimumFetchIntervalInSeconds = 3600L + }, + ) + } + } + + @Provides + @Singleton + fun provideRemoteConfigManager( + remoteConfig: FirebaseRemoteConfig, + ): FirebaseRemoteConfigManager = FirebaseRemoteConfigManager(remoteConfig) +} diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index 8944d6aa..b4250dc6 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -17,4 +17,5 @@ dependencies { implementation(libs.orbit.compose) implementation(libs.orbit.viewmodel) implementation(libs.lottie.compose) + implementation(libs.play.services.ads) } diff --git a/core/ui/src/main/AndroidManifest.xml b/core/ui/src/main/AndroidManifest.xml index 8bdb7e14..76073216 100644 --- a/core/ui/src/main/AndroidManifest.xml +++ b/core/ui/src/main/AndroidManifest.xml @@ -1,4 +1,3 @@ - - + diff --git a/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt b/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt index 2a926524..baf7e50b 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt @@ -1,7 +1,7 @@ package com.yapp.ui.component +import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.shape.RoundedCornerShape @@ -19,9 +19,14 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Rect import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.PathMeasure import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme import kotlinx.coroutines.launch @@ -37,7 +42,9 @@ fun OrbitBottomSheet( onDismissRequest: () -> Unit = {}, shape: Shape = RoundedCornerShape(topStart = 30.dp, topEnd = 30.dp), containerColor: Color = OrbitTheme.colors.gray_800, - content: @Composable ColumnScope.() -> Unit, + strokeColor: Color = OrbitTheme.colors.gray_700, + strokeThickness: Dp = 1.dp, + content: @Composable () -> Unit, ) { val scope = rememberCoroutineScope() if (isSheetOpen) { @@ -54,7 +61,76 @@ fun OrbitBottomSheet( containerColor = containerColor, dragHandle = null, ) { - content() + Box { + content() + BottomSheetTopRoundedStroke( + strokeColor = strokeColor, + strokeThickness = strokeThickness, + ) + } + } + } +} + +@Composable +fun BottomSheetTopRoundedStroke( + modifier: Modifier = Modifier, + strokeColor: Color, + strokeThickness: Dp = 1.dp, + radius: Dp = 30.dp, +) { + Canvas( + modifier = modifier + .fillMaxWidth() + .height(radius + strokeThickness), // Stroke 고려 + ) { + val width = size.width + val height = size.height + val radiusPx = radius.toPx() + val fadeWidth = radiusPx // 양 끝에서 선이 얇아지는 범위 + + val path = Path().apply { + moveTo(0f, height) // 왼쪽 끝 + arcTo( + rect = Rect(0f, 0f, radiusPx * 2, radiusPx * 2), + startAngleDegrees = 180f, + sweepAngleDegrees = 90f, + forceMoveTo = false, + ) + lineTo(width - radiusPx, 0f) + arcTo( + rect = Rect(width - radiusPx * 2, 0f, width, radiusPx * 2), + startAngleDegrees = 270f, + sweepAngleDegrees = 90f, + forceMoveTo = false, + ) + } + + val pathMeasure = PathMeasure().apply { setPath(path, false) } + val totalLength = pathMeasure.length + val segmentCount = 100 + + for (i in 0 until segmentCount) { + val start = i * (totalLength / segmentCount) + val end = (i + 1) * (totalLength / segmentCount) + + val segmentPath = Path() + if (pathMeasure.getSegment(start, end, segmentPath, true)) { + val minThickness = 0.dp.toPx() + val maxThickness = strokeThickness.toPx() + + val thickness = when { + start < fadeWidth -> minThickness + (maxThickness - minThickness) * (start / fadeWidth) + start > totalLength - fadeWidth -> minThickness + (maxThickness - minThickness) * ((totalLength - start) / fadeWidth) + else -> maxThickness + } + + drawPath( + path = segmentPath, + color = strokeColor, + style = Stroke(width = thickness), + ) + } } } } diff --git a/core/ui/src/main/java/com/yapp/ui/component/banner/AdsBanner.kt b/core/ui/src/main/java/com/yapp/ui/component/banner/AdsBanner.kt new file mode 100644 index 00000000..bd3a8e8b --- /dev/null +++ b/core/ui/src/main/java/com/yapp/ui/component/banner/AdsBanner.kt @@ -0,0 +1,34 @@ +package com.yapp.ui.component.banner + +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.viewinterop.AndroidView +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.AdSize +import com.google.android.gms.ads.AdView +import core.ui.R + +@SuppressLint("MissingPermission") +@Composable +fun AdsBanner( + modifier: Modifier = Modifier, +) { + val adUnitId = stringResource(id = R.string.admob_ad_unit_id) + + AndroidView( + modifier = modifier.fillMaxWidth(), + factory = { context -> + AdView(context).apply { + setAdSize(AdSize.BANNER) + this.adUnitId = adUnitId + loadAd(AdRequest.Builder().build()) + } + }, + update = { adView -> + adView.loadAd(AdRequest.Builder().build()) + }, + ) +} diff --git a/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt b/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt index 04c1a925..b1c97a1d 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt @@ -13,7 +13,10 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape @@ -21,6 +24,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch @Composable fun OrbitButton( @@ -28,6 +33,7 @@ fun OrbitButton( modifier: Modifier = Modifier, onClick: () -> Unit, enabled: Boolean = false, + debounceTime: Long = 500L, height: Dp = 54.dp, containerColor: Color = OrbitTheme.colors.main, contentColor: Color = OrbitTheme.colors.gray_900, @@ -39,6 +45,8 @@ fun OrbitButton( ) { val interactionSource = remember { MutableInteractionSource() } val isPressed = interactionSource.collectIsPressedAsState().value + val coroutineScope = rememberCoroutineScope() + var isClickable by remember { mutableStateOf(true) } val padding by animateDpAsState( targetValue = if (isPressed) 2.dp else 0.dp, @@ -46,9 +54,20 @@ fun OrbitButton( label = "PaddingAnimation", ) + fun handleClick() { + if (isClickable) { + isClickable = false + onClick() + coroutineScope.launch { + delay(debounceTime) + isClickable = true + } + } + } + Button( - onClick = onClick, - enabled = enabled, + onClick = ::handleClick, + enabled = enabled && isClickable, shape = shape, colors = ButtonDefaults.buttonColors( containerColor = if (isPressed) pressedContainerColor else containerColor, diff --git a/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt b/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt index f947716f..60c06d43 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer @@ -26,12 +27,17 @@ fun LottieAnimation( contentScale: ContentScale = ContentScale.FillWidth, scaleXAdjustment: Float = 1f, scaleYAdjustment: Float = 1f, + play: Boolean = iterations == 1, + restartOnPlay: Boolean = false, onAnimationEnd: (() -> Unit)? = null, ) { val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(resId)) - val progress by animateLottieCompositionAsState( + val isPlaying = remember { mutableStateOf(iterations == LottieConstants.IterateForever || play) } + val animationState = animateLottieCompositionAsState( composition = composition, iterations = iterations, + isPlaying = isPlaying.value, + restartOnPlay = restartOnPlay, ) val alpha = remember { Animatable(0f) } @@ -44,9 +50,18 @@ fun LottieAnimation( } } - LaunchedEffect(progress) { - if (progress == 1f) { + LaunchedEffect(play) { + if (play) { + isPlaying.value = true + } + } + + LaunchedEffect(animationState.progress) { + if (animationState.progress == 1f) { onAnimationEnd?.invoke() + if (iterations == 1) { + isPlaying.value = false + } } } @@ -62,7 +77,7 @@ fun LottieAnimation( if (composition != null) { com.airbnb.lottie.compose.LottieAnimation( composition = composition, - progress = { progress }, + progress = { animationState.progress }, modifier = Modifier.fillMaxSize(), ) } diff --git a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt index b1b0d178..a246b5f5 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.LocalTextSelectionColors import androidx.compose.foundation.text.selection.TextSelectionColors @@ -47,9 +48,10 @@ fun OrbitTextField( modifier: Modifier = Modifier, showWarning: Boolean = false, isValid: Boolean = false, - warningMessage: String, + warningMessage: String? = null, focusRequester: FocusRequester? = null, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + keyboardActions: KeyboardActions = KeyboardActions.Default, textAlign: TextAlign = TextAlign.Center, enabled: Boolean = true, ) { @@ -87,15 +89,18 @@ fun OrbitTextField( onFocusChanged = { isFocused = it }, focusRequester = actualFocusRequester, keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, isValid = isValid, isFocused = isFocused, textAlign = textAlign, enabled = enabled, ) - Box { - if (showWarning) { - WarningMessage(warningMessage, textAlign) + when (showWarning) { + true -> warningMessage?.let { + WarningMessage(it, textAlign) + } + false -> { } } } @@ -134,30 +139,37 @@ private fun TextFieldContainer( focusRequester: FocusRequester, onFocusChanged: (Boolean) -> Unit, keyboardOptions: KeyboardOptions, + keyboardActions: KeyboardActions, textAlign: TextAlign, enabled: Boolean, ) { + val outerBorderColor = when { + isFocused && text.text.isEmpty() -> OrbitTheme.colors.main.copy(alpha = 0.2f) + isFocused && !isValid -> OrbitTheme.colors.alert.copy(alpha = 0.2f) + isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f) + !isValid -> OrbitTheme.colors.alert.copy(alpha = 0.2f) + else -> Color.Transparent + } + + val innerBorderColor = when { + isFocused && text.text.isEmpty() -> OrbitTheme.colors.main.copy(alpha = 0.2f) + isFocused && !isValid -> OrbitTheme.colors.alert + isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f) + !isValid -> OrbitTheme.colors.alert + else -> OrbitTheme.colors.gray_700 + } + Box( modifier = Modifier .border( width = 3.dp, - color = when { - isValid -> Color.Transparent - isFocused && showWarning -> OrbitTheme.colors.alert.copy(alpha = 0.2f) - isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f) - else -> Color.Transparent - }, + color = outerBorderColor, shape = RoundedCornerShape(18.dp), ) .padding(2.dp) .border( width = 1.dp, - color = when { - isValid -> OrbitTheme.colors.gray_700 - isFocused && showWarning -> OrbitTheme.colors.alert - isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f) - else -> OrbitTheme.colors.gray_700 - }, + color = innerBorderColor, shape = RoundedCornerShape(16.dp), ) .background(OrbitTheme.colors.gray_800, shape = RoundedCornerShape(16.dp)) @@ -185,7 +197,9 @@ private fun TextFieldContainer( }, textAlign = textAlign, ), + singleLine = true, keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, cursorBrush = SolidColor(OrbitTheme.colors.white), enabled = enabled, decorationBox = { innerTextField -> @@ -224,7 +238,7 @@ private fun TextFieldContainer( }, ) - if (enabled && text.text.isNotEmpty()) { + if (enabled && text.text.isNotEmpty() && isFocused) { Icon( painter = painterResource(id = core.designsystem.R.drawable.ic_circle_delete), contentDescription = "delete", diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt index 532c2aff..76ba98d8 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt @@ -34,7 +34,6 @@ fun OrbitPickerItem( modifier: Modifier = Modifier, items: List, state: PickerState = rememberPickerState(), - startIndex: Int = 0, visibleItemsCount: Int, textModifier: Modifier = Modifier, infiniteScroll: Boolean = true, @@ -140,7 +139,7 @@ fun OrbitPickerItem( 0.2f } - val scaleY = 1f - (0.4f * (distanceFromCenter / maxDistance)).coerceIn(0f, 0.4f) + val scaleY = 1f - (0.2f * (distanceFromCenter / maxDistance)).coerceIn(0f, 0.4f) Text( text = getItemForIndex(index, items, infiniteScroll, visibleItemsMiddle), diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt index 606d88b8..7d90d39b 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt @@ -10,13 +10,11 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -26,7 +24,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme -import kotlinx.coroutines.delay @Composable fun OrbitYearMonthPicker( @@ -35,45 +32,51 @@ fun OrbitYearMonthPicker( initialLunar: String = "양력", initialYear: String = "2000", initialMonth: String = "1", - initialDay: String = "01", + initialDay: String = "1", onValueChange: (String, Int, Int, Int) -> Unit, ) { val screenWidth = LocalConfiguration.current.screenWidthDp.dp + val lunarState = remember { mutableStateOf(initialLunar) } - val yearState = remember { mutableStateOf(initialYear.toInt()) } - val monthState = remember { mutableStateOf(initialMonth.toInt()) } - val dayState = remember { mutableStateOf(initialDay.toInt()) } - val dayItems = remember { mutableStateListOf() } - LaunchedEffect(yearState.value, monthState.value) { - val maxDay = getMaxDaysInMonth(yearState.value, monthState.value) - dayItems.clear() - dayItems.addAll((1..maxDay).map { it.toString().padStart(2, '0') }) + val yearState = remember { mutableIntStateOf(initialYear.toInt()) } + val monthState = remember { mutableIntStateOf(initialMonth.toInt()) } + + val maxDay = getMaxDaysInMonth(yearState.intValue, monthState.intValue) + val dayItems = (1..maxDay).map { it.toString() } + + val startIndexYear = (1900..2024).map { it.toString() }.indexOf(initialYear).takeIf { it >= 0 } ?: 0 + val startIndexMonth = (1..12).map { it.toString() }.indexOf(initialMonth).takeIf { it >= 0 } ?: 0 + val startIndexDay = dayItems.indexOf(initialDay).takeIf { it >= 0 } ?: 0 - if (dayState.value > maxDay) { - dayState.value = maxDay + val dayState = remember { mutableIntStateOf(initialDay.toInt()) } + + val yearPickerState = rememberPickerState(startIndex = startIndexYear) + val monthPickerState = rememberPickerState(startIndex = startIndexMonth) + val dayPickerState = rememberPickerState(startIndex = startIndexDay) + + LaunchedEffect(yearState.intValue, monthState.intValue) { + val newMaxDay = getMaxDaysInMonth(yearState.intValue, monthState.intValue) + if (dayState.intValue > newMaxDay) { + dayState.intValue = newMaxDay } } - LaunchedEffect(lunarState.value, yearState.value, monthState.value, dayState.value) { - delay(300) - onValueChange(lunarState.value, yearState.value, monthState.value, dayState.value) + LaunchedEffect(lunarState.value, yearState.intValue, monthState.intValue, dayState.intValue) { + onValueChange(lunarState.value, yearState.intValue, monthState.intValue, dayState.intValue) } Surface( - modifier = modifier.fillMaxWidth().wrapContentHeight(), + modifier = modifier.fillMaxWidth(), ) { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Bottom, - modifier = Modifier.wrapContentSize().background(OrbitTheme.colors.gray_900), + modifier = Modifier.background(OrbitTheme.colors.gray_900), ) { val lunarItems = listOf("양력", "음력") val yearItems = (1900..2024).map { it.toString() } - val startIndex = yearItems.indexOf(initialYear).takeIf { it >= 0 } ?: 0 - val yearPickerState = rememberPickerState(startIndex = startIndex) val monthItems = (1..12).map { it.toString() } - val dayStartIndex = remember { dayItems.indexOf(initialDay).takeIf { it >= 0 } ?: 0 } - val monthStartIndex = remember { monthItems.indexOf(initialMonth).takeIf { it >= 0 } ?: 0 } + Box( modifier = Modifier.fillMaxWidth(), ) { @@ -109,29 +112,29 @@ fun OrbitYearMonthPicker( modifier = Modifier.width(screenWidth * 0.28f), textModifier = Modifier.padding(8.dp), infiniteScroll = false, - onValueChange = { yearState.value = it.toInt() }, + onValueChange = { yearState.intValue = it.toInt() }, ) OrbitPickerItem( items = monthItems, + state = monthPickerState, visibleItemsCount = 5, itemSpacing = itemSpacing, textStyle = OrbitTheme.typography.title2SemiBold, modifier = Modifier.width(screenWidth * 0.16f), textModifier = Modifier.padding(8.dp), infiniteScroll = false, - startIndex = monthStartIndex, - onValueChange = { monthState.value = it.toInt() }, + onValueChange = { monthState.intValue = it.toInt() }, ) OrbitPickerItem( items = dayItems, + state = dayPickerState, visibleItemsCount = 5, itemSpacing = itemSpacing, textStyle = OrbitTheme.typography.title2SemiBold, modifier = Modifier.width(screenWidth * 0.16f), textModifier = Modifier.padding(8.dp), infiniteScroll = false, - startIndex = dayStartIndex, - onValueChange = { dayState.value = it.toInt() }, + onValueChange = { dayState.intValue = it.toInt() }, ) } } diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt index bd8258d8..120e3398 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt @@ -9,7 +9,6 @@ class PickerState( val lazyListState: LazyListState, var selectedItem: String, var startIndex: Int, - var initialized: Boolean = false, ) @Composable diff --git a/core/ui/src/main/java/com/yapp/ui/component/tooltip/OrbitToolTip.kt b/core/ui/src/main/java/com/yapp/ui/component/tooltip/OrbitToolTip.kt new file mode 100644 index 00000000..7f044eff --- /dev/null +++ b/core/ui/src/main/java/com/yapp/ui/component/tooltip/OrbitToolTip.kt @@ -0,0 +1,166 @@ +package com.yapp.ui.component.tooltip + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.geometry.Rect +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Outline +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Popup +import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.ui.utils.toPx +import com.yapp.ui.utils.toRoundPx + +@Composable +fun OrbitToolTip( + backgroundColor: Color = OrbitTheme.colors.gray_900, + textColor: Color = OrbitTheme.colors.gray_100, + textStyle: TextStyle = OrbitTheme.typography.label2SemiBold, + offset: IntOffset = IntOffset(0, 0), + text: String, +) { + val popupOffset = IntOffset( + x = offset.x + 15.dp.toRoundPx(), + y = offset.y + 2.dp.toRoundPx(), + ) + + Popup( + alignment = Alignment.Center, + offset = popupOffset, + ) { + Column( + horizontalAlignment = Alignment.Start, + ) { + Row { + Spacer(modifier = Modifier.width(15.dp)) + + Spacer( + modifier = Modifier + .width(10.dp) + .height(5.dp) + .background( + color = backgroundColor, + shape = RoundedTopTriangleShape(1.dp.toPx()), + ), + ) + } + + Surface( + shape = RoundedCornerShape(8.dp), + color = backgroundColor, + ) { + Text( + modifier = Modifier.padding( + vertical = 6.dp, + horizontal = 10.dp, + ), + text = text, + style = textStyle, + color = textColor, + ) + } + } + } +} + +class RoundedTopTriangleShape(private val radius: Float) : Shape { + override fun createOutline( + size: Size, + layoutDirection: LayoutDirection, + density: Density, + ): Outline { + val path = Path().apply { + val topX = size.width / 2f + val topY = 0f + val bottomLeftX = 0f + val bottomLeftY = size.height + val bottomRightX = size.width + val bottomRightY = size.height + + // 왼쪽 아래 꼭짓점 시작 + moveTo(bottomLeftX, bottomLeftY) + + lineTo(topX - radius, topY) + + arcTo( + rect = Rect( + left = topX - radius, + top = topY, + right = topX + radius, + bottom = topY + (2 * radius), + ), + startAngleDegrees = 180f, + sweepAngleDegrees = 180f, + forceMoveTo = false, + ) + + lineTo(bottomRightX, bottomRightY) + + close() + } + + return Outline.Generic(path) + } +} + +@Preview +@Composable +fun ReversedPopup() { + OrbitTheme { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Gray), + ) { + Box( + modifier = Modifier.align(Alignment.Center), + ) { + Box( + modifier = Modifier + .size(32.dp) + .clip(CircleShape) + .clickable {}, + contentAlignment = Alignment.Center, + ) { + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_mail), + contentDescription = "Mail", + tint = OrbitTheme.colors.white, + ) + } + + OrbitToolTip( + text = "운세 도착", + offset = IntOffset(x = 0, y = 32.dp.toRoundPx()), + ) + } + } + } +} diff --git a/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt b/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt index 5863a08e..f3ee0b15 100644 --- a/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt +++ b/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt @@ -6,10 +6,14 @@ import androidx.compose.foundation.indication import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.material3.ripple import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.composed import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.input.pointer.pointerInput @Composable @@ -17,6 +21,8 @@ fun Modifier.customClickable( rippleEnabled: Boolean = true, rippleColor: Color? = null, enabled: Boolean = true, + fadeOnPress: Boolean = false, + pressedAlpha: Float = 0.5f, onClick: (() -> Unit)?, onLongClick: (() -> Unit)? = null, onPress: (() -> Unit)? = null, @@ -30,19 +36,28 @@ fun Modifier.customClickable( null } + var isPressed by remember { mutableStateOf(false) } + this.then( Modifier .pointerInput(Unit) { detectTapGestures( onPress = { + isPressed = true onPress?.invoke() tryAwaitRelease() + isPressed = false onRelease?.invoke() }, onTap = { onClick?.invoke() }, onLongPress = { onLongClick?.invoke() }, ) } + .graphicsLayer { + if (fadeOnPress) { + alpha = if (isPressed) pressedAlpha else 1f + } + } .indication(interactionSource, rippleIndication), ) } diff --git a/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt b/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt index f5dc35f7..ee23cd18 100644 --- a/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt +++ b/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt @@ -35,6 +35,7 @@ fun OrbitGenderToggle( modifier: Modifier = Modifier, height: Dp = 148.dp, textStyle: TextStyle = OrbitTheme.typography.heading2SemiBold, + shape: RoundedCornerShape = RoundedCornerShape(16.dp), ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() @@ -69,9 +70,9 @@ fun OrbitGenderToggle( .border( width = if (isPressed) 0.dp else 1.dp, color = borderColor, - shape = RoundedCornerShape(16.dp), + shape = shape, ) - .background(backgroundColor, shape = RoundedCornerShape(16.dp)) + .background(backgroundColor, shape = shape) .clickable( interactionSource = interactionSource, indication = null, diff --git a/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt b/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt index 5733c274..b08f3c85 100644 --- a/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt +++ b/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt @@ -8,3 +8,8 @@ import androidx.compose.ui.unit.Dp fun Dp.toPx(): Float { return with(LocalDensity.current) { this@toPx.toPx() } } + +@Composable +fun Dp.toRoundPx(): Int { + return with(LocalDensity.current) { this@toRoundPx.roundToPx() } +} diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 423f4426..f2c52f14 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { implementation(projects.core.network) implementation(projects.core.datastore) implementation(projects.core.media) + implementation(projects.core.remoteconfig) ksp(libs.androidx.room.compiler) implementation(libs.androidx.room.ktx) diff --git a/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt b/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt index 14027c71..ed92d2db 100644 --- a/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt +++ b/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt @@ -2,10 +2,12 @@ package com.yapp.data.remote.di import com.yapp.data.remote.repositoryimpl.DummyRepositoryImpl import com.yapp.data.remote.repositoryimpl.FortuneRepositoryImpl +import com.yapp.data.remote.repositoryimpl.RemoteConfigRepositoryImpl import com.yapp.data.remote.repositoryimpl.SignUpRepositoryImpl import com.yapp.data.remote.repositoryimpl.UserInfoRepositoryImpl import com.yapp.domain.repository.DummyRepository import com.yapp.domain.repository.FortuneRepository +import com.yapp.domain.repository.RemoteConfigRepository import com.yapp.domain.repository.SignUpRepository import com.yapp.domain.repository.UserInfoRepository import dagger.Binds @@ -40,4 +42,10 @@ abstract class RepositoryModule { abstract fun bindsFortuneRepository( fortuneRepository: FortuneRepositoryImpl, ): FortuneRepository + + @Binds + @Singleton + abstract fun bindsRemoteConfigRepository( + remoteConfigRepository: RemoteConfigRepositoryImpl, + ): RemoteConfigRepository } diff --git a/data/src/main/java/com/yapp/data/remote/repositoryimpl/RemoteConfigRepositoryImpl.kt b/data/src/main/java/com/yapp/data/remote/repositoryimpl/RemoteConfigRepositoryImpl.kt new file mode 100644 index 00000000..e45ae5a1 --- /dev/null +++ b/data/src/main/java/com/yapp/data/remote/repositoryimpl/RemoteConfigRepositoryImpl.kt @@ -0,0 +1,17 @@ +package com.yapp.data.remote.repositoryimpl + +import com.yapp.domain.model.MissionType +import com.yapp.domain.repository.RemoteConfigRepository +import com.yapp.remoteconfig.FirebaseRemoteConfigManager +import javax.inject.Inject + +class RemoteConfigRepositoryImpl @Inject constructor( + private val manager: FirebaseRemoteConfigManager, +) : RemoteConfigRepository { + + override suspend fun fetchAndActivate(): Boolean = manager.fetchAndActivate() + + override fun getMissionType(): MissionType { + return MissionType.fromRemoteValue(manager.getRawMissionType()) + } +} diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index de2c4bb0..e5567cb0 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -10,5 +10,5 @@ android { } dependencies { - implementation(libs.gson) + implementation(libs.kotlinx.serialization.json) } diff --git a/domain/src/main/java/com/yapp/domain/model/Alarm.kt b/domain/src/main/java/com/yapp/domain/model/Alarm.kt index 119a497a..f04d4148 100644 --- a/domain/src/main/java/com/yapp/domain/model/Alarm.kt +++ b/domain/src/main/java/com/yapp/domain/model/Alarm.kt @@ -2,11 +2,13 @@ package com.yapp.domain.model import android.net.Uri import android.os.Parcelable -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken import kotlinx.parcelize.Parcelize +import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json @Parcelize +@Serializable data class Alarm( val id: Long = 0, @@ -37,11 +39,11 @@ data class Alarm( companion object { fun fromJson(json: String): Alarm { - return Gson().fromJson(json, object : TypeToken() {}.type) + return Json.decodeFromString(json) } } - override fun toString(): String = Uri.encode(Gson().toJson(this)) + override fun toString(): String = Uri.encode(Json.encodeToString(this)) } fun Alarm.copyFrom(source: Alarm): Alarm { @@ -58,3 +60,17 @@ fun Alarm.copyFrom(source: Alarm): Alarm { isAlarmActive = source.isAlarmActive, ) } + +fun Alarm.toTimeString(): String { + val displayHour = if (isAm && hour == 12) { + 0 // 오전 12시는 0으로 표시 + } else if (!isAm && hour != 12) { + hour + 12 // 오후 1시~11시에는 12를 더함 + } else { + hour // 오전 1시~11시 및 오후 12시는 그대로 사용 + } + val formattedHour = displayHour.toString().padStart(2, '0') + val formattedMinute = minute.toString().padStart(2, '0') + + return "$formattedHour:$formattedMinute" +} diff --git a/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt b/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt index 8ed498de..beaead69 100644 --- a/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt +++ b/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt @@ -12,7 +12,7 @@ enum class AlarmDay(val bitValue: Int) { } fun AlarmDay.toDayOfWeek(): java.time.DayOfWeek { - return java.time.DayOfWeek.of(this.ordinal + 1) + return java.time.DayOfWeek.of(((this.ordinal + 6) % 7) + 1) } fun Set.toRepeatDays(): Int { @@ -24,3 +24,8 @@ fun Set.toRepeatDays(): Int { fun Int.toAlarmDays(): Set { return AlarmDay.entries.filterTo(mutableSetOf()) { (this and it.bitValue) != 0 } } + +fun Int.toAlarmDayNames(): List { + return AlarmDay.entries.filter { (this and it.bitValue) != 0 } + .map { it.name.replaceFirstChar { char -> char.uppercase() } } +} diff --git a/domain/src/main/java/com/yapp/domain/model/MissionType.kt b/domain/src/main/java/com/yapp/domain/model/MissionType.kt new file mode 100644 index 00000000..45388ee6 --- /dev/null +++ b/domain/src/main/java/com/yapp/domain/model/MissionType.kt @@ -0,0 +1,18 @@ +package com.yapp.domain.model + +sealed class MissionType { + data object Shake : MissionType() + data object Click : MissionType() + + companion object { + fun fromRemoteValue(value: String): MissionType { + return when (value) { + "tap_mission" -> Click + "shake_mission" -> Shake + else -> { + Click + } + } + } + } +} diff --git a/domain/src/main/java/com/yapp/domain/repository/RemoteConfigRepository.kt b/domain/src/main/java/com/yapp/domain/repository/RemoteConfigRepository.kt new file mode 100644 index 00000000..56709c6f --- /dev/null +++ b/domain/src/main/java/com/yapp/domain/repository/RemoteConfigRepository.kt @@ -0,0 +1,8 @@ +package com.yapp.domain.repository + +import com.yapp.domain.model.MissionType + +interface RemoteConfigRepository { + suspend fun fetchAndActivate(): Boolean + fun getMissionType(): MissionType +} diff --git a/domain/src/main/java/com/yapp/domain/usecase/GetMissionTypeUseCase.kt b/domain/src/main/java/com/yapp/domain/usecase/GetMissionTypeUseCase.kt new file mode 100644 index 00000000..9df0611f --- /dev/null +++ b/domain/src/main/java/com/yapp/domain/usecase/GetMissionTypeUseCase.kt @@ -0,0 +1,14 @@ +package com.yapp.domain.usecase + +import com.yapp.domain.model.MissionType +import com.yapp.domain.repository.RemoteConfigRepository +import javax.inject.Inject + +class GetMissionTypeUseCase @Inject constructor( + private val repository: RemoteConfigRepository, +) { + suspend fun execute(): MissionType { + repository.fetchAndActivate() + return repository.getMissionType() + } +} diff --git a/feature/alarm-interaction/build.gradle.kts b/feature/alarm-interaction/build.gradle.kts index c0b81866..efc6eeec 100644 --- a/feature/alarm-interaction/build.gradle.kts +++ b/feature/alarm-interaction/build.gradle.kts @@ -11,13 +11,16 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.alarm) implementation(projects.core.media) implementation(projects.domain) + implementation(projects.core.datastore) implementation(libs.orbit.core) implementation(libs.orbit.compose) implementation(libs.orbit.viewmodel) implementation(libs.androidx.material.android) implementation(libs.androidx.annotation) - implementation(libs.gson) + implementation(libs.play.services.ads) + implementation(libs.kotlinx.serialization.json) } diff --git a/feature/alarm-interaction/src/main/AndroidManifest.xml b/feature/alarm-interaction/src/main/AndroidManifest.xml index e1000761..76073216 100644 --- a/feature/alarm-interaction/src/main/AndroidManifest.xml +++ b/feature/alarm-interaction/src/main/AndroidManifest.xml @@ -1,4 +1,3 @@ - diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt index 443027a5..5860eb6d 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt @@ -16,14 +16,13 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.material3.Surface import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.core.util.Consumer import androidx.navigation.compose.NavHost import com.yapp.alarm.AlarmConstants import com.yapp.alarm.receivers.AlarmInteractionActivityReceiver -import com.yapp.common.navigation.destination.AlarmInteractionDestination import com.yapp.common.navigation.rememberOrbitNavigator +import com.yapp.common.navigation.route.AlarmInteractionBaseRoute import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.Alarm import dagger.hilt.android.AndroidEntryPoint @@ -70,11 +69,12 @@ class AlarmInteractionActivity : ComponentActivity() { ) { NavHost( navController = navigator.navController, - startDestination = AlarmInteractionDestination.Route.route, + startDestination = AlarmInteractionBaseRoute, modifier = Modifier.navigationBarsPadding(), ) { alarmInteractionNavGraph( navigator = navigator, + alarm = alarm, ) } } @@ -89,7 +89,7 @@ class AlarmInteractionActivity : ComponentActivity() { } Log.d("AlarmInteractionActivity", "New Intent: $newIntent") newAlarm?.let { alarm -> - navigator.navController.navigate("${AlarmInteractionDestination.AlarmAction.route}/$alarm") + navigator.navigateToAlarmAction(alarm = alarm) } } @@ -99,13 +99,6 @@ class AlarmInteractionActivity : ComponentActivity() { this@AlarmInteractionActivity.removeOnNewIntentListener(onNewIntentConsumer) } } - - LaunchedEffect(Unit) { - val route = "${AlarmInteractionDestination.AlarmAction.route}/$alarm" - navigator.navController.navigate(route) { - popUpTo(AlarmInteractionDestination.Route.route) { inclusive = true } - } - } } } diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt index d87492e6..bc8d0035 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt @@ -1,56 +1,75 @@ package com.yapp.alarm.interaction +import android.os.Bundle +import androidx.compose.runtime.LaunchedEffect import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavType import androidx.navigation.compose.composable -import androidx.navigation.navArgument +import androidx.navigation.navOptions import androidx.navigation.navigation -import com.google.gson.Gson import com.yapp.alarm.interaction.action.AlarmActionRoute import com.yapp.alarm.interaction.snooze.AlarmSnoozeTimerRoute -import com.yapp.common.navigation.JsonNavType import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.AlarmInteractionDestination +import com.yapp.common.navigation.route.AlarmInteractionBaseRoute +import com.yapp.common.navigation.route.AlarmInteractionDestination import com.yapp.domain.model.Alarm +import kotlinx.serialization.json.Json +import kotlin.reflect.typeOf -class AlarmArgType : JsonNavType() { - override fun fromJsonParse(value: String): Alarm { - return Gson().fromJson(value, Alarm::class.java) +val AlarmArgType = object : NavType(isNullableAllowed = false) { + override fun get(bundle: Bundle, key: String): Alarm? { + return bundle.getString(key)?.let { Alarm.fromJson(it) } } - override fun Alarm.getJsonParse(): String { - return Gson().toJson(this) + override fun parseValue(value: String): Alarm { + return Alarm.fromJson(value) + } + + override fun put(bundle: Bundle, key: String, value: Alarm) { + bundle.putString(key, Json.encodeToString(Alarm.serializer(), value)) } } fun NavGraphBuilder.alarmInteractionNavGraph( navigator: OrbitNavigator, + alarm: Alarm?, ) { - navigation( - route = AlarmInteractionDestination.Route.route, - startDestination = "${AlarmInteractionDestination.AlarmAction.route}/{alarm}", + navigation( + startDestination = AlarmInteractionDestination.Route, ) { - composable( - route = "${AlarmInteractionDestination.AlarmAction.route}/{alarm}", - arguments = listOf( - navArgument("alarm") { - type = AlarmArgType() - defaultValue = Alarm() - }, - ), + composable { + LaunchedEffect(Unit) { + alarm?.let { + navigator.navigateToAlarmAction( + it, + navOptions { + popUpTo(AlarmInteractionBaseRoute) { + inclusive = true + } + }, + ) + } ?: run { + navigator.navigateToHome( + navOptions { + popUpTo(AlarmInteractionBaseRoute) { + inclusive = true + } + }, + ) + } + } + } + + composable( + typeMap = mapOf(typeOf() to AlarmArgType), ) { AlarmActionRoute( navigator = navigator, ) } - composable( - route = "${AlarmInteractionDestination.AlarmSnoozeTimer.route}/{alarm}", - arguments = listOf( - navArgument("alarm") { - type = AlarmArgType() - defaultValue = Alarm() - }, - ), + composable( + typeMap = mapOf(typeOf() to AlarmArgType), ) { AlarmSnoozeTimerRoute( navigator = navigator, diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt index 0deed3a3..470f89c3 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt @@ -1,5 +1,7 @@ package com.yapp.alarm.interaction.action +import com.yapp.domain.model.Alarm +import com.yapp.ui.base.SideEffect import com.yapp.ui.base.UiState class AlarmActionContract { @@ -13,6 +15,7 @@ class AlarmActionContract { val snoozeEnabled: Boolean = true, val snoozeInterval: Int = 5, val snoozeCount: Int = 5, + val isFirstMission: Boolean? = null, ) : UiState sealed class Action { @@ -21,10 +24,6 @@ class AlarmActionContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() + data class NavigateToAlarmSnooze(val alarm: Alarm) : SideEffect() } } diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt index f77da04c..4db7ed7b 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.Icon @@ -30,6 +31,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.common.navigation.OrbitNavigator import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.ui.component.banner.AdsBanner import com.yapp.ui.component.button.OrbitButton import com.yapp.ui.component.lottie.LottieAnimation import com.yapp.ui.utils.heightForScreenPercentage @@ -47,12 +49,8 @@ internal fun AlarmActionRoute( LaunchedEffect(sideEffect) { sideEffect.collect { action -> when (action) { - is AlarmActionContract.SideEffect.Navigate -> { - navigator.navigateTo( - route = action.route, - popUpTo = action.popUpTo, - inclusive = action.inclusive, - ) + is AlarmActionContract.SideEffect.NavigateToAlarmSnooze -> { + navigator.navigateToAlarmSnoozeTimer(action.alarm) } } } @@ -83,6 +81,7 @@ internal fun AlarmActionScreen( snoozeEnabled = state.snoozeEnabled, snoozeInterval = state.snoozeInterval, snoozeCount = state.snoozeCount, + isFirstMission = state.isFirstMission, onSnoozeClick = { eventDispatcher(AlarmActionContract.Action.Snooze) }, onDismissClick = { eventDispatcher(AlarmActionContract.Action.Dismiss) @@ -118,64 +117,77 @@ private fun AlarmActionContent( snoozeEnabled: Boolean, snoozeInterval: Int, snoozeCount: Int, + isFirstMission: Boolean?, onSnoozeClick: () -> Unit, onDismissClick: () -> Unit, ) { - Column( - modifier = Modifier - .fillMaxSize() - .background( - color = Color(0xFF496381), - ), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer( - modifier = Modifier.heightForScreenPercentage( - 0.17f, - ), - ) + Box(modifier = Modifier.statusBarsPadding()) { + Column( + modifier = Modifier + .fillMaxSize() + .background( + color = Color(0xFF496381), + ), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Spacer( + modifier = Modifier.heightForScreenPercentage( + 0.17f, + ), + ) - AlarmTime( - isAm = isAm, - hour = hour, - minute = minute, - todayDate = todayDate, - ) + AlarmTime( + isAm = isAm, + hour = hour, + minute = minute, + todayDate = todayDate, + ) - Spacer(modifier = Modifier.height(102.dp)) + Spacer(modifier = Modifier.height(102.dp)) - Icon( - painter = painterResource(id = core.designsystem.R.drawable.ic_alarm_action_character), - tint = Color(0xFF07203E), - contentDescription = "Alarm Action Character", - ) + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_alarm_action_character), + tint = Color(0xFF07203E), + contentDescription = "Alarm Action Character", + ) - Spacer(modifier = Modifier.height(56.dp)) + Spacer(modifier = Modifier.height(56.dp)) - if (snoozeEnabled && snoozeCount != 0) { - AlarmSnoozeButton( - snoozeInterval = snoozeInterval, - snoozeCount = snoozeCount, - onSnoozeClick = onSnoozeClick, - ) - } else { - Spacer(modifier = Modifier.height(54.dp)) - } + if (snoozeEnabled && snoozeCount != 0) { + AlarmSnoozeButton( + snoozeInterval = snoozeInterval, + snoozeCount = snoozeCount, + onSnoozeClick = onSnoozeClick, + ) + } else { + Spacer(modifier = Modifier.height(54.dp)) + } - Spacer(modifier = Modifier.weight(1f)) + Spacer(modifier = Modifier.weight(1f)) - OrbitButton( - label = stringResource(id = R.string.alarm_off_btn), - enabled = true, - modifier = Modifier - .padding( - start = 40.dp, - end = 40.dp, - bottom = 48.dp, + if (isFirstMission != null) { + OrbitButton( + label = if (isFirstMission) { + stringResource(id = R.string.alarm_off_mission_start_btn) + } else { + stringResource(id = R.string.alarm_off_btn) + }, + enabled = true, + modifier = Modifier + .padding( + start = 40.dp, + end = 40.dp, + bottom = 48.dp, + ) + .height(62.dp), + onClick = onDismissClick, ) - .height(62.dp), - onClick = onDismissClick, - ) + } else { + Spacer(modifier = Modifier.height(62.dp)) + } + } + + AdsBanner() } } diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt index 548c79b0..57e6cd8c 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt @@ -5,18 +5,25 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent import com.yapp.alarm.pendingIntent.interaction.createAlarmSnoozeIntent -import com.yapp.common.navigation.Routes +import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import java.time.LocalDate +import java.time.LocalTime +import java.time.format.DateTimeFormatter +import java.time.format.TextStyle +import java.util.Locale import javax.inject.Inject @HiltViewModel class AlarmActionViewModel @Inject constructor( private val app: Application, + private val userPreferences: UserPreferences, savedStateHandle: SavedStateHandle, ) : BaseViewModel( AlarmActionContract.State(), @@ -25,6 +32,7 @@ class AlarmActionViewModel @Inject constructor( private val alarm: Alarm? = alarmJson?.let { Alarm.fromJson(it) } init { + fetchIsFirstMission() updateState { copy( snoozeEnabled = alarm?.isSnoozeEnabled ?: false, @@ -36,12 +44,24 @@ class AlarmActionViewModel @Inject constructor( startClock() } + private fun fetchIsFirstMission() { + viewModelScope.launch { + val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + val isFirstMission = fortuneDate != todayDate + + updateState { + copy(isFirstMission = isFirstMission) + } + } + } + private fun startClock() { viewModelScope.launch { while (isActive) { - val now = java.time.LocalTime.now() - val today = java.time.LocalDate.now() - val dayOfWeek = today.dayOfWeek.getDisplayName(java.time.format.TextStyle.FULL, java.util.Locale.KOREAN) + val now = LocalTime.now() + val today = LocalDate.now() + val dayOfWeek = today.dayOfWeek.getDisplayName(TextStyle.FULL, Locale.KOREAN) updateState { copy( @@ -76,13 +96,9 @@ class AlarmActionViewModel @Inject constructor( }, ) } - emitSideEffect( - AlarmActionContract.SideEffect.Navigate( - route = "${Routes.AlarmInteraction.ALARM_SNOOZE_TIMER}/$alarm", - popUpTo = Routes.AlarmInteraction.ALARM_ACTION, - inclusive = true, - ), - ) + alarm?.let { + emitSideEffect(AlarmActionContract.SideEffect.NavigateToAlarmSnooze(it)) + } } private fun dismiss() { diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt index ba6e652e..dcca8639 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt @@ -9,17 +9,12 @@ class AlarmSnoozeTimerContract { val alarmTimeStamp: Long = 0L, val remainingSeconds: Int = 1, val totalSeconds: Int = 300, + val isFirstMission: Boolean? = null, ) : UiState sealed class Action { data object Dismiss : Action() } - sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() - } + sealed class SideEffect : com.yapp.ui.base.SideEffect } diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt index a607dd85..e914f506 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt @@ -57,17 +57,7 @@ internal fun AlarmSnoozeTimerRoute( val sideEffect = viewModel.container.sideEffectFlow LaunchedEffect(sideEffect) { - sideEffect.collect { action -> - when (action) { - is AlarmSnoozeTimerContract.SideEffect.Navigate -> { - navigator.navigateTo( - route = action.route, - popUpTo = action.popUpTo, - inclusive = action.inclusive, - ) - } - } - } + sideEffect.collect { } } AlarmSnoozeTimerScreen( @@ -90,6 +80,7 @@ internal fun AlarmSnoozeTimerScreen( AlarmSnoozeContent( remainingSeconds = state.remainingSeconds, totalSeconds = state.totalSeconds, + isFirstMission = state.isFirstMission, onDismissClick = { eventDispatcher(AlarmSnoozeTimerContract.Action.Dismiss) (context as? ComponentActivity)?.finish() @@ -119,6 +110,7 @@ private fun AlarmSnoozeLoadingScreen() { private fun AlarmSnoozeContent( remainingSeconds: Int, totalSeconds: Int, + isFirstMission: Boolean?, onDismissClick: () -> Unit, ) { Column( @@ -147,9 +139,14 @@ private fun AlarmSnoozeContent( ) } - AlarmOffButton( - onClick = onDismissClick, - ) + if (isFirstMission != null) { + AlarmOffButton( + onClick = onDismissClick, + isFirstMission = isFirstMission, + ) + } else { + Spacer(modifier = Modifier.height(58.dp)) + } Spacer(modifier = Modifier.height(48.dp)) } @@ -273,6 +270,7 @@ private fun formatSecondsToTime(seconds: Int): String { private fun AlarmOffButton( modifier: Modifier = Modifier, onClick: () -> Unit, + isFirstMission: Boolean, height: Dp = 58.dp, containerColor: Color = OrbitTheme.colors.white.copy(alpha = 0.2f), contentColor: Color = OrbitTheme.colors.white, @@ -291,7 +289,11 @@ private fun AlarmOffButton( ), ) { Text( - text = stringResource(id = R.string.alarm_off_btn), + text = if (isFirstMission) { + stringResource(id = R.string.alarm_off_mission_start_btn) + } else { + stringResource(id = R.string.alarm_off_btn) + }, style = OrbitTheme.typography.headline2SemiBold, ) } diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt index 5ec0c4cd..6076cf8c 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt @@ -4,14 +4,18 @@ import android.app.Application import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent +import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import java.time.LocalDate import java.time.LocalDateTime import java.time.ZoneId +import java.time.format.DateTimeFormatter import javax.inject.Inject import kotlin.math.max @@ -19,6 +23,7 @@ import kotlin.math.max class AlarmSnoozeTimerViewModel @Inject constructor( private val app: Application, savedStateHandle: SavedStateHandle, + private val userPreferences: UserPreferences, ) : BaseViewModel( AlarmSnoozeTimerContract.State(), ) { @@ -26,9 +31,22 @@ class AlarmSnoozeTimerViewModel @Inject constructor( private val alarm: Alarm? = alarmJson?.let { Alarm.fromJson(it) } init { + fetchIsFirstMission() startClock() } + private fun fetchIsFirstMission() { + viewModelScope.launch { + val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + val isFirstMission = fortuneDate != todayDate + + updateState { + copy(isFirstMission = isFirstMission) + } + } + } + private fun startClock() { viewModelScope.launch { val nowMillis = System.currentTimeMillis() diff --git a/feature/alarm-interaction/src/main/res/values/strings.xml b/feature/alarm-interaction/src/main/res/values/strings.xml index f7e9dc83..0c4fd8b9 100644 --- a/feature/alarm-interaction/src/main/res/values/strings.xml +++ b/feature/alarm-interaction/src/main/res/values/strings.xml @@ -2,6 +2,7 @@ %d분 미루기 알람끄기 + 미션 시작 알람 미루기 남은 시간 diff --git a/feature/fortune/build.gradle.kts b/feature/fortune/build.gradle.kts index d82201b5..ac291d36 100644 --- a/feature/fortune/build.gradle.kts +++ b/feature/fortune/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.datastore) implementation(libs.orbit.core) implementation(libs.orbit.compose) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt index 0083828d..6c7528e0 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt @@ -25,11 +25,9 @@ sealed class FortuneContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() + data object NavigateToFortuneReward : SideEffect() + + data object NavigateToHome : SideEffect() data object NavigateBack : SideEffect() diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt index d0a0b1d2..5f1b5133 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt @@ -1,74 +1,94 @@ package com.yapp.fortune import androidx.compose.material3.SnackbarHostState -import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberCoroutineScope import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import androidx.navigation.navOptions import androidx.navigation.navigation import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.FortuneDestination import com.yapp.common.navigation.extensions.sharedHiltViewModel +import com.yapp.common.navigation.route.FortuneBaseRoute +import com.yapp.common.navigation.route.FortuneDestination import com.yapp.ui.component.snackbar.showCustomSnackBar +import kotlinx.coroutines.CoroutineScope fun NavGraphBuilder.fortuneNavGraph( navigator: OrbitNavigator, snackBarHostState: SnackbarHostState, ) { - navigation( - route = FortuneDestination.Route.route, - startDestination = FortuneDestination.Fortune.route, - ) { - FortuneDestination.routes.forEach { destination -> - composable(destination.route) { backStackEntry -> - val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) - val coroutineScope = rememberCoroutineScope() + navigation(startDestination = FortuneDestination.Fortune) { + composable { backStackEntry -> + val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) + val coroutineScope = rememberCoroutineScope() - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - when (sideEffect) { - is FortuneContract.SideEffect.Navigate -> navigator.navigateTo( - route = sideEffect.route, - popUpTo = sideEffect.popUpTo, - inclusive = sideEffect.inclusive, - ) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collect { sideEffect -> + handleSideEffect(sideEffect, navigator, snackBarHostState, coroutineScope) + } + } - FortuneContract.SideEffect.NavigateBack -> navigator.navigateBack() + FortuneRoute( + viewModel = viewModel, + navigator = navigator, + ) + } - is FortuneContract.SideEffect.ShowSnackBar -> showCustomSnackBar( - scope = coroutineScope, - snackBarHostState = snackBarHostState, - message = sideEffect.message, - actionLabel = sideEffect.label, - iconRes = sideEffect.iconRes, - bottomPadding = sideEffect.bottomPadding, - durationMillis = sideEffect.durationMillis, - onDismiss = sideEffect.onDismiss, - onAction = sideEffect.onAction, - ) - } - } - } + composable { backStackEntry -> + val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) + val coroutineScope = rememberCoroutineScope() - when (destination) { - FortuneDestination.Fortune -> FortuneRoute(viewModel) - FortuneDestination.Reward -> FortuneRewardRoute(viewModel) - else -> {} + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collect { sideEffect -> + handleSideEffect(sideEffect, navigator, snackBarHostState, coroutineScope) } } + + FortuneRewardRoute( + viewModel = viewModel, + ) } } } -@Composable -private fun handleFortuneSideEffect( +private suspend fun handleSideEffect( sideEffect: FortuneContract.SideEffect, navigator: OrbitNavigator, snackBarHostState: SnackbarHostState, + coroutineScope: CoroutineScope, ) { - val coroutineScope = rememberCoroutineScope() + when (sideEffect) { + FortuneContract.SideEffect.NavigateToFortuneReward -> { + navigator.navigateToFortuneReward( + navOptions = navOptions { + popUpTo(FortuneDestination.Fortune) { + inclusive = true + } + }, + ) + } + + FortuneContract.SideEffect.NavigateToHome -> navigator.navigateToHome( + navOptions = navOptions { + popUpTo(FortuneBaseRoute) { + inclusive = true + } + }, + ) + + FortuneContract.SideEffect.NavigateBack -> navigator.navigateBack() - LaunchedEffect(sideEffect) { + is FortuneContract.SideEffect.ShowSnackBar -> showCustomSnackBar( + scope = coroutineScope, + snackBarHostState = snackBarHostState, + message = sideEffect.message, + actionLabel = sideEffect.label, + iconRes = sideEffect.iconRes, + bottomPadding = sideEffect.bottomPadding, + durationMillis = sideEffect.durationMillis, + onDismiss = sideEffect.onDismiss, + onAction = sideEffect.onAction, + ) } } diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt index 0997bfcd..868464e8 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt @@ -28,6 +28,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.component.FortuneTopAppBar import com.yapp.ui.component.button.OrbitButton @@ -37,9 +39,16 @@ import com.yapp.ui.utils.heightForScreenPercentage fun FortuneRewardRoute( viewModel: FortuneViewModel = hiltViewModel(), ) { + val analyticsHelper = LocalAnalyticsHelper.current val state = viewModel.container.stateFlow.collectAsStateWithLifecycle() LaunchedEffect(state.value.fortuneImageId) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_talisman_view", + ), + ) + val imageId = state.value.fortuneImageId ?: viewModel.getRandomImage() viewModel.saveFortuneImageIdIfNeeded(imageId) } @@ -48,7 +57,14 @@ fun FortuneRewardRoute( state = state, onCloseClick = { viewModel.onAction(FortuneContract.Action.NavigateToHome) }, onCompleteClick = { viewModel.onAction(FortuneContract.Action.NavigateToHome) }, - onSaveImage = { viewModel.onAction(FortuneContract.Action.SaveImage(it)) }, + onSaveImage = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_talisman_save", + ), + ) + viewModel.onAction(FortuneContract.Action.SaveImage(it)) + }, ) } @@ -97,7 +113,7 @@ fun FortuneRewardScreen( .fillMaxWidth() .padding(start = 30.dp) .align(Alignment.Start), - text = "$nickName\n부적에 소원을 적으면\n이루어질거야!", + text = "$nickName\n부적을 가지고 있으면\n행운이 찾아올거야", style = OrbitTheme.typography.H1, color = OrbitTheme.colors.white, ) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt index 79929d26..0b7357bc 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt @@ -1,16 +1,22 @@ package com.yapp.fortune +import androidx.activity.compose.BackHandler import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -20,15 +26,23 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper +import com.yapp.common.navigation.OrbitNavigator import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.component.FortuneTopAppBar import com.yapp.fortune.component.SlidingIndicator import com.yapp.fortune.page.FortunePager +import com.yapp.ui.component.lottie.LottieAnimation +import java.math.BigDecimal +import java.math.RoundingMode @Composable fun FortuneRoute( viewModel: FortuneViewModel = hiltViewModel(), + navigator: OrbitNavigator, ) { + val analyticsHelper = LocalAnalyticsHelper.current val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() val pagerState = rememberPagerState( @@ -36,7 +50,60 @@ fun FortuneRoute( pageCount = { state.fortunePages.size + 2 }, ) + var startTime by remember { mutableLongStateOf(System.currentTimeMillis()) } + var previousPage by remember { mutableIntStateOf(pagerState.currentPage) } + + BackHandler { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_exit", + properties = mapOf( + AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to pagerState.currentPage + 1, + ), + ), + ) + navigator.navigateBack() + } + LaunchedEffect(pagerState.currentPage) { + val eventType = when (pagerState.currentPage) { + 0 -> "fortune_view_today" + 1 -> "fortune_view_category1" + 2 -> "fortune_view_category2" + 3 -> "fortune_view_style" + 4 -> "fortune_view_refer" + 5 -> "fortune_view_end" + else -> "" + } + + analyticsHelper.logEvent( + AnalyticsEvent( + type = eventType, + properties = mapOf( + AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to pagerState.currentPage + 1, + ), + ), + ) + + if (pagerState.currentPage != previousPage) { + val endTime = System.currentTimeMillis() + val duration = ((endTime - startTime).toDouble() / 1000) // 초 단위로 변환 + val truncatedDuration = BigDecimal(duration).setScale(2, RoundingMode.DOWN).toDouble() + + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_time_spent", + properties = mapOf( + AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to previousPage + 1, + AnalyticsEvent.FortunePropertiesKeys.DURATION to truncatedDuration, + ), + ), + ) + + startTime = endTime + previousPage = pagerState.currentPage + } + if (state.currentStep != pagerState.currentPage) { viewModel.onAction(FortuneContract.Action.UpdateStep(pagerState.currentPage)) } @@ -46,7 +113,18 @@ fun FortuneRoute( state = state, pagerState = pagerState, onNextStep = { viewModel.onAction(FortuneContract.Action.NextStep) }, - onCloseClick = { viewModel.onAction(FortuneContract.Action.NavigateToHome) }, + onNavigateToHome = { viewModel.onAction(FortuneContract.Action.NavigateToHome) }, + onCloseClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_exit", + properties = mapOf( + AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to pagerState.currentPage + 1, + ), + ), + ) + viewModel.onAction(FortuneContract.Action.NavigateToHome) + }, ) } @@ -55,6 +133,7 @@ fun FortuneScreen( state: FortuneContract.State, pagerState: PagerState, onNextStep: () -> Unit, + onNavigateToHome: () -> Unit, onCloseClick: () -> Unit, ) { val backgroundRes = when (state.currentStep) { @@ -69,35 +148,56 @@ fun FortuneScreen( .background(Color(0xFF4891F0)) .navigationBarsPadding(), ) { - Image( - painter = painterResource(id = backgroundRes), - contentDescription = null, - contentScale = ContentScale.Crop, - modifier = Modifier.matchParentSize(), - ) - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - FortuneTopAppBar( - titleLabel = "미래에서 온 편지", - onCloseClick = onCloseClick, + if (state.isLoading) { + FortuneLoadingScreen() + } else { + Image( + painter = painterResource(id = backgroundRes), + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier.matchParentSize(), ) - SlidingIndicator( - currentIndex = pagerState.currentPage, - count = 6, - dotHeight = 5.dp, - spacing = 4.dp, - inactiveColor = OrbitTheme.colors.white.copy(0.2f), - activeColor = OrbitTheme.colors.white, - ) + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + FortuneTopAppBar( + titleLabel = "미래에서 온 편지", + onCloseClick = onCloseClick, + ) + + SlidingIndicator( + currentIndex = pagerState.currentPage, + count = 6, + dotHeight = 5.dp, + spacing = 4.dp, + inactiveColor = OrbitTheme.colors.white.copy(0.2f), + activeColor = OrbitTheme.colors.white, + ) - FortunePager(state, pagerState, onNextStep) + FortunePager(state, pagerState, onNextStep, onNavigateToHome) + } } } } +@Composable +fun FortuneLoadingScreen() { + Box( + modifier = Modifier + .fillMaxSize() + .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f)), + contentAlignment = Alignment.Center, + ) { + LottieAnimation( + modifier = Modifier + .size(70.dp), + resId = core.designsystem.R.raw.star_loading, + ) + } +} + @Composable @Preview fun FortuneRoutePreview() { diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt index 56f13f00..b4890bfb 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt @@ -4,8 +4,6 @@ import android.app.Application import android.util.Log import androidx.annotation.DrawableRes import androidx.lifecycle.viewModelScope -import com.yapp.common.navigation.destination.FortuneDestination -import com.yapp.common.navigation.destination.HomeDestination import com.yapp.datastore.UserPreferences import com.yapp.domain.repository.FortuneRepository import com.yapp.domain.repository.ImageRepository @@ -18,6 +16,8 @@ import kotlinx.coroutines.launch import org.orbitmvi.orbit.syntax.simple.intent import org.orbitmvi.orbit.syntax.simple.postSideEffect import org.orbitmvi.orbit.syntax.simple.reduce +import java.time.LocalDate +import java.time.format.DateTimeFormatter import javax.inject.Inject @HiltViewModel @@ -33,11 +33,12 @@ class FortuneViewModel @Inject constructor( init { viewModelScope.launch { val fortuneId = userPreferences.fortuneIdFlow.firstOrNull() - fortuneId?.let { getFortune(it) } + val firstDismissedAlarmId = userPreferences.firstDismissedAlarmIdFlow.firstOrNull() + val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() + fortuneId?.let { getFortune(it, firstDismissedAlarmId, fortuneDate) } } } - - private fun getFortune(fortuneId: Long) = intent { + private fun getFortune(fortuneId: Long, firstDismissedAlarmId: Long?, fortuneDate: String?) = intent { updateState { copy(isLoading = true) } fortuneRepository.getFortune(fortuneId).onSuccess { fortune -> @@ -45,6 +46,8 @@ class FortuneViewModel @Inject constructor( val imageId = savedImageId ?: getRandomImage() val formattedTitle = fortune.dailyFortuneTitle.replace(",", ",\n").trim() + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + val hasReward = (fortuneDate == todayDate) && (firstDismissedAlarmId != null) updateState { copy( isLoading = false, @@ -53,6 +56,7 @@ class FortuneViewModel @Inject constructor( avgFortuneScore = fortune.avgFortuneScore, fortunePages = fortune.toFortunePages(), fortuneImageId = imageId, + hasReward = hasReward, ) } }.onFailure { error -> @@ -72,13 +76,7 @@ class FortuneViewModel @Inject constructor( when (action) { is FortuneContract.Action.NextStep -> { if (state.hasReward) { - postSideEffect( - FortuneContract.SideEffect.Navigate( - route = FortuneDestination.Reward.route, - popUpTo = FortuneDestination.Fortune.route, - inclusive = true, - ), - ) + postSideEffect(FortuneContract.SideEffect.NavigateToFortuneReward) } else { reduce { state.copy(currentStep = (state.currentStep + 1).coerceAtMost(5)) } } @@ -96,13 +94,7 @@ class FortuneViewModel @Inject constructor( } private fun navigateToHome() { - emitSideEffect( - FortuneContract.SideEffect.Navigate( - route = HomeDestination.Route.route, - popUpTo = FortuneDestination.Route.route, - inclusive = true, - ), - ) + emitSideEffect(FortuneContract.SideEffect.NavigateToHome) } private fun saveImage(@DrawableRes resId: Int) = viewModelScope.launch { diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt index 4ff5b412..ff64e917 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt @@ -23,7 +23,7 @@ fun CodyBox( clothsNameLabel: String, ) { Column( - modifier = Modifier.width(120.dp), + modifier = Modifier.width(110.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { Icon( diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt index dddca249..d5d5cf5c 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt @@ -2,13 +2,10 @@ package com.yapp.fortune.component import androidx.annotation.DrawableRes import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -37,25 +34,18 @@ fun DetailHoroScopeText( .paddingForScreenPercentage(horizontalPercentage = 0.055f), horizontalAlignment = Alignment.CenterHorizontally, ) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - ) { - Image( - painter = painterResource(id = iconRes), - contentDescription = null, - modifier = Modifier - .size(24.dp) - .padding(end = 4.dp), - ) - Text( - text = fortuneTitleText, - style = OrbitTheme.typography.label1SemiBold, - color = color, - textAlign = TextAlign.Start, - ) - } + Image( + painter = painterResource(id = iconRes), + contentDescription = null, + modifier = Modifier.size(24.dp), + ) + Spacer(modifier = Modifier.height(3.dp)) + Text( + text = fortuneTitleText, + style = OrbitTheme.typography.label1SemiBold, + color = color, + textAlign = TextAlign.Start, + ) Spacer(modifier = Modifier.height(8.dp)) Text( text = fortuneSubTitleText, diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt index ed9489ed..0282f8fb 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt @@ -35,7 +35,12 @@ fun FortuneTopAppBar( painter = painterResource(id = core.designsystem.R.drawable.ic_close), contentDescription = "Close", modifier = Modifier - .customClickable(onClick = onCloseClick), + .customClickable( + rippleEnabled = false, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onCloseClick, + ), tint = OrbitTheme.colors.white, ) Spacer(modifier = Modifier.padding(end = 12.dp)) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt index e7c8300f..02add410 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt @@ -19,7 +19,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme -import feature.fortune.R @Composable fun SpeechBubble( @@ -27,7 +26,7 @@ fun SpeechBubble( text: String, backGroundColor: Color = OrbitTheme.colors.white.copy(alpha = 0.2f), textColor: Color = OrbitTheme.colors.white, - textStyle: TextStyle = OrbitTheme.typography.body1Medium, + textStyle: TextStyle = OrbitTheme.typography.H3, verticalPadding: Dp = 10.dp, horizontalPadding: Dp = 16.dp, ) { diff --git a/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt b/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt index 2494c929..6dee0040 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt @@ -14,6 +14,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.component.HillWithGradient import com.yapp.ui.component.button.OrbitButton @@ -27,7 +29,10 @@ import com.yapp.ui.utils.paddingForScreenPercentage fun FortuneCompletePage( hasReward: Boolean, onCompleteClick: () -> Unit, + onNavigateToHome: () -> Unit, ) { + val analyticsHelper = LocalAnalyticsHelper.current + val message = if (hasReward) { "첫 알람에 잘 일어났네!\n보상으로 행운 부적을 줄게" } else { @@ -80,7 +85,18 @@ fun FortuneCompletePage( OrbitButton( label = if (hasReward) "부적 보러가기" else "완료", modifier = Modifier.padding(horizontal = 20.dp, vertical = 12.dp), - onClick = onCompleteClick, + onClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_complete", + ), + ) + if (hasReward) { + onCompleteClick() + } else { + onNavigateToHome() + } + }, enabled = true, ) } @@ -90,5 +106,5 @@ fun FortuneCompletePage( @Composable @Preview fun FortuneCompletePagePreview() { - FortuneCompletePage(hasReward = true, onCompleteClick = {}) + FortuneCompletePage(hasReward = true, onCompleteClick = {}, onNavigateToHome = {}) } diff --git a/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt b/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt index c86296d2..08b7cfc5 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt @@ -16,6 +16,7 @@ fun FortunePager( state: FortuneContract.State, pagerState: PagerState, onNextStep: () -> Unit, + onNavigateToHome: () -> Unit, ) { val coroutineScope = rememberCoroutineScope() HorizontalPager( @@ -53,6 +54,7 @@ fun FortunePager( 5 -> FortuneCompletePage( hasReward = state.hasReward, onCompleteClick = onNextStep, + onNavigateToHome = onNavigateToHome, ) else -> {} } diff --git a/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt b/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt index e3336cb7..3f9abb42 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt @@ -35,7 +35,6 @@ fun CodyContent( ) { codyList.chunked(2).forEach { rowItems -> Row( - horizontalArrangement = Arrangement.spacedBy(16.dp), verticalAlignment = Alignment.CenterVertically, ) { rowItems.forEach { item -> diff --git a/feature/home/build.gradle.kts b/feature/home/build.gradle.kts index 61e15919..b8a4b12d 100644 --- a/feature/home/build.gradle.kts +++ b/feature/home/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.alarm) implementation(projects.core.media) implementation(projects.core.datastore) diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt index 2f9c710f..de6da472 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt @@ -95,12 +95,6 @@ sealed class AlarmAddEditContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() - data object NavigateBack : SideEffect() data class SaveAlarm(val id: Long) : SideEffect() diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt index 156b8a66..d479e3f6 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt @@ -19,14 +19,19 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ripple.RippleAlpha import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.LocalRippleConfiguration +import androidx.compose.material3.RippleConfiguration import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarResult import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.material3.ripple import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -63,6 +68,7 @@ import com.yapp.ui.component.snackbar.showCustomSnackBar import com.yapp.ui.component.switch.OrbitSwitch import com.yapp.ui.component.timepicker.OrbitPicker import feature.home.R +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @Composable @@ -77,18 +83,11 @@ fun AlarmAddEditRoute( val coroutineScope = rememberCoroutineScope() LaunchedEffect(sideEffect) { - sideEffect.collect { effect -> + sideEffect.collectLatest { effect -> when (effect) { is AlarmAddEditContract.SideEffect.NavigateBack -> { navigator.navigateBack() } - is AlarmAddEditContract.SideEffect.Navigate -> { - navigator.navigateTo( - route = effect.route, - popUpTo = effect.popUpTo, - inclusive = effect.inclusive, - ) - } is AlarmAddEditContract.SideEffect.SaveAlarm -> { navigator.navController.previousBackStackEntry ?.savedStateHandle @@ -456,7 +455,14 @@ private fun AlarmAddEditSettingsSection( }.title }" } - state.soundState.isSoundEnabled -> state.soundState.sounds.getOrElse(state.soundState.soundIndex) { AlarmSound("", Uri.EMPTY) }.title + + state.soundState.isSoundEnabled -> state.soundState.sounds.getOrElse(state.soundState.soundIndex) { + AlarmSound( + "", + Uri.EMPTY, + ) + }.title + state.soundState.isVibrationEnabled -> stringResource(id = R.string.alarm_add_edit_vibration) else -> stringResource(id = R.string.alarm_add_edit_alarm_selected_option_none) }, @@ -471,44 +477,63 @@ private fun AlarmAddEditSettingsSection( } } +@OptIn(ExperimentalMaterial3Api::class) @Composable private fun AlarmAddEditSettingItem( label: String, description: String, onClick: () -> Unit, ) { - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { - onClick() - } - .padding( - horizontal = 20.dp, - vertical = 14.dp, + val interactionSource = remember { MutableInteractionSource() } + + CompositionLocalProvider( + LocalRippleConfiguration provides RippleConfiguration( + rippleAlpha = RippleAlpha( + pressedAlpha = 1f, + focusedAlpha = 1f, + hoveredAlpha = 1f, + draggedAlpha = 1f, ), - verticalAlignment = Alignment.CenterVertically, + ), ) { - Text( - label, - modifier = Modifier.width(80.dp), - style = OrbitTheme.typography.body1SemiBold, - color = OrbitTheme.colors.white, - ) - Text( - description, - modifier = Modifier.weight(1f), - style = OrbitTheme.typography.body2Regular, - color = OrbitTheme.colors.gray_50, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - textAlign = TextAlign.End, - ) - Icon( - painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right), - contentDescription = "Arrow", - tint = OrbitTheme.colors.gray_300, - ) + Row( + modifier = Modifier + .fillMaxWidth() + .clickable( + interactionSource = interactionSource, + indication = ripple( + color = OrbitTheme.colors.gray_700, + ), + ) { + onClick() + } + .padding( + horizontal = 20.dp, + vertical = 14.dp, + ), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + label, + modifier = Modifier.width(80.dp), + style = OrbitTheme.typography.body1SemiBold, + color = OrbitTheme.colors.white, + ) + Text( + description, + modifier = Modifier.weight(1f), + style = OrbitTheme.typography.body2Regular, + color = OrbitTheme.colors.gray_50, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.End, + ) + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right), + contentDescription = "Arrow", + tint = OrbitTheme.colors.gray_300, + ) + } } } diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt index c1ecb0f1..08713ebd 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt @@ -5,11 +5,14 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.yapp.alarm.AlarmHelper +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.AnalyticsHelper import com.yapp.common.util.ResourceProvider import com.yapp.domain.model.Alarm import com.yapp.domain.model.AlarmDay import com.yapp.domain.model.AlarmSound import com.yapp.domain.model.copyFrom +import com.yapp.domain.model.toAlarmDayNames import com.yapp.domain.model.toAlarmDays import com.yapp.domain.model.toDayOfWeek import com.yapp.domain.usecase.AlarmUseCase @@ -20,10 +23,12 @@ import dagger.hilt.android.lifecycle.HiltViewModel import feature.home.R import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch +import java.time.LocalTime import javax.inject.Inject @HiltViewModel class AlarmAddEditViewModel @Inject constructor( + private val analyticsHelper: AnalyticsHelper, private val alarmUseCase: AlarmUseCase, private val resourceProvider: ResourceProvider, private val hapticFeedbackManager: HapticFeedbackManager, @@ -57,9 +62,23 @@ class AlarmAddEditViewModel @Inject constructor( alarmUseCase.initializeSoundPlayer(defaultSound.uri) + val now = LocalTime.now() + val initialAmPm = if (now.hour < 12) "오전" else "오후" + val initialHour = if (now.hour == 0 || now.hour == 12) 12 else now.hour % 12 + val initialMinute = now.minute + updateState { copy( initialLoading = false, + timeState = timeState.copy( + initialAmPm = initialAmPm, + initialHour = "$initialHour", + initialMinute = initialMinute.toString().padStart(2, '0'), + currentAmPm = initialAmPm, + currentHour = initialHour, + currentMinute = initialMinute, + alarmMessage = getAlarmMessage(initialAmPm, initialHour, initialMinute, emptySet()), + ), soundState = soundState.copy(sounds = sounds, soundIndex = defaultSoundIndex), ) } @@ -239,6 +258,16 @@ class AlarmAddEditViewModel @Inject constructor( private suspend fun createNewAlarm(alarm: Alarm) { alarmUseCase.insertAlarm(alarm) .onSuccess { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "alarm_create", + properties = mapOf( + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "${it.id}", + AnalyticsEvent.AlarmPropertiesKeys.REPEAT_DAYS to it.repeatDays.toAlarmDayNames(), + AnalyticsEvent.AlarmPropertiesKeys.SNOOZE_OPTION to listOf(it.snoozeInterval, it.snoozeCount), + ), + ), + ) alarmHelper.scheduleAlarm(it) emitSideEffect(AlarmAddEditContract.SideEffect.SaveAlarm(it.id)) } @@ -480,6 +509,7 @@ class AlarmAddEditViewModel @Inject constructor( return when { days > 0 -> "${days}일 ${hours}시간 후에 울려요" hours > 0 -> "${hours}시간 ${minutes}분 후에 울려요" + minutes == 0L -> "곧 울려요" else -> "${minutes}분 후에 울려요" } } @@ -505,6 +535,11 @@ class AlarmAddEditViewModel @Inject constructor( val currentDayOfWeek = now.dayOfWeek.value val selectedDaysOfWeek = selectedDays.map { it.toDayOfWeek().value }.sorted() + + if (selectedDaysOfWeek.contains(currentDayOfWeek) && now.toLocalTime().isBefore(alarmTimeToday.toLocalTime())) { + return alarmTimeToday + } + val nextDay = selectedDaysOfWeek.firstOrNull { it > currentDayOfWeek } ?: selectedDaysOfWeek.first() val daysToAdd = if (nextDay > currentDayOfWeek) { @@ -512,6 +547,7 @@ class AlarmAddEditViewModel @Inject constructor( } else { 7 - (currentDayOfWeek - nextDay) } + val nextAlarmDate = now.toLocalDate().plusDays(daysToAdd.toLong()) return nextAlarmDate.atTime(alarmTimeToday.toLocalTime()) } diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt index d3aaa522..900d7e96 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt @@ -38,7 +38,6 @@ internal fun AlarmCheckItem( text = label, style = OrbitTheme.typography.label1Medium, color = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.gray_400, - modifier = Modifier.padding(start = 4.dp), textAlign = TextAlign.Center, ) } diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index 5bd10a47..a590bd8e 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -1,49 +1,81 @@ package com.yapp.alarm.component +import android.os.Handler +import android.os.Looper +import androidx.annotation.DrawableRes +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ripple.RippleAlpha +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.LocalRippleConfiguration +import androidx.compose.material3.RippleConfiguration +import androidx.compose.material3.Surface +import androidx.compose.material3.SwipeToDismissBox +import androidx.compose.material3.SwipeToDismissBoxValue import androidx.compose.material3.Text +import androidx.compose.material3.rememberSwipeToDismissBoxState +import androidx.compose.material3.ripple import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.layout.positionInRoot +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.AlarmDay import com.yapp.domain.model.toRepeatDays import com.yapp.ui.component.checkbox.OrbitCheckBox import com.yapp.ui.component.switch.OrbitSwitch +import feature.home.R import java.time.LocalDateTime import java.time.LocalTime import java.time.format.DateTimeFormatter +@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @Composable internal fun AlarmListItem( modifier: Modifier = Modifier, id: Long, repeatDays: Int, isHolidayAlarmOff: Boolean, + swipeable: Boolean = true, selectable: Boolean = false, selected: Boolean = false, onClick: (Long) -> Unit, + onLongPress: (Long, Float, Float) -> Unit, onToggleSelect: (Long) -> Unit, + onSwipe: (Long) -> Unit, isAm: Boolean, hour: Int, minute: Int, @@ -51,53 +83,133 @@ internal fun AlarmListItem( onToggleActive: (Long) -> Unit, ) { val interactionSource = remember { MutableInteractionSource() } - val isPressed by interactionSource.collectIsPressedAsState() - - Row( - modifier = modifier - .fillMaxWidth() - .background( - when { - isPressed || selected -> OrbitTheme.colors.gray_800 - else -> OrbitTheme.colors.gray_900 - }, - ) - .padding(horizontal = 24.dp, vertical = 20.dp) - .clickable( - interactionSource = interactionSource, - indication = null, - ) { - if (selectable) { - onToggleSelect(id) - } else { - onClick(id) + val density = LocalDensity.current + val configuration = LocalConfiguration.current + val screenHeightPx = with(density) { configuration.screenHeightDp.dp.toPx() } + + var itemPosition by remember { mutableStateOf(Pair(0f, 0f)) } + var itemSize by remember { mutableStateOf(IntSize(0, 0)) } + + val dismissState = rememberSwipeToDismissBoxState( + confirmValueChange = { + if (it == SwipeToDismissBoxValue.EndToStart) { + Handler(Looper.getMainLooper()).postDelayed({ + onSwipe(id) + }, 200,) + } + return@rememberSwipeToDismissBoxState it == SwipeToDismissBoxValue.EndToStart + }, + positionalThreshold = { + itemSize.width * 0.8f + }, + ) + + CompositionLocalProvider( + LocalRippleConfiguration provides RippleConfiguration( + rippleAlpha = RippleAlpha( + pressedAlpha = 1f, + focusedAlpha = 1f, + hoveredAlpha = 1f, + draggedAlpha = 1f, + ), + ), + ) { + SwipeToDismissBox( + state = dismissState, + modifier = modifier, + enableDismissFromStartToEnd = false, + enableDismissFromEndToStart = swipeable, + gesturesEnabled = swipeable, + backgroundContent = { + Box( + modifier = Modifier + .fillMaxSize() + .background(OrbitTheme.colors.gray_500) + .onGloballyPositioned { + itemSize = it.size + itemPosition = Pair( + it.positionInRoot().x, + it.positionInRoot().y, + ) + }, + contentAlignment = Alignment.CenterStart, + ) { + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_trash), + contentDescription = "Delete", + tint = Color.White, + modifier = Modifier + .size(24.dp) + .offset { + val offsetX = itemSize.width * (1 - dismissState.progress * 0.5f) - 12.dp.toPx() + + IntOffset( + x = offsetX.toInt(), + y = 0, + ) + }, + ) } }, - verticalAlignment = Alignment.CenterVertically, - ) { - if (selectable) { - OrbitCheckBox( - checked = selected, - onCheckedChange = { onToggleSelect(id) }, - ) - Spacer(modifier = Modifier.width(26.dp)) - } + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .background( + if (selected) OrbitTheme.colors.gray_800 else OrbitTheme.colors.gray_900, + ) + .combinedClickable( + interactionSource = interactionSource, + indication = ripple( + color = OrbitTheme.colors.gray_800, + ), + onLongClick = { + if (selectable) return@combinedClickable - AlarmListItemContent( - repeatDays = repeatDays, - isActive = isActive, - isHolidayAlarmOff = isHolidayAlarmOff, - isAm = isAm, - hour = hour, - minute = minute, - ) + val minRequiredSpace = itemSize.height + with(density) { 42.dp.toPx() } + val adjustedY = if (itemPosition.second + minRequiredSpace > screenHeightPx) { + screenHeightPx - minRequiredSpace + } else { + itemPosition.second + } - if (!selectable) { - Spacer(modifier = Modifier.weight(1f)) - OrbitSwitch( - isChecked = isActive, + onLongPress(id, itemPosition.first, adjustedY) + }, + ) { + if (selectable) { + onToggleSelect(id) + } else { + onClick(id) + } + } + .padding(horizontal = 24.dp, vertical = 20.dp), + verticalAlignment = Alignment.CenterVertically, ) { - onToggleActive(id) + if (selectable) { + OrbitCheckBox( + checked = selected, + onCheckedChange = { onToggleSelect(id) }, + ) + Spacer(modifier = Modifier.width(26.dp)) + } + + AlarmListItemContent( + repeatDays = repeatDays, + isActive = isActive, + isHolidayAlarmOff = isHolidayAlarmOff, + isAm = isAm, + hour = hour, + minute = minute, + ) + + if (!selectable) { + Spacer(modifier = Modifier.weight(1f)) + OrbitSwitch( + isChecked = isActive, + ) { + onToggleActive(id) + } + } } } } @@ -159,6 +271,7 @@ private fun AlarmListItemContent( text = ":", style = OrbitTheme.typography.title2Medium, color = if (isActive) OrbitTheme.colors.white else OrbitTheme.colors.gray_500, + modifier = Modifier.offset(y = (-2).dp), ) Spacer(modifier = Modifier.width(3.dp)) @@ -220,6 +333,65 @@ private fun getNextAlarmDateWithTime(isAm: Boolean, hour: Int, minute: Int): Str return nextAlarmDate.format(DateTimeFormatter.ofPattern("M월 d일")) } +@OptIn(ExperimentalMaterial3Api::class) +@Composable +internal fun AlarmListItemMenu( + text: String, + @DrawableRes iconRes: Int, + onClick: () -> Unit, +) { + val interactionSource = remember { MutableInteractionSource() } + + CompositionLocalProvider( + LocalRippleConfiguration provides RippleConfiguration( + rippleAlpha = RippleAlpha( + pressedAlpha = 1f, + focusedAlpha = 1f, + hoveredAlpha = 1f, + draggedAlpha = 1f, + ), + ), + ) { + Surface( + modifier = Modifier + .width(120.dp) + .height(42.dp) + .clip(RoundedCornerShape(12.dp)) + .clickable( + interactionSource = interactionSource, + indication = ripple( + bounded = false, + color = OrbitTheme.colors.gray_600, + ), + onClick = onClick, + ), + color = OrbitTheme.colors.gray_700, + shape = RoundedCornerShape(12.dp), + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = text, + style = OrbitTheme.typography.body1SemiBold, + color = OrbitTheme.colors.alert, + ) + + Icon( + modifier = Modifier.size(20.dp), + painter = painterResource(id = iconRes), + contentDescription = "Icon", + tint = OrbitTheme.colors.alert, + ) + } + } + } +} + @Preview @Composable private fun AlarmListItemPreview() { @@ -234,18 +406,21 @@ private fun AlarmListItemPreview() { repeatDays = selectedDays, isHolidayAlarmOff = true, selectable = true, + swipeable = false, selected = selected, isAm = true, hour = 6, minute = 0, isActive = isActive, onClick = { }, + onLongPress = { _, _, _ -> }, onToggleActive = { isActive = !isActive }, onToggleSelect = { selected = !selected }, + onSwipe = { }, ) Spacer( modifier = Modifier @@ -260,16 +435,54 @@ private fun AlarmListItemPreview() { isHolidayAlarmOff = false, selectable = false, selected = false, + swipeable = true, isAm = true, hour = 6, minute = 0, isActive = isActive, onClick = { }, + onLongPress = { _, _, _ -> }, onToggleActive = { isActive = !isActive }, onToggleSelect = { }, + onSwipe = { }, ) } } } + +@Preview +@Composable +private fun AlarmListItemMenuPreview() { + OrbitTheme { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + AlarmListItem( + id = 0, + repeatDays = 0, + isHolidayAlarmOff = false, + selectable = false, + swipeable = false, + selected = false, + isAm = true, + hour = 6, + minute = 0, + isActive = true, + onClick = { }, + onLongPress = { _, _, _ -> }, + onToggleActive = { }, + onToggleSelect = { }, + onSwipe = { }, + ) + + AlarmListItemMenu( + text = stringResource(id = R.string.alarm_delete_dialog_btn_delete), + iconRes = core.designsystem.R.drawable.ic_trash, + ) { + } + } + } +} diff --git a/feature/home/src/main/java/com/yapp/home/HomeContract.kt b/feature/home/src/main/java/com/yapp/home/HomeContract.kt index a6ea0717..ee3f5dd1 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeContract.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeContract.kt @@ -3,6 +3,7 @@ package com.yapp.home import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.yapp.domain.model.Alarm +import com.yapp.ui.base.SideEffect import com.yapp.ui.base.UiState sealed class HomeContract { @@ -12,28 +13,44 @@ sealed class HomeContract { val alarms: List = emptyList(), val lastAddedAlarmIndex: Int? = null, val dropdownMenuExpanded: Boolean = false, + val sortDropDownMenuExpanded: Boolean = false, val selectedAlarmIds: Set = emptySet(), val isSelectionMode: Boolean = false, val isDeleteDialogVisible: Boolean = false, val isNoActivatedAlarmDialogVisible: Boolean = false, val isNoDailyFortuneDialogVisible: Boolean = false, + val hasNewFortune: Boolean = false, + val isToolTipVisible: Boolean = false, val pendingAlarmToggle: Pair? = null, val lastFortuneScore: Int = -1, val deliveryTime: String = "받을 수 있는 운세가 없어요", - val name: String = "동현", + val name: String = "", + val activeItemMenu: Long? = null, + val activeItemMenuPosition: Pair? = null, + val sortOrder: AlarmSortOrder = AlarmSortOrder.DEFAULT, ) : UiState { val isAllSelected: Boolean get() = alarms.isNotEmpty() && selectedAlarmIds.size == alarms.size + val hasActivatedAlarm: Boolean get() = alarms.any { it.isAlarmActive } + + val sortedAlarms: List + get() = when (sortOrder) { + AlarmSortOrder.DEFAULT -> alarms + AlarmSortOrder.ACTIVATION -> alarms.sortedByDescending { it.isAlarmActive } + } } sealed class Action { data object NavigateToAlarmCreation : Action() data object ToggleMultiSelectionMode : Action() - data object ToggleDropdownMenuVisibility : Action() + data object ShowDropDownMenu : Action() + data object ShowSortDropDownMenu : Action() + data object HideDropDownMenu : Action() data class ToggleAlarmSelection(val alarmId: Long) : Action() data class ToggleAlarmActivation(val alarmId: Long) : Action() + data class SwipeToDeleteAlarm(val id: Long) : Action() data object ToggleAllAlarmSelection : Action() data object ShowDeleteDialog : Action() data object HideDeleteDialog : Action() @@ -41,6 +58,7 @@ sealed class HomeContract { data object HideNoActivatedAlarmDialog : Action() data object ShowNoDailyFortuneDialog : Action() data object HideNoDailyFortuneDialog : Action() + data object HideToolTip : Action() data object RollbackPendingAlarmToggle : Action() data object ConfirmDeletion : Action() data class DeleteSingleAlarm(val alarmId: Long) : Action() @@ -49,16 +67,19 @@ sealed class HomeContract { data class EditAlarm(val alarmId: Long) : Action() data object ShowDailyFortune : Action() data object NavigateToSetting : Action() + data class ShowItemMenu(val alarmId: Long, val x: Float, val y: Float) : Action() + data object HideItemMenu : Action() + data class SetSortOrder(val sortOrder: AlarmSortOrder) : Action() } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() + data object NavigateToAddAlarm : SideEffect() + + data class NavigateToEditAlarm(val alarmId: Long) : SideEffect() - data object NavigateBack : SideEffect() + data object NavigateToFortune : SideEffect() + + data object NavigateToSetting : SideEffect() data class ShowSnackBar( val message: String, @@ -70,4 +91,9 @@ sealed class HomeContract { val onAction: () -> Unit, ) : SideEffect() } + + enum class AlarmSortOrder { + DEFAULT, + ACTIVATION, + } } diff --git a/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt b/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt index ec43adbe..b044e9de 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt @@ -2,13 +2,12 @@ package com.yapp.home import androidx.compose.material3.SnackbarHostState import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavType import androidx.navigation.compose.composable import androidx.navigation.compose.navigation -import androidx.navigation.navArgument import com.yapp.alarm.addedit.AlarmAddEditRoute import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.HomeDestination +import com.yapp.common.navigation.route.HomeBaseRoute +import com.yapp.common.navigation.route.HomeDestination const val ADD_ALARM_RESULT_KEY = "addAlarmResult" const val UPDATE_ALARM_RESULT_KEY = "updateAlarmResult" @@ -18,26 +17,17 @@ fun NavGraphBuilder.homeNavGraph( navigator: OrbitNavigator, snackBarHostState: SnackbarHostState, ) { - navigation( - route = HomeDestination.Route.route, - startDestination = HomeDestination.Home.route, + navigation( + startDestination = HomeDestination.Route, ) { - composable(route = HomeDestination.Home.route) { + composable { HomeRoute( navigator = navigator, snackBarHostState = snackBarHostState, ) } - composable( - route = "${HomeDestination.AlarmAddEdit.route}?id={alarmId}", - arguments = listOf( - navArgument("alarmId") { - type = NavType.LongType - defaultValue = -1 - }, - ), - ) { + composable { AlarmAddEditRoute( navigator = navigator, snackBarHostState = snackBarHostState, diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index f37909de..b8a4dc46 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -1,14 +1,15 @@ package com.yapp.home -import android.util.Log import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.core.tween import androidx.compose.foundation.Canvas import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.collectIsPressedAsState +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -17,6 +18,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding @@ -40,6 +42,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur import androidx.compose.ui.draw.clip import androidx.compose.ui.geometry.CornerRadius import androidx.compose.ui.geometry.Offset @@ -50,23 +53,31 @@ import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.alarm.component.AlarmListItem +import com.yapp.alarm.component.AlarmListItemMenu import com.yapp.common.navigation.OrbitNavigator import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.domain.model.Alarm import com.yapp.home.component.bottomsheet.AlarmListBottomSheet import com.yapp.ui.component.dialog.OrbitDialog import com.yapp.ui.component.lottie.LottieAnimation import com.yapp.ui.component.snackbar.showCustomSnackBar +import com.yapp.ui.component.tooltip.OrbitToolTip import com.yapp.ui.utils.heightForScreenPercentage import com.yapp.ui.utils.toPx import feature.home.R +import kotlinx.coroutines.flow.collectLatest @Composable fun HomeRoute( @@ -110,18 +121,24 @@ fun HomeRoute( } LaunchedEffect(sideEffect) { - sideEffect.collect { effect -> + sideEffect.collectLatest { effect -> when (effect) { - is HomeContract.SideEffect.NavigateBack -> { - navigator.navigateBack() + is HomeContract.SideEffect.NavigateToAddAlarm -> { + navigator.navigateToAddAlarm() } - is HomeContract.SideEffect.Navigate -> { - navigator.navigateTo( - route = effect.route, - popUpTo = effect.popUpTo, - inclusive = effect.inclusive, - ) + + is HomeContract.SideEffect.NavigateToEditAlarm -> { + navigator.navigateToEditAlarm(effect.alarmId) + } + + is HomeContract.SideEffect.NavigateToFortune -> { + navigator.navigateToFortune() } + + is HomeContract.SideEffect.NavigateToSetting -> { + navigator.navigateToSetting() + } + is HomeContract.SideEffect.ShowSnackBar -> { val result = showCustomSnackBar( scope = coroutineScope, @@ -163,12 +180,13 @@ fun HomeScreen( eventDispatcher(HomeContract.Action.NavigateToSetting) }, onMailClick = { - Log.d("HomeScreen", "ShowDailyFortune") eventDispatcher(HomeContract.Action.ShowDailyFortune) }, onAddClick = { eventDispatcher(HomeContract.Action.NavigateToAlarmCreation) }, + hasNewFortune = state.hasNewFortune, + isTooltipVisible = state.isToolTipVisible, ) } else { HomeContent( @@ -264,107 +282,166 @@ private fun HomeContent( } } - Box { - AlarmListBottomSheet( - alarms = state.alarms, - menuExpanded = state.dropdownMenuExpanded, - isAllSelected = state.isAllSelected, - isSelectionMode = state.isSelectionMode, - selectedAlarmIds = state.selectedAlarmIds, - halfExpandedHeight = sheetHalfExpandHeight, - isLoading = false, - hasMoreData = false, - listState = listState, - onClickAlarm = { alarmId -> - eventDispatcher(HomeContract.Action.EditAlarm(alarmId)) - }, - onClickAdd = { - eventDispatcher(HomeContract.Action.NavigateToAlarmCreation) - }, - onClickMore = { - eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility) - }, - onClickCheckAll = { - eventDispatcher(HomeContract.Action.ToggleAllAlarmSelection) - }, - onClickClose = { - eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode) - }, - onClickEdit = { - eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode) - }, - onDismissRequest = { - eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility) - }, - onToggleSelect = { alarmId -> - eventDispatcher(HomeContract.Action.ToggleAlarmSelection(alarmId)) - }, - onToggleActive = { alarmId -> - eventDispatcher(HomeContract.Action.ToggleAlarmActivation(alarmId)) - }, - onLoadMore = { - eventDispatcher(HomeContract.Action.LoadMoreAlarms) + Box( + modifier = Modifier + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + ) { + eventDispatcher(HomeContract.Action.HideToolTip) }, - ) { + ) { + if (state.activeItemMenu != null) { Box( modifier = Modifier .fillMaxSize() - .background(Color(0xFF1F3B64)), - ) { - HillWithGradient() - - SkyImage() - - val characterY = (screenHeight * 0.28f) - 130.dp + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + ) { + eventDispatcher(HomeContract.Action.HideItemMenu) + } + .zIndex(1f), + ) + } - Column( + Box( + modifier = if (state.activeItemMenu != null) { + Modifier + .background(color = Color(0xFF1F3B64)) + .blur(10.dp) + } else { + Modifier + }, + ) { + AlarmListBottomSheet( + alarms = state.sortedAlarms, + menuExpanded = state.dropdownMenuExpanded, + sortDropDownMenuExpanded = state.sortDropDownMenuExpanded, + sortOrder = state.sortOrder, + isAllSelected = state.isAllSelected, + isSelectionMode = state.isSelectionMode, + selectedAlarmIds = state.selectedAlarmIds, + halfExpandedHeight = sheetHalfExpandHeight, + listState = listState, + onClickAlarm = { alarmId -> + eventDispatcher(HomeContract.Action.EditAlarm(alarmId)) + }, + onLongPressAlarm = { alarmId, x, y -> + eventDispatcher(HomeContract.Action.ShowItemMenu(alarmId, x, y)) + }, + onClickAdd = { + eventDispatcher(HomeContract.Action.NavigateToAlarmCreation) + }, + onClickMore = { + if (state.dropdownMenuExpanded || state.sortDropDownMenuExpanded) { + eventDispatcher(HomeContract.Action.HideDropDownMenu) + } else { + eventDispatcher(HomeContract.Action.ShowDropDownMenu) + } + }, + onClickCheckAll = { + eventDispatcher(HomeContract.Action.ToggleAllAlarmSelection) + }, + onClickClose = { + eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode) + }, + onClickEdit = { + eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode) + }, + onClickSort = { + eventDispatcher(HomeContract.Action.ShowSortDropDownMenu) + }, + onSetSortOrder = { sortOrder -> + eventDispatcher(HomeContract.Action.SetSortOrder(sortOrder)) + }, + onDismissRequest = { + eventDispatcher(HomeContract.Action.HideDropDownMenu) + }, + onToggleSelect = { alarmId -> + eventDispatcher(HomeContract.Action.ToggleAlarmSelection(alarmId)) + }, + onToggleActive = { alarmId -> + eventDispatcher(HomeContract.Action.ToggleAlarmActivation(alarmId)) + }, + onSwipe = { alarmId -> + eventDispatcher(HomeContract.Action.SwipeToDeleteAlarm(alarmId)) + }, + ) { + Box( modifier = Modifier - .fillMaxWidth() - .layout { measurable, constraints -> - val placeable = measurable.measure(constraints) - sheetHalfExpandHeight = screenHeight - placeable.height.toDp() - layout(placeable.width, placeable.height) { - placeable.placeRelative(0, 0) - } - }, - horizontalAlignment = Alignment.CenterHorizontally, + .fillMaxSize() + .background(Color(0xFF1F3B64)), ) { - Spacer(modifier = Modifier.height(characterY)) + HillWithGradient() + + SkyImage() + + val characterY = (screenHeight * 0.28f) - 130.dp + + Column( + modifier = Modifier + .fillMaxWidth() + .layout { measurable, constraints -> + val placeable = measurable.measure(constraints) + sheetHalfExpandHeight = screenHeight - placeable.height.toDp() + layout(placeable.width, placeable.height) { + placeable.placeRelative(0, 0) + } + }, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Spacer(modifier = Modifier.height(characterY)) + + HomeCharacterAnimation( + fortuneScore = state.lastFortuneScore, + hasActivatedAlarm = state.hasActivatedAlarm, + ) + Spacer(modifier = Modifier.height(8.dp)) + HomeFortuneDescription( + fortuneScore = state.lastFortuneScore, + hasActivatedAlarm = state.hasActivatedAlarm, + name = state.name, + deliveryTime = state.deliveryTime, + ) + } - HomeCharacterAnimation( - fortuneScore = state.lastFortuneScore, - hasActivatedAlarm = state.hasActivatedAlarm, - eventDispatcher = eventDispatcher, - ) - Spacer(modifier = Modifier.height(8.dp)) - HomeFortuneDescription( - fortuneScore = state.lastFortuneScore, - hasActivatedAlarm = state.hasActivatedAlarm, - name = state.name, - deliveryTime = state.deliveryTime, + HomeTopBar( + onSettingClick = { eventDispatcher(HomeContract.Action.NavigateToSetting) }, + onMailClick = { eventDispatcher(HomeContract.Action.ShowDailyFortune) }, + hasNewFortune = state.hasNewFortune, + isShowTooltip = state.isToolTipVisible, ) } + } - HomeTopBar( - onSettingClick = { eventDispatcher(HomeContract.Action.NavigateToSetting) }, - onMailClick = { eventDispatcher(HomeContract.Action.ShowDailyFortune) }, + BottomGradient(modifier = Modifier.align(Alignment.BottomCenter)) + + if (state.isSelectionMode && state.selectedAlarmIds.isNotEmpty()) { + DeleteAlarmButton( + modifier = Modifier + .widthIn(min = 130.dp) + .align(Alignment.BottomCenter) + .padding(bottom = 26.dp), + selectedAlarmCount = state.selectedAlarmIds.size, + onClick = { + eventDispatcher(HomeContract.Action.ShowDeleteDialog) + }, ) } } - BottomGradient(modifier = Modifier.align(Alignment.BottomCenter)) - - if (state.isSelectionMode && state.selectedAlarmIds.isNotEmpty()) { - DeleteAlarmButton( - modifier = Modifier - .widthIn(min = 130.dp) - .align(Alignment.BottomCenter) - .padding(bottom = 26.dp), - selectedAlarmCount = state.selectedAlarmIds.size, - onClick = { - eventDispatcher(HomeContract.Action.ShowDeleteDialog) - }, - ) + if (state.activeItemMenu != null) { + state.alarms.find { it.id == state.activeItemMenu }?.let { + AlarmWithMenu( + activeItemMenu = it, + activeItemMenuPosition = state.activeItemMenuPosition, + selectedAlarmIds = state.selectedAlarmIds, + onDelete = { alarmId -> + eventDispatcher(HomeContract.Action.DeleteSingleAlarm(alarmId)) + }, + ) + } } } } @@ -373,6 +450,8 @@ private fun HomeContent( private fun HomeTopBar( onSettingClick: () -> Unit, onMailClick: () -> Unit, + hasNewFortune: Boolean, + isShowTooltip: Boolean, ) { Box( modifier = Modifier.statusBarsPadding(), @@ -386,20 +465,46 @@ private fun HomeTopBar( ) { Spacer(modifier = Modifier.weight(1f)) - Box( - modifier = Modifier - .size(32.dp) - .clip(CircleShape) - .clickable { - onMailClick() - }, - contentAlignment = Alignment.Center, - ) { - Icon( - painter = painterResource(id = core.designsystem.R.drawable.ic_mail), - contentDescription = "Mail", - tint = OrbitTheme.colors.white, - ) + Box { + Box(contentAlignment = Alignment.BottomEnd) { + Box( + modifier = Modifier + .size(32.dp) + .clip(CircleShape) + .clickable { + onMailClick() + }, + contentAlignment = Alignment.Center, + ) { + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_mail), + contentDescription = "Mail", + tint = OrbitTheme.colors.white, + ) + } + + if (hasNewFortune) { + Spacer( + modifier = Modifier + .padding( + end = 4.dp, + bottom = 6.dp, + ) + .size(7.dp) + .background( + color = OrbitTheme.colors.alert, + shape = CircleShape, + ), + ) + } + } + + if (isShowTooltip) { + OrbitToolTip( + text = stringResource(id = R.string.home_tool_tip_fortune_arrived), + offset = IntOffset(x = 0, y = 32.dp.toPx().toInt()), + ) + } } Spacer(modifier = Modifier.width(12.dp)) @@ -479,11 +584,10 @@ private fun HomeCharacterAnimation( modifier: Modifier = Modifier, fortuneScore: Int, hasActivatedAlarm: Boolean, - eventDispatcher: (HomeContract.Action) -> Unit, ) { val (bubbleRes, starRes) = when { !hasActivatedAlarm -> { - Pair(null, core.designsystem.R.raw.fortune_preload) + Pair(null, core.designsystem.R.drawable.ic_character_no_alarm) } fortuneScore in 0..49 -> { Pair( @@ -523,10 +627,23 @@ private fun HomeCharacterAnimation( ) Spacer(modifier = Modifier.height(16.dp)) } ?: Spacer(modifier = Modifier.height(62.dp)) - LottieAnimation( - modifier = Modifier.size(110.dp), - resId = starRes, - ) + if (hasActivatedAlarm) { + LottieAnimation( + modifier = Modifier.size(110.dp), + resId = starRes, + ) + } else { + Image( + painter = painterResource(id = starRes), + contentDescription = "IMG_MAIN_STAR_GRAY", + modifier = Modifier + .size(110.dp) + .graphicsLayer { + scaleX = 1.25f + scaleY = 1.25f + }, + ) + } } } @@ -574,6 +691,8 @@ private fun HomeAlarmEmptyScreen( onSettingClick: () -> Unit, onMailClick: () -> Unit, onAddClick: () -> Unit, + hasNewFortune: Boolean, + isTooltipVisible: Boolean, ) { Column( modifier = Modifier @@ -584,6 +703,8 @@ private fun HomeAlarmEmptyScreen( HomeTopBar( onSettingClick = onSettingClick, onMailClick = onMailClick, + hasNewFortune = hasNewFortune, + isShowTooltip = isTooltipVisible, ) Spacer(modifier = Modifier.heightForScreenPercentage(0.13f)) @@ -745,6 +866,58 @@ private fun BottomGradient( ) } +@Composable +private fun AlarmWithMenu( + activeItemMenu: Alarm, + activeItemMenuPosition: Pair?, + selectedAlarmIds: Set, + onDelete: (Long) -> Unit = {}, +) { + val density = LocalDensity.current + + Column( + modifier = Modifier.offset( + x = with(density) { (activeItemMenuPosition?.first ?: 0f).toDp() }, + y = with(density) { (activeItemMenuPosition?.second ?: 0f).toDp() }, + ).zIndex(2f), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + AlarmListItem( + modifier = Modifier + .padding(horizontal = 20.dp) + .clip(RoundedCornerShape(24.dp)) + .border( + width = 1.dp, + shape = RoundedCornerShape(24.dp), + color = OrbitTheme.colors.gray_700, + ), + id = activeItemMenu.id, + repeatDays = activeItemMenu.repeatDays, + isHolidayAlarmOff = activeItemMenu.isHolidayAlarmOff, + swipeable = false, + selectable = false, + selected = selectedAlarmIds.contains(activeItemMenu.id), + isAm = activeItemMenu.isAm, + hour = activeItemMenu.hour, + minute = activeItemMenu.minute, + isActive = activeItemMenu.isAlarmActive, + onClick = { }, + onLongPress = { _, _, _ -> }, + onToggleActive = { }, + onToggleSelect = { }, + onSwipe = { }, + ) + + AlarmListItemMenu( + text = stringResource(id = R.string.alarm_delete_dialog_btn_delete), + iconRes = core.designsystem.R.drawable.ic_trash, + ) { + onDelete(activeItemMenu.id) + } + } +} + @Preview( showBackground = true, backgroundColor = 0xFF000000, @@ -753,7 +926,17 @@ private fun BottomGradient( fun HomeScreenPreview() { OrbitTheme { HomeScreen( - stateProvider = { HomeContract.State() }, + stateProvider = { + HomeContract.State() + .copy( + initialLoading = false, + alarms = listOf( + Alarm(), + ), + activeItemMenu = 0L, + activeItemMenuPosition = Pair(0f, 0f), + ) + }, eventDispatcher = {}, ) } diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index 0b8de16d..9c5dccc6 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -3,9 +3,6 @@ package com.yapp.home import android.util.Log import androidx.lifecycle.viewModelScope import com.yapp.alarm.AlarmHelper -import com.yapp.common.navigation.destination.FortuneDestination -import com.yapp.common.navigation.destination.HomeDestination -import com.yapp.common.navigation.destination.SettingDestination import com.yapp.common.util.ResourceProvider import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm @@ -15,6 +12,7 @@ import com.yapp.domain.usecase.AlarmUseCase import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import feature.home.R +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import java.time.LocalDate @@ -34,22 +32,28 @@ class HomeViewModel @Inject constructor( ) { init { loadAllAlarms() + loadDailyFortuneState() + loadUserName() } fun processAction(action: HomeContract.Action) { when (action) { HomeContract.Action.NavigateToAlarmCreation -> navigateToAlarmCreation() HomeContract.Action.ToggleMultiSelectionMode -> toggleMultiSelectionMode() - HomeContract.Action.ToggleDropdownMenuVisibility -> toggleDropdownMenuVisibility() + HomeContract.Action.ShowDropDownMenu -> showDropDownMenu() + HomeContract.Action.ShowSortDropDownMenu -> showSortDropDownMenu() + HomeContract.Action.HideDropDownMenu -> hideDropDownMenu() is HomeContract.Action.ToggleAlarmSelection -> toggleAlarmSelection(action.alarmId) HomeContract.Action.ToggleAllAlarmSelection -> toggleAllAlarmSelection() is HomeContract.Action.ToggleAlarmActivation -> toggleAlarmActivation(action.alarmId) + is HomeContract.Action.SwipeToDeleteAlarm -> deleteSingleAlarm(action.id) HomeContract.Action.ShowDeleteDialog -> showDeleteDialog() HomeContract.Action.HideDeleteDialog -> hideDeleteDialog() HomeContract.Action.ShowNoActivatedAlarmDialog -> showNoActivatedAlarmDialog() HomeContract.Action.HideNoActivatedAlarmDialog -> hideNoActivatedAlarmDialog() HomeContract.Action.ShowNoDailyFortuneDialog -> showNoDailyFortuneDialog() HomeContract.Action.HideNoDailyFortuneDialog -> hideNoDailyFortuneDialog() + HomeContract.Action.HideToolTip -> hideToolTip() HomeContract.Action.RollbackPendingAlarmToggle -> rollbackAlarmActivation() HomeContract.Action.ConfirmDeletion -> confirmDeletion() is HomeContract.Action.DeleteSingleAlarm -> deleteSingleAlarm(action.alarmId) @@ -58,6 +62,9 @@ class HomeViewModel @Inject constructor( is HomeContract.Action.EditAlarm -> editAlarm(action.alarmId) HomeContract.Action.ShowDailyFortune -> loadDailyFortune() HomeContract.Action.NavigateToSetting -> navigateToSetting() + is HomeContract.Action.ShowItemMenu -> showItemMenu(action.alarmId, action.x, action.y) + HomeContract.Action.HideItemMenu -> hideItemMenu() + is HomeContract.Action.SetSortOrder -> setSortOrder(action.sortOrder) } } @@ -93,7 +100,7 @@ class HomeViewModel @Inject constructor( } private fun navigateToAlarmCreation() { - emitSideEffect(HomeContract.SideEffect.Navigate(HomeDestination.AlarmAddEdit.route)) + emitSideEffect(HomeContract.SideEffect.NavigateToAddAlarm) } private fun toggleMultiSelectionMode() { @@ -106,8 +113,26 @@ class HomeViewModel @Inject constructor( } } - private fun toggleDropdownMenuVisibility() { - updateState { copy(dropdownMenuExpanded = !currentState.dropdownMenuExpanded) } + private fun showDropDownMenu() { + updateState { copy(dropdownMenuExpanded = true) } + } + + private fun showSortDropDownMenu() { + updateState { + copy( + dropdownMenuExpanded = false, + sortDropDownMenuExpanded = true, + ) + } + } + + private fun hideDropDownMenu() { + updateState { + copy( + dropdownMenuExpanded = false, + sortDropDownMenuExpanded = false, + ) + } } private fun toggleAlarmSelection(alarmId: Long) { @@ -170,6 +195,12 @@ class HomeViewModel @Inject constructor( private fun confirmDeletion() { deleteAlarms(currentState.selectedAlarmIds) + updateState { + copy( + selectedAlarmIds = emptySet(), + isDeleteDialogVisible = false, + ) + } } private fun showNoActivatedAlarmDialog() { @@ -225,49 +256,39 @@ class HomeViewModel @Inject constructor( private fun deleteAlarms(alarmIds: Set) { if (alarmIds.isEmpty()) return - val alarmsWithIndex = currentState.alarms.withIndex() - .filter { it.value.id in alarmIds } - .map { it.index to it.value } + val alarmsToDelete = currentState.alarms + .filter { it.id in alarmIds } - val alarmsToDelete = alarmsWithIndex.map { it.second } + viewModelScope.launch { + alarmsToDelete.forEach { alarm -> + alarmUseCase.deleteAlarm(alarm.id) + alarmHelper.unScheduleAlarm(alarm) + } + } - updateState { - copy( - alarms = currentState.alarms - alarmsToDelete.toSet(), - selectedAlarmIds = emptySet(), - isDeleteDialogVisible = false, - isSelectionMode = false, - ) + if (currentState.activeItemMenu != null) { + hideItemMenu() } - Log.d("HomeViewModel", "Deleting alarms: $alarmsToDelete") emitSideEffect( HomeContract.SideEffect.ShowSnackBar( message = resourceProvider.getString(R.string.alarm_deleted), label = resourceProvider.getString(R.string.alarm_delete_dialog_btn_cancel), iconRes = resourceProvider.getDrawable(core.designsystem.R.drawable.ic_check_green), - onDismiss = { - viewModelScope.launch { - alarmsToDelete.forEach { alarm -> - alarmUseCase.deleteAlarm(alarm.id) - alarmHelper.unScheduleAlarm(alarm) - } - } - }, + onDismiss = { }, onAction = { - restoreDeletedAlarms(alarmsWithIndex) + restoreDeletedAlarms(alarmsToDelete) }, ), ) } - private fun restoreDeletedAlarms(alarmsWithIndex: List>) { - updateState { - val restoredAlarms = currentState.alarms.toMutableList() - alarmsWithIndex.forEach { (index, alarm) -> - restoredAlarms.add(index, alarm) + private fun restoreDeletedAlarms(alarmsWithIndex: List) { + viewModelScope.launch { + alarmsWithIndex.forEach { alarm -> + alarmUseCase.insertAlarm(alarm) + alarmHelper.scheduleAlarm(alarm) } - copy(alarms = restoredAlarms) } } @@ -292,7 +313,7 @@ class HomeViewModel @Inject constructor( } private fun editAlarm(alarmId: Long) { - emitSideEffect(HomeContract.SideEffect.Navigate("${HomeDestination.AlarmAddEdit.route}?id=$alarmId")) + emitSideEffect(HomeContract.SideEffect.NavigateToEditAlarm(alarmId)) } private fun updateDeliveryTime(alarms: List) { @@ -349,6 +370,8 @@ class HomeViewModel @Inject constructor( val tomorrow = today.plusDays(1) return when { + inputDateTime.toLocalDate() == today -> + resourceProvider.getString(R.string.home_fortune_delivery_today, inputDateTime.format(DateTimeFormatter.ofPattern("a h:mm"))) inputDateTime.toLocalDate() == tomorrow -> resourceProvider.getString(R.string.home_fortune_delivery_tomorrow, inputDateTime.format(DateTimeFormatter.ofPattern("a h:mm"))) inputDateTime.year == now.year -> @@ -377,9 +400,41 @@ class HomeViewModel @Inject constructor( if (fortuneDate != todayDate) { processAction(HomeContract.Action.ShowNoDailyFortuneDialog) } else { - emitSideEffect( - HomeContract.SideEffect.Navigate(FortuneDestination.Fortune.route), - ) + userPreferences.markFortuneAsChecked() + emitSideEffect(HomeContract.SideEffect.NavigateToFortune) + } + } + } + + private fun loadDailyFortuneState() { + viewModelScope.launch { + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + + combine( + userPreferences.fortuneDateFlow, + userPreferences.fortuneScoreFlow, + userPreferences.hasNewFortuneFlow, + ) { fortuneDate, fortuneScore, hasNewFortune -> + val isTodayFortuneAvailable = fortuneDate == todayDate + val finalFortuneScore = if (isTodayFortuneAvailable) fortuneScore ?: -1 else -1 + + Pair(finalFortuneScore, hasNewFortune) + }.collect { (finalFortuneScore, hasNewFortune) -> + updateState { + copy( + lastFortuneScore = finalFortuneScore, + hasNewFortune = hasNewFortune, + isToolTipVisible = hasNewFortune, + ) + } + } + } + } + + private fun loadUserName() { + viewModelScope.launch { + userPreferences.userNameFlow.collect { userName -> + updateState { copy(name = userName ?: "") } } } } @@ -392,52 +447,34 @@ class HomeViewModel @Inject constructor( updateState { copy(isNoDailyFortuneDialogVisible = false) } } - private fun navigateToSetting() { - emitSideEffect( - HomeContract.SideEffect.Navigate( - route = SettingDestination.Route.route, - ), - ) + private fun hideToolTip() { + updateState { copy(isToolTipVisible = false) } } - /* - private fun loadMoreAlarms() { - val currentPage = currentState.paginationState.currentPage - if (currentState.paginationState.isLoading || !currentState.paginationState.hasMoreData) return - - val pageSize = 10 - val offset = currentPage * pageSize + private fun navigateToSetting() { + emitSideEffect(HomeContract.SideEffect.NavigateToSetting) + } + private fun showItemMenu(alarmId: Long, x: Float, y: Float) { updateState { copy( - paginationState = currentState.paginationState.copy(isLoading = true), + activeItemMenu = alarmId, + activeItemMenuPosition = x to y, ) } + } - viewModelScope.launch { - alarmUseCase.getPagedAlarms(limit = pageSize, offset = offset) - .onSuccess { - updateState { - copy( - alarms = currentState.alarms + it, - paginationState = currentState.paginationState.copy( - currentPage = currentPage + 1, - isLoading = false, - hasMoreData = it.size == pageSize, - ), - initialLoading = false, - ) - } - } - .onFailure { - Log.e("HomeViewModel", "Failed to get paged alarms", it) - updateState { - copy( - paginationState = currentState.paginationState.copy(isLoading = false), - initialLoading = false, - ) - } - } + private fun hideItemMenu() { + updateState { + copy( + activeItemMenu = null, + activeItemMenuPosition = null, + ) } - }*/ + } + + private fun setSortOrder(sortOrder: HomeContract.AlarmSortOrder) { + updateState { copy(sortOrder = sortOrder) } + hideDropDownMenu() + } } diff --git a/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt b/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt index 174bcd34..ed262d7c 100644 --- a/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt +++ b/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt @@ -3,29 +3,36 @@ package com.yapp.home.component import android.util.Log import androidx.annotation.DrawableRes import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ripple.RippleAlpha import androidx.compose.material3.Button import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.LocalRippleConfiguration +import androidx.compose.material3.RippleConfiguration +import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.ripple import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -39,6 +46,7 @@ internal fun AlarmListDropDownMenu( expanded: Boolean, onDismissRequest: () -> Unit, onClickEdit: () -> Unit, + onClickSort: () -> Unit, ) { DropdownMenu( modifier = modifier.padding(horizontal = 8.dp), @@ -54,9 +62,16 @@ internal fun AlarmListDropDownMenu( ) { onClickEdit() } + AlarmListDropDownMenuItem( + text = stringResource(id = R.string.alarm_list_bottom_sheet_menu_sort), + iconRes = core.designsystem.R.drawable.ic_filter, + ) { + onClickSort() + } } } +@OptIn(ExperimentalMaterial3Api::class) @Composable private fun AlarmListDropDownMenuItem( text: String, @@ -64,36 +79,53 @@ private fun AlarmListDropDownMenuItem( onClick: () -> Unit, ) { val interactionSource = remember { MutableInteractionSource() } - val isPressed by interactionSource.collectIsPressedAsState() - Row( - modifier = Modifier - .width(120.dp) - .background( - color = if (isPressed) OrbitTheme.colors.gray_600 else OrbitTheme.colors.gray_700, - shape = RoundedCornerShape(12.dp), - ) - .clickable( - interactionSource = interactionSource, - indication = null, - onClick = onClick, - ) - .padding(horizontal = 14.dp, vertical = 8.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, + CompositionLocalProvider( + LocalRippleConfiguration provides RippleConfiguration( + rippleAlpha = RippleAlpha( + pressedAlpha = 1f, + focusedAlpha = 1f, + hoveredAlpha = 1f, + draggedAlpha = 1f, + ), + ), ) { - Text( - text = text, - style = OrbitTheme.typography.body1SemiBold, - color = OrbitTheme.colors.white, - ) + Surface( + modifier = Modifier + .width(120.dp) + .clip(RoundedCornerShape(12.dp)) + .clickable( + interactionSource = interactionSource, + indication = ripple( + bounded = false, + color = OrbitTheme.colors.gray_600, + ), + onClick = onClick, + ), + color = OrbitTheme.colors.gray_700, + shape = RoundedCornerShape(12.dp), + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = text, + style = OrbitTheme.typography.body1SemiBold, + color = OrbitTheme.colors.white, + ) - Icon( - modifier = Modifier.size(20.dp), - painter = painterResource(id = iconRes), - contentDescription = "Icon", - tint = OrbitTheme.colors.white, - ) + Icon( + modifier = Modifier.size(20.dp), + painter = painterResource(id = iconRes), + contentDescription = "Icon", + tint = OrbitTheme.colors.white, + ) + } + } } } @@ -118,6 +150,9 @@ private fun AlarmListDropDownMenuPreview() { onClickEdit = { Log.d("AlarmListDropDownMenu", "Edit Clicked") }, + onClickSort = { + Log.d("AlarmListDropDownMenu", "Sort Clicked") + }, ) } } diff --git a/feature/home/src/main/java/com/yapp/home/component/AlarmSortDropDownMenu.kt b/feature/home/src/main/java/com/yapp/home/component/AlarmSortDropDownMenu.kt new file mode 100644 index 00000000..56c3cad6 --- /dev/null +++ b/feature/home/src/main/java/com/yapp/home/component/AlarmSortDropDownMenu.kt @@ -0,0 +1,140 @@ +package com.yapp.home.component + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ripple.RippleAlpha +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.LocalRippleConfiguration +import androidx.compose.material3.RippleConfiguration +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.ripple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.home.HomeContract +import feature.home.R + +@Composable +internal fun AlarmSortDropDownMenu( + modifier: Modifier = Modifier, + expanded: Boolean, + sortOrder: HomeContract.AlarmSortOrder, + onDismissRequest: () -> Unit, + onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit, +) { + DropdownMenu( + modifier = modifier.padding(horizontal = 8.dp), + expanded = expanded, + onDismissRequest = onDismissRequest, + containerColor = OrbitTheme.colors.gray_700, + shape = RoundedCornerShape(16.dp), + border = BorderStroke(1.dp, OrbitTheme.colors.gray_600), + ) { + AlarmSortDropDownMenuItem( + text = stringResource(id = R.string.alarm_list_bottom_sheet_menu_sort_default), + checked = sortOrder == HomeContract.AlarmSortOrder.DEFAULT, + onClick = { + onSetSortOrder(HomeContract.AlarmSortOrder.DEFAULT) + }, + ) + AlarmSortDropDownMenuItem( + text = stringResource(id = R.string.alarm_list_bottom_sheet_menu_sort_activation), + checked = sortOrder == HomeContract.AlarmSortOrder.ACTIVATION, + onClick = { + onSetSortOrder(HomeContract.AlarmSortOrder.ACTIVATION) + }, + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun AlarmSortDropDownMenuItem( + text: String, + checked: Boolean, + onClick: () -> Unit, +) { + val interactionSource = remember { MutableInteractionSource() } + + CompositionLocalProvider( + LocalRippleConfiguration provides RippleConfiguration( + rippleAlpha = RippleAlpha( + pressedAlpha = 1f, + focusedAlpha = 1f, + hoveredAlpha = 1f, + draggedAlpha = 1f, + ), + ), + ) { + Surface( + modifier = Modifier + .width(162.dp) + .clip(RoundedCornerShape(12.dp)) + .clickable( + interactionSource = interactionSource, + indication = ripple( + bounded = false, + color = OrbitTheme.colors.gray_600, + ), + onClick = onClick, + ), + color = OrbitTheme.colors.gray_700, + shape = RoundedCornerShape(12.dp), + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = text, + style = OrbitTheme.typography.body1SemiBold, + color = OrbitTheme.colors.white, + ) + + if (checked) { + Icon( + modifier = Modifier.size(20.dp), + painter = painterResource(id = core.designsystem.R.drawable.ic_check), + contentDescription = "Icon", + tint = OrbitTheme.colors.white, + ) + } + } + } + } +} + +@Preview +@Composable +fun AlarmSortDropDownMenuPreview() { + OrbitTheme { + AlarmSortDropDownMenu( + expanded = true, + sortOrder = HomeContract.AlarmSortOrder.DEFAULT, + onDismissRequest = {}, + onSetSortOrder = {}, + ) + } +} diff --git a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt index fef4ba66..20b00907 100644 --- a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt +++ b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt @@ -1,6 +1,7 @@ package com.yapp.home.component.bottomsheet import androidx.annotation.DrawableRes +import androidx.compose.animation.core.tween import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -50,9 +51,10 @@ import androidx.compose.ui.unit.dp import com.yapp.alarm.component.AlarmListItem import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.Alarm +import com.yapp.home.HomeContract import com.yapp.home.component.AlarmListDropDownMenu +import com.yapp.home.component.AlarmSortDropDownMenu import com.yapp.ui.component.checkbox.OrbitCheckBox -import com.yapp.ui.utils.OnLoadMore import feature.home.R import kotlinx.coroutines.launch @@ -65,23 +67,26 @@ enum class BottomSheetExpandState { internal fun AlarmListBottomSheet( alarms: List, menuExpanded: Boolean = false, + sortDropDownMenuExpanded: Boolean = false, + sortOrder: HomeContract.AlarmSortOrder, isAllSelected: Boolean, isSelectionMode: Boolean, selectedAlarmIds: Set, halfExpandedHeight: Dp = 0.dp, - isLoading: Boolean, - hasMoreData: Boolean, listState: LazyListState, onClickAlarm: (Long) -> Unit, + onLongPressAlarm: (Long, Float, Float) -> Unit, onClickAdd: () -> Unit, onClickMore: () -> Unit, onClickCheckAll: () -> Unit, onClickClose: () -> Unit, onClickEdit: () -> Unit, + onClickSort: () -> Unit, + onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit, onDismissRequest: () -> Unit, onToggleSelect: (Long) -> Unit, onToggleActive: (Long) -> Unit, - onLoadMore: () -> Unit, + onSwipe: (Long) -> Unit, content: @Composable () -> Unit, ) { var expandedType by remember { mutableStateOf(BottomSheetExpandState.HALF_EXPANDED) } @@ -102,9 +107,9 @@ internal fun AlarmListBottomSheet( val nestedScrollConnection = remember { object : androidx.compose.ui.input.nestedscroll.NestedScrollConnection { override fun onPreScroll( - available: Offset, // 변경된 부분 + available: Offset, source: androidx.compose.ui.input.nestedscroll.NestedScrollSource, - ): Offset { // 변경된 부분 + ): Offset { if (available.y < 0 && sheetState.currentValue == SheetValue.PartiallyExpanded) { coroutineScope.launch { sheetState.expand() } } @@ -126,24 +131,27 @@ internal fun AlarmListBottomSheet( AlarmBottomSheetContent( modifier = Modifier.nestedScroll(nestedScrollConnection), alarms = alarms, - menuExpanded = menuExpanded, + dropDownMenuExpanded = menuExpanded, + sortDropDownMenuExpanded = sortDropDownMenuExpanded, + sortOrder = sortOrder, isSelectionMode = isSelectionMode, isAllSelected = isAllSelected, selectedAlarmIds = selectedAlarmIds, listState = listState, onClickAlarm = onClickAlarm, + onLongPressAlarm = onLongPressAlarm, onClickAdd = onClickAdd, onClickMore = onClickMore, onClickCheckAll = onClickCheckAll, onClickClose = onClickClose, onClickEdit = onClickEdit, + onClickSort = onClickSort, + onSetSortOrder = onSetSortOrder, expandedType = expandedType, onDismissRequest = onDismissRequest, onToggleSelect = onToggleSelect, onToggleActive = onToggleActive, - isLoading = isLoading, - hasMoreData = hasMoreData, - onLoadMore = onLoadMore, + onSwipe = onSwipe, ) }, sheetShadowElevation = 0.dp, @@ -164,37 +172,33 @@ internal fun AlarmListBottomSheet( internal fun AlarmBottomSheetContent( modifier: Modifier = Modifier, alarms: List, - menuExpanded: Boolean, + dropDownMenuExpanded: Boolean, + sortDropDownMenuExpanded: Boolean, + sortOrder: HomeContract.AlarmSortOrder, isSelectionMode: Boolean, isAllSelected: Boolean, selectedAlarmIds: Set, listState: LazyListState, onClickAlarm: (Long) -> Unit, + onLongPressAlarm: (Long, Float, Float) -> Unit, onClickAdd: () -> Unit, onClickMore: () -> Unit, onClickCheckAll: () -> Unit, onClickClose: () -> Unit, onClickEdit: () -> Unit, + onClickSort: () -> Unit, + onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit, onDismissRequest: () -> Unit, onToggleSelect: (Long) -> Unit, onToggleActive: (Long) -> Unit, + onSwipe: (Long) -> Unit, expandedType: BottomSheetExpandState, - isLoading: Boolean, - hasMoreData: Boolean, - onLoadMore: () -> Unit, ) { val statusBarHeight = WindowInsets.statusBars.asPaddingValues().calculateTopPadding() val cornerRadius = if (expandedType == BottomSheetExpandState.HALF_EXPANDED) 16.dp else 0.dp val topPadding = if (expandedType == BottomSheetExpandState.HALF_EXPANDED) 14.dp else 14.dp + statusBarHeight - listState.OnLoadMore( - hasMoreData = hasMoreData, - isLoading = isLoading, - ) { - onLoadMore() - } - Column( modifier = modifier .fillMaxSize() @@ -214,39 +218,60 @@ internal fun AlarmBottomSheetContent( ) } else { AlarmListTopBar( - menuExpanded = menuExpanded, + menuExpanded = dropDownMenuExpanded, + sortDropDownMenuExpanded = sortDropDownMenuExpanded, + sortOrder = sortOrder, onClickAdd = onClickAdd, onClickMore = onClickMore, onDismissRequest = onDismissRequest, onClickEdit = onClickEdit, + onClickSort = onClickSort, + onSetSortOrder = onSetSortOrder, ) } LazyColumn( state = listState, ) { - itemsIndexed(alarms) { index, alarm -> + itemsIndexed( + items = alarms, + key = { _, alarm -> alarm.id }, + ) { index, alarm -> AlarmListItem( + modifier = Modifier + .animateItem( + fadeInSpec = null, + placementSpec = tween(durationMillis = 300), + fadeOutSpec = null, + ), id = alarm.id, repeatDays = alarm.repeatDays, isHolidayAlarmOff = alarm.isHolidayAlarmOff, + swipeable = !isSelectionMode, selectable = isSelectionMode, selected = selectedAlarmIds.contains(alarm.id), onClick = onClickAlarm, + onLongPress = onLongPressAlarm, onToggleSelect = onToggleSelect, isAm = alarm.isAm, hour = alarm.hour, minute = alarm.minute, isActive = alarm.isAlarmActive, onToggleActive = onToggleActive, + onSwipe = onSwipe, ) if (index != alarms.size - 1) { Spacer( modifier = Modifier + .padding(horizontal = 24.dp) .fillMaxWidth() .height(1.dp) .background(OrbitTheme.colors.gray_800) - .padding(horizontal = 24.dp), + .animateItem( + fadeInSpec = null, + placementSpec = tween(durationMillis = 300), + fadeOutSpec = null, + ), ) } } @@ -262,10 +287,14 @@ internal fun AlarmBottomSheetContent( private fun AlarmListTopBar( modifier: Modifier = Modifier, menuExpanded: Boolean, + sortDropDownMenuExpanded: Boolean, + sortOrder: HomeContract.AlarmSortOrder, onClickAdd: () -> Unit, onClickMore: () -> Unit, onDismissRequest: () -> Unit, onClickEdit: () -> Unit, + onClickSort: () -> Unit, + onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit, ) { Row( modifier = modifier @@ -301,6 +330,16 @@ private fun AlarmListTopBar( expanded = menuExpanded, onDismissRequest = onDismissRequest, onClickEdit = onClickEdit, + onClickSort = onClickSort, + ) + } + + if (sortDropDownMenuExpanded) { + AlarmSortDropDownMenu( + expanded = sortDropDownMenuExpanded, + sortOrder = sortOrder, + onDismissRequest = onDismissRequest, + onSetSortOrder = onSetSortOrder, ) } } diff --git a/feature/home/src/main/res/values/strings.xml b/feature/home/src/main/res/values/strings.xml index 2554cf1f..cfe4c73c 100644 --- a/feature/home/src/main/res/values/strings.xml +++ b/feature/home/src/main/res/values/strings.xml @@ -4,6 +4,8 @@ 기상 알람이 없어요 알람을 추가하고\n운세 편지를 받아보세요 + 운세 도착 + 운세 편지를 받고 싶다면\n기상 알람을 켜줘 미래에서 운세 편지를\n작성 중이야! 오늘 %s의 하루는\n주의가 필요해 @@ -53,6 +55,10 @@ 알람 편집 + 정렬 + + 기본 + 켜진 알람 우선 전체 선택 %d개 삭제 diff --git a/feature/mission/build.gradle.kts b/feature/mission/build.gradle.kts index 1648c0a3..95ffd72c 100644 --- a/feature/mission/build.gradle.kts +++ b/feature/mission/build.gradle.kts @@ -11,7 +11,9 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.media) + implementation(projects.core.alarm) implementation(projects.domain) implementation(projects.core.datastore) implementation(libs.orbit.core) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt index d246e6ef..f1812c49 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt @@ -1,14 +1,18 @@ package com.yapp.mission +import com.yapp.domain.model.MissionType + sealed class MissionContract { data class State( - val showOverlayText: Boolean = false, - val showOverlay: Boolean = true, - val missionProgress: Int = 0, + val missionType: MissionType = MissionType.Click, + val isMissionTypeLoading: Boolean = true, val isMissionCompleted: Boolean = false, - val isFlipped: Boolean = false, + val shakeCount: Int = 0, val clickCount: Int = 0, + val playWhenClick: Boolean = false, + val showFinalAnimation: Boolean = false, + val isFlipped: Boolean = false, val rotationY: Float = 0f, val rotationZ: Float = 0f, val showExitDialog: Boolean = false, @@ -16,22 +20,15 @@ sealed class MissionContract { ) : com.yapp.ui.base.UiState sealed class Action { - data object NextStep : Action() - data object PreviousStep : Action() - object StartOverlayTimer : Action() - object ShakeCard : Action() - object ClickCard : Action() - object ShowExitDialog : Action() - object HideExitDialog : Action() - object RetryPostFortune : Action() + data object ShakeCard : Action() + data object ClickCard : Action() + data object ShowExitDialog : Action() + data object HideExitDialog : Action() + data object RetryPostFortune : Action() } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() + data object NavigateToFortune : SideEffect() data object NavigateBack : SideEffect() } diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt index 81f0776c..a24f0545 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt @@ -4,64 +4,41 @@ import androidx.compose.runtime.LaunchedEffect import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.navDeepLink -import androidx.navigation.navigation +import androidx.navigation.navOptions import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.MissionDestination import com.yapp.common.navigation.extensions.sharedHiltViewModel +import com.yapp.common.navigation.route.MissionRoute -fun NavGraphBuilder.missionNavGraph( +fun NavGraphBuilder.missionScreen( navigator: OrbitNavigator, ) { - navigation( - route = MissionDestination.Route.route, - startDestination = MissionDestination.Mission.route, + composable( + deepLinks = listOf( + navDeepLink { + uriPattern = "orbitapp://mission?notificationId={notificationId}" + }, + ), ) { - composable( - route = MissionDestination.Mission.route, - deepLinks = listOf( - navDeepLink { - uriPattern = "orbitapp://mission" - }, - ), - ) { backStackEntry -> - val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) - - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - handleMissionSideEffect(sideEffect, navigator, viewModel) + val viewModel = it.sharedHiltViewModel(navigator.navController) + + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collect { sideEffect -> + when (sideEffect) { + MissionContract.SideEffect.NavigateToFortune -> { + navigator.navigateToFortune( + navOptions = navOptions { + popUpTo(MissionRoute) { + inclusive = true + } + }, + ) + } + + MissionContract.SideEffect.NavigateBack -> navigator.navigateBack() } } - - MissionRoute(viewModel) } - composable(MissionDestination.Progress.route) { backStackEntry -> - val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) - - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - handleMissionSideEffect(sideEffect, navigator, viewModel) - } - } - - MissionProgressRoute(viewModel) - } - } -} - -private fun handleMissionSideEffect( - sideEffect: MissionContract.SideEffect, - navigator: OrbitNavigator, - viewModel: MissionViewModel, -) { - when (sideEffect) { - is MissionContract.SideEffect.Navigate -> navigator.navigateTo( - route = sideEffect.route, - popUpTo = sideEffect.popUpTo, - inclusive = sideEffect.inclusive, - ) - - MissionContract.SideEffect.NavigateBack -> navigator.navigateBack() -// MissionContract.SideEffect.MissionCompleted -> onFinishMission() + MissionRoute(viewModel) } } diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt deleted file mode 100644 index 27774149..00000000 --- a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt +++ /dev/null @@ -1,267 +0,0 @@ -package com.yapp.mission - -import androidx.activity.compose.BackHandler -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.core.FastOutSlowInEasing -import androidx.compose.animation.core.tween -import androidx.compose.animation.fadeIn -import androidx.compose.animation.scaleIn -import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha -import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.yapp.designsystem.theme.OrbitTheme -import com.yapp.mission.component.FlipCard -import com.yapp.mission.component.MissionProgressBar -import com.yapp.ui.component.dialog.OrbitDialog -import com.yapp.ui.component.lottie.LottieAnimation -import com.yapp.ui.utils.heightForScreenPercentage -import com.yapp.ui.utils.paddingForScreenPercentage - -@Composable -fun MissionProgressRoute(viewModel: MissionViewModel = hiltViewModel()) { - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() - val context = LocalContext.current - val shakeDetector = remember { ShakeDetector(context) { viewModel.processAction(MissionContract.Action.ShakeCard) } } - - LaunchedEffect(Unit) { - shakeDetector.start() - viewModel.processAction(MissionContract.Action.StartOverlayTimer) - } - - DisposableEffect(Unit) { - onDispose { shakeDetector.stop() } - } - - MissionProgressScreen( - stateProvider = { state }, - eventDispatcher = viewModel::processAction, - ) -} - -@Composable -fun MissionProgressScreen( - stateProvider: () -> MissionContract.State, - eventDispatcher: (MissionContract.Action) -> Unit, -) { - val state = stateProvider() - val context = LocalContext.current - - BackHandler { - if (state.showExitDialog) { - eventDispatcher(MissionContract.Action.HideExitDialog) - } else { - eventDispatcher(MissionContract.Action.ShowExitDialog) - } - } - - Box( - modifier = Modifier.fillMaxSize(), - ) { - Image( - painter = painterResource(id = core.designsystem.R.drawable.img_mission_progress_background), - contentDescription = null, - contentScale = ContentScale.Crop, - modifier = Modifier.matchParentSize(), - ) - - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.heightForScreenPercentage(0.066f)) - Box( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp), - contentAlignment = Alignment.TopEnd, - ) { - Row( - modifier = Modifier - .clickable { - eventDispatcher(MissionContract.Action.ShowExitDialog) - }, - ) { - Icon( - painter = painterResource(id = core.designsystem.R.drawable.ic_cancel), - contentDescription = null, - tint = OrbitTheme.colors.white, - modifier = Modifier.size(24.dp), - ) - Text( - text = "나가기", - color = OrbitTheme.colors.white, - style = OrbitTheme.typography.body1SemiBold, - modifier = Modifier - .padding(start = 4.dp) - .align(Alignment.CenterVertically), - ) - } - } - - Spacer(modifier = Modifier.heightForScreenPercentage(0.0246f)) - MissionProgressBar( - currentProgress = state.clickCount, - totalProgress = 10, - modifier = Modifier - .fillMaxWidth() - .height(5.dp) - .padding(horizontal = 20.dp) - .alpha(if (state.showOverlay) 0f else 1f), - ) - Spacer(modifier = Modifier.heightForScreenPercentage(0.06f)) - Text( - text = "10회를 흔들어야 운세를 받아요", - color = OrbitTheme.colors.white, - style = OrbitTheme.typography.heading2SemiBold, - modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f), - ) - Spacer(modifier = Modifier.heightForScreenPercentage(0.005f)) - Text( - text = state.clickCount.toString(), - color = OrbitTheme.colors.white, - style = OrbitTheme.typography.displaySemiBold, - modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f), - ) - Spacer(modifier = Modifier.heightForScreenPercentage(0.0665f)) - FlipCard( - state = state, - eventDispatcher = eventDispatcher, - ) - } - } - - if (state.showOverlay) { - Column( - modifier = Modifier - .fillMaxSize() - .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f)) - .pointerInput(Unit) { - awaitPointerEventScope { - while (true) { - awaitPointerEvent() - } - } - }, - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.heightForScreenPercentage(0.226f)) - - AnimatedVisibility( - visible = state.showOverlayText, - enter = scaleIn( - initialScale = 0.8f, - animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing), - ) + fadeIn(animationSpec = tween(durationMillis = 300)), - ) { - Text( - text = "흔들기 시작!", - color = OrbitTheme.colors.white, - style = OrbitTheme.typography.title1Bold, - ) - } - } - } - - if (state.showExitDialog) { - OrbitDialog( - title = "나가면 운세를 받을 수 없어요", - message = "미션을 수행하지 않고 나가시겠어요?", - confirmText = "나가기", - cancelText = "취소", - onConfirm = { - (context as? androidx.activity.ComponentActivity)?.finish() - }, - onCancel = { - eventDispatcher(MissionContract.Action.HideExitDialog) - }, - ) - } - - if (state.isMissionCompleted) { - Box( - modifier = Modifier - .fillMaxSize() - .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f)) - .pointerInput(Unit) { - awaitPointerEventScope { - while (true) { - awaitPointerEvent() - } - } - }, - contentAlignment = Alignment.Center, - ) { - Box( - modifier = Modifier.fillMaxSize(), - ) { - LottieAnimation( - modifier = Modifier - .matchParentSize(), - scaleXAdjustment = 1.3f, - scaleYAdjustment = 1.3f, - resId = core.designsystem.R.raw.mission_success, - iterations = 1, - ) - Text( - text = "미션 성공!", - color = OrbitTheme.colors.white, - style = OrbitTheme.typography.title1Bold, - modifier = Modifier - .align(Alignment.TopCenter) - .paddingForScreenPercentage(topPercentage = 0.564f), - ) - } - } - } - - if (state.errorMessage != null) { - OrbitDialog( - title = "오류", - message = state.errorMessage, - confirmText = "확인", - onConfirm = { - eventDispatcher(MissionContract.Action.RetryPostFortune) - }, - ) - } - } -} - -@Composable -@Preview -fun MissionProgressRoutePreview() { - MissionProgressScreen( - stateProvider = { MissionContract.State() }, - eventDispatcher = {}, - ) -} diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt index c974eb47..cd42cdd1 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt @@ -1,179 +1,416 @@ package com.yapp.mission +import androidx.activity.ComponentActivity import androidx.activity.compose.BackHandler +import androidx.compose.animation.Crossfade +import androidx.compose.animation.core.tween import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.scale +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.AnalyticsHelper +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme -import com.yapp.ui.component.button.OrbitButton +import com.yapp.domain.model.MissionType +import com.yapp.mission.component.FlipCard +import com.yapp.mission.component.MissionProgressBar import com.yapp.ui.component.dialog.OrbitDialog +import com.yapp.ui.component.lottie.LottieAnimation +import com.yapp.ui.extensions.customClickable import com.yapp.ui.utils.heightForScreenPercentage +import com.yapp.ui.utils.paddingForScreenPercentage @Composable fun MissionRoute(viewModel: MissionViewModel = hiltViewModel()) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + val context = LocalContext.current + + val shakeDetector = remember { + ShakeDetector(context) { + viewModel.processAction(MissionContract.Action.ShakeCard) + } + } + + LaunchedEffect(Unit) { + shakeDetector.start() + } + + DisposableEffect(Unit) { + onDispose { shakeDetector.stop() } + } MissionScreen( stateProvider = { state }, eventDispatcher = viewModel::processAction, - onNext = { viewModel.processAction(MissionContract.Action.NextStep) }, + onFinish = { + (context as? ComponentActivity)?.finish() + }, ) } +/** + * Mission 상태에 따라 적절한 화면을 구성하는 메인 컨테이너. + * 로딩, 콘텐츠, 성공 오버레이, 다이얼로그 등 분기 처리 포함. + */ @Composable fun MissionScreen( stateProvider: () -> MissionContract.State, eventDispatcher: (MissionContract.Action) -> Unit, - onNext: () -> Unit, + onFinish: () -> Unit, ) { val state = stateProvider() - val context = LocalContext.current + val analytics = LocalAnalyticsHelper.current BackHandler { - if (state.showExitDialog) { - eventDispatcher(MissionContract.Action.HideExitDialog) - } else { - eventDispatcher(MissionContract.Action.ShowExitDialog) - } + eventDispatcher( + if (state.showExitDialog) { + MissionContract.Action.HideExitDialog + } else { + MissionContract.Action.ShowExitDialog + }, + ) } - Box( - modifier = Modifier.fillMaxSize(), - ) { + Box(modifier = Modifier.fillMaxSize()) { + if (state.isMissionTypeLoading) { + MissionLoadingScreen() + return + } + Image( - painter = painterResource(id = core.designsystem.R.drawable.img_mission_main_background), + painter = painterResource(id = core.designsystem.R.drawable.img_mission_progress_background), contentDescription = null, contentScale = ContentScale.Crop, modifier = Modifier.matchParentSize(), ) - Column( - modifier = Modifier - .fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.SpaceBetween, - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.heightForScreenPercentage(0.110f)) - MissionTag(label = "기상미션") - Spacer(modifier = Modifier.heightForScreenPercentage(0.0418f)) - MissionLabel(label = "10회를 흔들어", style = OrbitTheme.typography.headline2Medium) - Spacer(modifier = Modifier.heightForScreenPercentage(0.01f)) - MissionLabel(label = "부적을 뒤집어줘", style = OrbitTheme.typography.title2Bold) + MissionContent(state, eventDispatcher) + + if (state.showExitDialog) { + ExitDialog(state, eventDispatcher, onFinish, analytics) + } + + if (state.isMissionCompleted) { + MissionSuccessOverlay() + } + + state.errorMessage?.let { + ErrorDialog(message = it) { + eventDispatcher(MissionContract.Action.RetryPostFortune) } - Column( - modifier = Modifier - .fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Image( - painter = painterResource(id = core.designsystem.R.drawable.img_mission_main), - contentDescription = "", - modifier = Modifier - .fillMaxWidth() - .scale(1.1f), - ) + } + } +} + +/** + * 미션 콘텐츠 본문. TopBar, 진행 바, 상태별 게임 포함. + */ +@Composable +fun MissionContent( + state: MissionContract.State, + eventDispatcher: (MissionContract.Action) -> Unit, +) { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + MissionTopAppBar(onExit = { eventDispatcher(MissionContract.Action.ShowExitDialog) }) + MissionProgressBarSection(state) + MissionLabel(state) + Spacer(modifier = Modifier.heightForScreenPercentage(0.0665f)) + + when (state.missionType) { + is MissionType.Shake -> { + if (state.shakeCount == 0) { + MissionShakeInitialImage() + } else { + FlipCard(state = state, eventDispatcher = eventDispatcher) + } } - Column( - horizontalAlignment = Alignment.CenterHorizontally, - ) { - OrbitButton( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp), - label = "미션 시작", - onClick = onNext, - enabled = true, - ) - Spacer(modifier = Modifier.heightForScreenPercentage(0.027f)) - MissionLabel( - label = "미션하지 않기", - style = OrbitTheme.typography.body1SemiBold, - clickable = true, - onClick = { - eventDispatcher(MissionContract.Action.ShowExitDialog) - }, - ) - Spacer(modifier = Modifier.heightForScreenPercentage(0.0714f)) + + is MissionType.Click -> { + MissionClickCard(state, eventDispatcher) } } } +} + +/** + * '나가기' 버튼이 포함된 미션 상단 앱바 영역. + */ +@Composable +fun MissionTopAppBar(onExit: () -> Unit) { + Spacer(modifier = Modifier.heightForScreenPercentage(0.066f)) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + contentAlignment = Alignment.TopEnd, + ) { + Row( + modifier = Modifier.customClickable( + rippleEnabled = false, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onExit, + ), + ) { + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_cancel), + contentDescription = null, + tint = OrbitTheme.colors.white, + modifier = Modifier.size(24.dp), + ) + Text( + text = "나가기", + color = OrbitTheme.colors.white, + style = OrbitTheme.typography.body1SemiBold, + modifier = Modifier + .padding(start = 4.dp) + .align(Alignment.CenterVertically), + ) + } + } +} + +/** + * 미션 진행도 ProgressBar 섹션. + */ +@Composable +fun MissionProgressBarSection(state: MissionContract.State) { + Spacer(modifier = Modifier.heightForScreenPercentage(0.0246f)) + MissionProgressBar( + currentProgress = when (state.missionType) { + is MissionType.Shake -> state.shakeCount + is MissionType.Click -> state.clickCount + }, + totalProgress = 10, + modifier = Modifier + .fillMaxWidth() + .height(5.dp) + .padding(horizontal = 20.dp), + ) + Spacer(modifier = Modifier.heightForScreenPercentage(0.06f)) +} + +/** + * 미션 안내 문구 및 현재 카운트. + */ +@Composable +fun MissionLabel(state: MissionContract.State) { + val instruction = + if (state.missionType is MissionType.Shake) "10회를 흔들어 부적을 뒤집어줘" else "10회를 눌러 편지를 열어줘" + val count = if (state.missionType is MissionType.Shake) state.shakeCount else state.clickCount + + Text( + text = instruction, + color = OrbitTheme.colors.white, + style = OrbitTheme.typography.heading2SemiBold, + ) + Spacer(modifier = Modifier.heightForScreenPercentage(0.005f)) + Text( + text = count.toString(), + color = OrbitTheme.colors.white, + style = OrbitTheme.typography.displaySemiBold, + ) +} - if (state.showExitDialog) { - OrbitDialog( - title = "나가면 운세를 받을 수 없어요", - message = "미션을 수행하지 않고 나가시겠어요?", - confirmText = "나가기", - cancelText = "취소", - onConfirm = { (context as? androidx.activity.ComponentActivity)?.finish() }, - onCancel = { eventDispatcher(MissionContract.Action.HideExitDialog) }, +/** + * 흔들기 미션 초기 이미지. + */ +@Composable +fun MissionShakeInitialImage() { + Image( + painter = painterResource(id = core.designsystem.R.drawable.img_mission_main), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .scale(1.1f), + ) +} + +/** + * 클릭 미션 카드. 클릭 시 애니메이션 및 상태 변화. + */ +@Composable +fun MissionClickCard( + state: MissionContract.State, + eventDispatcher: (MissionContract.Action) -> Unit, +) { + if (state.clickCount == 0) { + Image( + painter = painterResource(id = core.designsystem.R.drawable.ic_mission_main_letter), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .scale(1.0f) + .pointerInput(Unit) { + detectTapGestures { eventDispatcher(MissionContract.Action.ClickCard) } + }, ) + } else { + Crossfade(targetState = state.showFinalAnimation, animationSpec = tween(500)) { showFinal -> + LottieAnimation( + modifier = Modifier + .aspectRatio(12f / 9f) + .pointerInput(Unit) { + detectTapGestures { + if (!showFinal) eventDispatcher(MissionContract.Action.ClickCard) + } + }, + resId = if (showFinal) core.designsystem.R.raw.mission_letter_open else core.designsystem.R.raw.mission_letter_tap, + play = state.playWhenClick || showFinal, + restartOnPlay = true, + iterations = 1, + ) + } } } +/** + * 미션 종료 시 나가기 다이얼로그. + */ @Composable -fun MissionTag(label: String) { +fun ExitDialog( + state: MissionContract.State, + eventDispatcher: (MissionContract.Action) -> Unit, + onFinish: () -> Unit, + analytics: AnalyticsHelper, +) { + OrbitDialog( + title = "나가면 운세를 받을 수 없어요", + message = "미션을 수행하지 않고 나가시겠어요?", + confirmText = "나가기", + cancelText = "취소", + onConfirm = { + analytics.logEvent( + AnalyticsEvent( + type = "mission_fail", + properties = mapOf( + AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to when (state.missionType) { + is MissionType.Shake -> "shake" + is MissionType.Click -> "click" + }, + ), + ), + ) + onFinish() + }, + onCancel = { eventDispatcher(MissionContract.Action.HideExitDialog) }, + ) +} + +/** + * 미션 성공 시 오버레이 화면. + */ +@Composable +fun MissionSuccessOverlay() { Box( modifier = Modifier - .background( - color = OrbitTheme.colors.main.copy(alpha = 0.1f), - shape = RoundedCornerShape(30.dp), - ) - .padding(vertical = 4.dp, horizontal = 12.dp), + .fillMaxSize() + .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f)) + .pointerInput(Unit) { + awaitPointerEventScope { + while (true) awaitPointerEvent() + } + }, + contentAlignment = Alignment.Center, ) { - Text( - text = label, - color = OrbitTheme.colors.main, - style = OrbitTheme.typography.body2Medium, - ) + Box(modifier = Modifier.fillMaxSize()) { + LottieAnimation( + modifier = Modifier.matchParentSize(), + scaleXAdjustment = 1.3f, + scaleYAdjustment = 1.3f, + resId = core.designsystem.R.raw.mission_success, + iterations = 1, + play = true, + ) + Text( + text = "미션 성공!", + color = OrbitTheme.colors.white, + style = OrbitTheme.typography.title1Bold, + modifier = Modifier + .align(Alignment.TopCenter) + .paddingForScreenPercentage(topPercentage = 0.564f), + ) + } } } +/** + * 오류 발생 시 다이얼로그. + */ @Composable -fun MissionLabel( - label: String, - style: TextStyle, - clickable: Boolean = false, - onClick: () -> Unit = { }, -) { - Text( - text = label, - color = OrbitTheme.colors.white, - style = style, - modifier = if (clickable) { Modifier.clickable { onClick() } } else Modifier, +fun ErrorDialog(message: String, onConfirm: () -> Unit) { + OrbitDialog( + title = "오류", + message = message, + confirmText = "확인", + onConfirm = onConfirm, ) } +/** + * 로딩 화면. 미션 타입 로딩 중에 표시. + */ +@Composable +fun MissionLoadingScreen() { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + LottieAnimation( + modifier = Modifier.size(70.dp), + resId = core.designsystem.R.raw.star_loading, + ) + } +} + @Composable @Preview -fun MissionRoutePreview() { +private fun MissionRoutePreview() { MissionScreen( - stateProvider = { MissionContract.State() }, - eventDispatcher = { }, - onNext = { }, + stateProvider = { + MissionContract.State( + isMissionTypeLoading = false, + missionType = MissionType.Shake, + shakeCount = 0, + clickCount = 0, + showFinalAnimation = false, + playWhenClick = false, + showExitDialog = false, + isMissionCompleted = false, + ) + }, + eventDispatcher = {}, + onFinish = {}, ) } diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 861a2f1c..38512436 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -1,17 +1,22 @@ package com.yapp.mission +import android.app.Application import android.util.Log +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope -import com.yapp.common.navigation.destination.FortuneDestination -import com.yapp.common.navigation.destination.HomeDestination -import com.yapp.common.navigation.destination.MissionDestination +import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.AnalyticsHelper import com.yapp.datastore.UserPreferences +import com.yapp.domain.model.MissionType import com.yapp.domain.repository.FortuneRepository +import com.yapp.domain.usecase.GetMissionTypeUseCase import com.yapp.media.haptic.HapticFeedbackManager import com.yapp.media.haptic.HapticType import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -19,76 +24,111 @@ import javax.inject.Inject @HiltViewModel class MissionViewModel @Inject constructor( + private val analyticsHelper: AnalyticsHelper, private val hapticFeedbackManager: HapticFeedbackManager, private val fortuneRepository: FortuneRepository, private val userPreferences: UserPreferences, + private val getMissionTypeUseCase: GetMissionTypeUseCase, + private val app: Application, + savedStateHandle: SavedStateHandle, ) : BaseViewModel( MissionContract.State(), ) { + init { + savedStateHandle.get("notificationId")?.toLong()?.let { + sendAlarmDismissIntent(it) + } + loadRemoteMissionType() + } - fun processAction(action: MissionContract.Action) { - when (action) { - is MissionContract.Action.NextStep -> { - emitSideEffect( - MissionContract.SideEffect.Navigate(route = MissionDestination.Progress.route), + private fun loadRemoteMissionType() { + viewModelScope.launch { + val missionType = getMissionTypeUseCase.execute() + updateState { + copy( + missionType = missionType, + isMissionTypeLoading = false, ) } + } + } - is MissionContract.Action.PreviousStep -> { - emitSideEffect(MissionContract.SideEffect.NavigateBack) - } + fun processAction(action: MissionContract.Action) { + when (action) { + is MissionContract.Action.ShakeCard -> handleShake() + is MissionContract.Action.ClickCard -> handleClick() + is MissionContract.Action.ShowExitDialog -> showExitDialog() + is MissionContract.Action.HideExitDialog -> hideExitDialog() + is MissionContract.Action.RetryPostFortune -> retryPostFortune() + } + } - is MissionContract.Action.StartOverlayTimer -> startOverlayTimer() + private fun showExitDialog() { + updateState { copy(showExitDialog = true) } + } - is MissionContract.Action.ShakeCard, is MissionContract.Action.ClickCard -> handleIncreaseCount() + private fun hideExitDialog() { + updateState { copy(showExitDialog = false) } + } - is MissionContract.Action.ShowExitDialog -> updateState { copy(showExitDialog = true) } - is MissionContract.Action.HideExitDialog -> updateState { copy(showExitDialog = false) } - is MissionContract.Action.RetryPostFortune -> retryPostFortune() + private fun handleShake() = viewModelScope.launch { + if (currentState.missionType !is MissionType.Shake) return@launch + + val currentCount = currentState.shakeCount + if (currentCount < 9) { + performHapticSuccess() + updateState { copy(shakeCount = currentCount + 1) } + } else if (!currentState.isFlipped) { + completeMission(type = "shake") + updateState { + copy( + isMissionCompleted = true, + shakeCount = 10, + isFlipped = true, + ) + } + delay(500) } } - private fun handleIncreaseCount() = viewModelScope.launch { - if (currentState.showOverlay) updateState { copy(showOverlay = false) } - if (currentState.showOverlayText) updateState { copy(showOverlayText = false) } + private fun handleClick() = viewModelScope.launch { + if (currentState.missionType !is MissionType.Click) return@launch val currentCount = currentState.clickCount if (currentCount < 9) { - hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) - updateState { copy(clickCount = currentCount + 1) } - } else if (currentCount == 9 && !currentState.isFlipped) { - hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) - postFortune() + performHapticSuccess() + logMissionSuccess("click") + updateState { copy(clickCount = currentCount + 1, playWhenClick = true) } + delay(500) + updateState { copy(playWhenClick = false) } + } else { updateState { copy( - isMissionCompleted = true, clickCount = 10, - isFlipped = true, + showFinalAnimation = true, ) } - kotlinx.coroutines.delay(500) + postFortune() + delay(500) + updateState { copy(isMissionCompleted = true) } } } private fun postFortune() { viewModelScope.launch { val userId = userPreferences.userIdFlow.firstOrNull() ?: return@launch - val fortuneResult = runCatching { + val result = runCatching { withContext(Dispatchers.IO) { fortuneRepository.postFortune(userId) } } - fortuneResult.onSuccess { fortune -> - val fortuneData = fortune.getOrThrow() - userPreferences.saveFortuneId(fortuneData.id) - - emitSideEffect( - MissionContract.SideEffect.Navigate( - route = FortuneDestination.Route.route, - popUpTo = MissionDestination.Route.route, - inclusive = true, - ), - ) + + result.onSuccess { + val data = it.getOrThrow() + userPreferences.saveFortuneId(data.id) + userPreferences.saveFortuneScore(data.avgFortuneScore) + + emitSideEffect(MissionContract.SideEffect.NavigateToFortune) }.onFailure { error -> Log.e("MissionViewModel", "운세 데이터 요청 실패: ${error.message}") updateState { copy(errorMessage = error.message) } @@ -99,45 +139,55 @@ class MissionViewModel @Inject constructor( private fun retryPostFortune() { viewModelScope.launch { val userId = userPreferences.userIdFlow.firstOrNull() ?: return@launch - val fortuneResult = runCatching { + val result = runCatching { withContext(Dispatchers.IO) { fortuneRepository.postFortune(userId) } } - fortuneResult.onSuccess { fortune -> - val fortuneData = fortune.getOrThrow() - userPreferences.saveFortuneId(fortuneData.id) + result.onSuccess { + val data = it.getOrThrow() + userPreferences.saveFortuneId(data.id) + userPreferences.saveFortuneScore(data.avgFortuneScore) - emitSideEffect( - MissionContract.SideEffect.Navigate( - route = FortuneDestination.Route.route, - popUpTo = MissionDestination.Route.route, - inclusive = true, - ), - ) + emitSideEffect(MissionContract.SideEffect.NavigateToFortune) }.onFailure { - Log.e("MissionViewModel", "운세 데이터 재요청 실패: ${it.message}") + Log.e("MissionViewModel", "운세 재요청 실패: ${it.message}") navigateToHome() } } } - private fun navigateToHome() { - emitSideEffect( - MissionContract.SideEffect.Navigate( - route = HomeDestination.Route.route, - popUpTo = MissionDestination.Route.route, - inclusive = true, + private fun completeMission(type: String) { + performHapticSuccess() + logMissionSuccess(type) + postFortune() + } + + private fun performHapticSuccess() { + hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) + } + + private fun logMissionSuccess(type: String) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "mission_success", + properties = mapOf( + AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to type, + ), ), ) } - private fun startOverlayTimer() = viewModelScope.launch { - updateState { copy(showOverlay = true) } - kotlinx.coroutines.delay(1000) - updateState { copy(showOverlayText = true) } - kotlinx.coroutines.delay(2000) - updateState { copy(showOverlay = false, showOverlayText = false) } + private fun navigateToHome() { + emitSideEffect(MissionContract.SideEffect.NavigateToFortune) + } + + private fun sendAlarmDismissIntent(id: Long) { + val alarmDismissIntent = createAlarmDismissIntent( + context = app, + notificationId = id, + ) + app.sendBroadcast(alarmDismissIntent) } } diff --git a/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt b/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt index 7b88dded..630ba25a 100644 --- a/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt +++ b/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt @@ -6,7 +6,6 @@ import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween import androidx.compose.foundation.Image -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.wrapContentSize @@ -50,8 +49,8 @@ fun FlipCard( } } - LaunchedEffect(state.clickCount) { - if (state.clickCount in 1..9) { + LaunchedEffect(state.shakeCount) { + if (state.shakeCount in 1..9) { rotationZ.animateTo( targetValue = -20f, animationSpec = tween(durationMillis = 66, easing = LinearEasing), @@ -76,8 +75,7 @@ fun FlipCard( rotationY = rotationY.value, scaleX = scale.value, scaleY = scale.value, - ) - .clickable { eventDispatcher(MissionContract.Action.ClickCard) }, + ), contentAlignment = Alignment.Center, ) { if (rotationY.value <= 90f) { diff --git a/feature/navigator/build.gradle.kts b/feature/navigator/build.gradle.kts index 5d85544d..a8db6273 100644 --- a/feature/navigator/build.gradle.kts +++ b/feature/navigator/build.gradle.kts @@ -10,9 +10,11 @@ android { dependencies { implementation(projects.core.common) + implementation(projects.core.analytics) implementation(libs.orbit.core) implementation(libs.orbit.compose) implementation(libs.orbit.viewmodel) + implementation(libs.kotlin.reflect) implementation(projects.feature.home) implementation(projects.feature.alarmInteraction) implementation(projects.feature.onboarding) diff --git a/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt b/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt index 5863eb31..7728e44f 100644 --- a/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt +++ b/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt @@ -7,12 +7,20 @@ import androidx.activity.ComponentActivity import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.compose.runtime.CompositionLocalProvider +import com.yapp.analytics.AnalyticsHelper +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.common.navigation.rememberOrbitNavigator import com.yapp.designsystem.theme.OrbitTheme import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject @AndroidEntryPoint class MainActivity : ComponentActivity() { + + @Inject + lateinit var analyticsHelper: AnalyticsHelper + @SuppressLint("SourceLockedOrientationActivity") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -31,9 +39,11 @@ class MainActivity : ComponentActivity() { val navigator = rememberOrbitNavigator() OrbitTheme { - OrbitNavHost( - navigator = navigator, - ) + CompositionLocalProvider(LocalAnalyticsHelper provides analyticsHelper) { + OrbitNavHost( + navigator = navigator, + ) + } } } } diff --git a/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt b/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt deleted file mode 100644 index 60d481ba..00000000 --- a/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.yapp.navigator - -import androidx.annotation.DrawableRes -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.height -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp -import com.yapp.common.navigation.destination.TopLevelDestination -import kotlinx.collections.immutable.ImmutableList - -@Composable -internal fun OrbitBottomNavigationBar( - modifier: Modifier = Modifier, - visible: Boolean, - currentTab: TopLevelDestination?, - entries: ImmutableList, - onClickItem: (TopLevelDestination) -> Unit, -) { - AnimatedVisibility(visible = visible) { - Column { - HorizontalDivider(color = Color.Black, thickness = 1.dp) - Row( - modifier = Modifier - .height(56.dp) - .background(color = Color.White), - ) { - entries.forEach { tab -> - NavItem( - selected = tab == currentTab, - label = stringResource(id = tab.titleId), - iconId = tab.iconId, - onClick = { onClickItem(tab) }, - ) - } - } - } - } -} - -@Composable -fun RowScope.NavItem( - modifier: Modifier = Modifier, - selected: Boolean, - label: String, - @DrawableRes iconId: Int, - onClick: () -> Unit, -) { - Column( - modifier = modifier - .weight(1f) - .fillMaxHeight() - .clickable(onClick = onClick), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - ) { - Icon( - painter = painterResource(id = iconId), - contentDescription = label, - tint = if (selected) Color.Blue else Color.Gray, - ) - Text(text = label, color = if (selected) Color.Blue else Color.Black) - } -} diff --git a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt index 69cc2889..082c2ca5 100644 --- a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt +++ b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt @@ -16,22 +16,18 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.SplashDestination -import com.yapp.common.navigation.destination.TopLevelDestination import com.yapp.common.navigation.rememberOrbitNavigator import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.fortuneNavGraph import com.yapp.home.homeNavGraph -import com.yapp.mission.missionNavGraph +import com.yapp.mission.missionScreen import com.yapp.onboarding.onboardingNavGraph import com.yapp.setting.settingNavGraph -import com.yapp.splash.SplashRoute +import com.yapp.splash.splashScreen import com.yapp.ui.component.snackbar.CustomSnackBarVisuals import com.yapp.ui.component.snackbar.OrbitSnackBar -import com.yapp.webview.webViewNavGraph -import kotlinx.collections.immutable.toImmutableList +import com.yapp.webview.webViewScreen @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable @@ -43,14 +39,6 @@ internal fun OrbitNavHost( Scaffold( modifier = modifier, - bottomBar = { - OrbitBottomNavigationBar( - visible = false, - currentTab = navigator.currentTab, - entries = TopLevelDestination.entries.toImmutableList(), - onClickItem = navigator::navigateToTopLevelDestination, - ) - }, snackbarHost = { OrbitSnackBarHost(snackBarHostState = snackBarHostState) }, @@ -58,27 +46,22 @@ internal fun OrbitNavHost( ) { NavHost( navController = navigator.navController, - startDestination = SplashDestination.Route.route, + startDestination = navigator.startDestination, modifier = Modifier.navigationBarsPadding(), ) { - composable(SplashDestination.Route.route) { - SplashRoute(navigator) - } - onboardingNavGraph( - navigator = navigator, - onFinishOnboarding = { navigator.navigateToTopLevelDestination(TopLevelDestination.HOME) }, - ) + splashScreen(navigator = navigator) + onboardingNavGraph(navigator = navigator) homeNavGraph( navigator = navigator, snackBarHostState = snackBarHostState, ) - missionNavGraph(navigator = navigator) + missionScreen(navigator = navigator) fortuneNavGraph( navigator = navigator, snackBarHostState = snackBarHostState, ) settingNavGraph(navigator = navigator) - webViewNavGraph(navigator = navigator) + webViewScreen(navigator = navigator) } } } diff --git a/feature/onboarding/build.gradle.kts b/feature/onboarding/build.gradle.kts index 94065df8..6c1d22e0 100644 --- a/feature/onboarding/build.gradle.kts +++ b/feature/onboarding/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.media) implementation(projects.domain) implementation(projects.core.datastore) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt index 7f823f1a..abc83d5c 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt @@ -49,7 +49,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.shouldShowRationale -import com.yapp.common.navigation.OrbitNavigator +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.OnBoardingTopAppBar import com.yapp.ui.component.button.OrbitButton @@ -61,10 +62,12 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalPermissionsApi::class) @Composable fun OnboardingAccessRoute( - navigator: OrbitNavigator, viewModel: OnboardingViewModel, ) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + + val analyticsHelper = LocalAnalyticsHelper.current + val context = LocalContext.current val coroutineScope = rememberCoroutineScope() @@ -93,6 +96,15 @@ fun OnboardingAccessRoute( val notificationPermissionLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.RequestPermission(), onResult = { granted -> + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_permission_request", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.IS_PERMISSION_GRANTED to granted, + ), + ), + ) + isNotificationPermissionGranted = granted if (!granted) hasRequestedPermission = true }, @@ -115,7 +127,7 @@ fun OnboardingAccessRoute( val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_RESUME) { isAlarmPermissionGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as android.app.AlarmManager + val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager alarmManager.canScheduleExactAlarms() } else { true @@ -127,6 +139,15 @@ fun OnboardingAccessRoute( } LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_permission_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "권한 설정1", + ), + ), + ) + delay(1000) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { notificationPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt index b5c4812a..963b03ba 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt @@ -8,13 +8,14 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.ui.component.timepicker.OrbitPicker import com.yapp.ui.utils.heightForScreenPercentage @@ -24,15 +25,37 @@ import feature.onboarding.R fun OnboardingAlarmTimeSelectionRoute( viewModel: OnboardingViewModel, ) { - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + val analyticsHelper = LocalAnalyticsHelper.current + BackHandler { - viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리 + viewModel.processAction(OnboardingContract.Action.PreviousStep) + } + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_alarm_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "초기 알람 생성", + ), + ), + ) } + OnboardingAlarmTimeSelectionScreen( - state = state, currentStep = 1, totalSteps = 6, - onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, + onNextClick = { + viewModel.processAction(OnboardingContract.Action.NextStep) + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_alarm_create", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "초기 알람 생성", + ), + ), + ) + }, onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) }, setAlarmTime = { isAm, hour, minute -> viewModel.processAction(OnboardingContract.Action.SetAlarmTime(isAm, hour, minute)) @@ -42,7 +65,6 @@ fun OnboardingAlarmTimeSelectionRoute( @Composable fun OnboardingAlarmTimeSelectionScreen( - state: OnboardingContract.State, currentStep: Int, totalSteps: Int, onNextClick: () -> Unit, @@ -90,7 +112,6 @@ fun OnboardingAlarmTimeSelectionScreen( fun OnboardingAlarmTimeSelectionScreenPreview() { OrbitTheme { OnboardingAlarmTimeSelectionScreen( - state = OnboardingContract.State(), currentStep = 0, totalSteps = 0, onNextClick = {}, diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt index 139316df..39868a89 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt @@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -30,7 +31,8 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.OnBoardingTopAppBar import com.yapp.ui.component.button.OrbitButton @@ -40,15 +42,37 @@ import feature.onboarding.R @Composable fun OnboardingBirthdayRoute(viewModel: OnboardingViewModel) { - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + val analyticsHelper = LocalAnalyticsHelper.current + BackHandler { viewModel.processAction(OnboardingContract.Action.PreviousStep) } + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_birthdate_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "생년월일", + ), + ), + ) + } + OnboardingBirthdayScreen( - state = state, currentStep = 2, totalSteps = 6, - onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, + onNextClick = { + viewModel.processAction(OnboardingContract.Action.NextStep) + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_birthdate_next", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "생년월일", + ), + ), + ) + }, onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) }, onBirthDateChange = { lunar, year, month, day -> viewModel.processAction(OnboardingContract.Action.UpdateBirthDate(lunar, year, month, day)) @@ -68,7 +92,6 @@ fun OnboardingBirthdayRoute(viewModel: OnboardingViewModel) { @Composable fun OnboardingBirthdayScreen( - state: OnboardingContract.State, currentStep: Int, totalSteps: Int, onNextClick: () -> Unit, @@ -188,7 +211,6 @@ fun AnnotatedTermsText( fun OnboardingBirthdayScreenPreview() { OrbitTheme { OnboardingBirthdayScreen( - state = OnboardingContract.State(), currentStep = 3, totalSteps = 3, onNextClick = {}, diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt index c51a632e..fcc8b744 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.scale @@ -18,6 +19,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.ui.component.lottie.LottieAnimation import com.yapp.ui.utils.heightForScreenPercentage @@ -27,10 +30,25 @@ import feature.onboarding.R fun OnboardingCompleteRoute( viewModel: OnboardingViewModel, ) { + val analyticsHelper = LocalAnalyticsHelper.current + val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_welcome1_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "환영1", + ), + ), + ) + } + BackHandler { - viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리 + viewModel.processAction(OnboardingContract.Action.PreviousStep) } + OnboardingCompleteScreen1( state = state, onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt index 7a77ad88..f99e8771 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt @@ -15,7 +15,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.scale @@ -23,7 +22,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.OnBoardingTopAppBar import com.yapp.ui.component.button.OrbitButton @@ -35,12 +33,11 @@ import feature.onboarding.R fun OnboardingCompleteRoute2( viewModel: OnboardingViewModel, ) { - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() BackHandler { - viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리 + viewModel.processAction(OnboardingContract.Action.PreviousStep) } + OnboardingCompleteScreen2( - state = state, onNextClick = { viewModel.processAction(OnboardingContract.Action.CompleteOnboarding) viewModel.processAction(OnboardingContract.Action.CreateAlarm) @@ -51,7 +48,6 @@ fun OnboardingCompleteRoute2( @Composable fun OnboardingCompleteScreen2( - state: OnboardingContract.State, onNextClick: () -> Unit, onBackClick: () -> Unit, currentStep: Int = 0, @@ -122,7 +118,6 @@ fun OnboardingCompleteScreen2( fun OnboardingCompleteScreen2Preview() { OrbitTheme { OnboardingCompleteScreen2( - state = OnboardingContract.State(), onNextClick = {}, onBackClick = {}, ) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt index 0a987a74..5e8b83c2 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt @@ -19,6 +19,7 @@ sealed class OnboardingContract { val isBirthTimeValid: Boolean = false, val isValid: Boolean = false, val isBottomSheetOpen: Boolean = false, + val isShowWarningDialog: Boolean = false, ) : UiState { val birthDateFormatted: String get() { @@ -61,6 +62,8 @@ sealed class OnboardingContract { data object ToggleBottomSheet : Action() data object CompleteOnboarding : Action() data class OpenWebView(val url: String) : Action() + data object ShowWarningDialog : Action() + data object HideWarningDialog : Action() } enum class FieldType(val validationRegex: Regex) { @@ -69,14 +72,30 @@ sealed class OnboardingContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() + data class NavigateToNextStep(val currentStep: Int) : SideEffect() data object NavigateBack : SideEffect() + data object OnboardingCompleted : SideEffect() + data class OpenWebView(val url: String) : SideEffect() } + + companion object { + fun truncateTextToLimit(text: String, maxLength: Int = 12): String { + var totalLength = 0 + val result = StringBuilder() + + for (char in text) { + val charWeight = if (char in '가'..'힣') 2 else 1 + + if (totalLength + charWeight > maxLength) break + + totalLength += charWeight + result.append(char) + } + + return result.toString() + } + } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt index b18ba0a5..412d9677 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt @@ -8,13 +8,14 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.GifImage import com.yapp.ui.utils.heightForScreenPercentage @@ -25,24 +26,45 @@ import feature.onboarding.R fun OnboardingExplainRoute( viewModel: OnboardingViewModel, ) { - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + val analyticsHelper = LocalAnalyticsHelper.current + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_intro_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "서비스 소개", + ), + ), + ) + } OnboardingExplainScreen( - state = state, onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, ) } @Composable fun OnboardingExplainScreen( - state: OnboardingContract.State, onNextClick: () -> Unit, ) { + val analyticsHelper = LocalAnalyticsHelper.current + OnboardingScreen( currentStep = 0, totalSteps = 0, isButtonEnabled = true, - onNextClick = onNextClick, + onNextClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_intro_next", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "서비스 소개", + ), + ), + ) + onNextClick() + }, onBackClick = null, showTopAppBar = false, buttonLabel = "다음", @@ -80,7 +102,6 @@ fun OnboardingExplainScreen( fun OnboardingExplainScreenPreview() { OrbitTheme { OnboardingExplainScreen( - state = OnboardingContract.State(), onNextClick = {}, ) } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt index 24ca5151..c9ba857d 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -20,8 +21,11 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.UserInfoBottomSheet +import com.yapp.ui.component.dialog.OrbitDialog import com.yapp.ui.toggle.OrbitGenderToggle import com.yapp.ui.utils.heightForScreenPercentage import com.yapp.ui.utils.paddingForScreenPercentage @@ -32,9 +36,24 @@ fun OnboardingGenderRoute( viewModel: OnboardingViewModel, ) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + + val analyticsHelper = LocalAnalyticsHelper.current + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_gender_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "성별", + ), + ), + ) + } + BackHandler { viewModel.processAction(OnboardingContract.Action.PreviousStep) } + OnboardingGenderScreen( state = state, currentStep = 5, @@ -42,11 +61,18 @@ fun OnboardingGenderRoute( onNextClick = { viewModel.processAction(OnboardingContract.Action.ToggleBottomSheet) }, onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) }, onGenderSelect = { gender -> + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_gender_select", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.GENDER to gender, + ), + ), + ) viewModel.processAction(OnboardingContract.Action.UpdateGender(gender)) }, onDismissRequest = { viewModel.processAction(OnboardingContract.Action.ToggleBottomSheet) - viewModel.processAction(OnboardingContract.Action.PreviousStep) }, onConfirmRequest = { viewModel.processAction(OnboardingContract.Action.ToggleBottomSheet) @@ -113,6 +139,17 @@ fun OnboardingGenderScreen( } } + if (state.isShowWarningDialog) { + OrbitDialog( + title = stringResource(id = R.string.onboarding_warning_dialog_title), + message = stringResource(id = R.string.onboarding_warning_dialog_message), + confirmText = stringResource(id = R.string.onboarding_warning_dialog_btn_confirm), + onConfirm = { + onConfirmRequest() + }, + ) + } + UserInfoBottomSheet( isSheetOpen = state.isBottomSheetOpen, onDismissRequest = onDismissRequest, diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt index db135bea..4c0b0692 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -22,6 +23,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.ui.component.textfield.OrbitTextField import com.yapp.ui.extensions.customClickable @@ -36,11 +39,22 @@ fun OnboardingNameRoute( val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() val focusRequester = remember { FocusRequester() } - LaunchedEffect(key1 = Unit) { + val analyticsHelper = LocalAnalyticsHelper.current + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_name_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "이름", + ), + ), + ) focusRequester.requestFocus() } + BackHandler { - viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리 + viewModel.processAction(OnboardingContract.Action.PreviousStep) } OnboardingNameScreen( @@ -48,10 +62,25 @@ fun OnboardingNameRoute( currentStep = 4, totalSteps = 6, focusRequester = focusRequester, - onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, + onNextClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_name_next", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "이름", + ), + ), + ) + viewModel.processAction(OnboardingContract.Action.NextStep) + }, onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) }, onTextChange = { value -> - viewModel.processAction(OnboardingContract.Action.UpdateField(value, OnboardingContract.FieldType.NAME)) + viewModel.processAction( + OnboardingContract.Action.UpdateField( + value, + OnboardingContract.FieldType.NAME, + ), + ) }, ) } @@ -105,10 +134,13 @@ fun OnboardingNameScreen( OrbitTextField( text = textFieldValue, onTextChange = { newValue -> + val truncatedText = OnboardingContract.truncateTextToLimit(newValue.text) + textFieldValue = newValue.copy( - selection = TextRange(newValue.text.length), + text = truncatedText, + selection = TextRange(truncatedText.length), ) - onTextChange(newValue.text) + onTextChange(truncatedText) }, hint = "이름 입력", isValid = state.isValid, @@ -117,7 +149,15 @@ fun OnboardingNameScreen( focusRequester = focusRequester, modifier = Modifier .fillMaxWidth() - .paddingForScreenPercentage(horizontalPercentage = 0.192f, topPercentage = 0.086f), + .paddingForScreenPercentage( + horizontalPercentage = 0.192f, + topPercentage = 0.086f, + ), + keyboardActions = KeyboardActions( + onDone = { + focusManager.clearFocus() + }, + ), ) } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt index e2c9ac62..ee57af2e 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt @@ -4,60 +4,106 @@ import android.net.Uri import androidx.compose.runtime.LaunchedEffect import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import androidx.navigation.navOptions import androidx.navigation.navigation import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.OnboardingDestination -import com.yapp.common.navigation.destination.WebViewDestination import com.yapp.common.navigation.extensions.sharedHiltViewModel +import com.yapp.common.navigation.route.OnboardingBaseRoute +import com.yapp.common.navigation.route.OnboardingDestination +import kotlinx.coroutines.flow.collectLatest fun NavGraphBuilder.onboardingNavGraph( navigator: OrbitNavigator, - onFinishOnboarding: () -> Unit, ) { - navigation( - route = OnboardingDestination.Route.route, - startDestination = OnboardingDestination.Explain.route, - ) { - OnboardingDestination.routes.forEach { destination -> - composable(destination.route) { backStackEntry -> - val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) + navigation(startDestination = OnboardingDestination.Explain) { + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingExplainRoute(viewModel) + } - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - handleSideEffect(sideEffect, navigator, viewModel, onFinishOnboarding) - } + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) } + } + OnboardingAlarmTimeSelectionRoute(viewModel) + } - when (destination) { - OnboardingDestination.Route, OnboardingDestination.Explain -> { - OnboardingExplainRoute(viewModel) - } - OnboardingDestination.AlarmTimeSelection -> { - OnboardingAlarmTimeSelectionRoute(viewModel) - } - OnboardingDestination.Birthday -> { - OnboardingBirthdayRoute(viewModel) - } - OnboardingDestination.TimeOfBirth -> { - OnboardingTimeOfBirthRoute(viewModel) - } - OnboardingDestination.Name -> { - OnboardingNameRoute(viewModel) - } - OnboardingDestination.Gender -> { - OnboardingGenderRoute(viewModel) - } - OnboardingDestination.Access -> { - OnboardingAccessRoute(navigator, viewModel) - } - OnboardingDestination.Complete1 -> { - OnboardingCompleteRoute(viewModel) - } - OnboardingDestination.Complete2 -> { - OnboardingCompleteRoute2(viewModel) - } + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingBirthdayRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingTimeOfBirthRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingNameRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingGenderRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingAccessRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingCompleteRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) } } + OnboardingCompleteRoute2(viewModel) } } } @@ -66,22 +112,29 @@ private fun handleSideEffect( sideEffect: OnboardingContract.SideEffect, navigator: OrbitNavigator, viewModel: OnboardingViewModel, - onFinishOnboarding: () -> Unit, ) { when (sideEffect) { - is OnboardingContract.SideEffect.Navigate -> navigator.navigateTo( - route = sideEffect.route, - popUpTo = sideEffect.popUpTo, - inclusive = sideEffect.inclusive, - ) + is OnboardingContract.SideEffect.NavigateToNextStep -> { + navigator.navigateToOnboardingNextStep(sideEffect.currentStep) + } + OnboardingContract.SideEffect.NavigateBack -> { viewModel.processAction(OnboardingContract.Action.Reset) navigator.navigateBack() } - OnboardingContract.SideEffect.OnboardingCompleted -> onFinishOnboarding() + + OnboardingContract.SideEffect.OnboardingCompleted -> { + navigator.navigateToHome( + navOptions = navOptions { + popUpTo(OnboardingBaseRoute) { + inclusive = true + } + }, + ) + } is OnboardingContract.SideEffect.OpenWebView -> { - navigator.navigateTo("${WebViewDestination.WebView.route}/${Uri.encode(sideEffect.url)}") + navigator.navigateToWebView(Uri.encode(sideEffect.url)) } } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt index f08e098e..ece77336 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt @@ -1,14 +1,13 @@ package com.yapp.onboarding +import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -22,7 +21,6 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.SoftwareKeyboardController -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.KeyboardType @@ -32,7 +30,10 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.onboarding.component.UnknownBirthTimeButton import com.yapp.ui.component.textfield.OrbitTextField import com.yapp.ui.extensions.customClickable import com.yapp.ui.utils.heightForScreenPercentage @@ -48,8 +49,22 @@ fun OnboardingTimeOfBirthRoute( val keyboardController: SoftwareKeyboardController? = LocalSoftwareKeyboardController.current val focusRequester = remember { FocusRequester() } - LaunchedEffect(key1 = Unit) { + val analyticsHelper = LocalAnalyticsHelper.current + + LaunchedEffect(Unit) { focusRequester.requestFocus() + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_birthtime_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "태어난 시간", + ), + ), + ) + } + + BackHandler { + viewModel.processAction(OnboardingContract.Action.PreviousStep) } OnboardingTimeOfBirthScreen( @@ -58,6 +73,14 @@ fun OnboardingTimeOfBirthRoute( totalSteps = 6, focusRequester = focusRequester, onNextClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_birthtime_next", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "태어난 시간", + ), + ), + ) viewModel.processAction(OnboardingContract.Action.Reset) viewModel.processAction(OnboardingContract.Action.NextStep) keyboardController?.hide() @@ -81,6 +104,8 @@ fun OnboardingTimeOfBirthScreen( onBackClick: () -> Unit, onTextChange: (String) -> Unit, ) { + val analyticsHelper = LocalAnalyticsHelper.current + val focusManager = LocalFocusManager.current var textFieldValue by remember { mutableStateOf( @@ -90,7 +115,6 @@ fun OnboardingTimeOfBirthScreen( ), ) } - var isPressed by remember { mutableStateOf(false) } OnboardingScreen( currentStep = currentStep, @@ -144,37 +168,24 @@ fun OnboardingTimeOfBirthScreen( ) } - Row( + UnknownBirthTimeButton( modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp) .align(Alignment.CenterHorizontally) - .customClickable( - rippleEnabled = false, - onClick = { - textFieldValue = TextFieldValue("시간모름") - onTextChange("시간모름") - onNextClick() - }, - onPress = { isPressed = true }, - onRelease = { isPressed = false }, - ), - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - painter = painterResource(id = core.designsystem.R.drawable.ic_check), - contentDescription = "Check", - tint = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.white, // ✅ 클릭 여부에 따라 색상 변경 - ) - Text( - text = stringResource(id = R.string.onboarding_step4_text_check), - style = OrbitTheme.typography.body1Medium, - color = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.white, // ✅ 클릭 여부에 따라 색상 변경 - modifier = Modifier.padding(start = 4.dp), - textAlign = TextAlign.Center, - ) - } + .padding(bottom = 20.dp), + onClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_birthtime_unknown", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "태어난 시간", + ), + ), + ) + textFieldValue = TextFieldValue("시간모름") + onTextChange("시간모름") + onNextClick() + }, + ) } } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index 2077b323..ec145349 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -3,7 +3,9 @@ package com.yapp.onboarding import android.util.Log import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope -import com.yapp.common.navigation.destination.OnboardingDestination +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.AnalyticsHelper +import com.yapp.common.navigation.route.OnboardingDestination import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm import com.yapp.domain.model.AlarmDay @@ -16,9 +18,11 @@ import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject +import kotlin.reflect.KClass @HiltViewModel class OnboardingViewModel @Inject constructor( + private val analyticsHelper: AnalyticsHelper, private val signUpRepository: SignUpRepository, private val userPreferences: UserPreferences, private val alarmUseCase: AlarmUseCase, @@ -31,6 +35,9 @@ class OnboardingViewModel @Inject constructor( birthType = savedStateHandle["birthType"] ?: "양력", ), ) { + private val currentRoute: KClass? + get() = OnboardingDestination.routes.getOrNull(currentState.currentStep) + fun processAction(action: OnboardingContract.Action) { when (action) { is OnboardingContract.Action.NextStep -> moveToNextStep() @@ -45,6 +52,8 @@ class OnboardingViewModel @Inject constructor( is OnboardingContract.Action.ToggleBottomSheet -> toggleBottomSheet() is OnboardingContract.Action.CompleteOnboarding -> completeOnboarding() is OnboardingContract.Action.OpenWebView -> openWebView(action.url) + is OnboardingContract.Action.ShowWarningDialog -> showWarningDialog() + is OnboardingContract.Action.HideWarningDialog -> hideWarningDialog() } } @@ -62,12 +71,24 @@ class OnboardingViewModel @Inject constructor( if (result.isSuccess) { val userId = result.getOrNull() ?: return@launch + val userName = state.userName userPreferences.saveUserId(userId) + userPreferences.saveUserName(userName) + + analyticsHelper.setUserId(userId) + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_complete", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "환영2", + ), + ), + ) updateState { copy(isBottomSheetOpen = false) } moveToNextStep() } else { - emitSideEffect(OnboardingContract.SideEffect.NavigateBack) + processAction(OnboardingContract.Action.ShowWarningDialog) } } } @@ -75,12 +96,15 @@ class OnboardingViewModel @Inject constructor( private fun moveToNextStep() { val currentStep = container.stateFlow.value.currentStep val nextStep = currentStep + 1 - val nextRoute = OnboardingDestination.nextRoute(currentStep) + val nextRoute = OnboardingDestination.getNextRouteForStep(currentStep) + + savedStateHandle["birthDate"] = currentState.birthDate + savedStateHandle["birthType"] = currentState.birthType if (nextRoute != null) { savedStateHandle["currentStep"] = nextStep updateState { copy(currentStep = nextStep) } - emitSideEffect(OnboardingContract.SideEffect.Navigate(nextRoute)) + emitSideEffect(OnboardingContract.SideEffect.NavigateToNextStep(currentStep)) } else { emitSideEffect(OnboardingContract.SideEffect.OnboardingCompleted) } @@ -160,14 +184,15 @@ class OnboardingViewModel @Inject constructor( } OnboardingContract.FieldType.NAME -> { - val isValid = value.matches(fieldType.validationRegex) + val truncatedValue = OnboardingContract.truncateTextToLimit(value) + val isValid = truncatedValue.matches(fieldType.validationRegex) updateState { copy( - textFieldValue = value, - userName = value, - showWarning = value.isNotEmpty() && !isValid, - isButtonEnabled = value.isNotEmpty() && isValid, + textFieldValue = truncatedValue, + userName = truncatedValue, + showWarning = !isValid, + isButtonEnabled = truncatedValue.isNotEmpty() && isValid, isValid = isValid, ) } @@ -176,11 +201,10 @@ class OnboardingViewModel @Inject constructor( } private fun updateBirthDate(lunar: String, year: Int, month: Int, day: Int) { + if (currentRoute != OnboardingDestination.Birthday::class) return + val formattedDate = "$year-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}" - if (currentState.birthDate == formattedDate && currentState.birthType == lunar) { - return - } hapticFeedbackManager.performHapticFeedback(HapticType.LIGHT_TICK) savedStateHandle["birthDate"] = formattedDate savedStateHandle["birthType"] = lunar @@ -224,4 +248,12 @@ class OnboardingViewModel @Inject constructor( private fun openWebView(url: String) { emitSideEffect(OnboardingContract.SideEffect.OpenWebView(url)) } + + private fun showWarningDialog() { + updateState { copy(isShowWarningDialog = true) } + } + + private fun hideWarningDialog() { + updateState { copy(isShowWarningDialog = false) } + } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt index 2ca70ab0..daca8c79 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt @@ -1,7 +1,6 @@ package com.yapp.onboarding.component import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -19,6 +18,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.ui.extensions.customClickable @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -37,7 +37,12 @@ fun OnBoardingTopAppBar( contentDescription = "Back", tint = OrbitTheme.colors.white, modifier = Modifier - .clickable(onClick = onBackClick) + .customClickable( + rippleEnabled = false, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onBackClick, + ) .padding(start = 20.dp), ) } @@ -67,5 +72,10 @@ fun OnBoardingTopAppBar( @Composable @Preview fun OnBoardingTopAppBarPreview() { - OnBoardingTopAppBar(currentStep = 1, totalSteps = 3) + OnBoardingTopAppBar( + currentStep = 1, + totalSteps = 3, + onBackClick = {}, + showTopAppBarActions = true, + ) } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/component/UnknownBirthTimeButton.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/component/UnknownBirthTimeButton.kt new file mode 100644 index 00000000..dd7ce8c8 --- /dev/null +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/component/UnknownBirthTimeButton.kt @@ -0,0 +1,79 @@ +package com.yapp.onboarding.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.yapp.designsystem.theme.OrbitTheme +import feature.onboarding.R + +@Composable +fun UnknownBirthTimeButton( + modifier: Modifier = Modifier, + onClick: () -> Unit, + containerColor: Color = Color.Transparent, + contentColor: Color = OrbitTheme.colors.white, + pressedContainerColor: Color = OrbitTheme.colors.gray_800, + pressedContentColor: Color = OrbitTheme.colors.main, + shape: Shape = RoundedCornerShape(12.dp), +) { + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + + val currentContainerColor = if (isPressed) pressedContainerColor else containerColor + val currentContentColor = if (isPressed) pressedContentColor else contentColor + + Row( + modifier = modifier + .background(currentContainerColor, shape) + .clickable( + interactionSource = interactionSource, + indication = null, + onClick = onClick, + ) + .padding(horizontal = 24.dp, vertical = 6.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + ) { + Text( + text = stringResource(id = R.string.onboarding_step4_text_check), + style = OrbitTheme.typography.body1Medium, + color = currentContentColor, + ) + Spacer(modifier = Modifier.width(4.dp)) + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right), + contentDescription = null, + modifier = Modifier.size(20.dp), + tint = currentContentColor, + ) + } +} + +@Composable +@Preview +fun PreviewUnknownBirthTimeButton() { + UnknownBirthTimeButton( + onClick = { /*TODO*/ }, + ) +} diff --git a/feature/onboarding/src/main/res/values/values.xml b/feature/onboarding/src/main/res/values/values.xml index 715f1b0c..840c5f0f 100644 --- a/feature/onboarding/src/main/res/values/values.xml +++ b/feature/onboarding/src/main/res/values/values.xml @@ -11,7 +11,7 @@ 태어난 시간을 알려주세요 태어난 시간을 몰라요 - 입력한 숫자를 확인해 주세요 + 입력한 내용를 확인해 주세요 어떤 이름으로 불리길\n원하시나요? 입력한 내용을 확인해 주세요 @@ -33,4 +33,8 @@ 기상 미션을 수행하면\n운세를 확인 할 수 있어요 오르비의 하루 운세로\n아침을 즐겁게 시작해 보세요! + 오류 + 서비스가 일시적으로 사용 불가능합니다.\n잠시 후 다시 시도해주세요. + 확인 + diff --git a/feature/setting/build.gradle.kts b/feature/setting/build.gradle.kts index 6227faa3..96e74f94 100644 --- a/feature/setting/build.gradle.kts +++ b/feature/setting/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.domain) implementation(projects.core.datastore) implementation(libs.orbit.core) diff --git a/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt b/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt index 6478df74..1870ceea 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt @@ -9,6 +9,9 @@ import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview @@ -58,7 +61,10 @@ fun EditBirthdayScreen( onCancelDialog: () -> Unit, onUpdateBirthDate: (String, Int, Int, Int) -> Unit, ) { - val (year, month, day) = state.birthDate.split("-") + var selectedLunar by remember { mutableStateOf(state.birthType) } + var selectedYear by remember { mutableStateOf(state.birthDate.split("-")[0].toInt()) } + var selectedMonth by remember { mutableStateOf(state.birthDate.split("-")[1].toInt()) } + var selectedDay by remember { mutableStateOf(state.birthDate.split("-")[2].toInt()) } Column( modifier = Modifier @@ -72,7 +78,9 @@ fun EditBirthdayScreen( showTopAppBarActions = true, title = "생년월일 수정", actionTitle = "확인", + isActionEnabled = true, onActionClick = { + onUpdateBirthDate(selectedLunar, selectedYear, selectedMonth, selectedDay) onConfirm() }, ) @@ -85,12 +93,15 @@ fun EditBirthdayScreen( Spacer(modifier = Modifier.heightForScreenPercentage(0.16f)) OrbitYearMonthPicker( - initialLunar = state.birthType, - initialYear = year, - initialMonth = month, - initialDay = day, + initialLunar = selectedLunar, + initialYear = selectedYear.toString(), + initialMonth = selectedMonth.toString(), + initialDay = selectedDay.toString(), ) { lunar, year, month, day -> - onUpdateBirthDate(lunar, year, month, day) + selectedLunar = lunar + selectedYear = year + selectedMonth = month + selectedDay = day } } diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt index 830b66a9..6df4257a 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt @@ -1,6 +1,5 @@ package com.yapp.setting -import android.util.Log import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable @@ -20,15 +19,20 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -49,7 +53,11 @@ fun EditProfileRoute( ) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() - Log.d("EditProfileRoute", "State: $state") + LaunchedEffect(state.shouldFetchUserInfo) { + if (state.shouldFetchUserInfo) { + viewModel.onAction(SettingContract.Action.RefreshUserInfo) + } + } EditProfileScreen( state = state, @@ -95,17 +103,19 @@ fun EditProfileScreen( ) { val focusManager = LocalFocusManager.current - val nameTextFieldValue = remember(state.name) { - TextFieldValue( - text = state.name, - selection = TextRange(state.name.length), - ) + val nameTextFieldValue = remember { mutableStateOf(TextFieldValue(state.name)) } + val birthTimeTextFieldValue = remember { mutableStateOf(TextFieldValue(state.timeOfBirth)) } + + LaunchedEffect(state.name) { + if (state.name != nameTextFieldValue.value.text) { + nameTextFieldValue.value = TextFieldValue(state.name) + } } - val birthTimeTextFieldValue = remember(state.timeOfBirth) { - TextFieldValue( - text = state.timeOfBirth, - selection = TextRange(state.timeOfBirth.length), - ) + + LaunchedEffect(state.timeOfBirth) { + if (state.timeOfBirth != birthTimeTextFieldValue.value.text) { + birthTimeTextFieldValue.value = TextFieldValue(state.timeOfBirth) + } } Column( @@ -124,6 +134,7 @@ fun EditProfileScreen( title = "프로필 수정", actionTitle = "저장", onActionClick = onSaveUserInfo, + isActionEnabled = state.isActionEnabled, ) Column( @@ -138,18 +149,22 @@ fun EditProfileScreen( ) Spacer(modifier = Modifier.height(8.dp)) OrbitTextField( - text = nameTextFieldValue, + text = nameTextFieldValue.value, onTextChange = { newValue -> + nameTextFieldValue.value = newValue onUpdateName(newValue.text) }, hint = "이름 입력", isValid = state.isNameValid, showWarning = !state.isNameValid, - warningMessage = "올바른 이름을 입력해주세요.", + warningMessage = "입력한 내용을 확인해 주세요.", modifier = Modifier .fillMaxWidth() .padding(horizontal = 18.dp), textAlign = TextAlign.Start, + keyboardActions = KeyboardActions( + onDone = { focusManager.clearFocus() }, + ), ) Spacer(modifier = Modifier.height(18.dp)) ContentsTitle( @@ -183,6 +198,7 @@ fun EditProfileScreen( onToggle = { onToggleGender(true) }, height = 52.dp, textStyle = OrbitTheme.typography.body1Regular, + shape = RoundedCornerShape(12.dp), ) } Box(modifier = Modifier.weight(1f)) { @@ -192,6 +208,7 @@ fun EditProfileScreen( onToggle = { onToggleGender(false) }, height = 52.dp, textStyle = OrbitTheme.typography.body1Regular, + shape = RoundedCornerShape(12.dp), ) } } @@ -210,19 +227,27 @@ fun EditProfileScreen( verticalAlignment = Alignment.CenterVertically, ) { OrbitTextField( - text = birthTimeTextFieldValue, + text = birthTimeTextFieldValue.value, onTextChange = { newValue -> - val formattedTime = formatTimeInput(newValue.text, state.timeOfBirth) - onUpdateTimeOfBirth(formattedTime) + val formattedValue = formatTimeInput(newValue.text, state.timeOfBirth) + birthTimeTextFieldValue.value = formattedValue + onUpdateTimeOfBirth(formattedValue.text) }, - hint = "시간모름", + hint = "23:59", isValid = state.isTimeValid, showWarning = !state.isTimeValid, - warningMessage = "올바른 시간을 입력해주세요.", enabled = !state.isTimeUnknown, modifier = Modifier .weight(1f), textAlign = TextAlign.Start, + keyboardOptions = KeyboardOptions.Default.copy( + keyboardType = KeyboardType.Number, + ), + keyboardActions = KeyboardActions( + onDone = { + focusManager.clearFocus() + }, + ), ) Spacer(modifier = Modifier.width(12.dp)) @@ -239,7 +264,7 @@ fun EditProfileScreen( color = if (state.isTimeUnknown) OrbitTheme.colors.main else OrbitTheme.colors.white, ) } - if (!state.isTimeValid) { + if (!state.isTimeUnknown && !state.isTimeValid) { WarningMessage( message = "올바른 시간을 입력해주세요.", textAlign = TextAlign.Start, @@ -261,11 +286,11 @@ fun EditProfileScreen( } } -fun formatTimeInput(input: String, previousText: String): String { +fun formatTimeInput(input: String, previousText: String): TextFieldValue { val sanitizedValue = input.filter { it.isDigit() } val isDeleting = sanitizedValue.length < previousText.filter { it.isDigit() }.length - return when { + val newText = when { isDeleting && previousText.endsWith(":") -> sanitizedValue sanitizedValue.length > 2 -> { val hours = sanitizedValue.take(2) @@ -283,6 +308,13 @@ fun formatTimeInput(input: String, previousText: String): String { else -> sanitizedValue } + val cursorPosition = if (newText.length == 3 && newText.endsWith(":")) { + 3 + } else { + newText.length + } + + return TextFieldValue(newText, TextRange(cursorPosition)) } @Composable diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt index 9e0049ca..166388b3 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt @@ -2,7 +2,6 @@ package com.yapp.setting import android.util.Log import androidx.lifecycle.viewModelScope -import com.yapp.common.navigation.destination.SettingDestination import com.yapp.datastore.UserPreferences import com.yapp.domain.model.EditUser import com.yapp.domain.repository.UserInfoRepository @@ -20,69 +19,79 @@ class EditProfileViewModel @Inject constructor( ) : BaseViewModel( SettingContract.State(), ) { - - init { - viewModelScope.launch { - userPreferences.userIdFlow.collect { userId -> - if (userId != null) { - fetchUserInfo(userId) + fun onAction(action: SettingContract.Action) = intent { + when (action) { + is SettingContract.Action.UpdateName -> updateName(action.name) + is SettingContract.Action.UpdateBirthDate -> updateBirthDate(action) + is SettingContract.Action.UpdateCalendarType -> updateCalendarType(action.calendarType) + is SettingContract.Action.UpdateGender -> updateGender(action.gender) + is SettingContract.Action.ToggleGender -> toggleGender(action.isMale) + is SettingContract.Action.ToggleTimeUnknown -> toggleTimeUnknown(action.isChecked) + is SettingContract.Action.UpdateTimeOfBirth -> updateTimeOfBirth(action.time) + is SettingContract.Action.ConfirmAndNavigateBack -> emitSideEffect(SettingContract.SideEffect.NavigateBack) + is SettingContract.Action.Reset -> updateState { SettingContract.State() } + SettingContract.Action.ShowDialog -> updateState { copy(isDialogVisible = true) } + SettingContract.Action.HideDialog -> updateState { copy(isDialogVisible = false) } + SettingContract.Action.PreviousStep -> previousStep() + SettingContract.Action.SubmitUserInfo -> submitUserInfo() + is SettingContract.Action.NavigateToEditBirthday -> navigateToEditBirthday() + is SettingContract.Action.RefreshUserInfo -> { + if (currentState.shouldFetchUserInfo) { + refreshUserInfo() } } + else -> {} } } - fun onAction(action: SettingContract.Action) = intent { - when (action) { - is SettingContract.Action.UpdateName -> updateState { - val isValid = SettingContract.FieldType.NAME.validationRegex.matches(action.name) - copy(name = action.name, isNameValid = isValid) - } + private fun updateName(name: String) = updateState { + copy(name = name, isNameValid = validateName(name)) + } - is SettingContract.Action.UpdateBirthDate -> { - val formattedDate = "${action.year}-${action.month.toString().padStart(2, '0')}-${action.day.toString().padStart(2, '0')}" - updateState { state.copy(birthDate = formattedDate) } - } + private fun validateName(name: String): Boolean { + return SettingContract.FieldType.NAME.validationRegex.matches(name) + } - is SettingContract.Action.UpdateCalendarType -> { - Log.d("EditProfileViewModel", "Received new calendarType: ${action.calendarType}") - updateState { state.copy(birthType = action.calendarType) } - } + private fun updateBirthDate(action: SettingContract.Action.UpdateBirthDate) = updateState { + val formattedDate = "${action.year}-${action.month.toString().padStart(2, '0')}-${ + action.day.toString().padStart(2, '0') + }" + copy(birthDate = formattedDate) + } - is SettingContract.Action.UpdateGender -> updateState { copy(selectedGender = action.gender) } - is SettingContract.Action.ToggleGender -> updateState { - copy( - isMaleSelected = action.isMale, - isFemaleSelected = !action.isMale, - ) - } + private fun updateCalendarType(calendarType: String) = updateState { + copy(birthType = calendarType) + } - is SettingContract.Action.ToggleTimeUnknown -> updateState { - copy( - isTimeUnknown = action.isChecked, - timeOfBirth = if (action.isChecked) "시간모름" else "", - ) - } + private fun updateGender(gender: String) = updateState { + copy(selectedGender = gender) + } - is SettingContract.Action.UpdateTimeOfBirth -> updateState { - val isValid = if (action.time.length == 5) { - SettingContract.FieldType.TIME.validationRegex.matches(action.time) - } else { - true - } - copy(timeOfBirth = action.time, isTimeValid = isValid) - } + private fun toggleGender(isMale: Boolean) = updateState { + copy( + isMaleSelected = isMale, + isFemaleSelected = !isMale, + selectedGender = if (isMale) "남성" else "여성", + ) + } - is SettingContract.Action.ConfirmAndNavigateBack -> { - emitSideEffect(SettingContract.SideEffect.NavigateBack) - } + private fun toggleTimeUnknown(isChecked: Boolean) = updateState { + val newState = copy( + isTimeUnknown = isChecked, + timeOfBirth = if (isChecked) "시간모름" else "", + ) + newState.copy(isTimeValid = validateTimeOfBirth(newState.timeOfBirth, isChecked)) + } - is SettingContract.Action.Reset -> updateState { SettingContract.State() } - SettingContract.Action.ShowDialog -> updateState { copy(isDialogVisible = true) } - SettingContract.Action.HideDialog -> updateState { copy(isDialogVisible = false) } - SettingContract.Action.PreviousStep -> emitSideEffect(SettingContract.SideEffect.NavigateBack) - SettingContract.Action.SubmitUserInfo -> submitUserInfo() - SettingContract.Action.NavigateToEditBirthday -> navigateToEditBirthday() - else -> {} + private fun updateTimeOfBirth(time: String) = updateState { + copy(timeOfBirth = time, isTimeValid = validateTimeOfBirth(time, isTimeUnknown)) + } + + private fun validateTimeOfBirth(time: String, isTimeUnknown: Boolean): Boolean { + return if (isTimeUnknown) { + true + } else { + time.length == 5 && SettingContract.FieldType.TIME.validationRegex.matches(time) } } @@ -92,14 +101,10 @@ class EditProfileViewModel @Inject constructor( .onSuccess { user -> val (initialYear, initialMonth, initialDay) = user.birthDate.split("-") - Log.d( - "EditProfileViewModel", - "Fetched user data -> birthDate: ${user.birthDate}", - ) - updateState { copy( name = user.name, + isNameValid = validateName(user.name), initialYear = initialYear, initialMonth = initialMonth, initialDay = initialDay, @@ -108,6 +113,10 @@ class EditProfileViewModel @Inject constructor( selectedGender = user.gender, timeOfBirth = user.birthTime ?: "99:99", isTimeUnknown = user.birthTime == "시간모름", + isTimeValid = validateTimeOfBirth( + user.birthTime ?: "", + user.birthTime == "시간모름", + ), isMaleSelected = user.gender == "남성", isFemaleSelected = user.gender == "여성", ) @@ -119,6 +128,11 @@ class EditProfileViewModel @Inject constructor( } } + private fun previousStep() { + updateState { copy(shouldFetchUserInfo = true) } + emitSideEffect(SettingContract.SideEffect.NavigateBack) + } + private fun submitUserInfo() = viewModelScope.launch { val userId = userPreferences.userIdFlow.firstOrNull() ?: return@launch val state = container.stateFlow.value @@ -134,8 +148,8 @@ class EditProfileViewModel @Inject constructor( val result = userInfoRepository.updateUserInfo(userId, updatedUser) if (result.isSuccess) { - Log.d("EditProfileViewModel", "사용자 정보 수정 성공") - emitSideEffect(SettingContract.SideEffect.NavigateBack) + userPreferences.saveUserName(state.name) + emitSideEffect(SettingContract.SideEffect.NavigateToSettingRoute) } else { Log.e("EditProfileViewModel", "사용자 정보 수정 실패") } @@ -144,9 +158,18 @@ class EditProfileViewModel @Inject constructor( private fun extractBirthDate(formattedDate: String): String { return formattedDate.replace(Regex("[^0-9-]"), "") } - // YYYY-MM-DD 형식으로 서버에 전송 - private fun navigateToEditBirthday() = intent { - emitSideEffect(SettingContract.SideEffect.Navigate(SettingDestination.EditBirthday.route)) + private fun navigateToEditBirthday() { + updateState { copy(shouldFetchUserInfo = false) } + emitSideEffect(SettingContract.SideEffect.NavigateToEditBirthday) + } + + private fun refreshUserInfo() { + viewModelScope.launch { + val userId = userPreferences.userIdFlow.firstOrNull() + if (userId != null) { + fetchUserInfo(userId) + } + } } } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt index 31275f24..6f957cc3 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt @@ -4,6 +4,7 @@ import com.yapp.ui.base.UiState sealed class SettingContract { data class State( + val initialLoading: Boolean = true, val name: String = "", val initialYear: String = "2000", val initialMonth: String = "01", @@ -18,6 +19,7 @@ sealed class SettingContract { val isDialogVisible: Boolean = false, val isNameValid: Boolean = true, val isTimeValid: Boolean = true, + val shouldFetchUserInfo: Boolean = true, ) : UiState { val birthDateFormatted: String get() { @@ -28,6 +30,13 @@ sealed class SettingContract { return "$birthType $year $month $day" } + val timeOfBirthFormatted: String + get() = timeOfBirth.takeIf { it.length >= 5 }?.let { + "${it.substring(0, 2)}시 ${it.substring(3, 5)}분" + } ?: " " + + val isActionEnabled: Boolean + get() = isNameValid && (isTimeUnknown || (timeOfBirth.length == 5 && isTimeValid)) && selectedGender != null } sealed class Action { @@ -47,6 +56,7 @@ sealed class SettingContract { data object HideDialog : Action() data object SubmitUserInfo : Action() data class OpenWebView(val url: String) : Action() + data object RefreshUserInfo : Action() } enum class FieldType(val validationRegex: Regex) { @@ -55,13 +65,14 @@ sealed class SettingContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() - data object NavigateBack : SideEffect() + + data object NavigateToSettingRoute : SideEffect() + + data object NavigateToEditProfile : SideEffect() + + data object NavigateToEditBirthday : SideEffect() + data class OpenWebView(val url: String) : SideEffect() } } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt b/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt index 36e41aa8..054c523b 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt @@ -8,127 +8,122 @@ import androidx.compose.animation.slideOutVertically import androidx.compose.runtime.LaunchedEffect import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import androidx.navigation.navOptions import androidx.navigation.navigation import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.SettingDestination -import com.yapp.common.navigation.destination.WebViewDestination import com.yapp.common.navigation.extensions.sharedHiltViewModel -import com.yapp.ui.base.BaseViewModel +import com.yapp.common.navigation.route.SettingBaseRoute +import com.yapp.common.navigation.route.SettingDestination +import kotlinx.coroutines.flow.collectLatest fun NavGraphBuilder.settingNavGraph( navigator: OrbitNavigator, ) { - navigation( - route = SettingDestination.Route.route, - startDestination = SettingDestination.Setting.route, + navigation( + startDestination = SettingDestination.Setting, ) { - SettingDestination.routes.forEach { destination -> - when (destination) { - SettingDestination.Setting -> { - composable(route = destination.route) { backStackEntry -> - val viewModel = - backStackEntry.sharedHiltViewModel(navigator.navController) + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - handleSettingSideEffect(sideEffect, navigator, viewModel) - } - } - - SettingRoute(viewModel) - } + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator) } + } - SettingDestination.EditProfile -> { - composable(route = destination.route) { backStackEntry -> - val viewModel = - backStackEntry.sharedHiltViewModel(navigator.navController) + SettingRoute(viewModel) + } - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - handleSettingSideEffect(sideEffect, navigator, viewModel) - } - } + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) - EditProfileRoute(viewModel) - } + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator) } + } - SettingDestination.EditBirthday -> { - composable( - route = destination.route, - enterTransition = { - slideInVertically( - initialOffsetY = { it }, - animationSpec = tween( - durationMillis = 350, - easing = FastOutSlowInEasing, - ), - ) - }, - exitTransition = { - slideOutVertically( - targetOffsetY = { -it }, - animationSpec = tween( - durationMillis = 250, - easing = FastOutSlowInEasing, - ), - ) - }, - popEnterTransition = { - slideInVertically( - initialOffsetY = { -it }, - animationSpec = tween( - durationMillis = 300, - easing = FastOutSlowInEasing, - ), - ) - }, - popExitTransition = { - slideOutVertically( - targetOffsetY = { it }, - animationSpec = tween( - durationMillis = 300, - easing = FastOutSlowInEasing, - ), - ) - }, - ) { backStackEntry -> - val viewModel = - backStackEntry.sharedHiltViewModel(navigator.navController) + EditProfileRoute(viewModel) + } - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - handleSettingSideEffect(sideEffect, navigator, viewModel) - } - } + composable( + enterTransition = { + slideInVertically( + initialOffsetY = { it }, + animationSpec = tween( + durationMillis = 350, + easing = FastOutSlowInEasing, + ), + ) + }, + exitTransition = { + slideOutVertically( + targetOffsetY = { -it }, + animationSpec = tween( + durationMillis = 250, + easing = FastOutSlowInEasing, + ), + ) + }, + popEnterTransition = { + slideInVertically( + initialOffsetY = { -it }, + animationSpec = tween( + durationMillis = 300, + easing = FastOutSlowInEasing, + ), + ) + }, + popExitTransition = { + slideOutVertically( + targetOffsetY = { it }, + animationSpec = tween( + durationMillis = 300, + easing = FastOutSlowInEasing, + ), + ) + }, + ) { + val viewModel = it.sharedHiltViewModel(navigator.navController) - EditBirthdayRoute(viewModel) - } + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator) } - - else -> {} } + + EditBirthdayRoute(viewModel) } } } -private fun handleSettingSideEffect( +private fun handleSideEffect( sideEffect: SettingContract.SideEffect, navigator: OrbitNavigator, - viewModel: BaseViewModel<*, *>, ) { when (sideEffect) { - is SettingContract.SideEffect.Navigate -> navigator.navigateTo( - route = sideEffect.route, - popUpTo = sideEffect.popUpTo, - inclusive = sideEffect.inclusive, - ) - SettingContract.SideEffect.NavigateBack -> navigator.navigateBack() + SettingContract.SideEffect.NavigateToSettingRoute -> { + navigator.navigateToSetting( + navOptions = navOptions { + popUpTo(SettingBaseRoute) { + inclusive = true + } + }, + ) + } + + SettingContract.SideEffect.NavigateToEditProfile -> { + navigator.navigateToEditProfile() + } + + SettingContract.SideEffect.NavigateToEditBirthday -> { + navigator.navigateToEditBirthDay() + } + is SettingContract.SideEffect.OpenWebView -> { - navigator.navigateTo("${WebViewDestination.WebView.route}/${Uri.encode(sideEffect.url)}") + navigator.navigateToWebView(Uri.encode(sideEffect.url)) } } } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index f7aaa76b..03f79fd0 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -1,7 +1,8 @@ package com.yapp.setting +import android.content.Intent import androidx.compose.foundation.background -import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -9,12 +10,17 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.designsystem.theme.OrbitTheme @@ -24,25 +30,38 @@ import com.yapp.setting.component.SettingTopAppBar import com.yapp.setting.component.TableOfContentsText import com.yapp.setting.component.UserInfoCard import com.yapp.setting.component.VersionCodeText +import com.yapp.ui.component.lottie.LottieAnimation +import com.yapp.ui.extensions.customClickable @Composable fun SettingRoute( viewModel: SettingViewModel = hiltViewModel(), ) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + val context = LocalContext.current + LaunchedEffect(key1 = Unit) { + viewModel.onAction(SettingContract.Action.RefreshUserInfo) + } SettingScreen( state = state, onNavigateToEditProfile = { - viewModel.onAction( - SettingContract.Action.NavigateToEditProfile, - ) + viewModel.onAction(SettingContract.Action.NavigateToEditProfile) }, onBackClick = { viewModel.onAction(SettingContract.Action.PreviousStep) }, onInquiryClick = { - viewModel.onAction( - SettingContract.Action.OpenWebView("http://pf.kakao.com/_YxiPsn/chat"), - ) + val kakaoUrl = "http://pf.kakao.com/_ykqxjn" + val kakaoSchemeUrl = "kakaoplus://plusfriend/home/_ykqxjn" + + val kakaoIntent = Intent(Intent.ACTION_VIEW, kakaoSchemeUrl.toUri()) + + try { + context.startActivity(kakaoIntent) // 카카오톡 앱으로 이동 + } catch (e: Exception) { + viewModel.onAction( + SettingContract.Action.OpenWebView(kakaoUrl), // 앱이 없으면 웹뷰로 열기 + ) + } }, onTermsClick = { viewModel.onAction( @@ -65,6 +84,35 @@ fun SettingScreen( onInquiryClick: () -> Unit = {}, onTermsClick: () -> Unit = {}, onPrivacyPolicyClick: () -> Unit = {}, +) { + if (state.initialLoading) { + SettingLoadingScreen() + } else { + SettingContent( + name = state.name, + selectedGender = state.selectedGender ?: "", + birthDate = state.birthDateFormatted, + timeOfBirth = state.timeOfBirthFormatted, + onNavigateToEditProfile = onNavigateToEditProfile, + onBackClick = onBackClick, + onInquiryClick = onInquiryClick, + onTermsClick = onTermsClick, + onPrivacyPolicyClick = onPrivacyPolicyClick, + ) + } +} + +@Composable +private fun SettingContent( + name: String, + selectedGender: String, + birthDate: String, + timeOfBirth: String, + onNavigateToEditProfile: () -> Unit, + onBackClick: () -> Unit, + onInquiryClick: () -> Unit, + onTermsClick: () -> Unit, + onPrivacyPolicyClick: () -> Unit, ) { Column( modifier = Modifier @@ -80,12 +128,18 @@ fun SettingScreen( ) Spacer(modifier = Modifier.height(12.dp)) UserInfoCard( - name = state.name, - gender = state.selectedGender ?: "", - birth = state.birthDate, + name = name, + gender = selectedGender, + birth = birthDate, + timeOfBirth = timeOfBirth, modifier = Modifier .padding(horizontal = 24.dp) - .clickable { onNavigateToEditProfile() }, + .customClickable( + rippleEnabled = true, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = { onNavigateToEditProfile() }, + ), ) Spacer(modifier = Modifier.height(24.dp)) InquiryCard( @@ -107,26 +161,49 @@ fun SettingScreen( SettingItem( itemTitle = "이용약관", modifier = Modifier - .clickable { - onTermsClick() - } + .customClickable( + rippleEnabled = true, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onTermsClick, + ) .padding(horizontal = 24.dp), ) Spacer(modifier = Modifier.height(24.dp)) SettingItem( itemTitle = "개인정보 처리방침", modifier = Modifier - .clickable { - onPrivacyPolicyClick() - } + .customClickable( + rippleEnabled = true, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onPrivacyPolicyClick, + ) .padding(horizontal = 24.dp), ) Spacer(modifier = Modifier.weight(1f)) - VersionCodeText(versionCode = "v1.0.0") + VersionCodeText() Spacer(modifier = Modifier.height(24.dp)) } } +@Composable +private fun SettingLoadingScreen() { + Box( + modifier = Modifier + .fillMaxSize() + .background(OrbitTheme.colors.gray_900), + contentAlignment = Alignment.Center, + ) { + LottieAnimation( + modifier = Modifier + .size(70.dp) + .align(Alignment.Center), + resId = core.designsystem.R.raw.star_loading, + ) + } +} + @Composable @Preview fun SettingScreenPreview() { diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt index 4a82c925..2e0773c0 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt @@ -2,11 +2,11 @@ package com.yapp.setting import android.util.Log import androidx.lifecycle.viewModelScope -import com.yapp.common.navigation.destination.SettingDestination import com.yapp.datastore.UserPreferences import com.yapp.domain.repository.UserInfoRepository import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import org.orbitmvi.orbit.syntax.simple.intent import javax.inject.Inject @@ -15,58 +15,15 @@ import javax.inject.Inject class SettingViewModel @Inject constructor( private val userInfoRepository: UserInfoRepository, private val userPreferences: UserPreferences, -) : - BaseViewModel( - SettingContract.State(), - ) { - - init { - viewModelScope.launch { - userPreferences.userIdFlow.collect { userId -> - if (userId != null) { - fetchUserInfo(userId) - } - } - } - } - +) : BaseViewModel( + SettingContract.State(), +) { fun onAction(action: SettingContract.Action) = intent { when (action) { - is SettingContract.Action.UpdateName -> updateState { - val isValid = SettingContract.FieldType.NAME.validationRegex.matches(action.name) - copy(name = action.name, isNameValid = isValid) - } - is SettingContract.Action.UpdateBirthDate -> { - val formattedDate = "${action.year}-${action.month.toString().padStart(2, '0')}-${action.day.toString().padStart(2, '0')}" - updateState { state.copy(birthDate = formattedDate) } - } - is SettingContract.Action.UpdateGender -> updateState { copy(selectedGender = action.gender) } - is SettingContract.Action.ToggleGender -> updateState { - copy( - isMaleSelected = action.isMale, - isFemaleSelected = !action.isMale, - ) - } - is SettingContract.Action.ToggleTimeUnknown -> updateState { - copy( - isTimeUnknown = action.isChecked, - timeOfBirth = if (action.isChecked) "시간모름" else "", - ) - } - is SettingContract.Action.UpdateTimeOfBirth -> updateState { - val isValid = if (action.time.length == 5) { - SettingContract.FieldType.TIME.validationRegex.matches(action.time) - } else { - true - } - copy(timeOfBirth = action.time, isTimeValid = isValid) - } - is SettingContract.Action.Reset -> updateState { SettingContract.State() } - SettingContract.Action.ShowDialog -> updateState { copy(isDialogVisible = true) } - SettingContract.Action.HideDialog -> updateState { copy(isDialogVisible = false) } SettingContract.Action.PreviousStep -> emitSideEffect(SettingContract.SideEffect.NavigateBack) SettingContract.Action.NavigateToEditProfile -> navigateToEditProfile() is SettingContract.Action.OpenWebView -> openWebView(action.url) + SettingContract.Action.RefreshUserInfo -> refreshUserInfo() else -> {} } } @@ -77,9 +34,11 @@ class SettingViewModel @Inject constructor( .onSuccess { user -> updateState { copy( + initialLoading = false, name = user.name, birthDate = user.birthDate, selectedGender = user.gender, + timeOfBirth = user.birthTime.toString(), ) } } @@ -89,11 +48,20 @@ class SettingViewModel @Inject constructor( } } - private fun navigateToEditProfile() = intent { - emitSideEffect(SettingContract.SideEffect.Navigate(SettingDestination.EditProfile.route)) + private fun navigateToEditProfile() { + emitSideEffect(SettingContract.SideEffect.NavigateToEditProfile) } private fun openWebView(url: String) { emitSideEffect(SettingContract.SideEffect.OpenWebView(url)) } + + private fun refreshUserInfo() { + viewModelScope.launch { + val userId = userPreferences.userIdFlow.firstOrNull() + if (userId != null) { + fetchUserInfo(userId) + } + } + } } diff --git a/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt b/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt index 4f3613ac..88cd7f78 100644 --- a/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt +++ b/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt @@ -2,7 +2,6 @@ package com.yapp.setting.component import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -21,6 +20,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.ui.extensions.customClickable @Composable fun InquiryCard( @@ -76,7 +76,12 @@ fun InquirySendRow( Row( modifier = Modifier .wrapContentWidth() - .clickable(onClick = onInquiryClick) + .customClickable( + rippleEnabled = true, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onInquiryClick, + ) .padding(horizontal = 4.dp, vertical = 6.dp), verticalAlignment = Alignment.CenterVertically, ) { diff --git a/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt b/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt index 0cf5998a..42a2b922 100644 --- a/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt +++ b/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt @@ -1,8 +1,6 @@ package com.yapp.setting.component import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -12,8 +10,6 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource @@ -21,6 +17,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.ui.extensions.customClickable @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -30,10 +27,8 @@ fun SettingTopAppBar( showTopAppBarActions: Boolean = true, title: String, actionTitle: String? = null, + isActionEnabled: Boolean = false, ) { - val interactionSource = remember { MutableInteractionSource() } - val isPressed by interactionSource.collectIsPressedAsState() - TopAppBar( title = { Text( @@ -51,7 +46,12 @@ fun SettingTopAppBar( contentDescription = "Back", tint = OrbitTheme.colors.white, modifier = Modifier - .clickable(onClick = onBackClick) + .customClickable( + rippleEnabled = false, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onBackClick, + ) .padding(start = 20.dp), ) } @@ -65,12 +65,11 @@ fun SettingTopAppBar( Text( text = actionTitle ?: "", style = OrbitTheme.typography.body1Medium, - color = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.gray_500, + color = if (isActionEnabled) OrbitTheme.colors.main else OrbitTheme.colors.gray_300, modifier = Modifier .padding(horizontal = 8.dp, vertical = 4.dp) .clickable( - interactionSource = interactionSource, - indication = null, + enabled = isActionEnabled, onClick = onActionClick, ), ) diff --git a/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt b/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt index 65eb37cc..edf2a83e 100644 --- a/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt +++ b/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt @@ -26,6 +26,7 @@ fun UserInfoCard( name: String, gender: String, birth: String, + timeOfBirth: String, modifier: Modifier = Modifier, ) { Box( @@ -40,7 +41,7 @@ fun UserInfoCard( Column { UserNameAndGenderText(name = name, gender = gender) Spacer(modifier = Modifier.height(4.dp)) - UserBirthDayText(birth = birth) + UserBirthDayText(birth = birth, timeOfBirth = timeOfBirth) } Icon( painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right), @@ -78,9 +79,9 @@ fun UserNameAndGenderText(name: String, gender: String) { } @Composable -fun UserBirthDayText(birth: String) { +fun UserBirthDayText(birth: String, timeOfBirth: String) { Text( - text = birth, + text = "$birth $timeOfBirth", style = OrbitTheme.typography.body1Regular, color = OrbitTheme.colors.gray_50, ) @@ -93,5 +94,6 @@ fun UserInfoCardPreview() { name = "강문수", gender = "남", birth = "1999.01.01", + timeOfBirth = "20:00", ) } diff --git a/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt b/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt index dc57c7cd..f551bc0e 100644 --- a/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt +++ b/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt @@ -1,16 +1,25 @@ package com.yapp.setting.component +import android.content.pm.PackageManager import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import com.yapp.designsystem.theme.OrbitTheme @Composable -fun VersionCodeText(versionCode: String) { +fun VersionCodeText() { + val context = LocalContext.current + val versionName = try { + context.packageManager.getPackageInfo(context.packageName, 0).versionName + } catch (e: PackageManager.NameNotFoundException) { + "1.0.0" + } + Text( - text = versionCode, + text = "v$versionName", modifier = Modifier.fillMaxWidth(), style = OrbitTheme.typography.body1Regular, color = OrbitTheme.colors.gray_300, diff --git a/feature/splash/build.gradle.kts b/feature/splash/build.gradle.kts index 30f42a19..0377f847 100644 --- a/feature/splash/build.gradle.kts +++ b/feature/splash/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.datastore) implementation(libs.orbit.core) implementation(libs.orbit.compose) diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt b/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt index 5cebff65..d83dff65 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt @@ -9,6 +9,8 @@ sealed class SplashContract { ) : UiState sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate(val route: String) : SideEffect() + data object NavigateToHome : SideEffect() + + data object NavigateToOnboarding : SideEffect() } } diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashNavGraph.kt b/feature/splash/src/main/java/com/yapp/splash/SplashNavGraph.kt new file mode 100644 index 00000000..5a8e0e33 --- /dev/null +++ b/feature/splash/src/main/java/com/yapp/splash/SplashNavGraph.kt @@ -0,0 +1,14 @@ +package com.yapp.splash + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import com.yapp.common.navigation.OrbitNavigator +import com.yapp.common.navigation.route.SplashRoute + +fun NavGraphBuilder.splashScreen( + navigator: OrbitNavigator, +) { + composable { + SplashRoute(navigator) + } +} diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt index 78ade0cd..272dea8a 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt @@ -19,9 +19,11 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.navOptions import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.SplashDestination +import com.yapp.common.navigation.route.SplashRoute import com.yapp.designsystem.theme.OrbitTheme +import kotlinx.coroutines.flow.collectLatest @Composable fun SplashRoute( @@ -32,13 +34,25 @@ fun SplashRoute( val sideEffect = viewModel.container.sideEffectFlow LaunchedEffect(sideEffect) { - sideEffect.collect { effect -> + sideEffect.collectLatest { effect -> when (effect) { - is SplashContract.SideEffect.Navigate -> { - navigator.navigateTo( - route = effect.route, - popUpTo = SplashDestination.Route.route, - inclusive = true, + is SplashContract.SideEffect.NavigateToOnboarding -> { + navigator.navigateToOnboarding( + navOptions = navOptions { + popUpTo(SplashRoute) { + inclusive = true + } + }, + ) + } + + is SplashContract.SideEffect.NavigateToHome -> { + navigator.navigateToHome( + navOptions = navOptions { + popUpTo(SplashRoute) { + inclusive = true + } + }, ) } } diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt b/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt index 93649d48..db697f4b 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt @@ -1,8 +1,6 @@ package com.yapp.splash import androidx.lifecycle.viewModelScope -import com.yapp.common.navigation.destination.OnboardingDestination -import com.yapp.common.navigation.destination.TopLevelDestination import com.yapp.datastore.UserPreferences import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel @@ -40,12 +38,11 @@ class SplashViewModel @Inject constructor( ) { userId, onboardingCompleted -> Pair(userId, onboardingCompleted) }.collect { (userId, onboardingCompleted) -> - val destination = if (userId != null && onboardingCompleted) { - TopLevelDestination.HOME.route + if (userId != null && onboardingCompleted) { + emitSideEffect(SplashContract.SideEffect.NavigateToHome) } else { - OnboardingDestination.Route.route + emitSideEffect(SplashContract.SideEffect.NavigateToOnboarding) } - emitSideEffect(SplashContract.SideEffect.Navigate(destination)) } } } diff --git a/feature/webview/build.gradle.kts b/feature/webview/build.gradle.kts index 01c77847..f8830aa7 100644 --- a/feature/webview/build.gradle.kts +++ b/feature/webview/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.domain) implementation(libs.orbit.core) implementation(libs.orbit.compose) diff --git a/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt b/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt index 039cbcd8..1e8c6458 100644 --- a/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt +++ b/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt @@ -1,27 +1,19 @@ package com.yapp.webview import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavType import androidx.navigation.compose.composable -import androidx.navigation.navArgument -import androidx.navigation.navigation +import androidx.navigation.toRoute import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.WebViewDestination +import com.yapp.common.navigation.route.WebViewRoute -fun NavGraphBuilder.webViewNavGraph(navigator: OrbitNavigator) { - navigation( - route = WebViewDestination.Route.route, - startDestination = WebViewDestination.WebView.route, - ) { - composable( - route = "${WebViewDestination.WebView.route}/{url}", - arguments = listOf(navArgument("url") { type = NavType.StringType }), - ) { backStackEntry -> - val url = backStackEntry.arguments?.getString("url") ?: "" - WebViewRoute( - url = url, - navController = navigator.navController, - ) - } +fun NavGraphBuilder.webViewScreen( + navigator: OrbitNavigator, +) { + composable { entry -> + val route = entry.toRoute() + WebViewRoute( + url = route.url, + navController = navigator.navController, + ) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d64d6719..51c70bb2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -58,8 +58,10 @@ gson = "2.11.0" # Google Libraries Versions google-service = "4.4.2" +playServicesAd = "24.2.0" firebase-bom = "33.1.1" firebase-app-distribution = "5.1.0" +firebase-crashlytics = "3.0.3" ## Test junit = "4.13.2" @@ -79,6 +81,7 @@ lottie = "6.1.0" accompanist = "0.37.0" materialAndroid = "1.7.5" flexible-bottomsheet = "0.1.5" +amplitude = "1.20.3" [libraries] @@ -146,11 +149,12 @@ okhttp-logging = { group = "com.squareup.okhttp3", name = "logging-interceptor", flexible-bottomsheet = { group = "com.github.skydoves", name = "flexible-bottomsheet-material3", version.ref = "flexible-bottomsheet" } #sentry-android = { group = "io.sentry", name = "sentry-android", version.ref = "sentry-android" } #sentry-compose = { group = "io.sentry", name = "sentry-compose", version.ref = "sentry-compose" } -gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } # Google Libraries firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase-bom" } firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics-ktx" } +firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics-ktx" } +firebase-config = { group = "com.google.firebase", name = "firebase-config-ktx" } ## Logging timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } @@ -173,6 +177,12 @@ lottie-compose = { group = "com.airbnb.android", name = "lottie-compose", versio accompanist-permission = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } androidx-material-android = { group = "androidx.compose.material", name = "material-android", version.ref = "materialAndroid" } +amplitude-analytics = { group = "com.amplitude", name = "analytics-android", version.ref = "amplitude" } + +play-services-ads = { group = "com.google.android.gms", name = "play-services-ads", version.ref = "playServicesAd" } + +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } + [plugins] ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } @@ -186,4 +196,5 @@ android-test = { id = "com.android.test", version.ref = "android-gradle-plugin" compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } google-service = { id = "com.google.gms.google-services", version.ref = "google-service" } firebase-app-distribution = { id = "com.google.firebase.appdistribution", version.ref = "firebase-app-distribution" } +firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase-crashlytics" } #sentry = { id = "io.sentry.android.gradle", version.ref = "sentry" } diff --git a/project.dot.png b/project.dot.png index 33a0a59b..51f22f9d 100644 Binary files a/project.dot.png and b/project.dot.png differ diff --git a/settings.gradle.kts b/settings.gradle.kts index 8fb9d5e2..c2db5f10 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -46,3 +46,5 @@ include(":feature:alarm-interaction") include(":core:alarm") include(":feature:splash") include(":feature:webview") +include(":core:analytics") +include(":core:remoteconfig")