fmode-ng 0.0.113 → 0.0.115

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/LICENSE.md +8 -0
  2. package/README.md +37 -37
  3. package/esm2022/fmode-ng.mjs +10 -5
  4. package/esm2022/lib/aigc/agent/fm-agent-task/fm-agent-task.component.mjs +8 -92
  5. package/esm2022/lib/aigc/agent/index.mjs +10 -3
  6. package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
  7. package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
  8. package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
  9. package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
  10. package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
  11. package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -98
  12. package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -107
  13. package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -113
  14. package/esm2022/lib/aigc/avatar/index.mjs +10 -8
  15. package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
  16. package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -164
  17. package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -49
  18. package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
  19. package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -155
  20. package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
  21. package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
  22. package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
  23. package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -140
  24. package/esm2022/lib/aigc/chat/chat-message-card/duration-str.pipe.mjs +10 -29
  25. package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -3
  26. package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -3
  27. package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -193
  28. package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -331
  29. package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +8 -249
  30. package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -83
  31. package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
  32. package/esm2022/lib/aigc/chat/index.mjs +10 -8
  33. package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
  34. package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -367
  35. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
  36. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
  37. package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -115
  38. package/esm2022/lib/aigc/index.mjs +10 -14
  39. package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
  40. package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +10 -2
  41. package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -174
  42. package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
  43. package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
  44. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
  45. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
  46. package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
  47. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-func.mjs +9 -162
  48. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-work.mjs +10 -68
  49. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -313
  50. package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -4
  51. package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -62
  52. package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -87
  53. package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -345
  54. package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -81
  55. package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -152
  56. package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -42
  57. package/esm2022/lib/aigc/story/index.mjs +10 -6
  58. package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -47
  59. package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -95
  60. package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -253
  61. package/esm2022/lib/aigc/story/story.service.mjs +10 -35
  62. package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +10 -636
  63. package/esm2022/lib/aigc/voice/index.mjs +10 -7
  64. package/esm2022/lib/aigc/voice/lib/audio/audio.player.mjs +10 -55
  65. package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -2
  66. package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -96
  67. package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +8 -177
  68. package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
  69. package/esm2022/lib/aigc/voice/lib/recorder/extension-waveview.mjs +10 -215
  70. package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
  71. package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +10 -189
  72. package/esm2022/lib/aigc/voice/tts/index.mjs +10 -5
  73. package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -2
  74. package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +8 -346
  75. package/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs +8 -342
  76. package/esm2022/lib/code/index.mjs +10 -2
  77. package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +8 -430
  78. package/esm2022/lib/core/agent/chat/completion/index.mjs +10 -2
  79. package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -2
  80. package/esm2022/lib/core/agent/chat/fmode-chat.mjs +8 -617
  81. package/esm2022/lib/core/agent/chat/index.mjs +10 -4
  82. package/esm2022/lib/core/agent/chat/interface.mjs +10 -2
  83. package/esm2022/lib/core/agent/index.mjs +10 -6
  84. package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +10 -133
  85. package/esm2022/lib/core/agent/prompt/index.mjs +10 -2
  86. package/esm2022/lib/core/agent/prompt/prompt-util.mjs +10 -16
  87. package/esm2022/lib/core/agent/story/agent.story.mjs +10 -64
  88. package/esm2022/lib/core/agent/story/index.mjs +10 -2
  89. package/esm2022/lib/core/agent/task/agent.task.mjs +10 -90
  90. package/esm2022/lib/core/agent/task/index.mjs +10 -2
  91. package/esm2022/lib/core/agent/waiting/index.mjs +10 -3
  92. package/esm2022/lib/core/agent/waiting/loading/loading.ctrl.mjs +10 -279
  93. package/esm2022/lib/core/agent/waiting/tips/tips.ctrl.mjs +8 -190
  94. package/esm2022/lib/core/index.mjs +10 -4
  95. package/esm2022/lib/core/parse/datatype/acl.mjs +10 -57
  96. package/esm2022/lib/core/parse/datatype/file.mjs +10 -69
  97. package/esm2022/lib/core/parse/datatype/geopoint.mjs +10 -57
  98. package/esm2022/lib/core/parse/datatype/relation.mjs +10 -56
  99. package/esm2022/lib/core/parse/fmode.cloud.mjs +10 -0
  100. package/esm2022/lib/core/parse/fmode.object.mjs +10 -232
  101. package/esm2022/lib/core/parse/fmode.parse.mjs +10 -84
  102. package/esm2022/lib/core/parse/fmode.query.mjs +8 -500
  103. package/esm2022/lib/core/parse/fmode.user.mjs +10 -275
  104. package/esm2022/lib/core/parse/index.mjs +10 -5
  105. package/esm2022/lib/core/parse/types.mjs +10 -2
  106. package/esm2022/lib/core/voice/index.mjs +10 -3
  107. package/esm2022/lib/core/voice/tts/index.mjs +10 -2
  108. package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -3
  109. package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -14
  110. package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -3
  111. package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -3
  112. package/esm2022/lib/icon/filetype/file.svg.mjs +10 -3
  113. package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -57
  114. package/esm2022/lib/icon/filetype/index.mjs +10 -12
  115. package/esm2022/lib/icon/filetype/md.svg.mjs +10 -3
  116. package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -3
  117. package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -3
  118. package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -8
  119. package/esm2022/lib/icon/filetype/video.svg.mjs +10 -3
  120. package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -3
  121. package/esm2022/lib/icon/index.mjs +10 -2
  122. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -209
  123. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
  124. package/esm2022/lib/map/index.mjs +10 -4
  125. package/esm2022/lib/map/map.module.mjs +10 -61
  126. package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -132
  127. package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -115
  128. package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -118
  129. package/esm2022/lib/nova-cloud/index.mjs +10 -3
  130. package/esm2022/lib/nova-cloud/ncloud-api-func.mjs +10 -91
  131. package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -53
  132. package/esm2022/lib/payment/index.mjs +10 -2
  133. package/esm2022/lib/payment/payment/payment.component.mjs +10 -543
  134. package/esm2022/lib/payment/payment.service.mjs +10 -202
  135. package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -48
  136. package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -29
  137. package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -211
  138. package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +8 -412
  139. package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -50
  140. package/esm2022/lib/person/index.mjs +10 -5
  141. package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -144
  142. package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -41
  143. package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -595
  144. package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -172
  145. package/esm2022/lib/person/person.service.mjs +8 -193
  146. package/esm2022/lib/platform/cross.service.mjs +10 -62
  147. package/esm2022/lib/platform/index.mjs +10 -2
  148. package/esm2022/lib/social/index.mjs +10 -2
  149. package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -230
  150. package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
  151. package/esm2022/lib/storage/index.mjs +10 -5
  152. package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -131
  153. package/esm2022/lib/storage/service-hwobs/index.mjs +10 -3
  154. package/esm2022/lib/storage/service-hwobs/typings/esdk-obs-browser.mjs +1 -1
  155. package/esm2022/lib/storage/service-upload/index.mjs +10 -2
  156. package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -513
  157. package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
  158. package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +10 -93
  159. package/esm2022/lib/storage/storage.module.mjs +10 -42
  160. package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -72
  161. package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -237
  162. package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +8 -72
  163. package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -207
  164. package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +8 -227
  165. package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -303
  166. package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +8 -371
  167. package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -94
  168. package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -36
  169. package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -281
  170. package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -72
  171. package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -22
  172. package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -169
  173. package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -69
  174. package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -65
  175. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -55
  176. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -142
  177. package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -35
  178. package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -81
  179. package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -50
  180. package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -145
  181. package/esm2022/lib/text/index.mjs +10 -4
  182. package/esm2022/lib/user/account/account.service.mjs +10 -222
  183. package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
  184. package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -66
  185. package/esm2022/lib/user/index.mjs +10 -17
  186. package/esm2022/lib/user/login/auth.guard.mjs +10 -28
  187. package/esm2022/lib/user/login/auth.service.mjs +8 -433
  188. package/esm2022/lib/user/login/login.component.mjs +10 -916
  189. package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -311
  190. package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
  191. package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
  192. package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -164
  193. package/esm2022/lib/user/profile/profile-bind/profile-confirm-modal.component.mjs +10 -79
  194. package/esm2022/lib/user/profile/profile.module.mjs +10 -54
  195. package/esm2022/lib/user/staff/index.mjs +10 -4
  196. package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
  197. package/esm2022/lib/user/staff/staff.module.mjs +10 -18
  198. package/esm2022/lib/user/staff/staff.service.mjs +10 -85
  199. package/esm2022/lib/user/user-name.pipe.mjs +10 -29
  200. package/esm2022/lib/user/user.module.mjs +10 -102
  201. package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
  202. package/esm2022/lib/video/index.mjs +10 -2
  203. package/esm2022/public-api.mjs +10 -21
  204. package/fesm2022/fmode-ng.mjs +7 -19788
  205. package/fesm2022/fmode-ng.mjs.map +1 -1
  206. package/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.d.ts +2 -2
  207. package/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.d.ts +2 -2
  208. package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +2 -2
  209. package/lib/aigc/chat/chat-list/chat-list.component.d.ts +3 -2
  210. package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +3 -3
  211. package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +2 -2
  212. package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +3 -3
  213. package/lib/aigc/service-fmai/service-imagine/imagine-func.d.ts +3 -3
  214. package/lib/aigc/service-fmai/service-imagine/imagine-work.d.ts +4 -4
  215. package/lib/aigc/service-fmai/service-imagine/imagine.service.d.ts +6 -6
  216. package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +2 -2
  217. package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +2 -1
  218. package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +6 -6
  219. package/lib/aigc/story/fm-story-list/story-preview.d.ts +4 -4
  220. package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +3 -3
  221. package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +2 -2
  222. package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +3 -2
  223. package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +3 -2
  224. package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +6 -6
  225. package/lib/aigc/story/story.service.d.ts +3 -2
  226. package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
  227. package/lib/core/agent/chat/fmode-chat.d.ts +11 -11
  228. package/lib/core/agent/story/agent.story.d.ts +8 -8
  229. package/lib/core/parse/datatype/geopoint.d.ts +5 -1
  230. package/lib/core/parse/fmode.cloud.d.ts +32 -0
  231. package/lib/core/parse/fmode.object.d.ts +2 -2
  232. package/lib/core/parse/fmode.parse.d.ts +15 -9
  233. package/lib/core/parse/fmode.query.d.ts +41 -2
  234. package/lib/core/parse/fmode.user.d.ts +1 -0
  235. package/lib/core/parse/index.d.ts +1 -0
  236. package/lib/core/parse/types.d.ts +2 -0
  237. package/lib/map/comp-poi-picker/comp-poi-picker.component.d.ts +5 -5
  238. package/lib/payment/payment/payment.component.d.ts +3 -3
  239. package/lib/payment/payment.service.d.ts +4 -4
  240. package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +2 -1
  241. package/lib/person/comp-person-item/comp-person-item.component.d.ts +2 -1
  242. package/lib/person/comp-person-story/comp-person-story.component.d.ts +13 -13
  243. package/lib/person/edit-upload/edit-upload.component.d.ts +1 -1
  244. package/lib/person/modal-person-select/modal-person-select.component.d.ts +5 -5
  245. package/lib/person/modal-user-verify/user-verify.component.d.ts +5 -5
  246. package/lib/person/person-detail/person-detail.component.d.ts +4 -4
  247. package/lib/person/person.service.d.ts +7 -7
  248. package/lib/storage/service-hwobs/hwobs.service.d.ts +4 -5
  249. package/lib/storage/service-upload/nova-upload.service.d.ts +5 -5
  250. package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +2 -1
  251. package/lib/text/fm-article-editor/article.service.d.ts +12 -12
  252. package/lib/text/fm-article-editor/draft.service.d.ts +5 -5
  253. package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +3 -2
  254. package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +16 -17
  255. package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +3 -3
  256. package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +11 -10
  257. package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +2 -2
  258. package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +3 -3
  259. package/lib/text/fm-article-editor/task-article-generation.d.ts +5 -4
  260. package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +3 -3
  261. package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +3 -3
  262. package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +3 -3
  263. package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +2 -1
  264. package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +3 -3
  265. package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +3 -3
  266. package/lib/user/account/account.service.d.ts +2 -2
  267. package/lib/user/comp-user-avatar/comp-user-avatar.component.d.ts +2 -2
  268. package/lib/user/login/auth.service.d.ts +5 -5
  269. package/lib/user/login/login.component.d.ts +3 -3
  270. package/lib/user/profile/auth-profile.service.d.ts +8 -8
  271. package/lib/user/profile/profile-bind/profile-bind.component.d.ts +7 -7
  272. package/lib/user/profile/profile-bind/profile-confirm-modal.component.d.ts +2 -2
  273. package/lib/user/staff/staff.service.d.ts +3 -3
  274. package/lib/user/user-name.pipe.d.ts +2 -2
  275. package/package.json +12 -18
