support.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
  1. <template>
  2. <main>
  3. <TopVisual :className="className" :title="title" :navigation="navigation" />
  4. <section>
  5. <div class="inn--container">
  6. <h2>고객센터</h2>
  7. <div class="form--contents--wrap">
  8. <form @submit.prevent="submitForm">
  9. <div class="form--contents">
  10. <h3>작성자 (성명) <span class="required">*</span></h3>
  11. <div>
  12. <input
  13. type="text"
  14. v-model="formData.name"
  15. placeholder="성명을 입력해주세요"
  16. required
  17. />
  18. </div>
  19. </div>
  20. <div class="form--contents">
  21. <h3>직책</h3>
  22. <div>
  23. <input
  24. type="text"
  25. v-model="formData.etc1"
  26. placeholder="직책을 입력해주세요"
  27. />
  28. </div>
  29. </div>
  30. <div class="form--contents">
  31. <h3>회사명</h3>
  32. <div>
  33. <input
  34. type="text"
  35. v-model="formData.etc2"
  36. placeholder="회사명을 입력해주세요"
  37. />
  38. </div>
  39. </div>
  40. <div class="form--contents">
  41. <h3>연락처 <span class="required">*</span></h3>
  42. <div class="tel-group">
  43. <select v-model="formData.tel_1" required>
  44. <option value="010">010</option>
  45. <option value="011">011</option>
  46. <option value="016">016</option>
  47. <option value="017">017</option>
  48. <option value="018">018</option>
  49. <option value="019">019</option>
  50. <option value="02">02</option>
  51. <option value="031">031</option>
  52. <option value="032">032</option>
  53. <option value="033">033</option>
  54. </select>
  55. <span>-</span>
  56. <input
  57. type="text"
  58. v-model="formData.tel_2"
  59. maxlength="4"
  60. pattern="[0-9]{3,4}"
  61. required
  62. />
  63. <span>-</span>
  64. <input
  65. type="text"
  66. v-model="formData.tel_3"
  67. maxlength="4"
  68. pattern="[0-9]{4}"
  69. required
  70. />
  71. </div>
  72. </div>
  73. <div class="form--contents">
  74. <h3>이메일 <span class="required">*</span></h3>
  75. <div>
  76. <input
  77. type="email"
  78. v-model="formData.email"
  79. placeholder="이메일을 입력해주세요"
  80. required
  81. />
  82. </div>
  83. </div>
  84. <div class="form--contents">
  85. <h3>문의항목 <span class="required">*</span></h3>
  86. <div class="radio-group">
  87. <label>
  88. <input
  89. type="radio"
  90. v-model="formData.category"
  91. value="원료"
  92. required
  93. />
  94. <span>원료</span>
  95. </label>
  96. <label>
  97. <input
  98. type="radio"
  99. v-model="formData.category"
  100. value="제품"
  101. required
  102. />
  103. <span>제품</span>
  104. </label>
  105. <label>
  106. <input
  107. type="radio"
  108. v-model="formData.category"
  109. value="기술"
  110. required
  111. />
  112. <span>기술</span>
  113. </label>
  114. <label>
  115. <input
  116. type="radio"
  117. v-model="formData.category"
  118. value="기타"
  119. required
  120. />
  121. <span>기타</span>
  122. </label>
  123. </div>
  124. </div>
  125. <div class="form--contents">
  126. <h3>제목 <span class="required">*</span></h3>
  127. <div>
  128. <input
  129. type="text"
  130. v-model="formData.title"
  131. placeholder="제목을 입력해주세요"
  132. required
  133. />
  134. </div>
  135. </div>
  136. <div class="form--contents">
  137. <h3>내용 <span class="required">*</span></h3>
  138. <div>
  139. <client-only>
  140. <SummernoteEditor
  141. v-model="formData.contents"
  142. :height="editorHeight"
  143. :placeholder="editorPlaceholder"
  144. />
  145. <template #fallback>
  146. <textarea
  147. v-model="formData.contents"
  148. rows="10"
  149. placeholder="문의 내용을 입력해주세요"
  150. required
  151. ></textarea>
  152. </template>
  153. </client-only>
  154. </div>
  155. </div>
  156. <div class="form--contents">
  157. <h3>개인 정보 수집 및 이용 동의</h3>
  158. <div class="privacy-box">
  159. <div class="privacy-content">
  160. 그린웨일 글로벌 주식회사 ('www.greenwhaleglobal.com'이하 '그린웨일 글로벌')은(는) 「개인정보 보호법」 제30조에 따라 정부주체의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립·공개합니다.<br/><br/>
  161. <strong>● 이 개인정보처리방침은 2022년 11월 01일부터 적용됩니다.</strong><br/><br/>
  162. <strong>제1조(개인정보의 처리 목적)</strong><br/>
  163. 그린웨일 글로벌은 다음의 목적을 위하여 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다.<br/>
  164. ▶ 재화 또는 서비스 제공: 맞춤 서비스 제공을 목적으로 개인정보를 처리합니다.<br/><br/>
  165. <strong>제2조(개인정보의 처리 및 보유 기간)</strong><br/>
  166. ① 그린웨일 글로벌은 법령에 따른 개인정보 보유·이용 기간 또는 정보 주체로부터 개인정보를 수집할 때 동의받은 개인정보 보유·이용 기간 내에서 개인정보를 처리·보유합니다.<br/>
  167. ② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다.<br/>
  168. • 재화 또는 서비스 제공과 관련한 개인정보는 수집.이용에 관한 동의일로부터 3년까지 위 이용목적을 위하여 보유.이용됩니다.<br/>
  169. • 보유근거 : 지속적인 피드백 관리를 위해<br/>
  170. • 관련법령 :<br/>
  171. 1) 신용정보의 수집/처리 및 이용 등에 관한 기록 : 3년<br/>
  172. 2) 소비자의 불만 또는 분쟁처리에 관한 기록 : 3년<br/>
  173. 3) 대금결제 및 재화 등의 공급에 관한 기록 : 5년<br/>
  174. 4) 계약 또는 청약철회 등에 관한 기록 : 5년<br/><br/>
  175. <strong>제3조(정보주체와 법정대리인의 권리·의무 및 그 행사방법)</strong><br/>
  176. 정보 주체는 그린웨일 글로벌에 대해 언제든지 개인정보 열람·정정·삭제·처리정지 요구 등의 권리를 행사할 수 있습니다.<br/>
  177. ① 제1항에 따른 권리 행사는 그린웨일 글로벌에 대해 「개인정보 보호법」 시행령 제41조 제1항에 따라, 서면 또는 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 그린웨일 글로벌은 이에 대해 지체 없이 조치하겠습니다.<br/>
  178. ② 제1항에 따른 권리 행사는 정보 주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다.<br/>
  179. ③ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 의하여 정보 주체의 권리가 제한될 수 있습니다.<br/>
  180. ④ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다.<br/>
  181. ⑤ 그린웨일 글로벌은 정보 주체 권리에 따른 열람의 요구, 정정·삭제의 요구, 처리정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인합니다.<br/><br/>
  182. <strong>제4조(처리하는 개인정보의 항목 작성)</strong><br/>
  183. 그린웨일 글로벌은 다음의 개인정보 항목을 처리하고 있습니다.<br/>
  184. • 재화 또는 서비스 제공<br/>
  185. • 필수항목 : 이메일, 휴대 전화번호, 이름, 회사 전화번호, 회사명<br/>
  186. • 선택항목 : 직책, 부서<br/><br/>
  187. <strong>제5조(개인정보의 파기)</strong><br/>
  188. ① 그린웨일 글로벌은 개인정보 보유기간의 경과, 처리목적 달성 등 개인정보가 불필요하게 되었을 때는 지체없이 해당 개인정보를 파기합니다.<br/>
  189. ② 정보 주체로부터 동의받은 개인정보 보유기간이 경과하거나 처리목적이 달성되었음에도 불구하고 다른 법령에 따라 개인정보를 계속 보존하여야 하는 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관장소를 달리하여 보존합니다.<br/>
  190. ③ 개인정보 파기의 절차 및 방법은 다음과 같습니다.<br/>
  191. • 파기 절차: 그린웨일 글로벌은 파기 사유가 발생한 개인정보를 선정하고, 그린웨일 글로벌의 개인정보 보호 책임자의 승인을 받아 개인정보를 파기합니다.<br/>
  192. • 파기 방법: 전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다<br/><br/>
  193. <strong>제6조(개인정보의 안전성 확보 조치)</strong><br/>
  194. 그린웨일글로벌은 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취하고 있습니다.<br/>
  195. ① 정기적인 자체 감사 실시<br/>
  196. ② 개인정보 취급 직원의 최소화 및 교육<br/>
  197. ③ 내부관리계획의 수립 및 시행<br/>
  198. ④ 개인정보에 대한 접근 제한<br/>
  199. ⑤ 비인가자에 대한 출입 통제<br/><br/>
  200. <strong>제7조(개인정보 자동 수집 장치의 설치•운영 및 거부에 관한 사항)</strong><br/>
  201. ① 그린웨일글로벌는 이용자에게 개별적인 맞춤서비스를 제공하기 위해 이용정보를 저장하고 수시로 불러오는 '쿠키(cookie)'를 사용합니다.<br/>
  202. ② 쿠키는 웹사이트를 운영하는데 이용되는 서버(http)가 이용자의 컴퓨터 브라우저에게 보내는 소량의 정보이며 이용자들의 PC 컴퓨터내의 하드디스크에 저장되기도 합니다.<br/><br/>
  203. <strong>제8조(개인정보 보호책임자 등)</strong><br/>
  204. ① 그린웨일 글로벌은 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만 처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다.<br/>
  205. • 담당자 : 경영지원팀 이안나 대리<br/>
  206. • 전화번호 : 02-3447-8802<br/>
  207. • 이메일 : green@greenwhaleglobal.com<br/><br/>
  208. <strong>제9조(권익침해 구제방법)</strong><br/>
  209. 정보 주체는 개인정보침해로 인한 구제를 받기 위하여 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보침해신고센터 등에 분쟁해결이나 상담 등을 신청할 수 있습니다.<br/>
  210. 1. 개인정보분쟁조정위원회 : (국번없이) 1833-6972 (www.kopico.go.kr)<br/>
  211. 2. 개인정보침해신고센터 : (국번없이) 118 (privacy.kisa.or.kr)<br/>
  212. 3. 대검찰청 : (국번없이) 1301 (www.spo.go.kr)<br/>
  213. 4. 경찰청 : (국번없이) 182 (cyberbureau.police.go.kr)<br/>
  214. </div>
  215. <div class="agree-check">
  216. <h4>개인정보 수집 및 이용에 동의합니까?</h4>
  217. <div class="radio-group">
  218. <label>
  219. <input
  220. type="radio"
  221. v-model="formData.agree"
  222. value="Y"
  223. required
  224. />
  225. <span>동의합니다.</span>
  226. </label>
  227. <label>
  228. <input
  229. type="radio"
  230. v-model="formData.agree"
  231. value="N"
  232. required
  233. />
  234. <span>동의하지 않습니다.</span>
  235. </label>
  236. </div>
  237. </div>
  238. </div>
  239. </div>
  240. <div class="form--contents">
  241. <div class="btn--wrap">
  242. <button
  243. type="submit"
  244. class="btn-submit"
  245. :disabled="isSubmitting"
  246. >
  247. {{ isSubmitting ? '전송중...' : '보내기' }}
  248. </button>
  249. </div>
  250. </div>
  251. </form>
  252. </div>
  253. <!-- 오시는 길 섹션 -->
  254. <div class="map-section">
  255. <h3>오시는 길</h3>
  256. <ul class="info-list">
  257. <li>서울시 강남구 언주로 650 한국건설기술인협회 신관 2층</li>
  258. </ul>
  259. <ul class="contact-list">
  260. <li>Tel : 02-3447-8801~8802</li>
  261. <li>E-Mail : green@greenwhaleglobal.com</li>
  262. </ul>
  263. <div id="map" class="map-container"></div>
  264. </div>
  265. </div>
  266. </section>
  267. </main>
  268. </template>
  269. <script setup>
  270. import { ref, onMounted } from 'vue'
  271. import TopVisual from '~/components/topVisual.vue'
  272. import SummernoteEditor from '~/components/SummernoteEditor.vue'
  273. import axios from 'axios'
  274. // 반응형 데이터
  275. const isSubmitting = ref(false)
  276. const formData = ref({
  277. name: '',
  278. etc1: '', // 직책
  279. etc2: '', // 회사명
  280. tel_1: '010',
  281. tel_2: '',
  282. tel_3: '',
  283. email: '',
  284. category: '',
  285. title: '',
  286. contents: '',
  287. agree: ''
  288. })
  289. // Summernote 에디터 설정
  290. const editorHeight = 400
  291. const editorPlaceholder = '문의 내용을 입력해주세요'
  292. // 페이지 설정
  293. const className = "contact"
  294. const title = "Contact"
  295. const navigation = [
  296. {
  297. name: "Contact",
  298. link: "/contact",
  299. gnbList: [
  300. { name: "공지사항", link: "/" },
  301. { name: "FAQ", link: "/" },
  302. { name: "고객센터", link: "/contact/support" }
  303. ]
  304. },
  305. { name: "고객센터", link: "/contact/support" }
  306. ]
  307. // 폼 유효성 검증
  308. const validateForm = () => {
  309. if (!formData.value.name) {
  310. alert('성명을 입력해주세요.')
  311. return false
  312. }
  313. if (!formData.value.tel_2 || !formData.value.tel_3) {
  314. alert('연락처를 입력해주세요.')
  315. return false
  316. }
  317. if (!formData.value.email) {
  318. alert('이메일을 입력해주세요.')
  319. return false
  320. }
  321. if (!formData.value.category) {
  322. alert('문의항목을 선택해주세요.')
  323. return false
  324. }
  325. if (!formData.value.title) {
  326. alert('제목을 입력해주세요.')
  327. return false
  328. }
  329. if (!formData.value.contents || formData.value.contents === '<p><br></p>' || formData.value.contents === '') {
  330. alert('내용을 입력해주세요.')
  331. return false
  332. }
  333. if (formData.value.agree !== 'Y') {
  334. alert('개인정보 수집 및 이용에 동의해주세요.')
  335. return false
  336. }
  337. return true
  338. }
  339. // 폼 제출
  340. const submitForm = async () => {
  341. if (!validateForm()) return
  342. isSubmitting.value = true
  343. try {
  344. // FormData 객체 생성
  345. const submitData = new FormData()
  346. submitData.append('act', 'ins')
  347. submitData.append('boardId', 'contact')
  348. submitData.append('name', formData.value.name)
  349. submitData.append('etc1', formData.value.etc1)
  350. submitData.append('etc2', formData.value.etc2)
  351. submitData.append('tel_1', formData.value.tel_1)
  352. submitData.append('tel_2', formData.value.tel_2)
  353. submitData.append('tel_3', formData.value.tel_3)
  354. submitData.append('email', formData.value.email)
  355. submitData.append('category', formData.value.category)
  356. submitData.append('title', formData.value.title)
  357. submitData.append('contents', formData.value.contents)
  358. // 디버깅을 위한 FormData 내용 출력
  359. console.log('=== Form Data 전송 내용 ===')
  360. for (let [key, value] of submitData.entries()) {
  361. console.log(`${key}:`, value)
  362. }
  363. // 백엔드 API 호출
  364. const config = useRuntimeConfig()
  365. const apiUrl = config.public.apiBase || 'http://localhost'
  366. const fullUrl = `${apiUrl}/board_proc`
  367. console.log('=== API 호출 정보 ===')
  368. console.log('API URL:', fullUrl)
  369. console.log('Request headers:', {
  370. 'Content-Type': 'multipart/form-data',
  371. 'X-Requested-With': 'XMLHttpRequest'
  372. })
  373. const response = await axios.post(
  374. fullUrl,
  375. submitData,
  376. {
  377. headers: {
  378. 'Content-Type': 'multipart/form-data',
  379. 'X-Requested-With': 'XMLHttpRequest'
  380. }
  381. }
  382. )
  383. console.log('=== API 응답 ===')
  384. console.log('Response status:', response.status)
  385. console.log('Response headers:', response.headers)
  386. console.log('Response data:', response.data)
  387. if (response.data && response.data.success) {
  388. alert('문의가 정상적으로 접수되었습니다.')
  389. resetForm()
  390. } else {
  391. console.error('API 응답 오류:', response.data)
  392. alert(`문의 접수 중 오류가 발생했습니다. 응답: ${JSON.stringify(response.data)}`)
  393. }
  394. } catch (error) {
  395. console.error('=== 전체 에러 정보 ===')
  396. console.error('Error object:', error)
  397. console.error('Error message:', error.message)
  398. console.error('Error response:', error.response)
  399. if (error.response) {
  400. console.error('Error response status:', error.response.status)
  401. console.error('Error response data:', error.response.data)
  402. console.error('Error response headers:', error.response.headers)
  403. alert(`API 호출 오류: ${error.response.status} - ${error.response.statusText}\n응답: ${JSON.stringify(error.response.data)}`)
  404. } else if (error.request) {
  405. console.error('Error request:', error.request)
  406. alert('서버에 연결할 수 없습니다. 네트워크 연결을 확인해주세요.')
  407. } else {
  408. alert(`요청 설정 오류: ${error.message}`)
  409. }
  410. } finally {
  411. isSubmitting.value = false
  412. }
  413. }
  414. // 폼 초기화
  415. const resetForm = () => {
  416. formData.value = {
  417. name: '',
  418. etc1: '',
  419. etc2: '',
  420. tel_1: '010',
  421. tel_2: '',
  422. tel_3: '',
  423. email: '',
  424. category: '',
  425. title: '',
  426. contents: '',
  427. agree: ''
  428. }
  429. }
  430. // 네이버 지도 초기화
  431. onMounted(() => {
  432. if (typeof naver !== 'undefined' && naver.maps) {
  433. const position = new naver.maps.LatLng(37.51490691373259, 127.03574342661345)
  434. const map = new naver.maps.Map('map', {
  435. center: position,
  436. zoom: 16
  437. })
  438. new naver.maps.Marker({
  439. position: position,
  440. map: map
  441. })
  442. }
  443. })
  444. // 메타 정보 설정
  445. useHead({
  446. script: [
  447. {
  448. src: 'https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=5qsxjdotgi',
  449. async: true
  450. }
  451. ]
  452. })
  453. </script>
  454. <style scoped>
  455. .form--contents--wrap {
  456. margin-top: 40px;
  457. }
  458. .form--contents {
  459. margin-bottom: 30px;
  460. }
  461. .form--contents h3 {
  462. font-size: 16px;
  463. font-weight: 600;
  464. margin-bottom: 10px;
  465. }
  466. .form--contents h3 .required {
  467. color: #ff0000;
  468. margin-left: 4px;
  469. }
  470. .form--contents input[type="text"],
  471. .form--contents input[type="email"],
  472. .form--contents select,
  473. .form--contents textarea {
  474. width: 100%;
  475. padding: 10px;
  476. border: 1px solid #ddd;
  477. border-radius: 4px;
  478. font-size: 14px;
  479. }
  480. .tel-group {
  481. display: flex;
  482. align-items: center;
  483. gap: 10px;
  484. }
  485. .tel-group select {
  486. width: 100px;
  487. }
  488. .tel-group input {
  489. flex: 1;
  490. }
  491. .tel-group span {
  492. font-weight: 500;
  493. }
  494. .radio-group {
  495. display: flex;
  496. gap: 20px;
  497. align-items: center;
  498. }
  499. .radio-group label {
  500. display: flex;
  501. align-items: center;
  502. cursor: pointer;
  503. }
  504. .radio-group input[type="radio"] {
  505. width: auto;
  506. margin-right: 5px;
  507. }
  508. .privacy-box {
  509. border: 1px solid #ddd;
  510. border-radius: 4px;
  511. padding: 20px;
  512. background-color: #f9f9f9;
  513. }
  514. .privacy-content {
  515. height: 300px;
  516. overflow-y: auto;
  517. padding: 15px;
  518. background-color: #fff;
  519. border: 1px solid #e0e0e0;
  520. border-radius: 4px;
  521. margin-bottom: 20px;
  522. line-height: 1.8;
  523. }
  524. .agree-check {
  525. padding: 15px;
  526. background-color: #fff;
  527. border: 1px solid #e0e0e0;
  528. border-radius: 4px;
  529. }
  530. .agree-check h4 {
  531. font-size: 14px;
  532. font-weight: 600;
  533. margin-bottom: 10px;
  534. }
  535. .btn--wrap {
  536. text-align: center;
  537. margin-top: 40px;
  538. }
  539. .btn-submit {
  540. padding: 12px 40px;
  541. background-color: #00a651;
  542. color: #fff;
  543. border: none;
  544. border-radius: 4px;
  545. font-size: 16px;
  546. font-weight: 600;
  547. cursor: pointer;
  548. transition: background-color 0.3s;
  549. }
  550. .btn-submit:hover {
  551. background-color: #008840;
  552. }
  553. .btn-submit:disabled {
  554. background-color: #ccc;
  555. cursor: not-allowed;
  556. }
  557. .map-section {
  558. margin-top: 80px;
  559. padding-top: 40px;
  560. border-top: 1px solid #ddd;
  561. }
  562. .map-section h3 {
  563. font-size: 24px;
  564. font-weight: 600;
  565. margin-bottom: 20px;
  566. }
  567. .info-list,
  568. .contact-list {
  569. list-style: none;
  570. padding: 0;
  571. margin: 0 0 20px 0;
  572. }
  573. .info-list li,
  574. .contact-list li {
  575. font-size: 14px;
  576. line-height: 1.8;
  577. }
  578. .map-container {
  579. height: 450px;
  580. border: 1px solid #ddd;
  581. border-radius: 4px;
  582. overflow: hidden;
  583. }
  584. </style>