@@ -1,916 +1,10 @@
1
- import { Component } from '@angular/core';
2
- import { FormBuilder, Validators, } from '@angular/forms';
3
- import { Observable } from 'rxjs';
4
- import { AuthService } from './auth.service';
5
- import Parse from "parse";
6
- import { Router, ActivatedRoute } from '@angular/router';
7
- import { HttpClient } from "@angular/common/http";
8
- import { NovaCloudService } from '../../nova-cloud/nova-cloud.service';
9
- import { ToastController } from '@ionic/angular/standalone';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./auth.service";
12
- import * as i2 from "../../nova-cloud/nova-cloud.service";
13
- import * as i3 from "@angular/forms";
14
- import * as i4 from "@ionic/angular/standalone";
15
- import * as i5 from "@angular/router";
16
- import * as i6 from "@angular/common/http";
17
- import * as i7 from "@angular/common";
18
- import * as i8 from "ng-zorro-antd/input";
19
- import * as i9 from "ng-zorro-antd/button";
20
- import * as i10 from "ng-zorro-antd/core/transition-patch";
21
- import * as i11 from "ng-zorro-antd/core/wave";
22
- import * as i12 from "ng-zorro-antd/modal";
23
- import * as i13 from "ng-zorro-antd/spin";
24
- import * as i14 from "ng-zorro-antd/tabs";
25
- import * as i15 from "ng-zorro-antd/grid";
26
- import * as i16 from "ng-zorro-antd/form";
27
- export class LoginComponent {
28
- // 绘制验证码
29
- drawCode(str) {
30
- // this.resetCode()
31
- this.canvas = document.getElementById("verifyCanvas"); //获取HTML端画布
32
- var context = this.canvas.getContext("2d"); //获取画布2D上下文
33
- context.fillStyle = "white"; //画布填充色
34
- context.fillRect(0, 0, this.canvas.width, this.canvas.height); //清空画布
35
- context.fillStyle = "cornflowerblue"; //设置字体颜色
36
- context.font = "25px Arial"; //设置字体
37
- var rand = new Array();
38
- var x = new Array();
39
- var y = new Array();
40
- for (var i = 0; i < 4; i++) {
41
- rand.push(rand[i]);
42
- rand[i] = this.nums[i];
43
- x[i] = i * 20 + 10;
44
- y[i] = Math.random() * 20 + 20;
45
- context.fillText(rand[i], x[i], y[i]);
46
- }
47
- str = rand.join('').toUpperCase();
48
- //画3条随机线
49
- for (var i = 0; i < 3; i++) {
50
- this.drawline(this.canvas, context);
51
- }
52
- // 画30个随机点
53
- for (var i = 0; i < 30; i++) {
54
- this.drawDot(this.canvas, context);
55
- }
56
- this.convertCanvasToImage(this.canvas);
57
- return str;
58
- }
59
- // 随机线
60
- drawline(canvas, context) {
61
- context.moveTo(Math.floor(Math.random() * canvas.width), Math.floor(Math.random() * canvas.height)); //随机线的起点x坐标是画布x坐标0位置,y坐标是画布高度的随机数
62
- context.lineTo(Math.floor(Math.random() * canvas.width), Math.floor(Math.random() * canvas.height)); //随机线的终点x坐标是画布宽度,y坐标是画布高度的随机数
63
- context.lineWidth = 0.5; //随机线宽
64
- context.strokeStyle = 'rgba(50,50,50,0.3)'; //随机线描边属性
65
- context.stroke(); //描边,即起点描到终点
66
- }
67
- // 随机点(所谓画点其实就是画1px像素的线,方法不再赘述)
68
- drawDot(canvas, context) {
69
- var px = Math.floor(Math.random() * canvas.width);
70
- var py = Math.floor(Math.random() * canvas.height);
71
- context.moveTo(px, py);
72
- context.lineTo(px + 1, py + 1);
73
- context.lineWidth = 0.2;
74
- context.stroke();
75
- }
76
- // 绘制图片
77
- convertCanvasToImage(canvas) {
78
- document.getElementById("verifyCanvas").style.display = "none";
79
- this.image = document.getElementById("code_img");
80
- this.image.src = canvas.toDataURL("image/png");
81
- return this.image;
82
- }
83
- sendSMSCode() {
84
- if (!this.codeVerified) {
85
- this.message.create("error", "请先核对验证码");
86
- return;
87
- }
88
- let mobile = this.validateSMSForm.value?.mobile;
89
- console.log(this.validateSMSForm.value);
90
- if (mobile) {
91
- let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
92
- apigURL = decodeURIComponent(atob(apigURL));
93
- let url = apigURL + "message";
94
- this.http.post(url, { company: this.companyId, mobile: mobile, action: 'login' }).subscribe((res) => {
95
- this.countDownSMS();
96
- // this.authServ.toast({message:"已发送,请查收验证码"})
97
- this.message.info(`已发送,请查收验证码`);
98
- }, error => {
99
- // this.authServ.toast({color:"danger",message:"系统繁忙中,请稍后重试"})
100
- this.message.error(error?.error?.mess || `系统繁忙中,请稍后重试`);
101
- });
102
- }
103
- else {
104
- this.message.error(`请正确输入手机号`);
105
- }
106
- }
107
- countDownSMS() {
108
- this.isSended = true;
109
- this.isSending = true;
110
- this.smsTimeCount = 60;
111
- let interval = setInterval(() => {
112
- this.smsTimeCount--;
113
- }, 1000);
114
- setTimeout(() => {
115
- clearInterval(interval);
116
- this.isSending = false;
117
- }, 60 * 1000);
118
- }
119
- // 点击登录按钮
120
- submitFormMobileSMS(value) {
121
- // localStorage.removeItem("user")
122
- for (const key in this.validateSMSForm.controls) {
123
- this.validateSMSForm.controls[key].markAsDirty();
124
- this.validateSMSForm.controls[key].updateValueAndValidity();
125
- }
126
- console.log(value);
127
- this.username = value.mobile;
128
- this.smsCode = value.smsCode;
129
- console.log("smslogin");
130
- // return
131
- this.loginSMS();
132
- }
133
- // 点击登录按钮
134
- submitFormMobilePassword(value) {
135
- // localStorage.removeItem("user")
136
- for (const key in this.validateForm.controls) {
137
- this.validateForm.controls[key].markAsDirty();
138
- this.validateForm.controls[key].updateValueAndValidity();
139
- }
140
- this.username = value.mobile || value.username;
141
- this.password = value.password;
142
- let checkCode = value.checkCode;
143
- let c = this.code.toLowerCase();
144
- let vc = checkCode.toLowerCase();
145
- console.log(c, vc);
146
- if (c != vc) {
147
- console.log(c, vc);
148
- this.message.create("error", "验证码错误");
149
- }
150
- else {
151
- this.loginMobilePassword();
152
- }
153
- }
154
- // 点击登录按钮
155
- submitFormUserPassword(value) {
156
- // localStorage.removeItem("user")
157
- for (const key in this.validateForm.controls) {
158
- this.validateForm.controls[key].markAsDirty();
159
- this.validateForm.controls[key].updateValueAndValidity();
160
- }
161
- this.username = value.mobile || value.username;
162
- this.password = value.password;
163
- let checkCode = value.checkCode;
164
- let c = this.code.toLowerCase();
165
- let vc = checkCode.toLowerCase();
166
- console.log(c, vc);
167
- if (c != vc) {
168
- console.log(c, vc);
169
- this.message.create("error", "验证码错误");
170
- }
171
- else {
172
- this.authServ
173
- .login(this.username, this.password)
174
- .then(async (data) => {
175
- }).catch(err => {
176
- console.log(err);
177
- this.message.create("error", "错误的用户名或密码");
178
- });
179
- }
180
- }
181
- // 点击重置密码
182
- async forgetFormFun(value) {
183
- for (const key in this.forgetForm.controls) {
184
- this.forgetForm.controls[key].markAsDirty();
185
- this.forgetForm.controls[key].updateValueAndValidity();
186
- }
187
- console.log(value.forgetusername, value.forgetPassword, value.forgetConfirmpassword);
188
- if (value.forgetPassword != value.forgetConfirmpassword) {
189
- this.message.create("error", "两次密码不一致");
190
- return;
191
- }
192
- if (!value.forgerphoneCode) {
193
- this.message.create("error", "请输入验证码");
194
- return;
195
- }
196
- let host = Parse.serverURL?.split("parse")?.[0] || "https://server.fmode.cn/";
197
- let url = host + "api/auth/reset_password";
198
- this.http.post(url, { company: this.companyId, mobile: value.forgetusername, code: value.forgerphoneCode, password: value.forgetConfirmpassword }).subscribe((res) => {
199
- if (res.code == 200) {
200
- this.message.create("success", res.msg);
201
- this.type = 'login';
202
- }
203
- else {
204
- this.message.create("error", "验证码错误");
205
- }
206
- }, error => {
207
- console.log(error.error);
208
- this.message.create('error', error.error.mess);
209
- });
210
- }
211
- async registSubmitForm(value) {
212
- for (const key in this.registForm.controls) {
213
- this.registForm.controls[key].markAsDirty();
214
- this.registForm.controls[key].updateValueAndValidity();
215
- }
216
- this.registName = value.registName;
217
- this.registIdcard = value.registIdcard;
218
- this.registPhone = value.registPhone;
219
- this.phoneCode = value.phoneCode;
220
- this.regpassword = value.regpassword;
221
- this.confirmPassword = value.confirmPassword;
222
- let checkInfo = await this.verifyCode(this.registPhone, this.phoneCode);
223
- if (checkInfo && checkInfo.code != 200) {
224
- this.message.create("error", checkInfo.mess);
225
- return;
226
- }
227
- this.queryUser();
228
- }
229
- getSelectEducation() {
230
- this.loginMobilePassword();
231
- this.iseducation = false;
232
- }
233
- loginSMS() {
234
- // 验证码登录
235
- let host = Parse.serverURL?.split("parse")?.[0] || "https://server.fmode.cn/";
236
- let url = host + `api/auth/mobile?company=${this.companyId}&mobile=${this.username}&code=${this.smsCode}`;
237
- this.http.get(url).subscribe((res) => {
238
- console.log(res);
239
- if (res.code == 200) {
240
- this.message.create("success", "登录成功");
241
- let token = res.data.token;
242
- Parse.User.become(token).then(user => {
243
- this.router.navigate([decodeURIComponent(this.rootPage)]);
244
- });
245
- }
246
- else {
247
- this.message.create("error", "验证码错误");
248
- }
249
- }, error => {
250
- console.log(error.error);
251
- this.message.create('error', error.error.mess);
252
- });
253
- }
254
- async loginMobilePassword() {
255
- let profile;
256
- let education;
257
- let currentUser;
258
- let username = await this.getMobileUser(this.username);
259
- if (!username) {
260
- this.message.create("error", "用户不存在,请尝试其他登录方式");
261
- return;
262
- }
263
- this.authServ
264
- .login(username, this.password)
265
- .then(async (data) => {
266
- }).catch(err => {
267
- console.log(err);
268
- this.message.create("error", "错误的用户名或密码");
269
- });
270
- }
271
- async queryUser() {
272
- // 查找这个用户存不存在,存在直接绑定登录,不存在注册
273
- let queryUser = new Parse.Query('_User');
274
- queryUser.contains("username", this.registPhone);
275
- queryUser.equalTo("company", this.companyId);
276
- let user = await queryUser.first();
277
- if (user?.id) {
278
- this.message.info(`该账户已激活,使用手机号密码直接登录`);
279
- return;
280
- }
281
- // 核验手机号
282
- Parse.User.signUp(this.companyId + "-" + this.registPhone, this.regpassword, "").then(async (res) => {
283
- if (res.id) {
284
- console.log(res);
285
- res.set("company", {
286
- __type: "Pointer",
287
- className: "Company",
288
- objectId: this.companyId
289
- });
290
- res.set("mobile", this.registPhone);
291
- res.set("type", "user");
292
- res.save();
293
- // 开通账号辅助填写账号密码
294
- this.username = this.registPhone;
295
- this.password = this.regpassword;
296
- }
297
- });
298
- }
299
- async getMobileUser(mobile) {
300
- if (this.mobileUserMap[mobile])
301
- return this.mobileUserMap[mobile];
302
- let result = await this.novaCloud.api("/auth/getusername", {
303
- company: this.companyId,
304
- mobile: mobile
305
- });
306
- console.log(result);
307
- if (result?.username) {
308
- this.mobileUserMap[mobile] = result?.username;
309
- }
310
- return this.mobileUserMap[mobile];
311
- }
312
- forget() {
313
- this.type = 'forget';
314
- }
315
- backLogin() {
316
- this.type = 'login';
317
- }
318
- handleCancel() {
319
- this.isVisible = false;
320
- }
321
- handleOk() {
322
- Parse.User.signUp(this.registPhone, this.regpassword, "").then(async (res) => {
323
- if (res.id) {
324
- console.log(res);
325
- res.set("company", {
326
- __type: "Pointer",
327
- className: "Company",
328
- objectId: this.companyId
329
- });
330
- res.save();
331
- this.username = this.registPhone;
332
- this.password = this.regpassword;
333
- }
334
- });
335
- }
336
- async getCode() {
337
- if (this.registPhone == undefined || this.registPhone.trim() == "") {
338
- this.message.info(`请输入注册手机号`);
339
- return;
340
- }
341
- let a = /^1[3456789]\d{9}$/;
342
- if (!this.registPhone.match(a)) {
343
- this.message.info(`请输入正确的手机号`);
344
- return;
345
- }
346
- let User = new Parse.Query('User');
347
- User.equalTo('username', this.registPhone);
348
- User.equalTo('company', this.companyId);
349
- let user = await User.first();
350
- if (user && user.id) {
351
- this.message.info(`该手机号已注册,请使用账号密码登录`);
352
- return;
353
- }
354
- // 本地测试
355
- let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
356
- apigURL = decodeURIComponent(atob(apigURL));
357
- let url = apigURL + "message";
358
- this.http.post(url, { company: this.companyId, mobile: this.registPhone, action: 'regist' }).subscribe((res) => {
359
- this.vCode = res.data.code;
360
- this.countDownFun();
361
- }, error => {
362
- this.message.info(`系统繁忙中,请稍后重试`);
363
- console.log(error);
364
- });
365
- }
366
- async getCode2() {
367
- if (this.forgetusername == undefined || this.forgetusername.trim() == "") {
368
- this.message.info(`请输入账号`);
369
- return;
370
- }
371
- let a = /^1[3456789]\d{9}$/;
372
- if (!this.forgetusername.match(a)) {
373
- this.message.info(`请输入正确的手机号`);
374
- return;
375
- }
376
- console.log(this.forgetusername);
377
- let User = new Parse.Query('User');
378
- User.equalTo('username', this.companyId + "-" + this.forgetusername);
379
- User.equalTo('company', this.companyId);
380
- let user = await User.first();
381
- if (!user) {
382
- this.message.info(`账号不存在`);
383
- return;
384
- }
385
- let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
386
- apigURL = decodeURIComponent(atob(apigURL));
387
- let url = apigURL + "message";
388
- this.http.post(url, { company: this.companyId, mobile: this.forgetusername, action: 'resetPassword' }).subscribe((res) => {
389
- console.log(res);
390
- this.vCode = res.data.code;
391
- this.countDownFun();
392
- }, error => {
393
- this.message.info(`系统繁忙中,请稍后重试`);
394
- console.log(error);
395
- });
396
- }
397
- async verifyCode(mobile, code) {
398
- let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
399
- apigURL = decodeURIComponent(atob(apigURL));
400
- let url = apigURL + "verifyCode";
401
- return new Promise(async (resolve, reject) => {
402
- this.http.post(url, { mobile: mobile, code: code }).subscribe((res) => {
403
- resolve(res);
404
- }, error => {
405
- console.log(error);
406
- resolve(error.error);
407
- });
408
- });
409
- }
410
- // 倒计时
411
- countDownFun() {
412
- this.isCountDown = true;
413
- if (this.countDown == 0) {
414
- return;
415
- }
416
- let timer = setInterval(() => {
417
- this.countDown = this.countDown - 1;
418
- if (this.countDown == 0) {
419
- clearInterval(timer);
420
- this.countDown = 60;
421
- this.isCountDown = false;
422
- }
423
- }, 1000);
424
- }
425
- constructor(authServ, novaCloud, fb, toastCtrl, router, route, activatedRoute, http) {
426
- this.authServ = authServ;
427
- this.novaCloud = novaCloud;
428
- this.fb = fb;
429
- this.toastCtrl = toastCtrl;
430
- this.router = router;
431
- this.route = route;
432
- this.activatedRoute = activatedRoute;
433
- this.http = http;
434
- this.nums = ['C', '6', 'Z', 't'];
435
- this.str = '';
436
- this.tabIndex = 0;
437
- this.codeVerified = false;
438
- this.passwordVisible = false;
439
- this.passwordVisible2 = false;
440
- this.passwordVisible3 = false;
441
- // 是否有多个层次
442
- this.iseducation = false;
443
- this.redirectUrl = localStorage.getItem("redirectUrl");
444
- // 手机验证码
445
- this.isSended = false;
446
- this.isSending = false;
447
- this.smsTimeCount = 60;
448
- this.loading = true;
449
- this.Lesson = [];
450
- this.myDate = new Date();
451
- // 查询该学生信息是否存在
452
- this.isVisible = false;
453
- this.type = 'login';
454
- this.mobileUserMap = {};
455
- this.isOkLoading = false;
456
- this.countDown = 60;
457
- this.isCountDown = false;
458
- // 页面显示素材
459
- this.mobileLogin = false;
460
- this.logo = 'https://www.fmode.cn/images/ewm1.png';
461
- this.qrcode = 'https://www.fmode.cn/images/logo_main.png';
462
- this.message = this.authServ.message;
463
- // 登录 用户名(手机号码)验证
464
- this.userNameAsyncValidator = (control) => new Observable((observer) => {
465
- let reg = /^1[3456789]\d{9}$/;
466
- // let reg2 = /^\d{17}(\d|X|x)$/;
467
- let username = control.value;
468
- setTimeout(() => {
469
- if (username == undefined || username.trim() == "") {
470
- this.userErrorTip = "请输入登录账号";
471
- observer.next({ error: true, duplicated: true });
472
- observer.complete();
473
- return;
474
- }
475
- if (!username.match(reg)) {
476
- this.userErrorTip = "请输入正确的登录账号";
477
- observer.next({ error: true, duplicated: true });
478
- observer.complete();
479
- return;
480
- }
481
- // if(username.length > 11){
482
- // if (!username.match(reg2) ) {
483
- // this.userErrorTip = "请输入正确的登录账号";
484
- // observer.next({ error: true, duplicated: true });
485
- // observer.complete();
486
- // return;
487
- // }
488
- // }else {
489
- // }
490
- observer.next(null);
491
- observer.complete();
492
- }, 1000);
493
- });
494
- // 登录 短信验证码验证
495
- this.smsAsyncValidator = (control) => new Observable((observer) => {
496
- setTimeout(() => {
497
- let smsCode = control.value;
498
- if (smsCode == undefined || smsCode.trim() == "") {
499
- this.smsCodeErrorTip = "请输入短信验证码";
500
- observer.next({ error: true, duplicated: true });
501
- observer.complete();
502
- return;
503
- }
504
- observer.next(null);
505
- observer.complete();
506
- }, 1000);
507
- });
508
- // 登录 密码验证
509
- this.passwordAsyncValidator = (control) => new Observable((observer) => {
510
- setTimeout(() => {
511
- let password = control.value;
512
- if (password == undefined || password.trim() == "") {
513
- this.passwordErrorTip = "请输入密码";
514
- observer.next({ error: true, duplicated: true });
515
- observer.complete();
516
- return;
517
- }
518
- if (password.length < 6) {
519
- this.passwordErrorTip = "密码长度不得小于6位";
520
- observer.next({ error: true, duplicated: true });
521
- observer.complete();
522
- return;
523
- }
524
- observer.next(null);
525
- observer.complete();
526
- }, 1000);
527
- });
528
- this.codeAsyncValidator = (control) => new Observable((observer) => {
529
- setTimeout(() => {
530
- let checkCode = control.value;
531
- if (checkCode == undefined || checkCode.trim() == "") {
532
- this.codeVerified = false;
533
- this.codeErrorTip = "请输入验证码";
534
- observer.next({ error: true, duplicated: true });
535
- observer.complete();
536
- return;
537
- }
538
- if (checkCode.length < 4) {
539
- this.codeVerified = false;
540
- this.codeErrorTip = "验证码长度不得小于4位";
541
- observer.next({ error: true, duplicated: true });
542
- observer.complete();
543
- return;
544
- }
545
- let c = this.code.toLowerCase();
546
- let vc = checkCode.toLowerCase();
547
- if (c != vc) {
548
- this.codeVerified = false;
549
- this.codeErrorTip = "验证码输入错误";
550
- observer.next({ error: true, duplicated: true });
551
- observer.complete();
552
- return;
553
- }
554
- this.codeVerified = true;
555
- observer.next(null);
556
- observer.complete();
557
- }, 1000);
558
- });
559
- // 注册 身份证号码验证
560
- this.registIdcardAsyncValidator = (control) => new Observable((observer) => {
561
- let registIdcard = control.value;
562
- setTimeout(() => {
563
- if (registIdcard == undefined || registIdcard.trim() == "") {
564
- this.registIdcardErrorTip = "请输入正确的身份证号码";
565
- observer.next({ error: true, duplicated: true });
566
- observer.complete();
567
- return;
568
- }
569
- if (/^\d{17}(\d|X|x)$/.test(registIdcard) === false) {
570
- this.registIdcardErrorTip = "请输入正确的身份证号码";
571
- observer.next({ error: true, duplicated: true });
572
- observer.complete();
573
- return;
574
- }
575
- observer.next(null);
576
- observer.complete();
577
- }, 1000);
578
- });
579
- // 忘记密码 验证
580
- this.forgetNameAsyncValidator = (control) => new Observable((observer) => {
581
- setTimeout(() => {
582
- let forgetName = control.value;
583
- if (forgetName == undefined || forgetName.trim() == "") {
584
- this.registNameErrorTip = "请输入账户账号或者手机号";
585
- observer.next({ error: true, duplicated: true });
586
- observer.complete();
587
- return;
588
- }
589
- this.forgetusername = forgetName;
590
- observer.next(null);
591
- observer.complete();
592
- }, 1000);
593
- });
594
- this.forgetPasswordAsyncValidator = (control) => new Observable((observer) => {
595
- setTimeout(() => {
596
- let forgetPassword = control.value;
597
- if (forgetPassword == undefined || forgetPassword.trim() == "") {
598
- this.passwordErrorTip = "请输入新密码";
599
- observer.next({ error: true, duplicated: true });
600
- observer.complete();
601
- return;
602
- }
603
- if (forgetPassword.length < 6) {
604
- this.passwordErrorTip = "密码长度不得小于6位";
605
- observer.next({ error: true, duplicated: true });
606
- observer.complete();
607
- return;
608
- }
609
- this.forgetPassword = forgetPassword;
610
- observer.next(null);
611
- observer.complete();
612
- }, 1000);
613
- });
614
- this.forgetConfirmPasswordAsyncValidator = (control) => new Observable((observer) => {
615
- setTimeout(() => {
616
- let forgetConfirmpassword = control.value;
617
- if (forgetConfirmpassword == undefined || forgetConfirmpassword.trim() == "") {
618
- this.forgetphoneCodesErrorTip = "请确认新密码";
619
- observer.next({ error: true, duplicated: true });
620
- observer.complete();
621
- return;
622
- }
623
- if (forgetConfirmpassword.length < 6) {
624
- this.forgetphoneCodesErrorTip = "密码长度不得小于6位";
625
- observer.next({ error: true, duplicated: true });
626
- observer.complete();
627
- return;
628
- }
629
- this.forgetConfirmpassword = forgetConfirmpassword;
630
- observer.next(null);
631
- observer.complete();
632
- }, 1000);
633
- });
634
- this.forgetCodeAsyncValidator = (control) => new Observable((observer) => {
635
- setTimeout(() => {
636
- let forgerphoneCode = control.value;
637
- if (forgerphoneCode == undefined || forgerphoneCode.trim() == "") {
638
- this.phoneCodesErrorTip = "请输入新密码";
639
- observer.next({ error: true, duplicated: true });
640
- observer.complete();
641
- return;
642
- }
643
- this.forgerphoneCode = forgerphoneCode;
644
- observer.next(null);
645
- observer.complete();
646
- }, 1000);
647
- });
648
- // 注册 姓名验证
649
- this.registNameAsyncValidator = (control) => new Observable((observer) => {
650
- setTimeout(() => {
651
- let registName = control.value;
652
- if (registName == undefined || registName.trim() == "") {
653
- this.registNameErrorTip = "请输入姓名";
654
- observer.next({ error: true, duplicated: true });
655
- observer.complete();
656
- return;
657
- }
658
- this.registName = registName;
659
- observer.next(null);
660
- observer.complete();
661
- }, 1000);
662
- });
663
- // 注册手机号验证
664
- this.registPhoneAsyncValidator = (control) => new Observable((observer) => {
665
- let registPhone = control.value;
666
- setTimeout(() => {
667
- if (registPhone == undefined || registPhone.trim() == "") {
668
- this.registIdcardErrorTip = "请输入正确的身份证号码";
669
- observer.next({ error: true, duplicated: true });
670
- observer.complete();
671
- return;
672
- }
673
- if (/^1[3456789]\d{9}$/.test(registPhone) === false) {
674
- this.phoneErrorTip = "请输入正确的手机号";
675
- observer.next({ error: true, duplicated: true });
676
- observer.complete();
677
- return;
678
- }
679
- observer.next(null);
680
- observer.complete();
681
- }, 1000);
682
- });
683
- this.registCodeAsyncValidator = (control) => new Observable((observer) => {
684
- setTimeout(() => {
685
- let registCode = control.value;
686
- if (registCode == undefined || registCode.trim() == "") {
687
- this.phoneCodesErrorTip = "请输入验证码";
688
- observer.next({ error: true, duplicated: true });
689
- observer.complete();
690
- return;
691
- }
692
- observer.next(null);
693
- observer.complete();
694
- }, 1000);
695
- });
696
- // 注册密码验证
697
- this.regpasswordAsyncValidator = (control) => new Observable((observer) => {
698
- setTimeout(() => {
699
- let regpassword = control.value;
700
- if (regpassword == undefined || regpassword.trim() == "") {
701
- this.regpasswordErrorTip = "请输入密码";
702
- observer.next({ error: true, duplicated: true });
703
- observer.complete();
704
- return;
705
- }
706
- if (regpassword.length < 6) {
707
- this.regpasswordErrorTip = "密码长度不得小于6位";
708
- observer.next({ error: true, duplicated: true });
709
- observer.complete();
710
- return;
711
- }
712
- if (regpassword.length > 12) {
713
- this.regpasswordErrorTip = "密码长度不得大于12位";
714
- observer.next({ error: true, duplicated: true });
715
- observer.complete();
716
- return;
717
- }
718
- this.regpassword = regpassword;
719
- observer.next(null);
720
- observer.complete();
721
- }, 1000);
722
- });
723
- // 注册 确认密码验证
724
- this.confirmPasswordAsyncValidator = (control) => new Observable((observer) => {
725
- setTimeout(() => {
726
- let confirmPassword = control.value;
727
- if (confirmPassword == undefined || confirmPassword.trim() == "") {
728
- this.confirmPasswordErrorTip = "请确认密码";
729
- observer.next({ error: true, duplicated: true });
730
- observer.complete();
731
- return;
732
- }
733
- if (confirmPassword != this.regpassword) {
734
- this.confirmPasswordErrorTip = "两次输入密码不一致,请重新输入";
735
- observer.next({ error: true, duplicated: true });
736
- observer.complete();
737
- return;
738
- }
739
- this.confirmPassword = confirmPassword;
740
- observer.next(null);
741
- observer.complete();
742
- }, 1000);
743
- });
744
- this.code = '';
745
- this.initLoginForm();
746
- this.route.paramMap.subscribe(async (params) => {
747
- console.log(params);
748
- this.appId = params.get("appId");
749
- if (!await this.initAppConfig()) {
750
- this.companyId = params.get("companyId");
751
- if (!this.companyId) {
752
- this.companyId = localStorage.getItem("company") || "Q0DryNYA8g";
753
- }
754
- await this.initCompanyConfig();
755
- }
756
- });
757
- }
758
- async initCompanyConfig() {
759
- if (!this.companyId)
760
- return;
761
- let query = new Parse.Query("Company");
762
- this.company = await query.get(this.companyId);
763
- // 设置页面
764
- this.logo = this.company?.get("logo") || this.logo;
765
- this.qrcode = this.company?.get("qrcode") || this.qrcode;
766
- this.mobileLogin = this.company?.get('jpush')?.appkey || false;
767
- this.rootPage = this.company?.get('rootPage');
768
- }
769
- async initAppConfig() {
770
- if (!this.appId)
771
- return false;
772
- let query = new Parse.Query("App");
773
- query.include("company");
774
- this.app = await query.get(this.appId);
775
- // 设置页面
776
- console.log(this.app);
777
- this.logo = this.app?.get("logo") || this.logo;
778
- this.qrcode = this.app?.get("qrcode") || this.qrcode;
779
- this.mobileLogin = this.app?.get('jpush')?.appkey || false;
780
- this.companyId = this.app?.get("company").id;
781
- this.rootPage = this.app?.get('rootPage');
782
- return true;
783
- }
784
- initLoginForm() {
785
- this.validateForm = this.fb.group({
786
- // 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
787
- mobile: ["", [Validators.required], [this.userNameAsyncValidator]],
788
- password: ["", [Validators.required], [this.passwordAsyncValidator]],
789
- // initCode: [this.code ],
790
- checkCode: ["", [Validators.required], [this.codeAsyncValidator]]
791
- });
792
- this.validateUserForm = this.fb.group({
793
- // 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
794
- username: ["", [Validators.required], []],
795
- password: ["", [Validators.required], [this.passwordAsyncValidator]],
796
- // initCode: [this.code ],
797
- checkCode: ["", [Validators.required], [this.codeAsyncValidator]]
798
- });
799
- this.validateSMSForm = this.fb.group({
800
- // 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
801
- mobile: ["", [Validators.required], [this.userNameAsyncValidator]],
802
- password: [""],
803
- smsCode: ["", [Validators.required], [this.smsAsyncValidator]],
804
- // initCode: [this.code ],
805
- checkCode: ["", [Validators.required], [this.codeAsyncValidator]]
806
- });
807
- this.registForm = this.fb.group({
808
- // 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
809
- registName: ["", [Validators.required], [this.registNameAsyncValidator]],
810
- registIdcard: ["", [Validators.required], [this.registIdcardAsyncValidator]],
811
- registPhone: ["", [Validators.required], [this.registPhoneAsyncValidator]],
812
- phoneCode: ["", [Validators.required], [this.registCodeAsyncValidator]],
813
- regpassword: ["", [Validators.required], [this.regpasswordAsyncValidator]],
814
- confirmPassword: ["", [Validators.required], [this.confirmPasswordAsyncValidator]]
815
- });
816
- this.forgetForm = this.fb.group({
817
- forgetusername: ["", [Validators.required], [this.forgetNameAsyncValidator]],
818
- forgetPassword: ["", [Validators.required], [this.forgetPasswordAsyncValidator]],
819
- forgetConfirmpassword: ["", [Validators.required], [this.forgetConfirmPasswordAsyncValidator]],
820
- forgerphoneCode: ["", [Validators.required], [this.registCodeAsyncValidator]],
821
- });
822
- }
823
- ngOnInit() {
824
- // localStorage.removeItem('company')
825
- // localStorage.removeItem('pid')
826
- // localStorage.clear();
827
- this.activatedRoute.paramMap.subscribe(params => {
828
- if (params.get('p')) {
829
- localStorage.setItem('pid', params.get('p'));
830
- }
831
- else {
832
- localStorage.setItem('company', this.companyId);
833
- }
834
- });
835
- this.creatCode();
836
- }
837
- creatCode() {
838
- this.code = '';
839
- let codeLength = 4; //验证码的长度
840
- let codeChars = [
841
- 0,
842
- 1,
843
- 2,
844
- 3,
845
- 4,
846
- 5,
847
- 6,
848
- 7,
849
- 8,
850
- 9,
851
- "a",
852
- "b",
853
- "c",
854
- "d",
855
- "e",
856
- "f",
857
- "g",
858
- "h",
859
- "i",
860
- "j",
861
- "k",
862
- "l",
863
- "m",
864
- "n",
865
- "o",
866
- "p",
867
- "q",
868
- "r",
869
- "s",
870
- "t",
871
- "u",
872
- "v",
873
- "w",
874
- "x",
875
- "y",
876
- "z",
877
- "A",
878
- "B",
879
- "C",
880
- "D",
881
- "E",
882
- "F",
883
- "G",
884
- "H",
885
- "I",
886
- "J",
887
- "K",
888
- "L",
889
- "M",
890
- "N",
891
- "O",
892
- "P",
893
- "Q",
894
- "R",
895
- "S",
896
- "T",
897
- "U",
898
- "V",
899
- "W",
900
- "X",
901
- "Y",
902
- "Z"
903
- ];
904
- for (let i = 0; i < codeLength; i++) {
905
- let charNum = Math.floor(Math.random() * 52);
906
- this.code += codeChars[charNum];
907
- }
908
- }
909
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginComponent, deps: [{ token: i1.AuthService }, { token: i2.NovaCloudService }, { token: i3.FormBuilder }, { token: i4.ToastController }, { token: i5.Router }, { token: i5.ActivatedRoute }, { token: i5.ActivatedRoute }, { token: i6.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
910
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LoginComponent, selector: "app-pcuser-login", ngImport: i0, template: "<div class=\"student-login-layout\">\r\n <div class=\"nav_center\">\r\n <img [src]=\"logo\" alt=\"\" class=\"login_img\">\r\n <div class=\"nav_login\">\r\n <nz-tabset [nzSelectedIndex]=\"tabIndex\" [nzTabPosition]=\"'top'\">\r\n\r\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u5BC6\u7801\u767B\u5165 -->\r\n <nz-tab nzTitle=\"\u624B\u673A\u5BC6\u7801\" style=\"color: #000000;\">\r\n <ng-container *ngIf=\"type == 'login'\">\r\n <form nz-form [formGroup]=\"validateForm\" (ngSubmit)=\"submitFormMobilePassword(validateForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B\u673A\u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\r\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item class=\"form-control-contain\">\r\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\r\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\r\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\r\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\r\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\r\n <div (click)=\"creatCode()\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\r\n \u6362\u4E00\u4E2A\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div class=\"login_btn\">\r\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateForm.valid\">\u767B\u5F55</button>\r\n </div>\r\n <div class=\"forget\">\r\n <h6 (click)=\"forget()\">\u5FD8\u8BB0\u5BC6\u7801</h6>\r\n </div>\r\n </form>\r\n </ng-container>\r\n <ng-container *ngIf=\"type == 'forget'\">\r\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\r\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item class=\"forget_contain\">\r\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\r\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\r\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\r\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\r\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n \u83B7\u53D6\u9A8C\u8BC1\u7801\r\n </div>\r\n <div *ngIf=\"isCountDown\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n {{countDown}}/\u79D2\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div class=\"login_btn\">\r\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\r\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\r\n </div>\r\n <div class=\"forget\">\r\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\r\n </div>\r\n </form>\r\n </ng-container>\r\n\r\n </nz-tab>\r\n\r\n <!-- \u767B\u5F55\uFF1A\u5E10\u53F7+\u5BC6\u7801\u767B\u5165 -->\r\n <nz-tab nzTitle=\"\u5E10\u53F7\u5BC6\u7801\" style=\"color: #000000;\">\r\n <ng-container *ngIf=\"type == 'login'\">\r\n <form nz-form [formGroup]=\"validateUserForm\" (ngSubmit)=\"submitFormUserPassword(validateUserForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5E10 \u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\r\n <input nz-input formControlName=\"username\" placeholder=\"\u8BF7\u8F93\u5165\u5E10\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item class=\"form-control-contain\">\r\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\r\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\r\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\r\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\r\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\r\n <div (click)=\"creatCode()\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\r\n \u6362\u4E00\u4E2A\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div class=\"login_btn\">\r\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateUserForm.valid\">\u767B\u5F55</button>\r\n </div>\r\n </form>\r\n </ng-container>\r\n <ng-container *ngIf=\"type == 'forget'\">\r\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\r\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item class=\"forget_contain\">\r\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\r\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\r\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\r\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\r\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n \u83B7\u53D6\u9A8C\u8BC1\u7801\r\n </div>\r\n <div *ngIf=\"isCountDown\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n {{countDown}}/\u79D2\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div class=\"login_btn\">\r\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\r\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\r\n </div>\r\n <div class=\"forget\">\r\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\r\n </div>\r\n </form>\r\n </ng-container>\r\n\r\n </nz-tab>\r\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u9A8C\u8BC1\u7801\u767B\u5165 -->\r\n <nz-tab nzTitle=\"\u77ED\u4FE1\u9A8C\u8BC1\" style=\"color: #000000;\">\r\n <ng-container *ngIf=\"type == 'login'\">\r\n <form nz-form [formGroup]=\"validateSMSForm\" (ngSubmit)=\"submitFormMobileSMS(validateSMSForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B \u673A \u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\r\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item class=\"form-control-contain\">\r\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\r\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\r\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\r\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\r\n <div (click)=\"creatCode()\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\r\n \u6362\u4E00\u4E2A\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u77ED\u4FE1\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"10\" nzErrorTip=\"{{smsCodeErrorTip}}\">\r\n <nz-input-group>\r\n <input nz-input [type]=\"'text'\" [disabled]=\"!isSended || !codeVerified\" formControlName=\"smsCode\" placeholder=\"\u8BF7\u8F93\u5165\u77ED\u4FE1\u9A8C\u8BC1\u7801\" />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\r\n <div *ngIf=\"!isSending\" (click)=\"sendSMSCode()\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\r\n \u83B7\u53D6\u9A8C\u8BC1\u7801\r\n </div>\r\n <div *ngIf=\"isSending\"\r\n style=\"background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;\">\r\n {{smsTimeCount}}\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n \r\n <div class=\"login_btn\">\r\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateSMSForm.valid\">\u767B\u5F55</button>\r\n </div>\r\n </form>\r\n </ng-container>\r\n </nz-tab>\r\n\r\n <!-- \u6CE8\u518C\uFF1A\u4F01\u4E1A\u7528\u6237Profile\u5F00\u901A -->\r\n <nz-tab *ngIf=\"mobileLogin\" nzTitle=\"\u5F00\u901A\" style=\"color: #000000;\" class=\"activation\">\r\n <form nz-form [formGroup]=\"registForm\" (ngSubmit)=\"registSubmitForm(registForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u8BC1\u4EF6</nz-form-label>\r\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzValidatingTip=\"\u9A8C\u8BC1\u4E2D...\"\r\n nzErrorTip=\"{{registIdcardErrorTip}}\">\r\n <input title=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" nz-input formControlName=\"registIdcard\" placeholder=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u59D3\u540D</nz-form-label>\r\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{registNameErrorTip}}\">\r\n <input nz-input type=\"text\" formControlName=\"registName\" placeholder=\"\u8BF7\u8F93\u5165\u59D3\u540D\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u7ED1\u5B9A\u624B\u673A\u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{phoneErrorTip}}\">\r\n <input [(ngModel)]=\"registPhone\" nz-input style=\"font-size: 18px;\" type=\"text\"\r\n formControlName=\"registPhone\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item class=\"verifyCode\">\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u624B\u673A\u9A8C\u8BC1\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"6\" class=\"code_input\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\">\r\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"phoneCode\" placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"6\" class=\"codeContain\">\r\n <div *ngIf=\"!isCountDown\" (click)=\"getCode()\"\r\n class=\"get_code\"\r\n style=\"background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n \u83B7\u9A8C\u8BC1\u7801\r\n </div>\r\n <div *ngIf=\"isCountDown\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n {{countDown}}/\u79D2\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u5BC6\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{regpasswordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate2\">\r\n <input nz-input [type]=\"passwordVisible2 ? 'text' : 'password'\" formControlName=\"regpassword\"\r\n placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate2>\r\n <i nz-icon [nzType]=\"passwordVisible2 ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible2 = !passwordVisible2\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{confirmPasswordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate3\">\r\n <input nz-input [type]=\"passwordVisible3 ? 'text' : 'password'\" formControlName=\"confirmPassword\"\r\n placeholder=\"\u8BF7\u786E\u8BA4\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate3>\r\n <i nz-icon [nzType]=\"passwordVisible3 ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible3 = !passwordVisible3\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div class=\"login_btn\">\r\n <button nz-button nzType=\"primary\" [disabled]=\"!registForm.valid\">\u7533\u8BF7\u5F00\u901A</button>\r\n </div>\r\n </form>\r\n </nz-tab>\r\n </nz-tabset>\r\n <div class=\"nav_login_right\">\r\n <p class=\"login_right_title\">\u4E8C\u7EF4\u7801</p>\r\n <img [src]=\"qrcode\" alt=\"\u516C\u4F17\u53F7\u4E8C\u7EF4\u7801\">\r\n <p>\u626B\u7801\u8FDB\u5165\u5FAE\u4FE1\u7AEF</p>\r\n <!-- <p class=\"login_right_bottom\">\u9996\u6B21\u767B\u5F55\u6709\u60CA\u559C</p> -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"loadWrap\" style=\"display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;\"\r\n *ngIf=\"loading2\">\r\n <nz-spin nzTip=\"\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\">\r\n <nz-alert nzType=\"info\" nzMessage=\"\u8BFE\u7A0B\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\"></nz-alert>\r\n </nz-spin>\r\n </div>\r\n\r\n <!-- \u6CE8\u9500 -->\r\n <nz-modal [(nzVisible)]=\"isVisible\" nzTitle=\"\u624B\u673A\u53F7\u9519\u8BEF\" (nzOnCancel)=\"handleCancel()\" (nzOnOk)=\"handleOk()\">\r\n <ng-container *nzModalContent>\r\n <p>\u624B\u673A\u53F7\u9519\u8BEF, \u8054\u7CFB\u7BA1\u7406\u5458\u6838\u5BF9\u4FE1\u606F</p>\r\n </ng-container>\r\n </nz-modal>\r\n </div>\r\n</div>\r\n", styles: [".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i8.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i8.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i8.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "component", type: i9.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i10.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i11.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i12.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i12.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "component", type: i13.NzSpinComponent, selector: "nz-spin", inputs: ["nzIndicator", "nzSize", "nzTip", "nzDelay", "nzSimple", "nzSpinning"], exportAs: ["nzSpin"] }, { kind: "component", type: i14.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzSelectedIndex", "nzTabPosition", "nzTabBarExtraContent", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { kind: "component", type: i14.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { kind: "directive", type: i15.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i15.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i16.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "component", type: i16.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i16.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i16.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }] }); }
911
- }
912
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginComponent, decorators: [{
913
- type: Component,
914
- args: [{ selector: "app-pcuser-login", template: "<div class=\"student-login-layout\">\r\n <div class=\"nav_center\">\r\n <img [src]=\"logo\" alt=\"\" class=\"login_img\">\r\n <div class=\"nav_login\">\r\n <nz-tabset [nzSelectedIndex]=\"tabIndex\" [nzTabPosition]=\"'top'\">\r\n\r\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u5BC6\u7801\u767B\u5165 -->\r\n <nz-tab nzTitle=\"\u624B\u673A\u5BC6\u7801\" style=\"color: #000000;\">\r\n <ng-container *ngIf=\"type == 'login'\">\r\n <form nz-form [formGroup]=\"validateForm\" (ngSubmit)=\"submitFormMobilePassword(validateForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B\u673A\u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\r\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item class=\"form-control-contain\">\r\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\r\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\r\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\r\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\r\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\r\n <div (click)=\"creatCode()\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\r\n \u6362\u4E00\u4E2A\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div class=\"login_btn\">\r\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateForm.valid\">\u767B\u5F55</button>\r\n </div>\r\n <div class=\"forget\">\r\n <h6 (click)=\"forget()\">\u5FD8\u8BB0\u5BC6\u7801</h6>\r\n </div>\r\n </form>\r\n </ng-container>\r\n <ng-container *ngIf=\"type == 'forget'\">\r\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\r\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item class=\"forget_contain\">\r\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\r\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\r\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\r\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\r\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n \u83B7\u53D6\u9A8C\u8BC1\u7801\r\n </div>\r\n <div *ngIf=\"isCountDown\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n {{countDown}}/\u79D2\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div class=\"login_btn\">\r\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\r\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\r\n </div>\r\n <div class=\"forget\">\r\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\r\n </div>\r\n </form>\r\n </ng-container>\r\n\r\n </nz-tab>\r\n\r\n <!-- \u767B\u5F55\uFF1A\u5E10\u53F7+\u5BC6\u7801\u767B\u5165 -->\r\n <nz-tab nzTitle=\"\u5E10\u53F7\u5BC6\u7801\" style=\"color: #000000;\">\r\n <ng-container *ngIf=\"type == 'login'\">\r\n <form nz-form [formGroup]=\"validateUserForm\" (ngSubmit)=\"submitFormUserPassword(validateUserForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5E10 \u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\r\n <input nz-input formControlName=\"username\" placeholder=\"\u8BF7\u8F93\u5165\u5E10\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item class=\"form-control-contain\">\r\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\r\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\r\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\r\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\r\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\r\n <div (click)=\"creatCode()\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\r\n \u6362\u4E00\u4E2A\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div class=\"login_btn\">\r\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateUserForm.valid\">\u767B\u5F55</button>\r\n </div>\r\n </form>\r\n </ng-container>\r\n <ng-container *ngIf=\"type == 'forget'\">\r\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\r\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item class=\"forget_contain\">\r\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\r\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\r\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\r\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\r\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n \u83B7\u53D6\u9A8C\u8BC1\u7801\r\n </div>\r\n <div *ngIf=\"isCountDown\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n {{countDown}}/\u79D2\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div class=\"login_btn\">\r\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\r\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\r\n </div>\r\n <div class=\"forget\">\r\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\r\n </div>\r\n </form>\r\n </ng-container>\r\n\r\n </nz-tab>\r\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u9A8C\u8BC1\u7801\u767B\u5165 -->\r\n <nz-tab nzTitle=\"\u77ED\u4FE1\u9A8C\u8BC1\" style=\"color: #000000;\">\r\n <ng-container *ngIf=\"type == 'login'\">\r\n <form nz-form [formGroup]=\"validateSMSForm\" (ngSubmit)=\"submitFormMobileSMS(validateSMSForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B \u673A \u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\r\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item class=\"form-control-contain\">\r\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\r\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\r\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\r\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\r\n <div (click)=\"creatCode()\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\r\n \u6362\u4E00\u4E2A\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u77ED\u4FE1\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"10\" nzErrorTip=\"{{smsCodeErrorTip}}\">\r\n <nz-input-group>\r\n <input nz-input [type]=\"'text'\" [disabled]=\"!isSended || !codeVerified\" formControlName=\"smsCode\" placeholder=\"\u8BF7\u8F93\u5165\u77ED\u4FE1\u9A8C\u8BC1\u7801\" />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\r\n <div *ngIf=\"!isSending\" (click)=\"sendSMSCode()\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\r\n \u83B7\u53D6\u9A8C\u8BC1\u7801\r\n </div>\r\n <div *ngIf=\"isSending\"\r\n style=\"background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;\">\r\n {{smsTimeCount}}\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n \r\n <div class=\"login_btn\">\r\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateSMSForm.valid\">\u767B\u5F55</button>\r\n </div>\r\n </form>\r\n </ng-container>\r\n </nz-tab>\r\n\r\n <!-- \u6CE8\u518C\uFF1A\u4F01\u4E1A\u7528\u6237Profile\u5F00\u901A -->\r\n <nz-tab *ngIf=\"mobileLogin\" nzTitle=\"\u5F00\u901A\" style=\"color: #000000;\" class=\"activation\">\r\n <form nz-form [formGroup]=\"registForm\" (ngSubmit)=\"registSubmitForm(registForm.value)\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u8BC1\u4EF6</nz-form-label>\r\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzValidatingTip=\"\u9A8C\u8BC1\u4E2D...\"\r\n nzErrorTip=\"{{registIdcardErrorTip}}\">\r\n <input title=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" nz-input formControlName=\"registIdcard\" placeholder=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u59D3\u540D</nz-form-label>\r\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{registNameErrorTip}}\">\r\n <input nz-input type=\"text\" formControlName=\"registName\" placeholder=\"\u8BF7\u8F93\u5165\u59D3\u540D\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u7ED1\u5B9A\u624B\u673A\u53F7</nz-form-label>\r\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{phoneErrorTip}}\">\r\n <input [(ngModel)]=\"registPhone\" nz-input style=\"font-size: 18px;\" type=\"text\"\r\n formControlName=\"registPhone\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item class=\"verifyCode\">\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u624B\u673A\u9A8C\u8BC1\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"6\" class=\"code_input\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\">\r\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"phoneCode\" placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"6\" class=\"codeContain\">\r\n <div *ngIf=\"!isCountDown\" (click)=\"getCode()\"\r\n class=\"get_code\"\r\n style=\"background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n \u83B7\u9A8C\u8BC1\u7801\r\n </div>\r\n <div *ngIf=\"isCountDown\"\r\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\r\n {{countDown}}/\u79D2\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u5BC6\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{regpasswordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate2\">\r\n <input nz-input [type]=\"passwordVisible2 ? 'text' : 'password'\" formControlName=\"regpassword\"\r\n placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate2>\r\n <i nz-icon [nzType]=\"passwordVisible2 ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible2 = !passwordVisible2\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\r\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{confirmPasswordErrorTip}}\">\r\n <nz-input-group [nzSuffix]=\"suffixTemplate3\">\r\n <input nz-input [type]=\"passwordVisible3 ? 'text' : 'password'\" formControlName=\"confirmPassword\"\r\n placeholder=\"\u8BF7\u786E\u8BA4\u5BC6\u7801\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate3>\r\n <i nz-icon [nzType]=\"passwordVisible3 ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible3 = !passwordVisible3\"></i>\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div class=\"login_btn\">\r\n <button nz-button nzType=\"primary\" [disabled]=\"!registForm.valid\">\u7533\u8BF7\u5F00\u901A</button>\r\n </div>\r\n </form>\r\n </nz-tab>\r\n </nz-tabset>\r\n <div class=\"nav_login_right\">\r\n <p class=\"login_right_title\">\u4E8C\u7EF4\u7801</p>\r\n <img [src]=\"qrcode\" alt=\"\u516C\u4F17\u53F7\u4E8C\u7EF4\u7801\">\r\n <p>\u626B\u7801\u8FDB\u5165\u5FAE\u4FE1\u7AEF</p>\r\n <!-- <p class=\"login_right_bottom\">\u9996\u6B21\u767B\u5F55\u6709\u60CA\u559C</p> -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"loadWrap\" style=\"display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;\"\r\n *ngIf=\"loading2\">\r\n <nz-spin nzTip=\"\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\">\r\n <nz-alert nzType=\"info\" nzMessage=\"\u8BFE\u7A0B\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\"></nz-alert>\r\n </nz-spin>\r\n </div>\r\n\r\n <!-- \u6CE8\u9500 -->\r\n <nz-modal [(nzVisible)]=\"isVisible\" nzTitle=\"\u624B\u673A\u53F7\u9519\u8BEF\" (nzOnCancel)=\"handleCancel()\" (nzOnOk)=\"handleOk()\">\r\n <ng-container *nzModalContent>\r\n <p>\u624B\u673A\u53F7\u9519\u8BEF, \u8054\u7CFB\u7BA1\u7406\u5458\u6838\u5BF9\u4FE1\u606F</p>\r\n </ng-container>\r\n </nz-modal>\r\n </div>\r\n</div>\r\n", styles: [".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"] }]
915
- }], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.NovaCloudService }, { type: i3.FormBuilder }, { type: i4.ToastController }, { type: i5.Router }, { type: i5.ActivatedRoute }, { type: i5.ActivatedRoute }, { type: i6.HttpClient }] });
916
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi91c2VyL2xvZ2luL2xvZ2luLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvdXNlci9sb2dpbi9sb2dpbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQXlELFVBQVUsR0FBRyxNQUFNLGdCQUFnQixDQUFDO0FBQ2pILE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU81RCxNQUFNLE9BQU8sY0FBYztJQU16QixRQUFRO0lBQ1IsUUFBUSxDQUFDLEdBQUc7UUFDVixtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsV0FBVztRQUNsRSxJQUFJLE9BQU8sR0FBNkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXO1FBQ2pGLE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FBTyxD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O1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1NBQ0osQ0FBQztRQUNGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtZQUM1QyxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQzsrR0F4Z0NVLGNBQWM7bUdBQWQsY0FBYyx3RENmM0IsNGt1QkFpWEE7OzRGRGxXYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycywgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUsIFBhcmFtTWFwIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBOb3ZhQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbm92YS1jbG91ZC9ub3ZhLWNsb3VkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb2FzdENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1wY3VzZXItbG9naW5cIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2xvZ2luLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2xvZ2luLmNvbXBvbmVudC5zY3NzXCJdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMb2dpbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgbnVtcyA9IFsnQycsICc2JywgJ1onLCAndCddO1xyXG4gIHN0ciA9ICcnO1xyXG4gIGNhbnZhczogYW55O1xyXG4gIGltYWdlOiBhbnk7XHJcbiAgdGFiSW5kZXg6bnVtYmVyID0gMDtcclxuICAvLyDnu5jliLbpqozor4HnoIFcclxuICBkcmF3Q29kZShzdHIpIHtcclxuICAgIC8vIHRoaXMucmVzZXRDb2RlKClcclxuICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ2ZXJpZnlDYW52YXNcIik7IC8v6I635Y+WSFRNTOerr+eUu+W4g1xyXG4gICAgdmFyIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTsgLy/ojrflj5bnlLvluIMyROS4iuS4i+aWh1xyXG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBcIndoaXRlXCI7IC8v55S75biD5aGr5YWF6ImyXHJcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpOyAvL+a4heepuueUu+W4g1xyXG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBcImNvcm5mbG93ZXJibHVlXCI7IC8v6K6+572u5a2X5L2T6aKc6ImyXHJcbiAgICBjb250ZXh0LmZvbnQgPSBcIjI1cHggQXJpYWxcIjsgLy/orr7nva7lrZfkvZNcclxuICAgIHZhciByYW5kID0gbmV3IEFycmF5KCk7XHJcbiAgICB2YXIgeCA9IG5ldyBBcnJheSgpO1xyXG4gICAgdmFyIHkgPSBuZXcgQXJyYXkoKTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XHJcbiAgICAgIHJhbmQucHVzaChyYW5kW2ldKTtcclxuICAgICAgcmFuZFtpXSA9IHRoaXMubnVtc1tpXVxyXG4gICAgICB4W2ldID0gaSAqIDIwICsgMTA7XHJcbiAgICAgIHlbaV0gPSBNYXRoLnJhbmRvbSgpICogMjAgKyAyMDtcclxuICAgICAgY29udGV4dC5maWxsVGV4dChyYW5kW2ldLCB4W2ldLCB5W2ldKTtcclxuICAgIH1cclxuICAgIHN0ciA9IHJhbmQuam9pbignJykudG9VcHBlckNhc2UoKTtcclxuICAgIC8v55S7M+adoemaj+acuue6v1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcclxuICAgICAgdGhpcy5kcmF3bGluZSh0aGlzLmNhbnZhcywgY29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g55S7MzDkuKrpmo/mnLrngrlcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzA7IGkrKykge1xyXG4gICAgICB0aGlzLmRyYXdEb3QodGhpcy5jYW52YXMsIGNvbnRleHQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb252ZXJ0Q2FudmFzVG9JbWFnZSh0aGlzLmNhbnZhcyk7XHJcbiAgICByZXR1cm4gc3RyO1xyXG4gIH1cclxuXHJcbiAgLy8g6ZqP5py657q/XHJcbiAgZHJhd2xpbmUoY2FudmFzLCBjb250ZXh0KSB7XHJcbiAgICBjb250ZXh0Lm1vdmVUbyhNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW52YXMud2lkdGgpLCBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW52YXMuaGVpZ2h0KSk7IC8v6ZqP5py657q/55qE6LW354K5eOWdkOagh+aYr+eUu+W4g3jlnZDmoIcw5L2N572u77yMeeWdkOagh+aYr+eUu+W4g+mrmOW6pueahOmaj+acuuaVsFxyXG4gICAgY29udGV4dC5saW5lVG8oTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FudmFzLndpZHRoKSwgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FudmFzLmhlaWdodCkpOyAvL+maj+acuue6v+eahOe7iOeCuXjlnZDmoIfmmK/nlLvluIPlrr3luqbvvIx55Z2Q5qCH5piv55S75biD6auY5bqm55qE6ZqP5py65pWwXHJcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDAuNTsgLy/pmo/mnLrnur/lrr1cclxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSg1MCw1MCw1MCwwLjMpJzsgLy/pmo/mnLrnur/mj4/ovrnlsZ7mgKdcclxuICAgIGNvbnRleHQuc3Ryb2tlKCk7IC8v5o+P6L6577yM5Y2z6LW354K55o+P5Yiw57uI54K5XHJcbiAgfVxyXG4gIC8vIOmaj+acuueCuSjmiYDosJPnlLvngrnlhbblrp7lsLHmmK/nlLsxcHjlg4/ntKDnmoTnur/vvIzmlrnms5XkuI3lho3otZjov7ApXHJcbiAgZHJhd0RvdChjYW52YXMsIGNvbnRleHQpIHtcclxuICAgIHZhciBweCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbnZhcy53aWR0aCk7XHJcbiAgICB2YXIgcHkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW52YXMuaGVpZ2h0KTtcclxuICAgIGNvbnRleHQubW92ZVRvKHB4LCBweSk7XHJcbiAgICBjb250ZXh0LmxpbmVUbyhweCArIDEsIHB5ICsgMSk7XHJcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDAuMjtcclxuICAgIGNvbnRleHQuc3Ryb2tlKCk7XHJcbiAgfVxyXG4gIC8vIOe7mOWItuWbvueJh1xyXG4gIGNvbnZlcnRDYW52YXNUb0ltYWdlKGNhbnZhcykge1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ2ZXJpZnlDYW52YXNcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgdGhpcy5pbWFnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29kZV9pbWdcIik7XHJcbiAgICB0aGlzLmltYWdlLnNyYyA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XHJcbiAgICByZXR1cm4gdGhpcy5pbWFnZTtcclxuICB9XHJcbiAgLy8g55m75b2VXHJcbiAgLy8gICDpqozor4HnoIFcclxuICB2Q29kZTogc3RyaW5nO1xyXG4gIC8vIOeZu+W9lemqjOivgeihqOWNleWvueixoVxyXG4gIHZhbGlkYXRlRm9ybSE6IEZvcm1Hcm91cDtcclxuICAvLyDluJDlj7flr4bnoIHooajljZXlr7nosaFcclxuICB2YWxpZGF0ZVVzZXJGb3JtITogRm9ybUdyb3VwO1xyXG4gIC8vIOaJi+acuumqjOivgeeggeihqOWNlVxyXG4gIHZhbGlkYXRlU01TRm9ybSE6Rm9ybUdyb3VwO1xyXG4gIHNtc0NvZGVFcnJvclRpcDpzdHJpbmc7XHJcbiAgLy8g55So5oi35ZCN6ZSZ6K+v5o+Q56S6XHJcbiAgdXNlckVycm9yVGlwOiBhbnk7XHJcbiAgLy8g5a+G56CB6ZSZ6K+v5o+Q56S6XHJcbiAgcGFzc3dvcmRFcnJvclRpcDogYW55O1xyXG4gIGZvcmdldHBob25lQ29kZXNFcnJvclRpcDogYW55O1xyXG4gIHBob25lRXJyb3JUaXA6IGFueTtcclxuICBjb2RlVmVyaWZpZWQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvZGVFcnJvclRpcDogYW55XHJcbiAgLy8g55So5oi35ZCN77yI5omL5py65Y+356CB77yJXHJcbiAgdXNlcm5hbWU6IGFueTtcclxuICAvLyAgIGZvcmdldHVzZXJuYW1lXHJcbiAgZm9yZ2V0dXNlcm5hbWU6IHN0cmluZztcclxuICBmb3JnZXRQYXNzd29yZDogc3RyaW5nO1xyXG4gIGZvcmdldENvbmZpcm1wYXNzd29yZDogc3RyaW5nO1xyXG4gIGZvcmdlcnBob25lQ29kZTogc3RyaW5nO1xyXG4gIHNtc0NvZGU6c3RyaW5nXHJcbiAgLy8g5a+G56CBXHJcbiAgcGhvbmVDb2RlOiBhbnk7XHJcbiAgLy8gY29kZTogJzY3ZGUnXHJcbiAgLy/miYDmnInlgJnpgInnu4TmiJDpqozor4HnoIHnmoTlrZfnrKbvvIzlvZPnhLbkuZ/lj6/ku6XnlKjkuK3mlofnmoRcclxuICAvLyDmo4DmtYvmmK/lkKbkuLrlrabmoKHlrabnlJ9cclxuXHJcbiAgLy8gLy/nu5HlrprlrabnsY3pqozor4HooajljZXlr7nosaFcclxuICAvLyBwcm9maWxlRm9ybSE6IEZvcm1Hcm91cDtcclxuICAvLyAvLyDlp5PlkI3plJnor6/mj5DnpLpcclxuICAvLyBuYW1lRXJyb3JUaXA6IGFueTtcclxuICAvLyAvLyDouqvku73or4Hlj7fnoIHplJnor6/mj5DnpLpcclxuICAvLyBpZGNhcmRFcnJvclRpcDogYW55O1xyXG5cclxuICAvLyDms6jlhoxcclxuICByZWdpc3RGb3JtITogRm9ybUdyb3VwO1xyXG4gIC8vIOW/mOiusOWvhueggVxyXG4gIGZvcmdldEZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgLy8g5rOo5YaM5aeT5ZCN6ZSZ6K+v5o+Q56S6XHJcbiAgcmVnaXN0TmFtZUVycm9yVGlwOiBhbnk7XHJcbiAgLy8g5a+G56CB6ZSZ6K+v5o+Q56S6XHJcbiAgcmVnaXN0SWRjYXJkRXJyb3JUaXA6IGFueTtcclxuICAvLyDms6jlhozlp5PlkI1cclxuICByZWdpc3ROYW1lOiBhbnk7XHJcbiAgcGhvbmVDb2RlczogYW55O1xyXG4gIHJlZ2lzdFBob25lOiBhbnk7XHJcbiAgLy8g5rOo5YaM6Lqr5Lu96K+B5Y+356CBXHJcbiAgcmVnaXN0SWRjYXJkOiBhbnk7XHJcbiAgcGFzc3dvcmRWaXNpYmxlID0gZmFsc2U7XHJcbiAgcGFzc3dvcmRWaXNpYmxlMiA9IGZhbHNlO1xyXG4gIHBhc3N3b3JkVmlzaWJsZTMgPSBmYWxzZTtcclxuICAvLyDmmK/lkKbmnInlpJrkuKrlsYLmrKFcclxuICBpc2VkdWNhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8vIOWxguasoVxyXG4gIHNlbGVjdEVkdWNhdGlvbjogYW55O1xyXG4gIHJlZGlyZWN0VXJsOiBhbnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInJlZGlyZWN0VXJsXCIpO1xyXG5cclxuICAvLyDmiYvmnLrpqozor4HnoIFcclxuXHJcbiAgaXNTZW5kZWQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzU2VuZGluZzpib29sZWFuID0gZmFsc2U7XHJcbiAgc21zVGltZUNvdW50OiBudW1iZXIgPSA2MDtcclxuICBzZW5kU01TQ29kZSgpe1xyXG4gICAgaWYoIXRoaXMuY29kZVZlcmlmaWVkKXtcclxuICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcImVycm9yXCIsIFwi6K+35YWI5qC45a+56aqM6K+B56CBXCIpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGxldCBtb2JpbGUgPSB0aGlzLnZhbGlkYXRlU01TRm9ybS52YWx1ZT8ubW9iaWxlO1xyXG4gICAgY29uc29sZS5sb2codGhpcy52YWxpZGF0ZVNNU0Zvcm0udmFsdWUpXHJcbiAgICBpZihtb2JpbGUpe1xyXG4gICAgICBsZXQgYXBpZ1VSTCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiTk9WQV9BUElHX1NFUlZFUlwiKVxyXG5hcGlnVVJMID0gZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IoYXBpZ1VSTCkpO1xyXG5sZXQgdXJsID0gYXBpZ1VSTCtcIm1lc3NhZ2VcIlxyXG4gICAgICB0aGlzLmh0dHAucG9zdCh1cmwsIHsgY29tcGFueTogdGhpcy5jb21wYW55SWQsIG1vYmlsZTogbW9iaWxlLCBhY3Rpb246ICdsb2dpbicgfSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY291bnREb3duU01TKClcclxuICAgICAgICAvLyB0aGlzLmF1dGhTZXJ2LnRvYXN0KHttZXNzYWdlOlwi5bey5Y+R6YCB77yM6K+35p+l5pS26aqM6K+B56CBXCJ9KVxyXG4gICAgICAgIHRoaXMubWVzc2FnZS5pbmZvKGDlt7Llj5HpgIHvvIzor7fmn6XmlLbpqozor4HnoIFgKTtcclxuICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vIHRoaXMuYXV0aFNlcnYudG9hc3Qoe2NvbG9yOlwiZGFuZ2VyXCIsbWVzc2FnZTpcIuezu+e7n+e5geW/meS4re+8jOivt+eojeWQjumHjeivlVwifSlcclxuICAgICAgICB0aGlzLm1lc3NhZ2UuZXJyb3IoZXJyb3I/LmVycm9yPy5tZXNzfHxg57O757uf57mB5b+Z5Lit77yM6K+356iN5ZCO6YeN6K+VYCk7XHJcbiAgICAgIH0pXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLm1lc3NhZ2UuZXJyb3IoYOivt+ato+ehrui+k+WFpeaJi+acuuWPt2ApO1xyXG4gICAgfVxyXG4gIH1cclxuICBjb3VudERvd25TTVMoKXtcclxuXHJcbiAgICB0aGlzLmlzU2VuZGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNTZW5kaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc21zVGltZUNvdW50ID0gNjA7XHJcbiAgICBsZXQgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKT0+e1xyXG4gICAgICB0aGlzLnNtc1RpbWVDb3VudCAtLVxyXG4gICAgfSwxMDAwKVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcclxuICAgICAgdGhpcy5pc1NlbmRpbmcgPSBmYWxzZTtcclxuICAgIH0sIDYwKjEwMDApO1xyXG4gIH1cclxuICAvLyDngrnlh7vnmbvlvZXmjInpkq5cclxuICBzdWJtaXRGb3JtTW9iaWxlU01TKHZhbHVlOiB7IG1vYmlsZTogc3RyaW5nOyBzbXNDb2RlOiBzdHJpbmc7IGNoZWNrQ29kZTogc3RyaW5nIH0pOiB2b2lkIHtcclxuICAgIC8vIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwidXNlclwiKVxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy52YWxpZGF0ZVNNU0Zvcm0uY29udHJvbHMpIHtcclxuICAgICAgdGhpcy52YWxpZGF0ZVNNU0Zvcm0uY29udHJvbHNba2V5XS5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICB0aGlzLnZhbGlkYXRlU01TRm9ybS5jb250cm9sc1trZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKHZhbHVlKVxyXG4gICAgdGhpcy51c2VybmFtZSA9IHZhbHVlLm1vYmlsZTtcclxuICAgIHRoaXMuc21zQ29kZSA9IHZhbHVlLnNtc0NvZGU7XHJcbiAgICBjb25zb2xlLmxvZyhcInNtc2xvZ2luXCIpXHJcbiAgICAvLyByZXR1cm5cclxuICAgIHRoaXMubG9naW5TTVMoKTtcclxuICB9XHJcbiAgLy8g54K55Ye755m75b2V5oyJ6ZKuXHJcbiAgc3VibWl0Rm9ybU1vYmlsZVBhc3N3b3JkKHZhbHVlOiB7IG1vYmlsZTogc3RyaW5nOyB1c2VybmFtZT86c3RyaW5nOyBwYXNzd29yZDogc3RyaW5nOyBjaGVja0NvZGU6IHN0cmluZyB9KTogdm9pZCB7XHJcbiAgICAvLyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcInVzZXJcIilcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2tleV0ubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHNba2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVzZXJuYW1lID0gdmFsdWUubW9iaWxlIHx8IHZhbHVlLnVzZXJuYW1lO1xyXG4gICAgdGhpcy5wYXNzd29yZCA9IHZhbHVlLnBhc3N3b3JkO1xyXG4gICAgbGV0IGNoZWNrQ29kZSA9IHZhbHVlLmNoZWNrQ29kZTtcclxuICAgIGxldCBjID0gdGhpcy5jb2RlLnRvTG93ZXJDYXNlKClcclxuICAgIGxldCB2YyA9IGNoZWNrQ29kZS50b0xvd2VyQ2FzZSgpXHJcbiAgICBjb25zb2xlLmxvZyhjLCB2Yyk7XHJcblxyXG4gICAgaWYgKGMgIT0gdmMpIHtcclxuICAgICAgY29uc29sZS5sb2coYywgdmMpO1xyXG5cclxuICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcImVycm9yXCIsIFwi6aqM6K+B56CB6ZSZ6K+vXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sb2dpbk1vYmlsZVBhc3N3b3JkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDngrnlh7vnmbvlvZXmjInpkq5cclxuICBzdWJtaXRGb3JtVXNlclBhc3N3b3JkKHZhbHVlOiB7IG1vYmlsZTogc3RyaW5nOyB1c2VybmFtZT86c3RyaW5nOyBwYXNzd29yZDogc3RyaW5nOyBjaGVja0NvZGU6IHN0cmluZyB9KTogdm9pZCB7XHJcbiAgICAvLyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcInVzZXJcIilcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2tleV0ubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHNba2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVzZXJuYW1lID0gdmFsdWUubW9iaWxlIHx8IHZhbHVlLnVzZXJuYW1lO1xyXG4gICAgdGhpcy5wYXNzd29yZCA9IHZhbHVlLnBhc3N3b3JkO1xyXG4gICAgbGV0IGNoZWNrQ29kZSA9IHZhbHVlLmNoZWNrQ29kZTtcclxuICAgIGxldCBjID0gdGhpcy5jb2RlLnRvTG93ZXJDYXNlKClcclxuICAgIGxldCB2YyA9IGNoZWNrQ29kZS50b0xvd2VyQ2FzZSgpXHJcbiAgICBjb25zb2xlLmxvZyhjLCB2Yyk7XHJcblxyXG4gICAgaWYgKGMgIT0gdmMpIHtcclxuICAgICAgY29uc29sZS5sb2coYywgdmMpO1xyXG5cclxuICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcImVycm9yXCIsIFwi6aqM6K+B56CB6ZSZ6K+vXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hdXRoU2VydlxyXG4gICAgICAubG9naW4odGhpcy51c2VybmFtZSwgdGhpcy5wYXNzd29yZClcclxuICAgICAgLnRoZW4oYXN5bmMgZGF0YSA9PiB7XHJcbiAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBcIumUmeivr+eahOeUqOaIt+WQjeaIluWvhueggVwiKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDngrnlh7vph43nva7lr4bnoIFcclxuICBhc3luYyBmb3JnZXRGb3JtRnVuKHZhbHVlOiB7IGZvcmdldHVzZXJuYW1lOiBzdHJpbmc7IGZvcmdldFBhc3N3b3JkOiBzdHJpbmc7IGZvcmdldENvbmZpcm1wYXNzd29yZDogc3RyaW5nOyBmb3JnZXJwaG9uZUNvZGU6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmZvcmdldEZvcm0uY29udHJvbHMpIHtcclxuICAgICAgdGhpcy5mb3JnZXRGb3JtLmNvbnRyb2xzW2tleV0ubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy5mb3JnZXRGb3JtLmNvbnRyb2xzW2tleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2codmFsdWUuZm9yZ2V0dXNlcm5hbWUsIHZhbHVlLmZvcmdldFBhc3N3b3JkLCB2YWx1ZS5mb3JnZXRDb25maXJtcGFzc3dvcmQpXHJcbiAgICBpZiAodmFsdWUuZm9yZ2V0UGFzc3dvcmQgIT0gdmFsdWUuZm9yZ2V0Q29uZmlybXBhc3N3b3JkKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBcIuS4pOasoeWvhueggeS4jeS4gOiHtFwiKTtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBpZiAoIXZhbHVlLmZvcmdlcnBob25lQ29kZSkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLor7fovpPlhaXpqozor4HnoIFcIik7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IGhvc3QgPSAoUGFyc2UgYXMgYW55KS5zZXJ2ZXJVUkw/LnNwbGl0KFwicGFyc2VcIik/LlswXSB8fCBcImh0dHBzOi8vc2VydmVyLmZtb2RlLmNuL1wiXHJcblxyXG4gICAgbGV0IHVybCA9IGhvc3QgKyBcImFwaS9hdXRoL3Jlc2V0X3Bhc3N3b3JkXCJcclxuICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgeyBjb21wYW55OiB0aGlzLmNvbXBhbnlJZCwgbW9iaWxlOiB2YWx1ZS5mb3JnZXR1c2VybmFtZSwgY29kZTogdmFsdWUuZm9yZ2VycGhvbmVDb2RlLCBwYXNzd29yZDogdmFsdWUuZm9yZ2V0Q29uZmlybXBhc3N3b3JkIH0pLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJzdWNjZXNzXCIsIHJlcy5tc2cpO1xyXG4gICAgICAgIHRoaXMudHlwZSA9ICdsb2dpbidcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLpqozor4HnoIHplJnor69cIik7XHJcbiAgICAgIH1cclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5sb2coZXJyb3IuZXJyb3IpXHJcbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoJ2Vycm9yJywgZXJyb3IuZXJyb3IubWVzcyk7XHJcbiAgICB9KVxyXG4gIH1cclxuICAvLyDngrnlh7vms6jlhozmjInpkq5cclxuICByZWdwYXNzd29yZDogYW55O1xyXG4gIGNvbmZpcm1QYXNzd29yZDogYW55O1xyXG4gIGFzeW5jIHJlZ2lzdFN1Ym1pdEZvcm0odmFsdWU6IHsgcmVnaXN0TmFtZTogc3RyaW5nOyByZWdpc3RJZGNhcmQ6IHN0cmluZywgcmVncGFzc3dvcmQ6IHN0cmluZzsgY29uZmlybVBhc3N3b3JkOiBzdHJpbmc7IHBob25lQ29kZTogc3RyaW5nOyByZWdpc3RQaG9uZTogc3RyaW5nIH0pIHtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnJlZ2lzdEZvcm0uY29udHJvbHMpIHtcclxuICAgICAgdGhpcy5yZWdpc3RGb3JtLmNvbnRyb2xzW2tleV0ubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy5yZWdpc3RGb3JtLmNvbnRyb2xzW2tleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZWdpc3ROYW1lID0gdmFsdWUucmVnaXN0TmFtZTtcclxuICAgIHRoaXMucmVnaXN0SWRjYXJkID0gdmFsdWUucmVnaXN0SWRjYXJkO1xyXG4gICAgdGhpcy5yZWdpc3RQaG9uZSA9IHZhbHVlLnJlZ2lzdFBob25lO1xyXG4gICAgdGhpcy5waG9uZUNvZGUgPSB2YWx1ZS5waG9uZUNvZGU7XHJcbiAgICB0aGlzLnJlZ3Bhc3N3b3JkID0gdmFsdWUucmVncGFzc3dvcmQ7XHJcbiAgICB0aGlzLmNvbmZpcm1QYXNzd29yZCA9IHZhbHVlLmNvbmZpcm1QYXNzd29yZDtcclxuICAgIGxldCBjaGVja0luZm86IGFueSA9IGF3YWl0IHRoaXMudmVyaWZ5Q29kZSh0aGlzLnJlZ2lzdFBob25lLCB0aGlzLnBob25lQ29kZSlcclxuICAgIGlmIChjaGVja0luZm8gJiYgY2hlY2tJbmZvLmNvZGUgIT0gMjAwKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBjaGVja0luZm8ubWVzcyk7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5xdWVyeVVzZXIoKTtcclxuICB9XHJcbiAgXHJcbiAgZ2V0U2VsZWN0RWR1Y2F0aW9uKCkge1xyXG4gICAgdGhpcy5sb2dpbk1vYmlsZVBhc3N3b3JkKClcclxuICAgIHRoaXMuaXNlZHVjYXRpb24gPSBmYWxzZTtcclxuICB9XHJcbiAgbG9naW5TTVMoKXtcclxuICAgIC8vIOmqjOivgeeggeeZu+W9lVxyXG4gICAgbGV0IGhvc3QgPSAoUGFyc2UgYXMgYW55KS5zZXJ2ZXJVUkw/LnNwbGl0KFwicGFyc2VcIik/LlswXSB8fCBcImh0dHBzOi8vc2VydmVyLmZtb2RlLmNuL1wiXHJcblxyXG4gICAgbGV0IHVybCA9IGhvc3QgKyBgYXBpL2F1dGgvbW9iaWxlP2NvbXBhbnk9JHt0aGlzLmNvbXBhbnlJZH0mbW9iaWxlPSR7dGhpcy51c2VybmFtZX0mY29kZT0ke3RoaXMuc21zQ29kZX1gXHJcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhyZXMpO1xyXG4gICAgICBpZiAocmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcInN1Y2Nlc3NcIiwgXCLnmbvlvZXmiJDlip9cIik7XHJcbiAgICAgICAgbGV0IHRva2VuID0gcmVzLmRhdGEudG9rZW47XHJcbiAgICAgICAgUGFyc2UuVXNlci5iZWNvbWUodG9rZW4pLnRoZW4odXNlcj0+e1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2RlY29kZVVSSUNvbXBvbmVudCh0aGlzLnJvb3RQYWdlKV0pXHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLpqozor4HnoIHplJnor69cIik7XHJcbiAgICAgIH1cclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5sb2coZXJyb3IuZXJyb3IpXHJcbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoJ2Vycm9yJywgZXJyb3IuZXJyb3IubWVzcyk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBhc3luYyBsb2dpbk1vYmlsZVBhc3N3b3JkKCkge1xyXG4gICAgbGV0IHByb2ZpbGU6IGFueTtcclxuICAgIGxldCBlZHVjYXRpb246IGFueTtcclxuICAgIGxldCBjdXJyZW50VXNlcjogYW55O1xyXG4gICAgbGV0IHVzZXJuYW1lID0gYXdhaXQgdGhpcy5nZXRNb2JpbGVVc2VyKHRoaXMudXNlcm5hbWUpXHJcbiAgICBpZighdXNlcm5hbWUpe1xyXG4gICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLnlKjmiLfkuI3lrZjlnKjvvIzor7flsJ3or5Xlhbbku5bnmbvlvZXmlrnlvI9cIik7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5hdXRoU2VydlxyXG4gICAgICAubG9naW4odXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpXHJcbiAgICAgIC50aGVuKGFzeW5jIGRhdGEgPT4ge1xyXG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLplJnor6/nmoTnlKjmiLflkI3miJblr4bnoIFcIik7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZGluZzogYm9vbGVhbiA9IHRydWVcclxuICBsb2FkaW5nMjogYm9vbGVhbiBcclxuICBQcm9maWxlOiBhbnlcclxuICBMZXNzb246IGFueSA9IFtdO1xyXG4gIG15RGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gXHJcbiAgLy8g5p+l6K+i6K+l5a2m55Sf5L+h5oGv5piv5ZCm5a2Y5ZyoXHJcbiAgaXNWaXNpYmxlOiBib29sZWFuID0gZmFsc2VcclxuICBwcm9maWxlOiBhbnlcclxuICBhc3luYyBxdWVyeVVzZXIoKSB7XHJcbiAgICAgICAgLy8g5p+l5om+6L+Z5Liq55So5oi35a2Y5LiN5a2Y5Zyo77yM5a2Y5Zyo55u05o6l57uR5a6a55m75b2V77yM5LiN5a2Y5Zyo5rOo5YaMXHJcbiAgICAgICAgbGV0IHF1ZXJ5VXNlciA9IG5ldyBQYXJzZS5RdWVyeSgnX1VzZXInKVxyXG4gICAgICAgIHF1ZXJ5VXNlci5jb250YWlucyhcInVzZXJuYW1lXCIsIHRoaXMucmVnaXN0UGhvbmUpO1xyXG4gICAgICAgIHF1ZXJ5VXNlci5lcXVhbFRvKFwiY29tcGFueVwiLCB0aGlzLmNvbXBhbnlJZClcclxuICAgICAgICBsZXQgdXNlciA9IGF3YWl0IHF1ZXJ5VXNlci5maXJzdCgpXHJcbiAgICAgICAgaWYodXNlcj8uaWQpe1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivpei0puaIt+W3sua/gOa0u++8jOS9v+eUqOaJi+acuuWPt+WvhueggeebtOaOpeeZu+W9lWApO1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOaguOmqjOaJi+acuuWPt1xyXG4gICBcclxuICAgICAgICBQYXJzZS5Vc2VyLnNpZ25VcChcclxuICAgICAgICAgIHRoaXMuY29tcGFueUlkK1wiLVwiICsgdGhpcy5yZWdpc3RQaG9uZSxcclxuICAgICAgICAgIHRoaXMucmVncGFzc3dvcmQsXHJcbiAgICAgICAgICBcIlwiXHJcbiAgICAgICAgKS50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLmlkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcylcclxuICAgICAgICAgICAgcmVzLnNldChcImNvbXBhbnlcIiwge1xyXG4gICAgICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbXBhbnlcIixcclxuICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5jb21wYW55SWRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJlcy5zZXQoXCJtb2JpbGVcIiwgdGhpcy5yZWdpc3RQaG9uZSk7XHJcbiAgICAgICAgICAgIHJlcy5zZXQoXCJ0eXBlXCIsXCJ1c2VyXCIpO1xyXG4gICAgICAgICAgICByZXMuc2F2ZSgpO1xyXG4gICAgICAgICAgICAvLyDlvIDpgJrotKblj7fovoXliqnloavlhpnotKblj7flr4bnoIFcclxuICAgICAgICAgICAgdGhpcy51c2VybmFtZSA9IHRoaXMucmVnaXN0UGhvbmU7XHJcbiAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSB0aGlzLnJlZ3Bhc3N3b3JkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gIH1cclxuICB0eXBlOiBzdHJpbmcgPSAnbG9naW4nXHJcblxyXG4gIG1vYmlsZVVzZXJNYXAgPSB7fVxyXG4gIGFzeW5jIGdldE1vYmlsZVVzZXIobW9iaWxlKXtcclxuICAgIGlmKHRoaXMubW9iaWxlVXNlck1hcFttb2JpbGVdKSByZXR1cm4gdGhpcy5tb2JpbGVVc2VyTWFwW21vYmlsZV1cclxuICAgIGxldCByZXN1bHQ6YW55ID0gYXdhaXQgdGhpcy5ub3ZhQ2xvdWQuYXBpKFwiL2F1dGgvZ2V0dXNlcm5hbWVcIix7XHJcbiAgICAgIGNvbXBhbnk6dGhpcy5jb21wYW55SWQsXHJcbiAgICAgIG1vYmlsZTptb2JpbGVcclxuICAgIH0pXHJcbiAgICBjb25zb2xlLmxvZyhyZXN1bHQpXHJcbiAgICBpZihyZXN1bHQ/LnVzZXJuYW1lKXtcclxuICAgICAgdGhpcy5tb2JpbGVVc2VyTWFwW21vYmlsZV0gPSByZXN1bHQ/LnVzZXJuYW1lXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5tb2JpbGVVc2VyTWFwW21vYmlsZV1cclxuICB9XHJcblxyXG4gIGZvcmdldCgpIHtcclxuICAgIHRoaXMudHlwZSA9ICdmb3JnZXQnXHJcbiAgfVxyXG5cclxuICBiYWNrTG9naW4oKSB7XHJcbiAgICB0aGlzLnR5cGUgPSAnbG9naW4nXHJcbiAgfVxyXG4gXHJcbiAgaGFuZGxlQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZVxyXG4gIH1cclxuICBwYXNzd29yZDogYW55O1xyXG4gIGhhbmRsZU9rKCkge1xyXG4gICAgUGFyc2UuVXNlci5zaWduVXAoXHJcbiAgICAgIHRoaXMucmVnaXN0UGhvbmUsXHJcbiAgICAgIHRoaXMucmVncGFzc3dvcmQsXHJcbiAgICAgIFwiXCJcclxuICAgICkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICBpZiAocmVzLmlkKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzKVxyXG4gICAgICAgIHJlcy5zZXQoXCJjb21wYW55XCIsIHtcclxuICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXHJcbiAgICAgICAgICBjbGFzc05hbWU6IFwiQ29tcGFueVwiLFxyXG4gICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuY29tcGFueUlkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmVzLnNhdmUoKTtcclxuICAgICAgICB0aGlzLnVzZXJuYW1lID0gdGhpcy5yZWdpc3RQaG9uZVxyXG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSB0aGlzLnJlZ3Bhc3N3b3JkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgaXNPa0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgYXN5bmMgZ2V0Q29kZSgpIHtcclxuICAgIGlmICh0aGlzLnJlZ2lzdFBob25lID09IHVuZGVmaW5lZCB8fCB0aGlzLnJlZ2lzdFBob25lLnRyaW0oKSA9PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZS5pbmZvKGDor7fovpPlhaXms6jlhozmiYvmnLrlj7dgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGEgPSAvXjFbMzQ1Njc4OV1cXGR7OX0kLztcclxuICAgIGlmICghdGhpcy5yZWdpc3RQaG9uZS5tYXRjaChhKSkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2UuaW5mbyhg6K+36L6T5YWl5q2j56Gu55qE5omL5py65Y+3YCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBVc2VyID0gbmV3IFBhcnNlLlF1ZXJ5KCdVc2VyJylcclxuICAgIFVzZXIuZXF1YWxUbygndXNlcm5hbWUnLCB0aGlzLnJlZ2lzdFBob25lKVxyXG4gICAgVXNlci5lcXVhbFRvKCdjb21wYW55JywgdGhpcy5jb21wYW55SWQpXHJcbiAgICBsZXQgdXNlciA9IGF3YWl0IFVzZXIuZmlyc3QoKVxyXG4gICAgaWYgKHVzZXIgJiYgdXNlci5pZCkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2UuaW5mbyhg6K+l5omL5py65Y+35bey5rOo5YaM77yM6K+35L2/55So6LSm5Y+35a+G56CB55m75b2VYCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIOacrOWcsOa1i+ivlVxyXG4gICAgbGV0IGFwaWdVUkwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIk5PVkFfQVBJR19TRVJWRVJcIilcclxuYXBpZ1VSTCA9IGRlY29kZVVSSUNvbXBvbmVudChhdG9iKGFwaWdVUkwpKTtcclxubGV0IHVybCA9IGFwaWdVUkwrXCJtZXNzYWdlXCJcclxuICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgeyBjb21wYW55OiB0aGlzLmNvbXBhbnlJZCwgbW9iaWxlOiB0aGlzLnJlZ2lzdFBob25lLCBhY3Rpb246ICdyZWdpc3QnIH0pLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy52Q29kZSA9IHJlcy5kYXRhLmNvZGVcclxuICAgICAgdGhpcy5jb3VudERvd25GdW4oKVxyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICB0aGlzLm1lc3NhZ2UuaW5mbyhg57O757uf57mB5b+Z5Lit77yM6K+356iN5ZCO6YeN6K+VYCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldENvZGUyKCkge1xyXG4gICAgaWYgKHRoaXMuZm9yZ2V0dXNlcm5hbWUgPT0gdW5kZWZpbmVkIHx8IHRoaXMuZm9yZ2V0dXNlcm5hbWUudHJpbSgpID09IFwiXCIpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivt+i+k+WFpei0puWPt2ApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgYSA9IC9eMVszNDU2Nzg5XVxcZHs5fSQvO1xyXG4gICAgaWYgKCF0aGlzLmZvcmdldHVzZXJuYW1lLm1hdGNoKGEpKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZS5pbmZvKGDor7fovpPlhaXmraPnoa7nmoTmiYvmnLrlj7dgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2codGhpcy5mb3JnZXR1c2VybmFtZSlcclxuICAgIGxldCBVc2VyID0gbmV3IFBhcnNlLlF1ZXJ5KCdVc2VyJylcclxuICAgIFVzZXIuZXF1YWxUbygndXNlcm5hbWUnLHRoaXMuY29tcGFueUlkICsgXCItXCIgKyB0aGlzLmZvcmdldHVzZXJuYW1lKVxyXG4gICAgVXNlci5lcXVhbFRvKCdjb21wYW55JywgdGhpcy5jb21wYW55SWQpXHJcbiAgICBsZXQgdXNlciA9IGF3YWl0IFVzZXIuZmlyc3QoKVxyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZS5pbmZvKGDotKblj7fkuI3lrZjlnKhgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGFwaWdVUkwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIk5PVkFfQVBJR19TRVJWRVJcIilcclxuYXBpZ1VSTCA9IGRlY29kZVVSSUNvbXBvbmVudChhdG9iKGFwaWdVUkwpKTtcclxubGV0IHVybCA9IGFwaWdVUkwrXCJtZXNzYWdlXCJcclxuICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgeyBjb21wYW55OiB0aGlzLmNvbXBhbnlJZCwgbW9iaWxlOiB0aGlzLmZvcmdldHVzZXJuYW1lLCBhY3Rpb246ICdyZXNldFBhc3N3b3JkJyB9KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlcylcclxuICAgICAgdGhpcy52Q29kZSA9IHJlcy5kYXRhLmNvZGVcclxuICAgICAgdGhpcy5jb3VudERvd25GdW4oKVxyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICB0aGlzLm1lc3NhZ2UuaW5mbyhg57O757uf57mB5b+Z5Lit77yM6K+356iN5ZCO6YeN6K+VYCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGFzeW5jIHZlcmlmeUNvZGUobW9iaWxlLCBjb2RlKSB7XHJcbiAgICBsZXQgYXBpZ1VSTCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiTk9WQV9BUElHX1NFUlZFUlwiKVxyXG5hcGlnVVJMID0gZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IoYXBpZ1VSTCkpO1xyXG5sZXQgdXJsID0gYXBpZ1VSTCtcInZlcmlmeUNvZGVcIlxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5odHRwLnBvc3QodXJsLCB7IG1vYmlsZTogbW9iaWxlLCBjb2RlOiBjb2RlIH0pLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICByZXNvbHZlKHJlcylcclxuICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgICAgIHJlc29sdmUoZXJyb3IuZXJyb3IpXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIGNvdW50RG93bjogbnVtYmVyID0gNjBcclxuICBpc0NvdW50RG93bjogYm9vbGVhbiA9IGZhbHNlXHJcbiAgLy8g5YCS6K6h5pe2XHJcbiAgY291bnREb3duRnVuKCkge1xyXG4gICAgdGhpcy5pc0NvdW50RG93biA9IHRydWVcclxuICAgIGlmICh0aGlzLmNvdW50RG93biA9PSAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvdW50RG93biA9IHRoaXMuY291bnREb3duIC0gMVxyXG4gICAgICBpZiAodGhpcy5jb3VudERvd24gPT0gMCkge1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpXHJcbiAgICAgICAgdGhpcy5jb3VudERvd24gPSA2MFxyXG4gICAgICAgIHRoaXMuaXNDb3VudERvd24gPSBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9LCAxMDAwKVxyXG4gIH1cclxuXHJcbiAgLy8g6aG16Z2i5pi+56S657Sg5p2QXHJcbiAgbW9iaWxlTG9naW46Ym9vbGVhbiA9IGZhbHNlXHJcbiAgcm9vdFBhZ2U6c3RyaW5nXHJcbiAgbG9nbzpzdHJpbmcgPSAnaHR0cHM6Ly93d3cuZm1vZGUuY24vaW1hZ2VzL2V3bTEucG5nJztcclxuICBxcmNvZGU6c3RyaW5nID0gJ2h0dHBzOi8vd3d3LmZtb2RlLmNuL2ltYWdlcy9sb2dvX21haW4ucG5nJztcclxuICAvLyDlhazlj7jluJDlj7flpZfmgLvlkI7lj7DnmbvlvZVcclxuICBjb21wYW55OlBhcnNlLk9iamVjdFxyXG4gIGNvbXBhbnlJZDpzdHJpbmdcclxuICAvLyDnrqHnkIbnq6/lrprliLZBUFDlkI7lj7DnmbvlvZVcclxuICBhcHA6UGFyc2UuT2JqZWN0XHJcbiAgYXBwSWQ6c3RyaW5nXHJcbiAgbWVzc2FnZSA9IHRoaXMuYXV0aFNlcnYubWVzc2FnZVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGF1dGhTZXJ2OiBBdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUgbm92YUNsb3VkOiBOb3ZhQ2xvdWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHRvYXN0Q3RybDpUb2FzdENvbnRyb2xsZXIsXHJcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOkFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnRcclxuICApIHtcclxuICAgIHRoaXMuaW5pdExvZ2luRm9ybSgpXHJcblxyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbU1hcC5zdWJzY3JpYmUoYXN5bmMgcGFyYW1zPT57XHJcbiAgICAgIGNvbnNvbGUubG9nKHBhcmFtcylcclxuICBcclxuICAgICAgdGhpcy5hcHBJZCA9IHBhcmFtcy5nZXQoXCJhcHBJZFwiKTtcclxuICAgICAgaWYoIWF3YWl0IHRoaXMuaW5pdEFwcENvbmZpZygpKXtcclxuICAgICAgICB0aGlzLmNvbXBhbnlJZCA9IHBhcmFtcy5nZXQoXCJjb21wYW55SWRcIik7XHJcbiAgICAgICAgaWYoIXRoaXMuY29tcGFueUlkKXtcclxuICAgICAgICAgIHRoaXMuY29tcGFueUlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpIHx8IFwiUTBEcnlOWUE4Z1wiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdENvbXBhbnlDb25maWcoKVxyXG4gIFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICB9XHJcbiAgYXN5bmMgaW5pdENvbXBhbnlDb25maWcoKXtcclxuICAgIGlmKCF0aGlzLmNvbXBhbnlJZCkgcmV0dXJuXHJcbiAgICBsZXQgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJDb21wYW55XCIpXHJcbiAgICB0aGlzLmNvbXBhbnkgPSBhd2FpdCBxdWVyeS5nZXQodGhpcy5jb21wYW55SWQpO1xyXG4gICAgLy8g6K6+572u6aG16Z2iXHJcbiAgICB0aGlzLmxvZ28gPSB0aGlzLmNvbXBhbnk/LmdldChcImxvZ29cIikgfHwgdGhpcy5sb2dvO1xyXG4gICAgdGhpcy5xcmNvZGUgPSB0aGlzLmNvbXBhbnk/LmdldChcInFyY29kZVwiKSB8fCB0aGlzLnFyY29kZTtcclxuICAgIHRoaXMubW9iaWxlTG9naW4gPSB0aGlzLmNvbXBhbnk/LmdldCgnanB1c2gnKT8uYXBwa2V5IHx8IGZhbHNlXHJcbiAgICB0aGlzLnJvb3RQYWdlID0gdGhpcy5jb21wYW55Py5nZXQoJ3Jvb3RQYWdlJylcclxuICB9XHJcblxyXG4gIGFzeW5jIGluaXRBcHBDb25maWcoKXtcclxuICAgIGlmKCF0aGlzLmFwcElkKSByZXR1cm4gZmFsc2VcclxuICAgIGxldCBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShcIkFwcFwiKTtcclxuICAgIHF1ZXJ5LmluY2x1ZGUoXCJjb21wYW55XCIpO1xyXG4gICAgdGhpcy5hcHAgPSBhd2FpdCBxdWVyeS5nZXQodGhpcy5hcHBJZCk7XHJcbiAgICAvLyDorr7nva7pobXpnaJcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuYXBwKVxyXG4gICAgdGhpcy5sb2dvID0gdGhpcy5hcHA/LmdldChcImxvZ29cIikgfHwgdGhpcy5sb2dvO1xyXG4gICAgdGhpcy5xcmNvZGUgPSB0aGlzLmFwcD8uZ2V0KFwicXJjb2RlXCIpIHx8IHRoaXMucXJjb2RlO1xyXG4gICAgdGhpcy5tb2JpbGVMb2dpbiA9IHRoaXMuYXBwPy5nZXQoJ2pwdXNoJyk/LmFwcGtleSB8fCBmYWxzZVxyXG4gICAgdGhpcy5jb21wYW55SWQgPSB0aGlzLmFwcD8uZ2V0KFwiY29tcGFueVwiKS5pZDtcclxuICAgIHRoaXMucm9vdFBhZ2UgPSB0aGlzLmFwcD8uZ2V0KCdyb290UGFnZScpXHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuICBpbml0TG9naW5Gb3JtKCl7XHJcblxyXG4gICAgdGhpcy52YWxpZGF0ZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgLy8g5Yqg5YWl6aqM6K+B55qE6KGo5Y2V6aG5IO+8miDliJ3lp4vlgLzjgIEg5piv5ZCm6aqM6K+BIOiwg+eUqOeahOmqjOivgeaWueazlVxyXG4gICAgICBtb2JpbGU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnVzZXJOYW1lQXN5bmNWYWxpZGF0b3JdXSxcclxuICAgICAgcGFzc3dvcmQ6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnBhc3N3b3JkQXN5bmNWYWxpZGF0b3JdXSxcclxuICAgICAgLy8gaW5pdENvZGU6IFt0aGlzLmNvZGUgXSxcclxuICAgICAgY2hlY2tDb2RlOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5jb2RlQXN5bmNWYWxpZGF0b3JdXVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIHRoaXMudmFsaWRhdGVVc2VyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAvLyDliqDlhaXpqozor4HnmoTooajljZXpobkg77yaIOWIneWni+WAvOOAgSDmmK/lkKbpqozor4Eg6LCD55So55qE6aqM6K+B5pa55rOVXHJcbiAgICAgIHVzZXJuYW1lOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbXV0sXHJcbiAgICAgIHBhc3N3b3JkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5wYXNzd29yZEFzeW5jVmFsaWRhdG9yXV0sXHJcbiAgICAgIC8vIGluaXRDb2RlOiBbdGhpcy5jb2RlIF0sXHJcbiAgICAgIGNoZWNrQ29kZTogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMuY29kZUFzeW5jVmFsaWRhdG9yXV1cclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy52YWxpZGF0ZVNNU0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgLy8g5Yqg5YWl6aqM6K+B55qE6KGo5Y2V6aG5IO+8miDliJ3lp4vlgLzjgIEg5piv5ZCm6aqM6K+BIOiwg+eUqOeahOmqjOivgeaWueazlVxyXG4gICAgICBtb2JpbGU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnVzZXJOYW1lQXN5bmNWYWxpZGF0b3JdXSxcclxuICAgICAgcGFzc3dvcmQ6IFtcIlwiXSxcclxuICAgICAgc21zQ29kZTogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMuc21zQXN5bmNWYWxpZGF0b3JdXSxcclxuICAgICAgLy8gaW5pdENvZGU6IFt0aGlzLmNvZGUgXSxcclxuICAgICAgY2hlY2tDb2RlOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5jb2RlQXN5bmNWYWxpZGF0b3JdXVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIHRoaXMucmVnaXN0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAvLyDliqDlhaXpqozor4HnmoTooajljZXpobkg77yaIOWIneWni+WAvOOAgSDmmK/lkKbpqozor4Eg6LCD55So55qE6aqM6K+B5pa55rOVXHJcbiAgICAgIHJlZ2lzdE5hbWU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnJlZ2lzdE5hbWVBc3luY1ZhbGlkYXRvcl1dLFxyXG4gICAgICByZWdpc3RJZGNhcmQ6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnJlZ2lzdElkY2FyZEFzeW5jVmFsaWRhdG9yXV0sXHJcbiAgICAgIHJlZ2lzdFBob25lOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5yZWdpc3RQaG9uZUFzeW5jVmFsaWRhdG9yXV0sXHJcbiAgICAgIHBob25lQ29kZTogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMucmVnaXN0Q29kZUFzeW5jVmFsaWRhdG9yXV0sXHJcbiAgICAgIHJlZ3Bhc3N3b3JkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5yZWdwYXNzd29yZEFzeW5jVmFsaWRhdG9yXV0sXHJcbiAgICAgIGNvbmZpcm1QYXNzd29yZDogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMuY29uZmlybVBhc3N3b3JkQXN5bmNWYWxpZGF0b3JdXVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcmdldEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuXHJcbiAgICAgIGZvcmdldHVzZXJuYW1lOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5mb3JnZXROYW1lQXN5bmNWYWxpZGF0b3JdXSxcclxuICAgICAgZm9yZ2V0UGFzc3dvcmQ6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLmZvcmdldFBhc3N3b3JkQXN5bmNWYWxpZGF0b3JdXSxcclxuICAgICAgZm9yZ2V0Q29uZmlybXBhc3N3b3JkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5mb3JnZXRDb25maXJtUGFzc3dvcmRBc3luY1ZhbGlkYXRvcl1dLFxyXG4gICAgICBmb3JnZXJwaG9uZUNvZGU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnJlZ2lzdENvZGVBc3luY1ZhbGlkYXRvcl1dLFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8vIOeZu+W9lSDnlKjmiLflkI3vvIjmiYvmnLrlj7fnoIHvvInpqozor4FcclxuICB1c2VyTmFtZUFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxyXG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcclxuICAgICAgbGV0IHJlZyA9IC9eMVszNDU2Nzg5XVxcZHs5fSQvO1xyXG4gICAgICAvLyBsZXQgcmVnMiA9IC9eXFxkezE3fShcXGR8WHx4KSQvO1xyXG4gICAgICBsZXQgdXNlcm5hbWUgPSBjb250cm9sLnZhbHVlO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodXNlcm5hbWUgPT0gdW5kZWZpbmVkIHx8IHVzZXJuYW1lLnRyaW0oKSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICB0aGlzLnVzZXJFcnJvclRpcCA9IFwi6K+36L6T5YWl55m75b2V6LSm5Y+3XCI7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXVzZXJuYW1lLm1hdGNoKHJlZykpIHtcclxuICAgICAgICAgIHRoaXMudXNlckVycm9yVGlwID0gXCLor7fovpPlhaXmraPnoa7nmoTnmbvlvZXotKblj7dcIjtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmKHVzZXJuYW1lLmxlbmd0aCA+IDExKXtcclxuICAgICAgICAvLyAgIGlmICghdXNlcm5hbWUubWF0Y2gocmVnMikgKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMudXNlckVycm9yVGlwID0gXCLor7fovpPlhaXmraPnoa7nmoTnmbvlvZXotKblj7dcIjtcclxuICAgICAgICAvLyAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xyXG4gICAgICAgIC8vICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gfWVsc2Uge1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9LCAxMDAwKTtcclxuICAgIH0pO1xyXG4gICAgLy8g55m75b2VIOefreS/oemqjOivgeeggemqjOivgVxyXG4gICAgc21zQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDpGb3JtQ29udHJvbCk9PiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPikgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBsZXQgc21zQ29kZSA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgaWYgKHNtc0NvZGUgPT0gdW5kZWZpbmVkIHx8IHNtc0NvZGUudHJpbSgpID09IFwiXCIpIHtcclxuICAgICAgICAgIHRoaXMuc21zQ29kZUVycm9yVGlwID0gXCLor7fovpPlhaXnn63kv6Hpqozor4HnoIFcIjtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9KTtcclxuICAvLyDnmbvlvZUg5a+G56CB6aqM6K+BXHJcbiAgcGFzc3dvcmRBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT5cclxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGxldCBwYXNzd29yZCA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgaWYgKHBhc3N3b3JkID09IHVuZGVmaW5lZCB8fCBwYXNzd29yZC50cmltKCkgPT0gXCJcIikge1xyXG4gICAgICAgICAgdGhpcy5wYXNzd29yZEVycm9yVGlwID0gXCLor7fovpPlhaXlr4bnoIFcIjtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFzc3dvcmQubGVuZ3RoIDwgNikge1xyXG4gICAgICAgICAgdGhpcy5wYXNzd29yZEVycm9yVGlwID0gXCLlr4bnoIHplb/luqbkuI3lvpflsI/kuo425L2NXCI7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgfSk7XHJcblxyXG4gIGNvZGVBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT5cclxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGxldCBjaGVja0NvZGUgPSBjb250cm9sLnZhbHVlO1xyXG4gICAgICAgIGlmIChjaGVja0NvZGUgPT0gdW5kZWZpbmVkIHx8IGNoZWNrQ29kZS50cmltKCkgPT0gXCJcIikge1xyXG4gICAgICAgICAgdGhpcy5jb2RlVmVyaWZpZWQgPSBmYWxzZVxyXG4gICAgICAgICAgdGhpcy5jb2RlRXJyb3JUaXAgPSBcIuivt+i+k+WFpemqjOivgeeggVwiO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNoZWNrQ29kZS5sZW5ndGggPCA0KSB7XHJcbiAgICAgICAgICB0aGlzLmNvZGVWZXJpZmllZCA9IGZhbHNlXHJcbiAgICAgICAgICB0aGlzLmNvZGVFcnJvclRpcCA9IFwi6aqM6K+B56CB6ZW/5bqm5LiN5b6X5bCP5LqONOS9jVwiO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGMgPSB0aGlzLmNvZGUudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIGxldCB2YyA9IGNoZWNrQ29kZS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgaWYoYyE9dmMpe1xyXG4gICAgICAgICAgdGhpcy5jb2RlVmVyaWZpZWQgPSBmYWxzZVxyXG4gICAgICAgICAgdGhpcy5jb2RlRXJyb3JUaXAgPSBcIumqjOivgeeggei+k+WFpemUmeivr1wiO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvZGVWZXJpZmllZCA9IHRydWVcclxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgfSk7XHJcbiAgY29uZmlybVBhc3N3b3JkRXJyb3JUaXA6IGFueTtcclxuICByZWdwYXNzd29yZEVycm9yVGlwOiBhbnk7XHJcbiAgcGhvbmVDb2Rlc0Vycm9yVGlwOiBhbnlcclxuICAvLyDms6jlhowg6Lqr5Lu96K+B5Y+356CB6aqM6K+BXHJcbiAgcmVnaXN0SWRjYXJkQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XHJcbiAgICBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPikgPT4ge1xyXG4gICAgICBsZXQgcmVnaXN0SWRjYXJkID0gY29udHJvbC52YWx1ZTtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmIChyZWdpc3RJZGNhcmQgPT0gdW5kZWZpbmVkIHx8IHJlZ2lzdElkY2FyZC50cmltKCkgPT0gXCJcIikge1xyXG4gICAgICAgICAgdGhpcy5yZWdpc3RJZGNhcmRFcnJvclRpcCA9IFwi6K+36L6T5YWl5q2j56Gu55qE6Lqr5Lu96K+B5Y+356CBXCI7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoL15cXGR7MTd9KFxcZHxYfHgpJC8udGVzdChyZWdpc3RJZGNhcmQpID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgdGhpcy5yZWdpc3RJZGNhcmRFcnJvclRpcCA9IFwi6K+36L6T5YWl5q2j56Gu55qE6Lqr5Lu96K+B5Y+356CBXCI7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9LCAxMDAwKTtcclxuICAgIH0pO1xyXG4gIC8vIOW/mOiusOWvhueggSDpqozor4FcclxuICBmb3JnZXROYW1lQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XHJcbiAgICBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPikgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBsZXQgZm9yZ2V0TmFtZSA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgaWYgKGZvcmdldE5hbWUgPT0gdW5kZWZpbmVkIHx8IGZvcmdldE5hbWUudHJpbSgpID09IFwiXCIpIHtcclxuICAgICAgICAgIHRoaXMucmVnaXN0TmFtZUVycm9yVGlwID0gXCLor7fovpPlhaXotKbmiLfotKblj7fmiJbogIXmiYvmnLrlj7dcIjtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm9yZ2V0dXNlcm5hbWUgPSBmb3JnZXROYW1lO1xyXG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9KTtcclxuXHJcbiAgZm9yZ2V0UGFzc3dvcmRBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT5cclxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGxldCBmb3JnZXRQYXNzd29yZCA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgaWYgKGZvcmdldFBhc3N3b3JkID09IHVuZGVmaW5lZCB8fCBmb3JnZXRQYXNzd29yZC50cmltKCkgPT0gXCJcIikge1xyXG4gICAgICAgICAgdGhpcy5wYXNzd29yZEVycm9yVGlwID0gXCLor7fovpPlhaXmlrDlr4bnoIFcIjtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmb3JnZXRQYXNzd29yZC5sZW5ndGggPCA2KSB7XHJcbiAgICAgICAgICB0aGlzLnBhc3N3b3JkRXJyb3JUaXAgPSBcIuWvhueggemVv+W6puS4jeW+l+Wwj+S6jjbkvY1cIjtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm9yZ2V0UGFzc3dvcmQgPSBmb3JnZXRQYXNzd29yZDtcclxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgfSk7XHJcblxyXG4gIGZvcmdldENvbmZpcm1QYXNzd29yZEFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxyXG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgbGV0IGZvcmdldENvbmZpcm1wYXNzd29yZCA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgaWYgKGZvcmdldENvbmZpcm1wYXNzd29yZCA9PSB1bmRlZmluZWQgfHwgZm9yZ2V0Q29uZmlybXBhc3N3b3JkLnRyaW0oKSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcmdldHBob25lQ29kZXNFcnJvclRpcCA9IFwi6K+356Gu6K6k5paw5a+G56CBXCI7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZm9yZ2V0Q29uZmlybXBhc3N3b3JkLmxlbmd0aCA8IDYpIHtcclxuICAgICAgICAgIHRoaXMuZm9yZ2V0cGhvbmVDb2Rlc0Vycm9yVGlwID0gXCLlr4bnoIHplb/luqbkuI3lvpflsI/kuo425L2NXCI7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcmdldENvbmZpcm1wYXNzd29yZCA9IGZvcmdldENvbmZpcm1wYXNzd29yZDtcclxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgfSk7XHJcblxyXG4gIGZvcmdldENvZGVBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT5cclxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGxldCBmb3JnZXJwaG9uZUNvZGUgPSBjb250cm9sLnZhbHVlO1xyXG4gICAgICAgIGlmIChmb3JnZXJwaG9uZUNvZGUgPT0gdW5kZWZpbmVkIHx8IGZvcmdlcnBob25lQ29kZS50cmltKCkgPT0gXCJcIikge1xyXG4gICAgICAgICAgdGhpcy5waG9uZUNvZGVzRXJyb3JUaXAgPSBcIuivt+i+k+WFpeaWsOWvhueggVwiO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JnZXJwaG9uZUNvZGUgPSBmb3JnZXJwaG9uZUNvZGU7XHJcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9LCAxMDAwKTtcclxuICAgIH0pO1xyXG5cclxuXHJcblxyXG5cclxuICAvLyDms6jlhowg5aeT5ZCN6aqM6K+BXHJcbiAgcmVnaXN0TmFtZUFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxyXG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgbGV0IHJlZ2lzdE5hbWUgPSBjb250cm9sLnZhbHVlO1xyXG4gICAgICAgIGlmIChyZWdpc3ROYW1lID09IHVuZGVmaW5lZCB8fCByZWdpc3ROYW1lLnRyaW0oKSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICB0aGlzLnJlZ2lzdE5hbWVFcnJvclRpcCA9IFwi6K+36L6T5YWl5aeT5ZCNXCI7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlZ2lzdE5hbWUgPSByZWdpc3ROYW1lO1xyXG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gIC8vIOazqOWGjOaJi+acuuWPt+mqjOivgVxyXG4gIHJlZ2lzdFBob25lQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XHJcbiAgICBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPikgPT4ge1xyXG4gICAgICBsZXQgcmVnaXN0UGhvbmUgPSBjb250cm9sLnZhbHVlO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAocmVnaXN0UGhvbmUgPT0gdW5kZWZpbmVkIHx8IHJlZ2lzdFBob25lLnRyaW0oKSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICB0aGlzLnJlZ2lzdElkY2FyZEVycm9yVGlwID0gXCLor7fovpPlhaXmraPnoa7nmoTouqvku73or4Hlj7fnoIFcIjtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoL14xWzM0NTY3ODldXFxkezl9JC8udGVzdChyZWdpc3RQaG9uZSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICB0aGlzLnBob25lRXJyb3JUaXAgPSBcIuivt+i+k+WFpeato+ehrueahOaJi+acuuWPt1wiO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gIHJlZ2lzdENvZGVBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT5cclxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGxldCByZWdpc3RDb2RlID0gY29udHJvbC52YWx1ZTtcclxuICAgICAgICBpZiAocmVnaXN0Q29kZSA9PSB1bmRlZmluZWQgfHwgcmVnaXN0Q29kZS50cmltKCkgPT0gXCJcIikge1xyXG4gICAgICAgICAgdGhpcy5waG9uZUNvZGVzRXJyb3JUaXAgPSBcIuivt+i+k+WFpemqjOivgeeggVwiO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9LCAxMDAwKTtcclxuICAgIH0pO1xyXG4gIC8vIOazqOWGjOWvhueggemqjOivgVxyXG4gIHJlZ3Bhc3N3b3JkQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XHJcbiAgICBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPikgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBsZXQgcmVncGFzc3dvcmQgPSBjb250cm9sLnZhbHVlO1xyXG4gICAgICAgIGlmIChyZWdwYXNzd29yZCA9PSB1bmRlZmluZWQgfHwgcmVncGFzc3dvcmQudHJpbSgpID09IFwiXCIpIHtcclxuICAgICAgICAgIHRoaXMucmVncGFzc3dvcmRFcnJvclRpcCA9IFwi6K+36L6T5YWl5a+G56CBXCI7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVncGFzc3dvcmQubGVuZ3RoIDwgNikge1xyXG4gICAgICAgICAgdGhpcy5yZWdwYXNzd29yZEVycm9yVGlwID0gXCLlr4bnoIHplb/luqbkuI3lvpflsI/kuo425L2NXCI7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVncGFzc3dvcmQubGVuZ3RoID4gMTIpIHtcclxuICAgICAgICAgIHRoaXMucmVncGFzc3dvcmRFcnJvclRpcCA9IFwi5a+G56CB6ZW/5bqm5LiN5b6X5aSn5LqOMTLkvY1cIjtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVncGFzc3dvcmQgPSByZWdwYXNzd29yZFxyXG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9KTtcclxuICAvLyDms6jlhowg56Gu6K6k5a+G56CB6aqM6K+BXHJcbiAgY29uZmlybVBhc3N3b3JkQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XHJcbiAgICBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPikgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBsZXQgY29uZmlybVBhc3N3b3JkID0gY29udHJvbC52YWx1ZTtcclxuICAgICAgICBpZiAoY29uZmlybVBhc3N3b3JkID09IHVuZGVmaW5lZCB8fCBjb25maXJtUGFzc3dvcmQudHJpbSgpID09IFwiXCIpIHtcclxuICAgICAgICAgIHRoaXMuY29uZmlybVBhc3N3b3JkRXJyb3JUaXAgPSBcIuivt+ehruiupOWvhueggVwiO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbmZpcm1QYXNzd29yZCAhPSB0aGlzLnJlZ3Bhc3N3b3JkKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpcm1QYXNzd29yZEVycm9yVGlwID0gXCLkuKTmrKHovpPlhaXlr4bnoIHkuI3kuIDoh7TvvIzor7fph43mlrDovpPlhaVcIjtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29uZmlybVBhc3N3b3JkID0gY29uZmlybVBhc3N3b3JkO1xyXG5cclxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgfSk7XHJcblxyXG4gIGNvZGU6IGFueSA9ICcnXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBcclxuICAgIC8vIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjb21wYW55JylcclxuICAgIC8vIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdwaWQnKVxyXG4gICAgLy8gbG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnBhcmFtTWFwLnN1YnNjcmliZShwYXJhbXMgPT4ge1xyXG4gICAgICBpZiAocGFyYW1zLmdldCgncCcpKSB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3BpZCcsIHBhcmFtcy5nZXQoJ3AnKSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY29tcGFueScsIHRoaXMuY29tcGFueUlkKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgdGhpcy5jcmVhdENvZGUoKTtcclxuICB9XHJcbiAgY3JlYXRDb2RlKCkge1xyXG4gICAgdGhpcy5jb2RlID0gJydcclxuICAgIGxldCBjb2RlTGVuZ3RoID0gNDsgIC8v6aqM6K+B56CB55qE6ZW/5bqmXHJcbiAgICBsZXQgY29kZUNoYXJzID0gW1xyXG4gICAgICAwLFxyXG4gICAgICAxLFxyXG4gICAgICAyLFxyXG4gICAgICAzLFxyXG4gICAgICA0LFxyXG4gICAgICA1LFxyXG4gICAgICA2LFxyXG4gICAgICA3LFxyXG4gICAgICA4LFxyXG4gICAgICA5LFxyXG4gICAgICBcImFcIixcclxuICAgICAgXCJiXCIsXHJcbiAgICAgIFwiY1wiLFxyXG4gICAgICBcImRcIixcclxuICAgICAgXCJlXCIsXHJcbiAgICAgIFwiZlwiLFxyXG4gICAgICBcImdcIixcclxuICAgICAgXCJoXCIsXHJcbiAgICAgIFwiaVwiLFxyXG4gICAgICBcImpcIixcclxuICAgICAgXCJrXCIsXHJcbiAgICAgIFwibFwiLFxyXG4gICAgICBcIm1cIixcclxuICAgICAgXCJuXCIsXHJcbiAgICAgIFwib1wiLFxyXG4gICAgICBcInBcIixcclxuICAgICAgXCJxXCIsXHJcbiAgICAgIFwiclwiLFxyXG4gICAgICBcInNcIixcclxuICAgICAgXCJ0XCIsXHJcbiAgICAgIFwidVwiLFxyXG4gICAgICBcInZcIixcclxuICAgICAgXCJ3XCIsXHJcbiAgICAgIFwieFwiLFxyXG4gICAgICBcInlcIixcclxuICAgICAgXCJ6XCIsXHJcbiAgICAgIFwiQVwiLFxyXG4gICAgICBcIkJcIixcclxuICAgICAgXCJDXCIsXHJcbiAgICAgIFwiRFwiLFxyXG4gICAgICBcIkVcIixcclxuICAgICAgXCJGXCIsXHJcbiAgICAgIFwiR1wiLFxyXG4gICAgICBcIkhcIixcclxuICAgICAgXCJJXCIsXHJcbiAgICAgIFwiSlwiLFxyXG4gICAgICBcIktcIixcclxuICAgICAgXCJMXCIsXHJcbiAgICAgIFwiTVwiLFxyXG4gICAgICBcIk5cIixcclxuICAgICAgXCJPXCIsXHJcbiAgICAgIFwiUFwiLFxyXG4gICAgICBcIlFcIixcclxuICAgICAgXCJSXCIsXHJcbiAgICAgIFwiU1wiLFxyXG4gICAgICBcIlRcIixcclxuICAgICAgXCJVXCIsXHJcbiAgICAgIFwiVlwiLFxyXG4gICAgICBcIldcIixcclxuICAgICAgXCJYXCIsXHJcbiAgICAgIFwiWVwiLFxyXG4gICAgICBcIlpcIlxyXG4gICAgXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZUxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjaGFyTnVtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNTIpXHJcbiAgICAgIHRoaXMuY29kZSArPSBjb2RlQ2hhcnNbY2hhck51bV07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwic3R1ZGVudC1sb2dpbi1sYXlvdXRcIj5cclxuICA8ZGl2IGNsYXNzPVwibmF2X2NlbnRlclwiPlxyXG4gICAgPGltZyBbc3JjXT1cImxvZ29cIiBhbHQ9XCJcIiBjbGFzcz1cImxvZ2luX2ltZ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm5hdl9sb2dpblwiPlxyXG4gICAgICA8bnotdGFic2V0IFtuelNlbGVjdGVkSW5kZXhdPVwidGFiSW5kZXhcIiBbbnpUYWJQb3NpdGlvbl09XCIndG9wJ1wiPlxyXG5cclxuICAgICAgICA8IS0tIOeZu+W9le+8muaJi+acuuWPtyvlr4bnoIHnmbvlhaUgLS0+XHJcbiAgICAgICAgPG56LXRhYiBuelRpdGxlPVwi5omL5py65a+G56CBXCIgc3R5bGU9XCJjb2xvcjogIzAwMDAwMDtcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09ICdsb2dpbidcIj5cclxuICAgICAgICAgICAgPGZvcm0gbnotZm9ybSBbZm9ybUdyb3VwXT1cInZhbGlkYXRlRm9ybVwiIChuZ1N1Ym1pdCk9XCJzdWJtaXRGb3JtTW9iaWxlUGFzc3dvcmQodmFsaWRhdGVGb3JtLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBuelJlcXVpcmVkPuaJi+acuuWPtzwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCIxNFwiIG56RXJyb3JUaXA9XCJ7e3VzZXJFcnJvclRpcH19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJtb2JpbGVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeaJi+acuuWPt1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7lr4Yg56CBPC9uei1mb3JtLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7cGFzc3dvcmRFcnJvclRpcH19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgW3R5cGVdPVwicGFzc3dvcmRWaXNpYmxlID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiICBmb3JtQ29udHJvbE5hbWU9XCJwYXNzd29yZFwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5a+G56CBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9uei1pbnB1dC1ncm91cD5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIFtuelR5cGVdPVwicGFzc3dvcmRWaXNpYmxlID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhc3N3b3JkVmlzaWJsZSA9ICFwYXNzd29yZFZpc2libGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtIGNsYXNzPVwiZm9ybS1jb250cm9sLWNvbnRhaW5cIj5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIGNsYXNzPVwiY29udGFpbl95YW56bVwiIG56UmVxdWlyZWQgPumqjOivgeeggSA8L256LWZvcm0tbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNlwiIG56RXJyb3JUaXA9XCJ7e2NvZGVFcnJvclRpcH19XCIgY2xhc3M9XCJjb250YWluX2lucHV0X3lhbnptXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZToxNHB4XCIgdGl0bGU9XCLor7fovpPlhaXpqozor4HnoIFcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLljLrliIblpKflsI/lhplcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwiY29kZVRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIiBoZWlnaHQ6IDEwMCU7IG1hcmdpbjogMCA0cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgbGV0dGVyLXNwYWNpbmc6IDJweDtcIj57e2NvZGV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwic3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImNyZWF0Q29kZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IzQwYTlmZjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIOaNouS4gOS4qlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dpbl9idG5cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbnotYnV0dG9uIG56VHlwZT1cInByaW1hcnlcIiBbbnpTaXplXT1cIidsYXJnZSdcIiBbZGlzYWJsZWRdPVwiIXZhbGlkYXRlRm9ybS52YWxpZFwiPueZu+W9lTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JnZXRcIj5cclxuICAgICAgICAgICAgICAgIDxoNiAoY2xpY2spPVwiZm9yZ2V0KClcIj7lv5jorrDlr4bnoIE8L2g2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09ICdmb3JnZXQnXCI+XHJcbiAgICAgICAgICAgIDxmb3JtIG56LWZvcm0gW2Zvcm1Hcm91cF09XCJmb3JnZXRGb3JtXCIgKG5nU3VibWl0KT1cImZvcmdldEZvcm1GdW4oZm9yZ2V0Rm9ybS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7nmbvlvZXotKblj7c8L256LWZvcm0tbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3t1c2VyRXJyb3JUaXB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZm9yZ2V0dXNlcm5hbWVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeaJi+acuuWPt1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7mlrAg5a+GIOeggTwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCIxNFwiIG56RXJyb3JUaXA9XCJ7e3Bhc3N3b3JkRXJyb3JUaXB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeFRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JnZXRQYXNzd29yZFwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5a+G56CBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9uei1pbnB1dC1ncm91cD5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIFtuelR5cGVdPVwicGFzc3dvcmRWaXNpYmxlID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhc3N3b3JkVmlzaWJsZSA9ICFwYXNzd29yZFZpc2libGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuXHJcbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+56Gu6K6k5a+G56CBPC9uei1mb3JtLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7Zm9yZ2V0cGhvbmVDb2Rlc0Vycm9yVGlwfX1cIj5cclxuICAgICAgICAgICAgICAgICAgPG56LWlucHV0LWdyb3VwIFtuelN1ZmZpeF09XCJzdWZmaXhUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBbdHlwZV09XCJwYXNzd29yZFZpc2libGUgPyAndGV4dCcgOiAncGFzc3dvcmQnXCIgIGZvcm1Db250cm9sTmFtZT1cImZvcmdldENvbmZpcm1wYXNzd29yZFwiIHBsYWNlaG9sZGVyPVwi6K+35YaN5qyh6L6T5YWl5a+G56CBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9uei1pbnB1dC1ncm91cD5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIFtuelR5cGVdPVwicGFzc3dvcmRWaXNpYmxlID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhc3N3b3JkVmlzaWJsZSA9ICFwYXNzd29yZFZpc2libGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuXHJcbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbSBjbGFzcz1cImZvcmdldF9jb250YWluXCI+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBuelJlcXVpcmVkID7pqowg6K+BIOeggTwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI4XCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3twaG9uZUNvZGVzRXJyb3JUaXB9fVwiIGNsYXNzPVwiY29kZUlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImZvcmdlcnBob25lQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLmiYvmnLrpqozor4HnoIFcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNlwiIGNsYXNzPVwiZ2V0Q29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQ291bnREb3duXCIgKGNsaWNrKT1cImdldENvZGUyKClcIiAgY2xhc3M9XCJnZXRfY29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiM0MGE5ZmY7Y3Vyc29yOiBwb2ludGVyOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMThweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICDojrflj5bpqozor4HnoIFcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvdW50RG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiM0MGE5ZmY7IGNvbG9yOiAjZmZmOyBwYWRkaW5nOiA1cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxOHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7Y291bnREb3dufX0v56eSXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ2luX2J0blwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT1cIndpZHRoOiAzNDhweDtcIiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtuelNpemVdPVwiJ2xhcmdlJ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZm9yZ2V0Rm9ybS52YWxpZFwiPumHjee9ruWvhueggTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JnZXRcIj5cclxuICAgICAgICAgICAgICAgIDxoNiAoY2xpY2spPVwiYmFja0xvZ2luKClcIj7ov5Tlm57nmbvlvZU8L2g2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPC9uei10YWI+XHJcblxyXG4gICAgICAgIDwhLS0g55m75b2V77ya5biQ5Y+3K+WvhueggeeZu+WFpSAtLT5cclxuICAgICAgICA8bnotdGFiIG56VGl0bGU9XCLluJDlj7flr4bnoIFcIiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwO1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT0gJ2xvZ2luJ1wiPlxyXG4gICAgICAgICAgICA8Zm9ybSBuei1mb3JtIFtmb3JtR3JvdXBdPVwidmFsaWRhdGVVc2VyRm9ybVwiIChuZ1N1Ym1pdCk9XCJzdWJtaXRGb3JtVXNlclBhc3N3b3JkKHZhbGlkYXRlVXNlckZvcm0udmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+5biQIOWPtzwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCIxNFwiIG56RXJyb3JUaXA9XCJ7e3VzZXJFcnJvclRpcH19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ1c2VybmFtZVwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5biQ5Y+3XCIgLz5cclxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxyXG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBuelJlcXVpcmVkPuWvhiDnoIE8L256LWZvcm0tbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3twYXNzd29yZEVycm9yVGlwfX1cIj5cclxuICAgICAgICAgICAgICAgICAgPG56LWlucHV0LWdyb3VwIFtuelN1ZmZpeF09XCJzdWZmaXhUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBbdHlwZV09XCJwYXNzd29yZFZpc2libGUgPyAndGV4dCcgOiAncGFzc3dvcmQnXCIgIGZvcm1Db250cm9sTmFtZT1cInBhc3N3b3JkXCIgcGxhY2Vob2xkZXI9XCLor7fovpPlhaXlr4bnoIFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3N1ZmZpeFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gW256VHlwZV09XCJwYXNzd29yZFZpc2libGUgPyAnZXllLWludmlzaWJsZScgOiAnZXllJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlID0gIXBhc3N3b3JkVmlzaWJsZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxyXG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0gY2xhc3M9XCJmb3JtLWNvbnRyb2wtY29udGFpblwiPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgY2xhc3M9XCJjb250YWluX3lhbnptXCIgbnpSZXF1aXJlZCA+6aqM6K+B56CBIDwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgbnpFcnJvclRpcD1cInt7Y29kZUVycm9yVGlwfX1cIiBjbGFzcz1cImNvbnRhaW5faW5wdXRfeWFuem1cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwiZm9udC1zaXplOjE0cHhcIiB0aXRsZT1cIuivt+i+k+WFpemqjOivgeeggVwiIG56LWlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuWMuuWIhuWkp+Wwj+WGmVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI0XCIgY2xhc3M9XCJjb2RlVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiIGhlaWdodDogMTAwJTsgbWFyZ2luOiAwIDRweDsgdGV4dC1hbGlnbjogY2VudGVyOyBsZXR0ZXItc3BhY2luZzogMnB4O1wiPnt7Y29kZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI0XCIgY2xhc3M9XCJzd2l0Y2hcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiY3JlYXRDb2RlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAg5o2i5LiA5LiqXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ2luX2J0blwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtuelNpemVdPVwiJ2xhcmdlJ1wiIFtkaXNhYmxlZF09XCIhdmFsaWRhdGVVc2VyRm9ybS52YWxpZFwiPueZu+W9lTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09ICdmb3JnZXQnXCI+XHJcbiAgICAgICAgICAgIDxmb3JtIG56LWZvcm0gW2Zvcm1Hcm91cF09XCJmb3JnZXRGb3JtXCIgKG5nU3VibWl0KT1cImZvcmdldEZvcm1GdW4oZm9yZ2V0Rm9ybS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7nmbvlvZXotKblj7c8L256LWZvcm0tbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3t1c2VyRXJyb3JUaXB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZm9yZ2V0dXNlcm5hbWVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeaJi+acuuWPt1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7mlrAg5a+GIOeggTwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCIxNFwiIG56RXJyb3JUaXA9XCJ7e3Bhc3N3b3JkRXJyb3JUaXB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeFRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JnZXRQYXNzd29yZFwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5a+G56CBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9uei1pbnB1dC1ncm91cD5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIFtuelR5cGVdPVwicGFzc3dvcmRWaXNpYmxlID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhc3N3b3JkVmlzaWJsZSA9ICFwYXNzd29yZFZpc2libGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuXHJcbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+56Gu6K6k5a+G56CBPC9uei1mb3JtLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7Zm9yZ2V0cGhvbmVDb2Rlc0Vycm9yVGlwfX1cIj5cclxuICAgICAgICAgICAgICAgICAgPG56LWlucHV0LWdyb3VwIFtuelN1ZmZpeF09XCJzdWZmaXhUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBbdHlwZV09XCJwYXNzd29yZFZpc2libGUgPyAndGV4dCcgOiAncGFzc3dvcmQnXCIgIGZvcm1Db250cm9sTmFtZT1cImZvcmdldENvbmZpcm1wYXNzd29yZFwiIHBsYWNlaG9sZGVyPVwi6K+35YaN5qyh6L6T5YWl5a+G56CBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9uei1pbnB1dC1ncm91cD5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIFtuelR5cGVdPVwicGFzc3dvcmRWaXNpYmxlID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhc3N3b3JkVmlzaWJsZSA9ICFwYXNzd29yZFZpc2libGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuXHJcbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbSBjbGFzcz1cImZvcmdldF9jb250YWluXCI+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBuelJlcXVpcmVkID7pqowg6K+BIOeggTwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI4XCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3twaG9uZUNvZGVzRXJyb3JUaXB9fVwiIGNsYXNzPVwiY29kZUlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImZvcmdlcnBob25lQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLmiYvmnLrpqozor4HnoIFcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNlwiIGNsYXNzPVwiZ2V0Q29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQ291bnREb3duXCIgKGNsaWNrKT1cImdldENvZGUyKClcIiAgY2xhc3M9XCJnZXRfY29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiM0MGE5ZmY7Y3Vyc29yOiBwb2ludGVyOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMThweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICDojrflj5bpqozor4HnoIFcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvdW50RG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiM0MGE5ZmY7IGNvbG9yOiAjZmZmOyBwYWRkaW5nOiA1cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxOHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7Y291bnREb3dufX0v56eSXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ2luX2J0blwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT1cIndpZHRoOiAzNDhweDtcIiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtuelNpemVdPVwiJ2xhcmdlJ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZm9yZ2V0Rm9ybS52YWxpZFwiPumHjee9ruWvhueggTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JnZXRcIj5cclxuICAgICAgICAgICAgICAgIDxoNiAoY2xpY2spPVwiYmFja0xvZ2luKClcIj7ov5Tlm57nmbvlvZU8L2g2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPC9uei10YWI+XHJcbiAgICAgICAgPCEtLSDnmbvlvZXvvJrmiYvmnLrlj7cr6aqM6K+B56CB55m75YWlIC0tPlxyXG4gICAgICAgIDxuei10YWIgbnpUaXRsZT1cIuefreS/oemqjOivgVwiIHN0eWxlPVwiY29sb3I6ICMwMDAwMDA7XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PSAnbG9naW4nXCI+XHJcbiAgICAgICAgICAgIDxmb3JtIG56LWZvcm0gW2Zvcm1Hcm91cF09XCJ2YWxpZGF0ZVNNU0Zvcm1cIiAobmdTdWJtaXQpPVwic3VibWl0Rm9ybU1vYmlsZVNNUyh2YWxpZGF0ZVNNU0Zvcm0udmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+5omLIOacuiDlj7c8L256LWZvcm0tbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3t1c2VyRXJyb3JUaXB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibW9iaWxlXCIgcGxhY2Vob2xkZXI9XCLor7fovpPlhaXmiYvmnLrlj7dcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcblxyXG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0gY2xhc3M9XCJmb3JtLWNvbnRyb2wtY29udGFpblwiPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgY2xhc3M9XCJjb250YWluX3lhbnptXCIgbnpSZXF1aXJlZCA+6aqM6K+B56CBPC9uei1mb3JtLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjZcIiBuekVycm9yVGlwPVwie3tjb2RlRXJyb3JUaXB9fVwiIGNsYXNzPVwiY29udGFpbl9pbnB1dF95YW56bVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJmb250LXNpemU6MTRweFwiIHRpdGxlPVwi6K+36L6T5YWl6aqM6K+B56CBXCIgbnotaW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0NvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi5Yy65YiG5aSn5bCP5YaZXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjRcIiBjbGFzcz1cImNvZGVUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIgaGVpZ2h0OiAxMDAlOyBtYXJnaW46IDAgNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGxldHRlci1zcGFjaW5nOiAycHg7XCI+e3tjb2RlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjRcIiBjbGFzcz1cInN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJjcmVhdENvZGUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiM0MGE5ZmY7IGNvbG9yOiAjZmZmOyBwYWRkaW5nOiA1cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgICAgICDmjaLkuIDkuKpcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuXHJcbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+55+t5L+h56CBPC9uei1mb3JtLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjEwXCIgbnpFcnJvclRpcD1cInt7c21zQ29kZUVycm9yVGlwfX1cIj5cclxuICAgICAgICAgICAgICAgICAgPG56LWlucHV0LWdyb3VwPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBbdHlwZV09XCIndGV4dCdcIiBbZGlzYWJsZWRdPVwiIWlzU2VuZGVkIHx8ICFjb2RlVmVyaWZpZWRcIiBmb3JtQ29udHJvbE5hbWU9XCJzbXNDb2RlXCIgcGxhY2Vob2xkZXI9XCLor7fovpPlhaXnn63kv6Hpqozor4HnoIFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxyXG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwic3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNTZW5kaW5nXCIgKGNsaWNrKT1cInNlbmRTTVNDb2RlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAg6I635Y+W6aqM6K+B56CBXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNTZW5kaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojZWZmNWY5OyBjb2xvcjogcmdiKDExOCwgMTE3LCAxMTcpOyBwYWRkaW5nOiA1cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e3Ntc1RpbWVDb3VudH19XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ2luX2J0blwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtuelNpemVdPVwiJ2xhcmdlJ1wiIFtkaXNhYmxlZF09XCIhdmFsaWRhdGVTTVNGb3JtLnZhbGlkXCI+55m75b2VPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbnotdGFiPlxyXG5cclxuICAgICAgICA8IS0tIOazqOWGjO+8muS8geS4mueUqOaIt1Byb2ZpbGXlvIDpgJogLS0+XHJcbiAgICAgICAgPG56LXRhYiAqbmdJZj1cIm1vYmlsZUxvZ2luXCIgbnpUaXRsZT1cIuW8gOmAmlwiIHN0eWxlPVwiY29sb3I6ICMwMDAwMDA7XCIgY2xhc3M9XCJhY3RpdmF0aW9uXCI+XHJcbiAgICAgICAgICA8Zm9ybSBuei1mb3JtIFtmb3JtR3JvdXBdPVwicmVnaXN0Rm9ybVwiIChuZ1N1Ym1pdCk9XCJyZWdpc3RTdWJtaXRGb3JtKHJlZ2lzdEZvcm0udmFsdWUpXCI+XHJcbiAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI3XCIgbnpSZXF1aXJlZD7lvIDpgJror4Hku7Y8L256LWZvcm0tbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjEyXCIgbnpIYXNGZWVkYmFjayBuelZhbGlkYXRpbmdUaXA9XCLpqozor4HkuK0uLi5cIlxyXG4gICAgICAgICAgICAgICAgbnpFcnJvclRpcD1cInt7cmVnaXN0SWRjYXJkRXJyb3JUaXB9fVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHRpdGxlPVwi6K+36L6T5YWl6Lqr5Lu96K+B5Y+356CBXCIgbnotaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicmVnaXN0SWRjYXJkXCIgcGxhY2Vob2xkZXI9XCLor7fovpPlhaXouqvku73or4Hlj7fnoIFcIiAvPlxyXG4gICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgPG56LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjdcIiBuelJlcXVpcmVkPuW8gOmAmuWnk+WQjTwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTJcIiBuekhhc0ZlZWRiYWNrIG56RXJyb3JUaXA9XCJ7e3JlZ2lzdE5hbWVFcnJvclRpcH19XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJyZWdpc3ROYW1lXCIgcGxhY2Vob2xkZXI9XCLor7fovpPlhaXlp5PlkI1cIiAvPlxyXG4gICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgPG56LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjdcIiBuelJlcXVpcmVkPue7keWumuaJi+acuuWPtzwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTJcIiBuekhhc0ZlZWRiYWNrIG56RXJyb3JUaXA9XCJ7e3Bob25lRXJyb3JUaXB9fVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwicmVnaXN0UGhvbmVcIiBuei1pbnB1dCAgc3R5bGU9XCJmb250LXNpemU6IDE4cHg7XCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZWdpc3RQaG9uZVwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5omL5py65Y+3XCIgLz5cclxuICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0gY2xhc3M9XCJ2ZXJpZnlDb2RlXCI+XHJcbiAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI3XCIgbnpSZXF1aXJlZD7miYvmnLrpqozor4HnoIE8L256LWZvcm0tbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjZcIiBjbGFzcz1cImNvZGVfaW5wdXRcIiBuekhhc0ZlZWRiYWNrIG56RXJyb3JUaXA9XCJ7e3Bob25lQ29kZXNFcnJvclRpcH19XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJmb250LXNpemU6IDE4cHg7XCIgbnotaW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJwaG9uZUNvZGVcIiBwbGFjZWhvbGRlcj1cIuaJi+acuumqjOivgeeggVwiIC8+XHJcbiAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjZcIiBjbGFzcz1cImNvZGVDb250YWluXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQ291bnREb3duXCIgKGNsaWNrKT1cImdldENvZGUoKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdldF9jb2RlXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiM0MGE5ZmY7IGN1cnNvcjogcG9pbnRlcjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE4cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgIOiOt+mqjOivgeeggVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb3VudERvd25cIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IzQwYTlmZjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE4cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7Y291bnREb3dufX0v56eSXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI3XCIgbnpSZXF1aXJlZD7lvIDpgJrlr4bnoIE8L256LWZvcm0tbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjEyXCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3tyZWdwYXNzd29yZEVycm9yVGlwfX1cIj5cclxuICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGUyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBbdHlwZV09XCJwYXNzd29yZFZpc2libGUyID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiIGZvcm1Db250cm9sTmFtZT1cInJlZ3Bhc3N3b3JkXCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeWvhueggVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZTI+XHJcbiAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gW256VHlwZV09XCJwYXNzd29yZFZpc2libGUyID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYXNzd29yZFZpc2libGUyID0gIXBhc3N3b3JkVmlzaWJsZTJcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgICA8L256LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgPG56LWZvcm0taXRlbT5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjdcIiBuelJlcXVpcmVkPuehruiupOWvhueggTwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTJcIiBuekhhc0ZlZWRiYWNrIG56RXJyb3JUaXA9XCJ7e2NvbmZpcm1QYXNzd29yZEVycm9yVGlwfX1cIj5cclxuICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGUzXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBbdHlwZV09XCJwYXNzd29yZFZpc2libGUzID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiIGZvcm1Db250cm9sTmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLor7fnoa7orqTlr4bnoIFcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9uei1pbnB1dC1ncm91cD5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3VmZml4VGVtcGxhdGUzPlxyXG4gICAgICAgICAgICAgICAgICA8aSBuei1pY29uIFtuelR5cGVdPVwicGFzc3dvcmRWaXNpYmxlMyA/ICdleWUtaW52aXNpYmxlJyA6ICdleWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlMyA9ICFwYXNzd29yZFZpc2libGUzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dpbl9idG5cIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cIiFyZWdpc3RGb3JtLnZhbGlkXCI+55Sz6K+35byA6YCaPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgIDwvbnotdGFiPlxyXG4gICAgICA8L256LXRhYnNldD5cclxuICAgICAgPGRpdiBjbGFzcz1cIm5hdl9sb2dpbl9yaWdodFwiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwibG9naW5fcmlnaHRfdGl0bGVcIj7kuoznu7TnoIE8L3A+XHJcbiAgICAgICAgPGltZyBbc3JjXT1cInFyY29kZVwiIGFsdD1cIuWFrOS8l+WPt+S6jOe7tOeggVwiPlxyXG4gICAgICAgIDxwPuaJq+eggei/m+WFpeW+ruS/oeerrzwvcD5cclxuICAgICAgICA8IS0tIDxwIGNsYXNzPVwibG9naW5fcmlnaHRfYm90dG9tXCI+6aaW5qyh55m75b2V5pyJ5oOK5ZacPC9wPiAtLT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibG9hZFdyYXBcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7XCJcclxuICAgICAgKm5nSWY9XCJsb2FkaW5nMlwiPlxyXG4gICAgICA8bnotc3BpbiBuelRpcD1cIuWKoOi9veS4re+8jOivt+eojeWQji4uLlwiPlxyXG4gICAgICAgIDxuei1hbGVydCBuelR5cGU9XCJpbmZvXCIgbnpNZXNzYWdlPVwi6K++56iL5Yqg6L295Lit77yM6K+356iN5ZCOLi4uXCI+PC9uei1hbGVydD5cclxuICAgICAgPC9uei1zcGluPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSDms6jplIAgLS0+XHJcbiAgICA8bnotbW9kYWwgWyhuelZpc2libGUpXT1cImlzVmlzaWJsZVwiIG56VGl0bGU9XCLmiYvmnLrlj7fplJnor69cIiAobnpPbkNhbmNlbCk9XCJoYW5kbGVDYW5jZWwoKVwiIChuek9uT2spPVwiaGFuZGxlT2soKVwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuek1vZGFsQ29udGVudD5cclxuICAgICAgICA8cD7miYvmnLrlj7fplJnor68sIOiBlOezu+euoeeQhuWRmOaguOWvueS/oeaBrzwvcD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L256LW1vZGFsPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/user/login/login.component.mjs
7
+ */
8
+ import{Component}from"@angular/core";import{FormBuilder,Validators}from"@angular/forms";import{Observable}from"rxjs";import{AuthService}from"./auth.service";import{FmodeParse}from"@fmode/parse";import{Router,ActivatedRoute}from"@angular/router";import{HttpClient}from"@angular/common/http";import{NovaCloudService}from"../../nova-cloud/nova-cloud.service";import{ToastController}from"@ionic/angular/standalone";import*as i0 from"@angular/core";import*as i1 from"./auth.service";import*as i2 from"../../nova-cloud/nova-cloud.service";import*as i3 from"@angular/forms";import*as i4 from"@ionic/angular/standalone";import*as i5 from"@angular/router";import*as i6 from"@angular/common/http";import*as i7 from"@angular/common";import*as i8 from"ng-zorro-antd/input";import*as i9 from"ng-zorro-antd/button";import*as i10 from"ng-zorro-antd/core/transition-patch";import*as i11 from"ng-zorro-antd/core/wave";import*as i12 from"ng-zorro-antd/modal";import*as i13 from"ng-zorro-antd/spin";import*as i14 from"ng-zorro-antd/tabs";import*as i15 from"ng-zorro-antd/grid";import*as i16 from"ng-zorro-antd/form";const Parse=FmodeParse.with("nova");export class LoginComponent{drawCode(n){this.canvas=document.getElementById("verifyCanvas");var e=this.canvas.getContext("2d");e.fillStyle="white",e.fillRect(0,0,this.canvas.width,this.canvas.height),e.fillStyle="cornflowerblue",e.font="25px Arial";for(var o=new Array,t=new Array,r=new Array,i=0;i<4;i++)o.push(o[i]),o[i]=this.nums[i],t[i]=20*i+10,r[i]=20*Math.random()+20,e.fillText(o[i],t[i],r[i]);n=o.join("").toUpperCase();for(i=0;i<3;i++)this.drawline(this.canvas,e);for(i=0;i<30;i++)this.drawDot(this.canvas,e);return this.convertCanvasToImage(this.canvas),n}drawline(n,e){e.moveTo(Math.floor(Math.random()*n.width),Math.floor(Math.random()*n.height)),e.lineTo(Math.floor(Math.random()*n.width),Math.floor(Math.random()*n.height)),e.lineWidth=.5,e.strokeStyle="rgba(50,50,50,0.3)",e.stroke()}drawDot(n,e){var o=Math.floor(Math.random()*n.width),t=Math.floor(Math.random()*n.height);e.moveTo(o,t),e.lineTo(o+1,t+1),e.lineWidth=.2,e.stroke()}convertCanvasToImage(n){return document.getElementById("verifyCanvas").style.display="none",this.image=document.getElementById("code_img"),this.image.src=n.toDataURL("image/png"),this.image}sendSMSCode(){if(!this.codeVerified)return void this.message.create("error","请先核对验证码");let n=this.validateSMSForm.value?.mobile;if(console.log(this.validateSMSForm.value),n){let e=localStorage.getItem("NOVA_APIG_SERVER");e=decodeURIComponent(atob(e));let o=e+"message";this.http.post(o,{company:this.companyId,mobile:n,action:"login"}).subscribe((n=>{this.countDownSMS(),this.message.info("已发送,请查收验证码")}),(n=>{this.message.error(n?.error?.mess||"系统繁忙中,请稍后重试")}))}else this.message.error("请正确输入手机号")}countDownSMS(){this.isSended=!0,this.isSending=!0,this.smsTimeCount=60;let n=setInterval((()=>{this.smsTimeCount--}),1e3);setTimeout((()=>{clearInterval(n),this.isSending=!1}),6e4)}submitFormMobileSMS(n){for(const n in this.validateSMSForm.controls)this.validateSMSForm.controls[n].markAsDirty(),this.validateSMSForm.controls[n].updateValueAndValidity();console.log(n),this.username=n.mobile,this.smsCode=n.smsCode,console.log("smslogin"),this.loginSMS()}submitFormMobilePassword(n){for(const n in this.validateForm.controls)this.validateForm.controls[n].markAsDirty(),this.validateForm.controls[n].updateValueAndValidity();this.username=n.mobile||n.username,this.password=n.password;let e=n.checkCode,o=this.code.toLowerCase(),t=e.toLowerCase();console.log(o,t),o!=t?(console.log(o,t),this.message.create("error","验证码错误")):this.loginMobilePassword()}submitFormUserPassword(n){for(const n in this.validateForm.controls)this.validateForm.controls[n].markAsDirty(),this.validateForm.controls[n].updateValueAndValidity();this.username=n.mobile||n.username,this.password=n.password;let e=n.checkCode,o=this.code.toLowerCase(),t=e.toLowerCase();console.log(o,t),o!=t?(console.log(o,t),this.message.create("error","验证码错误")):this.authServ.login(this.username,this.password).then((async n=>{})).catch((n=>{console.log(n),this.message.create("error","错误的用户名或密码")}))}async forgetFormFun(n){for(const n in this.forgetForm.controls)this.forgetForm.controls[n].markAsDirty(),this.forgetForm.controls[n].updateValueAndValidity();if(console.log(n.forgetusername,n.forgetPassword,n.forgetConfirmpassword),n.forgetPassword!=n.forgetConfirmpassword)return void this.message.create("error","两次密码不一致");if(!n.forgerphoneCode)return void this.message.create("error","请输入验证码");let e=(Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/")+"api/auth/reset_password";this.http.post(e,{company:this.companyId,mobile:n.forgetusername,code:n.forgerphoneCode,password:n.forgetConfirmpassword}).subscribe((n=>{200==n.code?(this.message.create("success",n.msg),this.type="login"):this.message.create("error","验证码错误")}),(n=>{console.log(n.error),this.message.create("error",n.error.mess)}))}async registSubmitForm(n){for(const n in this.registForm.controls)this.registForm.controls[n].markAsDirty(),this.registForm.controls[n].updateValueAndValidity();this.registName=n.registName,this.registIdcard=n.registIdcard,this.registPhone=n.registPhone,this.phoneCode=n.phoneCode,this.regpassword=n.regpassword,this.confirmPassword=n.confirmPassword;let e=await this.verifyCode(this.registPhone,this.phoneCode);e&&200!=e.code?this.message.create("error",e.mess):this.queryUser()}getSelectEducation(){this.loginMobilePassword(),this.iseducation=!1}loginSMS(){let n=(Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/")+`api/auth/mobile?company=${this.companyId}&mobile=${this.username}&code=${this.smsCode}`;this.http.get(n).subscribe((n=>{if(console.log(n),200==n.code){this.message.create("success","登录成功");let e=n.data.token;Parse.User.become(e).then((n=>{this.router.navigate([decodeURIComponent(this.rootPage)])}))}else this.message.create("error","验证码错误")}),(n=>{console.log(n.error),this.message.create("error",n.error.mess)}))}async loginMobilePassword(){let n=await this.getMobileUser(this.username);n?this.authServ.login(n,this.password).then((async n=>{})).catch((n=>{console.log(n),this.message.create("error","错误的用户名或密码")})):this.message.create("error","用户不存在,请尝试其他登录方式")}async queryUser(){let n=new Parse.Query("_User");n.contains("username",this.registPhone),n.equalTo("company",this.companyId);let e=await n.first();e?.id?this.message.info("该账户已激活,使用手机号密码直接登录"):Parse.User.signUp(this.companyId+"-"+this.registPhone,this.regpassword).then((async n=>{n.id&&(console.log(n),n.set("company",{__type:"Pointer",className:"Company",objectId:this.companyId}),n.set("mobile",this.registPhone),n.set("type","user"),n.save(),this.username=this.registPhone,this.password=this.regpassword)}))}async getMobileUser(n){if(this.mobileUserMap[n])return this.mobileUserMap[n];let e=await this.novaCloud.api("/auth/getusername",{company:this.companyId,mobile:n});return console.log(e),e?.username&&(this.mobileUserMap[n]=e?.username),this.mobileUserMap[n]}forget(){this.type="forget"}backLogin(){this.type="login"}handleCancel(){this.isVisible=!1}handleOk(){Parse.User.signUp(this.registPhone,this.regpassword).then((async n=>{n.id&&(console.log(n),n.set("company",{__type:"Pointer",className:"Company",objectId:this.companyId}),n.save(),this.username=this.registPhone,this.password=this.regpassword)}))}async getCode(){if(null==this.registPhone||""==this.registPhone.trim())return void this.message.info("请输入注册手机号");if(!this.registPhone.match(/^1[3456789]\d{9}$/))return void this.message.info("请输入正确的手机号");let n=new Parse.Query("User");n.equalTo("username",this.registPhone),n.equalTo("company",this.companyId);let e=await n.first();if(e&&e.id)return void this.message.info("该手机号已注册,请使用账号密码登录");let o=localStorage.getItem("NOVA_APIG_SERVER");o=decodeURIComponent(atob(o));let t=o+"message";this.http.post(t,{company:this.companyId,mobile:this.registPhone,action:"regist"}).subscribe((n=>{this.vCode=n.data.code,this.countDownFun()}),(n=>{this.message.info("系统繁忙中,请稍后重试"),console.log(n)}))}async getCode2(){if(null==this.forgetusername||""==this.forgetusername.trim())return void this.message.info("请输入账号");if(!this.forgetusername.match(/^1[3456789]\d{9}$/))return void this.message.info("请输入正确的手机号");console.log(this.forgetusername);let n=new Parse.Query("User");if(n.equalTo("username",this.companyId+"-"+this.forgetusername),n.equalTo("company",this.companyId),!await n.first())return void this.message.info("账号不存在");let e=localStorage.getItem("NOVA_APIG_SERVER");e=decodeURIComponent(atob(e));let o=e+"message";this.http.post(o,{company:this.companyId,mobile:this.forgetusername,action:"resetPassword"}).subscribe((n=>{console.log(n),this.vCode=n.data.code,this.countDownFun()}),(n=>{this.message.info("系统繁忙中,请稍后重试"),console.log(n)}))}async verifyCode(n,e){let o=localStorage.getItem("NOVA_APIG_SERVER");o=decodeURIComponent(atob(o));let t=o+"verifyCode";return new Promise((async(o,r)=>{this.http.post(t,{mobile:n,code:e}).subscribe((n=>{o(n)}),(n=>{console.log(n),o(n.error)}))}))}countDownFun(){if(this.isCountDown=!0,0==this.countDown)return;let n=setInterval((()=>{this.countDown=this.countDown-1,0==this.countDown&&(clearInterval(n),this.countDown=60,this.isCountDown=!1)}),1e3)}constructor(n,e,o,t,r,i,a,s){this.authServ=n,this.novaCloud=e,this.fb=o,this.toastCtrl=t,this.router=r,this.route=i,this.activatedRoute=a,this.http=s,this.nums=["C","6","Z","t"],this.str="",this.tabIndex=0,this.codeVerified=!1,this.passwordVisible=!1,this.passwordVisible2=!1,this.passwordVisible3=!1,this.iseducation=!1,this.redirectUrl=localStorage.getItem("redirectUrl"),this.isSended=!1,this.isSending=!1,this.smsTimeCount=60,this.loading=!0,this.Lesson=[],this.myDate=new Date,this.isVisible=!1,this.type="login",this.mobileUserMap={},this.isOkLoading=!1,this.countDown=60,this.isCountDown=!1,this.mobileLogin=!1,this.logo="https://www.fmode.cn/images/ewm1.png",this.qrcode="https://www.fmode.cn/images/logo_main.png",this.message=this.authServ.message,this.userNameAsyncValidator=n=>new Observable((e=>{let o=/^1[3456789]\d{9}$/,t=n.value;setTimeout((()=>null==t||""==t.trim()?(this.userErrorTip="请输入登录账号",e.next({error:!0,duplicated:!0}),void e.complete()):t.match(o)?(e.next(null),void e.complete()):(this.userErrorTip="请输入正确的登录账号",e.next({error:!0,duplicated:!0}),void e.complete())),1e3)})),this.smsAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.smsCodeErrorTip="请输入短信验证码",e.next({error:!0,duplicated:!0}),void e.complete();e.next(null),e.complete()}),1e3)})),this.passwordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.passwordErrorTip="请输入密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.passwordErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):(e.next(null),void e.complete())}),1e3)})),this.codeAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.codeVerified=!1,this.codeErrorTip="请输入验证码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<4?(this.codeVerified=!1,this.codeErrorTip="验证码长度不得小于4位",e.next({error:!0,duplicated:!0}),void e.complete()):this.code.toLowerCase()!=o.toLowerCase()?(this.codeVerified=!1,this.codeErrorTip="验证码输入错误",e.next({error:!0,duplicated:!0}),void e.complete()):(this.codeVerified=!0,e.next(null),void e.complete())}),1e3)})),this.registIdcardAsyncValidator=n=>new Observable((e=>{let o=n.value;setTimeout((()=>null==o||""==o.trim()||!1===/^\d{17}(\d|X|x)$/.test(o)?(this.registIdcardErrorTip="请输入正确的身份证号码",e.next({error:!0,duplicated:!0}),void e.complete()):(e.next(null),void e.complete())),1e3)})),this.forgetNameAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.registNameErrorTip="请输入账户账号或者手机号",e.next({error:!0,duplicated:!0}),void e.complete();this.forgetusername=o,e.next(null),e.complete()}),1e3)})),this.forgetPasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.passwordErrorTip="请输入新密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.passwordErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):(this.forgetPassword=o,e.next(null),void e.complete())}),1e3)})),this.forgetConfirmPasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.forgetphoneCodesErrorTip="请确认新密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.forgetphoneCodesErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):(this.forgetConfirmpassword=o,e.next(null),void e.complete())}),1e3)})),this.forgetCodeAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.phoneCodesErrorTip="请输入新密码",e.next({error:!0,duplicated:!0}),void e.complete();this.forgerphoneCode=o,e.next(null),e.complete()}),1e3)})),this.registNameAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.registNameErrorTip="请输入姓名",e.next({error:!0,duplicated:!0}),void e.complete();this.registName=o,e.next(null),e.complete()}),1e3)})),this.registPhoneAsyncValidator=n=>new Observable((e=>{let o=n.value;setTimeout((()=>null==o||""==o.trim()?(this.registIdcardErrorTip="请输入正确的身份证号码",e.next({error:!0,duplicated:!0}),void e.complete()):!1===/^1[3456789]\d{9}$/.test(o)?(this.phoneErrorTip="请输入正确的手机号",e.next({error:!0,duplicated:!0}),void e.complete()):(e.next(null),void e.complete())),1e3)})),this.registCodeAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.phoneCodesErrorTip="请输入验证码",e.next({error:!0,duplicated:!0}),void e.complete();e.next(null),e.complete()}),1e3)})),this.regpasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.regpasswordErrorTip="请输入密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.regpasswordErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):o.length>12?(this.regpasswordErrorTip="密码长度不得大于12位",e.next({error:!0,duplicated:!0}),void e.complete()):(this.regpassword=o,e.next(null),void e.complete())}),1e3)})),this.confirmPasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.confirmPasswordErrorTip="请确认密码",e.next({error:!0,duplicated:!0}),void e.complete()):o!=this.regpassword?(this.confirmPasswordErrorTip="两次输入密码不一致,请重新输入",e.next({error:!0,duplicated:!0}),void e.complete()):(this.confirmPassword=o,e.next(null),void e.complete())}),1e3)})),this.code="",this.initLoginForm(),this.route.paramMap.subscribe((async n=>{console.log(n),this.appId=n.get("appId"),await this.initAppConfig()||(this.companyId=n.get("companyId"),this.companyId||(this.companyId=localStorage.getItem("company")||"Q0DryNYA8g"),await this.initCompanyConfig())}))}async initCompanyConfig(){if(!this.companyId)return;let n=new Parse.Query("Company");this.company=await n.get(this.companyId),this.logo=this.company?.get("logo")||this.logo,this.qrcode=this.company?.get("qrcode")||this.qrcode,this.mobileLogin=this.company?.get("jpush")?.appkey||!1,this.rootPage=this.company?.get("rootPage")}async initAppConfig(){if(!this.appId)return!1;let n=new Parse.Query("App");return n.include("company"),this.app=await n.get(this.appId),console.log(this.app),this.logo=this.app?.get("logo")||this.logo,this.qrcode=this.app?.get("qrcode")||this.qrcode,this.mobileLogin=this.app?.get("jpush")?.appkey||!1,this.companyId=this.app?.get("company").id,this.rootPage=this.app?.get("rootPage"),!0}initLoginForm(){this.validateForm=this.fb.group({mobile:["",[Validators.required],[this.userNameAsyncValidator]],password:["",[Validators.required],[this.passwordAsyncValidator]],checkCode:["",[Validators.required],[this.codeAsyncValidator]]}),this.validateUserForm=this.fb.group({username:["",[Validators.required],[]],password:["",[Validators.required],[this.passwordAsyncValidator]],checkCode:["",[Validators.required],[this.codeAsyncValidator]]}),this.validateSMSForm=this.fb.group({mobile:["",[Validators.required],[this.userNameAsyncValidator]],password:[""],smsCode:["",[Validators.required],[this.smsAsyncValidator]],checkCode:["",[Validators.required],[this.codeAsyncValidator]]}),this.registForm=this.fb.group({registName:["",[Validators.required],[this.registNameAsyncValidator]],registIdcard:["",[Validators.required],[this.registIdcardAsyncValidator]],registPhone:["",[Validators.required],[this.registPhoneAsyncValidator]],phoneCode:["",[Validators.required],[this.registCodeAsyncValidator]],regpassword:["",[Validators.required],[this.regpasswordAsyncValidator]],confirmPassword:["",[Validators.required],[this.confirmPasswordAsyncValidator]]}),this.forgetForm=this.fb.group({forgetusername:["",[Validators.required],[this.forgetNameAsyncValidator]],forgetPassword:["",[Validators.required],[this.forgetPasswordAsyncValidator]],forgetConfirmpassword:["",[Validators.required],[this.forgetConfirmPasswordAsyncValidator]],forgerphoneCode:["",[Validators.required],[this.registCodeAsyncValidator]]})}ngOnInit(){this.activatedRoute.paramMap.subscribe((n=>{n.get("p")?localStorage.setItem("pid",n.get("p")):localStorage.setItem("company",this.companyId)})),this.creatCode()}creatCode(){this.code="";let n=[0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];for(let e=0;e<4;e++){let e=Math.floor(52*Math.random());this.code+=n[e]}}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:LoginComponent,deps:[{token:i1.AuthService},{token:i2.NovaCloudService},{token:i3.FormBuilder},{token:i4.ToastController},{token:i5.Router},{token:i5.ActivatedRoute},{token:i5.ActivatedRoute},{token:i6.HttpClient}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:LoginComponent,selector:"app-pcuser-login",ngImport:i0,template:'<div class="student-login-layout">\n <div class="nav_center">\n <img [src]="logo" alt="" class="login_img">\n <div class="nav_login">\n <nz-tabset [nzSelectedIndex]="tabIndex" [nzTabPosition]="\'top\'">\n\n \x3c!-- 登录:手机号+密码登入 --\x3e\n <nz-tab nzTitle="手机密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateForm" (ngSubmit)="submitFormMobilePassword(validateForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手机号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateForm.valid">登录</button>\n </div>\n <div class="forget">\n <h6 (click)="forget()">忘记密码</h6>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n\n \x3c!-- 登录:帐号+密码登入 --\x3e\n <nz-tab nzTitle="帐号密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateUserForm" (ngSubmit)="submitFormUserPassword(validateUserForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>帐 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="username" placeholder="请输入帐号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateUserForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n \x3c!-- 登录:手机号+验证码登入 --\x3e\n <nz-tab nzTitle="短信验证" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateSMSForm" (ngSubmit)="submitFormMobileSMS(validateSMSForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手 机 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>短信码</nz-form-label>\n <nz-form-control [nzSpan]="10" nzErrorTip="{{smsCodeErrorTip}}">\n <nz-input-group>\n <input nz-input [type]="\'text\'" [disabled]="!isSended || !codeVerified" formControlName="smsCode" placeholder="请输入短信验证码" />\n </nz-input-group>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div *ngIf="!isSending" (click)="sendSMSCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 获取验证码\n </div>\n <div *ngIf="isSending"\n style="background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;">\n {{smsTimeCount}}\n </div>\n </nz-form-control>\n </nz-form-item>\n \n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateSMSForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n </nz-tab>\n\n \x3c!-- 注册:企业用户Profile开通 --\x3e\n <nz-tab *ngIf="mobileLogin" nzTitle="开通" style="color: #000000;" class="activation">\n <form nz-form [formGroup]="registForm" (ngSubmit)="registSubmitForm(registForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通证件</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzValidatingTip="验证中..."\n nzErrorTip="{{registIdcardErrorTip}}">\n <input title="请输入身份证号码" nz-input formControlName="registIdcard" placeholder="请输入身份证号码" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通姓名</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{registNameErrorTip}}">\n <input nz-input type="text" formControlName="registName" placeholder="请输入姓名" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>绑定手机号</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{phoneErrorTip}}">\n <input [(ngModel)]="registPhone" nz-input style="font-size: 18px;" type="text"\n formControlName="registPhone" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="verifyCode">\n <nz-form-label [nzSpan]="7" nzRequired>手机验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" class="code_input" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}">\n <input style="font-size: 18px;" nz-input type="text" formControlName="phoneCode" placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="codeContain">\n <div *ngIf="!isCountDown" (click)="getCode()"\n class="get_code"\n style="background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{regpasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate2">\n <input nz-input [type]="passwordVisible2 ? \'text\' : \'password\'" formControlName="regpassword"\n placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate2>\n <i nz-icon [nzType]="passwordVisible2 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible2 = !passwordVisible2"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{confirmPasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate3">\n <input nz-input [type]="passwordVisible3 ? \'text\' : \'password\'" formControlName="confirmPassword"\n placeholder="请确认密码" />\n </nz-input-group>\n <ng-template #suffixTemplate3>\n <i nz-icon [nzType]="passwordVisible3 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible3 = !passwordVisible3"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [disabled]="!registForm.valid">申请开通</button>\n </div>\n </form>\n </nz-tab>\n </nz-tabset>\n <div class="nav_login_right">\n <p class="login_right_title">二维码</p>\n <img [src]="qrcode" alt="公众号二维码">\n <p>扫码进入微信端</p>\n \x3c!-- <p class="login_right_bottom">首次登录有惊喜</p> --\x3e\n </div>\n </div>\n\n <div class="loadWrap" style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;"\n *ngIf="loading2">\n <nz-spin nzTip="加载中,请稍后...">\n <nz-alert nzType="info" nzMessage="课程加载中,请稍后..."></nz-alert>\n </nz-spin>\n </div>\n\n \x3c!-- 注销 --\x3e\n <nz-modal [(nzVisible)]="isVisible" nzTitle="手机号错误" (nzOnCancel)="handleCancel()" (nzOnOk)="handleOk()">\n <ng-container *nzModalContent>\n <p>手机号错误, 联系管理员核对信息</p>\n </ng-container>\n </nz-modal>\n </div>\n</div>\n',styles:[".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"],dependencies:[{kind:"directive",type:i7.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:i3.ɵNgNoValidate,selector:"form:not([ngNoForm]):not([ngNativeValidate])"},{kind:"directive",type:i3.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i3.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i3.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i3.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i3.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:i8.NzInputDirective,selector:"input[nz-input],textarea[nz-input]",inputs:["nzBorderless","nzSize","nzStepperless","nzStatus","disabled"],exportAs:["nzInput"]},{kind:"component",type:i8.NzInputGroupComponent,selector:"nz-input-group",inputs:["nzAddOnBeforeIcon","nzAddOnAfterIcon","nzPrefixIcon","nzSuffixIcon","nzAddOnBefore","nzAddOnAfter","nzPrefix","nzStatus","nzSuffix","nzSize","nzSearch","nzCompact"],exportAs:["nzInputGroup"]},{kind:"directive",type:i8.NzInputGroupWhitSuffixOrPrefixDirective,selector:"nz-input-group[nzSuffix], nz-input-group[nzPrefix]"},{kind:"component",type:i9.NzButtonComponent,selector:"button[nz-button], a[nz-button]",inputs:["nzBlock","nzGhost","nzSearch","nzLoading","nzDanger","disabled","tabIndex","nzType","nzShape","nzSize"],exportAs:["nzButton"]},{kind:"directive",type:i10.ɵNzTransitionPatchDirective,selector:"[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group",inputs:["hidden"]},{kind:"directive",type:i11.NzWaveDirective,selector:'[nz-wave],button[nz-button]:not([nzType="link"]):not([nzType="text"])',inputs:["nzWaveExtraNode"],exportAs:["nzWave"]},{kind:"component",type:i12.NzModalComponent,selector:"nz-modal",inputs:["nzMask","nzMaskClosable","nzCloseOnNavigation","nzVisible","nzClosable","nzOkLoading","nzOkDisabled","nzCancelDisabled","nzCancelLoading","nzKeyboard","nzNoAnimation","nzCentered","nzDraggable","nzContent","nzFooter","nzZIndex","nzWidth","nzWrapClassName","nzClassName","nzStyle","nzTitle","nzCloseIcon","nzMaskStyle","nzBodyStyle","nzOkText","nzCancelText","nzOkType","nzOkDanger","nzIconType","nzModalType","nzAutofocus","nzOnOk","nzOnCancel"],outputs:["nzOnOk","nzOnCancel","nzAfterOpen","nzAfterClose","nzVisibleChange"],exportAs:["nzModal"]},{kind:"directive",type:i12.NzModalContentDirective,selector:"[nzModalContent]",exportAs:["nzModalContent"]},{kind:"component",type:i13.NzSpinComponent,selector:"nz-spin",inputs:["nzIndicator","nzSize","nzTip","nzDelay","nzSimple","nzSpinning"],exportAs:["nzSpin"]},{kind:"component",type:i14.NzTabSetComponent,selector:"nz-tabset",inputs:["nzSelectedIndex","nzTabPosition","nzTabBarExtraContent","nzCanDeactivate","nzAddIcon","nzTabBarStyle","nzType","nzSize","nzAnimated","nzTabBarGutter","nzHideAdd","nzCentered","nzHideAll","nzLinkRouter","nzLinkExact"],outputs:["nzSelectChange","nzSelectedIndexChange","nzTabListScroll","nzClose","nzAdd"],exportAs:["nzTabset"]},{kind:"component",type:i14.NzTabComponent,selector:"nz-tab",inputs:["nzTitle","nzClosable","nzCloseIcon","nzDisabled","nzForceRender"],outputs:["nzSelect","nzDeselect","nzClick","nzContextmenu"],exportAs:["nzTab"]},{kind:"directive",type:i15.NzColDirective,selector:"[nz-col],nz-col,nz-form-control,nz-form-label",inputs:["nzFlex","nzSpan","nzOrder","nzOffset","nzPush","nzPull","nzXs","nzSm","nzMd","nzLg","nzXl","nzXXl"],exportAs:["nzCol"]},{kind:"directive",type:i15.NzRowDirective,selector:"[nz-row],nz-row,nz-form-item",inputs:["nzAlign","nzJustify","nzGutter"],exportAs:["nzRow"]},{kind:"directive",type:i16.NzFormDirective,selector:"[nz-form]",inputs:["nzLayout","nzNoColon","nzAutoTips","nzDisableAutoTips","nzTooltipIcon","nzLabelAlign","nzLabelWrap"],exportAs:["nzForm"]},{kind:"component",type:i16.NzFormItemComponent,selector:"nz-form-item",exportAs:["nzFormItem"]},{kind:"component",type:i16.NzFormLabelComponent,selector:"nz-form-label",inputs:["nzFor","nzRequired","nzNoColon","nzTooltipTitle","nzTooltipIcon","nzLabelAlign","nzLabelWrap"],exportAs:["nzFormLabel"]},{kind:"component",type:i16.NzFormControlComponent,selector:"nz-form-control",inputs:["nzSuccessTip","nzWarningTip","nzErrorTip","nzValidatingTip","nzExtra","nzAutoTips","nzDisableAutoTips","nzHasFeedback","nzValidateStatus"],exportAs:["nzFormControl"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:LoginComponent,decorators:[{type:Component,args:[{selector:"app-pcuser-login",template:'<div class="student-login-layout">\n <div class="nav_center">\n <img [src]="logo" alt="" class="login_img">\n <div class="nav_login">\n <nz-tabset [nzSelectedIndex]="tabIndex" [nzTabPosition]="\'top\'">\n\n \x3c!-- 登录:手机号+密码登入 --\x3e\n <nz-tab nzTitle="手机密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateForm" (ngSubmit)="submitFormMobilePassword(validateForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手机号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateForm.valid">登录</button>\n </div>\n <div class="forget">\n <h6 (click)="forget()">忘记密码</h6>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n\n \x3c!-- 登录:帐号+密码登入 --\x3e\n <nz-tab nzTitle="帐号密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateUserForm" (ngSubmit)="submitFormUserPassword(validateUserForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>帐 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="username" placeholder="请输入帐号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateUserForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n \x3c!-- 登录:手机号+验证码登入 --\x3e\n <nz-tab nzTitle="短信验证" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateSMSForm" (ngSubmit)="submitFormMobileSMS(validateSMSForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手 机 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>短信码</nz-form-label>\n <nz-form-control [nzSpan]="10" nzErrorTip="{{smsCodeErrorTip}}">\n <nz-input-group>\n <input nz-input [type]="\'text\'" [disabled]="!isSended || !codeVerified" formControlName="smsCode" placeholder="请输入短信验证码" />\n </nz-input-group>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div *ngIf="!isSending" (click)="sendSMSCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 获取验证码\n </div>\n <div *ngIf="isSending"\n style="background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;">\n {{smsTimeCount}}\n </div>\n </nz-form-control>\n </nz-form-item>\n \n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateSMSForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n </nz-tab>\n\n \x3c!-- 注册:企业用户Profile开通 --\x3e\n <nz-tab *ngIf="mobileLogin" nzTitle="开通" style="color: #000000;" class="activation">\n <form nz-form [formGroup]="registForm" (ngSubmit)="registSubmitForm(registForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通证件</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzValidatingTip="验证中..."\n nzErrorTip="{{registIdcardErrorTip}}">\n <input title="请输入身份证号码" nz-input formControlName="registIdcard" placeholder="请输入身份证号码" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通姓名</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{registNameErrorTip}}">\n <input nz-input type="text" formControlName="registName" placeholder="请输入姓名" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>绑定手机号</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{phoneErrorTip}}">\n <input [(ngModel)]="registPhone" nz-input style="font-size: 18px;" type="text"\n formControlName="registPhone" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="verifyCode">\n <nz-form-label [nzSpan]="7" nzRequired>手机验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" class="code_input" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}">\n <input style="font-size: 18px;" nz-input type="text" formControlName="phoneCode" placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="codeContain">\n <div *ngIf="!isCountDown" (click)="getCode()"\n class="get_code"\n style="background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{regpasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate2">\n <input nz-input [type]="passwordVisible2 ? \'text\' : \'password\'" formControlName="regpassword"\n placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate2>\n <i nz-icon [nzType]="passwordVisible2 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible2 = !passwordVisible2"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{confirmPasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate3">\n <input nz-input [type]="passwordVisible3 ? \'text\' : \'password\'" formControlName="confirmPassword"\n placeholder="请确认密码" />\n </nz-input-group>\n <ng-template #suffixTemplate3>\n <i nz-icon [nzType]="passwordVisible3 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible3 = !passwordVisible3"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [disabled]="!registForm.valid">申请开通</button>\n </div>\n </form>\n </nz-tab>\n </nz-tabset>\n <div class="nav_login_right">\n <p class="login_right_title">二维码</p>\n <img [src]="qrcode" alt="公众号二维码">\n <p>扫码进入微信端</p>\n \x3c!-- <p class="login_right_bottom">首次登录有惊喜</p> --\x3e\n </div>\n </div>\n\n <div class="loadWrap" style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;"\n *ngIf="loading2">\n <nz-spin nzTip="加载中,请稍后...">\n <nz-alert nzType="info" nzMessage="课程加载中,请稍后..."></nz-alert>\n </nz-spin>\n </div>\n\n \x3c!-- 注销 --\x3e\n <nz-modal [(nzVisible)]="isVisible" nzTitle="手机号错误" (nzOnCancel)="handleCancel()" (nzOnOk)="handleOk()">\n <ng-container *nzModalContent>\n <p>手机号错误, 联系管理员核对信息</p>\n </ng-container>\n </nz-modal>\n </div>\n</div>\n',styles:[".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"]}]}],ctorParameters:()=>[{type:i1.AuthService},{type:i2.NovaCloudService},{type:i3.FormBuilder},{type:i4.ToastController},{type:i5.Router},{type:i5.ActivatedRoute},{type:i5.ActivatedRoute},{type:i6.HttpClient}]});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi91c2VyL2xvZ2luL2xvZ2luLmNvbXBvbmVudC5tanM=`
10
+