From 735120f1cbcf5c454a6567dd8ee7d5d086aef182 Mon Sep 17 00:00:00 2001 From: yangsh Date: Tue, 9 Dec 2025 17:28:31 +0900 Subject: [PATCH] new --- Dockerfile | 22 +- app/Cells/MenuCell.php | 30 + app/Config/Database.php | 82 +- app/Config/Filters.php | 28 +- app/Config/Routes.php | 57 +- app/Controllers/BaseController.php | 51 +- app/Controllers/Home.php | 15 - app/Controllers/Login.php | 164 + app/Controllers/Main.php | 17 - app/Controllers/board/Notice.php | 298 ++ app/Controllers/home/Home.php | 45 + app/Controllers/listfax/ListFax.php | 188 + app/Controllers/manage/Dept.php | 137 + app/Controllers/manage/LoginLog.php | 56 + app/Controllers/manage/Menu.php | 225 + app/Controllers/manage/Phone.php | 115 + app/Controllers/manage/User.php | 183 + app/Filters/AuthCheck.php | 4 +- app/Helpers/array_helper.php | 71 + app/Helpers/string_helper.php | 41 + app/Helpers/url_helper.php | 43 + app/Libraries/Common.php | 36 + app/Models/Home/HomeModel.php | 151 + app/Models/board/NoticeModel.php | 276 + app/Models/common/CodeModel.php | 22 + app/Models/common/LoginModel.php | 51 + app/Models/common/MenuModel.php | 40 + app/Models/listfax/ListFaxModel.php | 10 + app/Models/manage/DeptModel.php | 199 + app/Models/manage/LoginLogModel.php | 93 + app/Models/manage/MenuModel.php | 50 + app/Models/manage/PhoneModel.php | 79 + app/Models/manage/UserModel.php | 443 ++ app/Views/layouts/header.php | 52 +- app/Views/layouts/loading-indicator.php | 15 + app/Views/layouts/main.php | 11 +- app/Views/layouts/sidebar.php | 215 +- app/Views/layouts/topbar.php | 13 +- app/Views/pages/board/notice.php | 135 + app/Views/pages/board/noticeDetail.php | 127 + app/Views/pages/board/noticeModify.php | 134 + app/Views/pages/board/noticeWrite.php | 126 + app/Views/pages/dashboard.php | 196 - app/Views/pages/home/dashboard.php | 161 + app/Views/pages/login.php | 202 +- app/Views/pages/manage/dept/lists.php | 559 ++ app/Views/pages/manage/dept/users.php | 159 + app/Views/pages/manage/log/lists.php | 164 + app/Views/pages/manage/menu/lists.php | 133 + app/Views/pages/manage/phone/lists.php | 431 ++ app/Views/pages/manage/user/lists.php | 658 +++ public/architectui/2463b90d9a316e4e5294.woff2 | Bin 0 -> 158220 bytes public/architectui/assets/fonts/AD.svg | 35 + public/architectui/assets/fonts/AE.svg | 33 + public/architectui/assets/fonts/AF.svg | 34 + public/architectui/assets/fonts/AG.svg | 44 + public/architectui/assets/fonts/AI.svg | 50 + public/architectui/assets/fonts/AL.svg | 27 + public/architectui/assets/fonts/AM.svg | 32 + public/architectui/assets/fonts/AO.svg | 37 + public/architectui/assets/fonts/AR.svg | 26 + public/architectui/assets/fonts/AS.svg | 36 + public/architectui/assets/fonts/AT.svg | 24 + public/architectui/assets/fonts/AU.svg | 36 + public/architectui/assets/fonts/AW.svg | 30 + public/architectui/assets/fonts/AX.svg | 32 + public/architectui/assets/fonts/AZ.svg | 33 + public/architectui/assets/fonts/BA.svg | 32 + public/architectui/assets/fonts/BB.svg | 38 + public/architectui/assets/fonts/BD.svg | 27 + public/architectui/assets/fonts/BE.svg | 32 + public/architectui/assets/fonts/BF.svg | 28 + public/architectui/assets/fonts/BG.svg | 28 + public/architectui/assets/fonts/BH.svg | 23 + public/architectui/assets/fonts/BI.svg | 36 + public/architectui/assets/fonts/BJ.svg | 32 + public/architectui/assets/fonts/BL.svg | 42 + public/architectui/assets/fonts/BM.svg | 49 + public/architectui/assets/fonts/BN.svg | 28 + public/architectui/assets/fonts/BO.svg | 32 + public/architectui/assets/fonts/BR.svg | 35 + public/architectui/assets/fonts/BS.svg | 33 + public/architectui/assets/fonts/BT.svg | 27 + public/architectui/assets/fonts/BV.svg | 28 + public/architectui/assets/fonts/BW.svg | 29 + public/architectui/assets/fonts/BY.svg | 30 + public/architectui/assets/fonts/BZ.svg | 30 + public/architectui/assets/fonts/CA.svg | 25 + public/architectui/assets/fonts/CC.svg | 33 + public/architectui/assets/fonts/CD.svg | 31 + public/architectui/assets/fonts/CF.svg | 43 + public/architectui/assets/fonts/CG.svg | 34 + public/architectui/assets/fonts/CH.svg | 23 + public/architectui/assets/fonts/CI.svg | 28 + public/architectui/assets/fonts/CK.svg | 31 + public/architectui/assets/fonts/CL.svg | 29 + public/architectui/assets/fonts/CM.svg | 38 + public/architectui/assets/fonts/CN.svg | 32 + public/architectui/assets/fonts/CO.svg | 32 + public/architectui/assets/fonts/CR.svg | 29 + public/architectui/assets/fonts/CU.svg | 32 + public/architectui/assets/fonts/CV.svg | 30 + public/architectui/assets/fonts/CW.svg | 29 + public/architectui/assets/fonts/CX.svg | 38 + public/architectui/assets/fonts/CY.svg | 24 + public/architectui/assets/fonts/CZ.svg | 28 + public/architectui/assets/fonts/DE.svg | 32 + public/architectui/assets/fonts/DJ.svg | 33 + public/architectui/assets/fonts/DK.svg | 23 + public/architectui/assets/fonts/DM.svg | 41 + public/architectui/assets/fonts/DO.svg | 33 + public/architectui/assets/fonts/DZ.svg | 29 + public/architectui/assets/fonts/EC.svg | 39 + public/architectui/assets/fonts/EE.svg | 28 + public/architectui/assets/fonts/EG.svg | 30 + public/architectui/assets/fonts/ER.svg | 40 + public/architectui/assets/fonts/ES.svg | 34 + public/architectui/assets/fonts/ET.svg | 42 + public/architectui/assets/fonts/EU.svg | 27 + public/architectui/assets/fonts/FI.svg | 22 + public/architectui/assets/fonts/FJ.svg | 51 + public/architectui/assets/fonts/FK.svg | 58 + public/architectui/assets/fonts/FM.svg | 23 + public/architectui/assets/fonts/FO.svg | 27 + public/architectui/assets/fonts/FR.svg | 28 + public/architectui/assets/fonts/GA.svg | 32 + public/architectui/assets/fonts/GB-ENG.svg | 22 + public/architectui/assets/fonts/GB-NIR.svg | 41 + public/architectui/assets/fonts/GB-SCT.svg | 23 + public/architectui/assets/fonts/GB-WLS.svg | 28 + public/architectui/assets/fonts/GB-ZET.svg | 23 + public/architectui/assets/fonts/GB.svg | 32 + public/architectui/assets/fonts/GD.svg | 49 + public/architectui/assets/fonts/GE.svg | 26 + public/architectui/assets/fonts/GF.svg | 32 + public/architectui/assets/fonts/GG.svg | 27 + public/architectui/assets/fonts/GH.svg | 37 + public/architectui/assets/fonts/GI.svg | 38 + public/architectui/assets/fonts/GL.svg | 33 + public/architectui/assets/fonts/GM.svg | 33 + public/architectui/assets/fonts/GN.svg | 32 + public/architectui/assets/fonts/GP.svg | 40 + public/architectui/assets/fonts/GQ.svg | 34 + public/architectui/assets/fonts/GR.svg | 22 + public/architectui/assets/fonts/GS.svg | 112 + public/architectui/assets/fonts/GT.svg | 26 + public/architectui/assets/fonts/GU.svg | 65 + public/architectui/assets/fonts/GW.svg | 37 + public/architectui/assets/fonts/GY.svg | 42 + public/architectui/assets/fonts/HK.svg | 23 + public/architectui/assets/fonts/HM.svg | 36 + public/architectui/assets/fonts/HN.svg | 33 + public/architectui/assets/fonts/HR.svg | 35 + public/architectui/assets/fonts/HT.svg | 46 + public/architectui/assets/fonts/HU.svg | 28 + public/architectui/assets/fonts/ID.svg | 23 + public/architectui/assets/fonts/IE.svg | 28 + public/architectui/assets/fonts/IL.svg | 26 + public/architectui/assets/fonts/IM.svg | 30 + public/architectui/assets/fonts/IN.svg | 31 + public/architectui/assets/fonts/IO.svg | 33 + public/architectui/assets/fonts/IQ.svg | 33 + public/architectui/assets/fonts/IR.svg | 31 + public/architectui/assets/fonts/IS.svg | 28 + public/architectui/assets/fonts/IT.svg | 28 + public/architectui/assets/fonts/JE.svg | 32 + public/architectui/assets/fonts/JM.svg | 33 + public/architectui/assets/fonts/JO.svg | 34 + public/architectui/assets/fonts/JP.svg | 22 + public/architectui/assets/fonts/KE.svg | 43 + public/architectui/assets/fonts/KG.svg | 28 + public/architectui/assets/fonts/KH.svg | 29 + public/architectui/assets/fonts/KI.svg | 35 + public/architectui/assets/fonts/KM.svg | 39 + public/architectui/assets/fonts/KN.svg | 39 + public/architectui/assets/fonts/KP.svg | 30 + public/architectui/assets/fonts/KR.svg | 38 + public/architectui/assets/fonts/KW.svg | 33 + public/architectui/assets/fonts/KY.svg | 44 + public/architectui/assets/fonts/KZ.svg | 29 + public/architectui/assets/fonts/LA.svg | 29 + public/architectui/assets/fonts/LB.svg | 29 + public/architectui/assets/fonts/LC.svg | 33 + public/architectui/assets/fonts/LGBT.svg | 42 + public/architectui/assets/fonts/LI.svg | 27 + public/architectui/assets/fonts/LK.svg | 43 + public/architectui/assets/fonts/LR.svg | 36 + public/architectui/assets/fonts/LS.svg | 34 + public/architectui/assets/fonts/LT.svg | 32 + public/architectui/assets/fonts/LU.svg | 28 + public/architectui/assets/fonts/LV.svg | 24 + public/architectui/assets/fonts/LY.svg | 33 + .../assets/fonts/Linearicons-Free.eot | Bin 0 -> 55820 bytes .../assets/fonts/Linearicons-Free.svg | 541 ++ .../assets/fonts/Linearicons-Free.ttf | Bin 0 -> 55620 bytes .../assets/fonts/Linearicons-Free.woff | Bin 0 -> 55696 bytes .../assets/fonts/Linearicons-Free.woff2 | Bin 0 -> 21780 bytes public/architectui/assets/fonts/MA.svg | 23 + public/architectui/assets/fonts/MC.svg | 23 + public/architectui/assets/fonts/MD.svg | 42 + public/architectui/assets/fonts/ME.svg | 29 + public/architectui/assets/fonts/MF.svg | 28 + public/architectui/assets/fonts/MG.svg | 28 + public/architectui/assets/fonts/MH.svg | 29 + public/architectui/assets/fonts/MK.svg | 29 + public/architectui/assets/fonts/ML.svg | 32 + public/architectui/assets/fonts/MM.svg | 33 + public/architectui/assets/fonts/MN.svg | 33 + public/architectui/assets/fonts/MO.svg | 26 + public/architectui/assets/fonts/MP.svg | 29 + public/architectui/assets/fonts/MQ.svg | 27 + public/architectui/assets/fonts/MR.svg | 27 + public/architectui/assets/fonts/MS.svg | 47 + public/architectui/assets/fonts/MT.svg | 29 + public/architectui/assets/fonts/MU.svg | 37 + public/architectui/assets/fonts/MV.svg | 28 + public/architectui/assets/fonts/MW.svg | 33 + public/architectui/assets/fonts/MX.svg | 30 + public/architectui/assets/fonts/MY.svg | 32 + public/architectui/assets/fonts/MZ.svg | 43 + public/architectui/assets/fonts/NA.svg | 75 + public/architectui/assets/fonts/NC.svg | 42 + public/architectui/assets/fonts/NE.svg | 33 + public/architectui/assets/fonts/NF.svg | 29 + public/architectui/assets/fonts/NG.svg | 24 + public/architectui/assets/fonts/NI.svg | 26 + public/architectui/assets/fonts/NL.svg | 28 + public/architectui/assets/fonts/NO.svg | 28 + public/architectui/assets/fonts/NP.svg | 35 + public/architectui/assets/fonts/NR.svg | 28 + public/architectui/assets/fonts/NU.svg | 41 + public/architectui/assets/fonts/NZ.svg | 34 + public/architectui/assets/fonts/OM.svg | 29 + public/architectui/assets/fonts/PA.svg | 30 + public/architectui/assets/fonts/PE.svg | 24 + public/architectui/assets/fonts/PF.svg | 52 + public/architectui/assets/fonts/PG.svg | 36 + public/architectui/assets/fonts/PH.svg | 33 + public/architectui/assets/fonts/PK.svg | 32 + public/architectui/assets/fonts/PL.svg | 23 + public/architectui/assets/fonts/PM.svg | 66 + public/architectui/assets/fonts/PN.svg | 51 + public/architectui/assets/fonts/PR.svg | 30 + public/architectui/assets/fonts/PS.svg | 33 + public/architectui/assets/fonts/PT.svg | 38 + public/architectui/assets/fonts/PW.svg | 27 + public/architectui/assets/fonts/PY.svg | 30 + .../assets/fonts/Pe-icon-7-stroke.eot | Bin 0 -> 58680 bytes .../assets/fonts/Pe-icon-7-stroke.svg | 212 + .../assets/fonts/Pe-icon-7-stroke.ttf | Bin 0 -> 58480 bytes .../assets/fonts/Pe-icon-7-stroke.woff | Bin 0 -> 58556 bytes public/architectui/assets/fonts/QA.svg | 23 + public/architectui/assets/fonts/RE.svg | 28 + public/architectui/assets/fonts/RO.svg | 32 + public/architectui/assets/fonts/RS.svg | 39 + public/architectui/assets/fonts/RU.svg | 28 + public/architectui/assets/fonts/RW.svg | 37 + public/architectui/assets/fonts/SA.svg | 26 + public/architectui/assets/fonts/SB.svg | 39 + public/architectui/assets/fonts/SC.svg | 43 + public/architectui/assets/fonts/SD.svg | 33 + public/architectui/assets/fonts/SE.svg | 27 + public/architectui/assets/fonts/SG.svg | 24 + public/architectui/assets/fonts/SH.svg | 53 + public/architectui/assets/fonts/SI.svg | 28 + public/architectui/assets/fonts/SJ.svg | 28 + public/architectui/assets/fonts/SK.svg | 46 + public/architectui/assets/fonts/SL.svg | 28 + public/architectui/assets/fonts/SM.svg | 25 + public/architectui/assets/fonts/SN.svg | 33 + public/architectui/assets/fonts/SO.svg | 23 + public/architectui/assets/fonts/SR.svg | 34 + public/architectui/assets/fonts/SS.svg | 44 + public/architectui/assets/fonts/ST.svg | 39 + public/architectui/assets/fonts/SV.svg | 30 + public/architectui/assets/fonts/SX.svg | 45 + public/architectui/assets/fonts/SY.svg | 34 + public/architectui/assets/fonts/SZ.svg | 47 + public/architectui/assets/fonts/TC.svg | 40 + public/architectui/assets/fonts/TD.svg | 32 + public/architectui/assets/fonts/TF.svg | 35 + public/architectui/assets/fonts/TG.svg | 33 + public/architectui/assets/fonts/TH.svg | 29 + public/architectui/assets/fonts/TJ.svg | 29 + public/architectui/assets/fonts/TK.svg | 31 + public/architectui/assets/fonts/TL.svg | 33 + public/architectui/assets/fonts/TM.svg | 74 + public/architectui/assets/fonts/TN.svg | 23 + public/architectui/assets/fonts/TO.svg | 28 + public/architectui/assets/fonts/TR.svg | 23 + public/architectui/assets/fonts/TT.svg | 28 + public/architectui/assets/fonts/TV.svg | 36 + public/architectui/assets/fonts/TW.svg | 28 + public/architectui/assets/fonts/TZ.svg | 37 + public/architectui/assets/fonts/UA.svg | 27 + public/architectui/assets/fonts/UG.svg | 37 + public/architectui/assets/fonts/UM.svg | 28 + public/architectui/assets/fonts/US-CA.svg | 33 + public/architectui/assets/fonts/US.svg | 28 + public/architectui/assets/fonts/UY.svg | 29 + public/architectui/assets/fonts/UZ.svg | 29 + public/architectui/assets/fonts/VA.svg | 39 + public/architectui/assets/fonts/VC.svg | 37 + public/architectui/assets/fonts/VE.svg | 33 + public/architectui/assets/fonts/VG.svg | 42 + public/architectui/assets/fonts/VI.svg | 49 + public/architectui/assets/fonts/VN.svg | 27 + public/architectui/assets/fonts/VU.svg | 38 + public/architectui/assets/fonts/WF.svg | 28 + public/architectui/assets/fonts/WS.svg | 28 + public/architectui/assets/fonts/XK.svg | 28 + public/architectui/assets/fonts/YE.svg | 28 + public/architectui/assets/fonts/YT.svg | 77 + public/architectui/assets/fonts/ZA.svg | 44 + public/architectui/assets/fonts/ZM.svg | 42 + public/architectui/assets/fonts/ZW.svg | 43 + .../architectui/assets/fonts/fa-solid-900.eot | Bin 0 -> 192758 bytes .../architectui/assets/fonts/fa-solid-900.svg | 4667 +++++++++++++++++ .../architectui/assets/fonts/fa-solid-900.ttf | Bin 0 -> 192472 bytes .../assets/fonts/fa-solid-900.woff | Bin 0 -> 98384 bytes .../assets/fonts/fa-solid-900.woff2 | Bin 0 -> 75728 bytes public/architectui/assets/fonts/ionicons.eot | Bin 0 -> 120724 bytes public/architectui/assets/fonts/ionicons.svg | 2230 ++++++++ public/architectui/assets/fonts/ionicons.ttf | Bin 0 -> 188508 bytes public/architectui/assets/fonts/ionicons.woff | Bin 0 -> 67904 bytes public/architectui/assets/js/datatable.kor.js | 24 + .../apex_charts.98288b227c064e6a107f.js | 1 + public/architectui/assets/scripts/app.js | 370 ++ .../scripts/blockui.98288b227c064e6a107f.js | 1 + .../carousel_slider.98288b227c064e6a107f.js | 1 + .../scripts/chart_js.98288b227c064e6a107f.js | 1 + public/architectui/assets/scripts/chart_js.js | 1179 ----- .../circle_progress.98288b227c064e6a107f.js | 1 + .../scripts/clipboard.98288b227c064e6a107f.js | 1 + .../scripts/count_up.98288b227c064e6a107f.js | 1 + .../datepicker.98288b227c064e6a107f.js | 1 + .../scripts/demo.98288b227c064e6a107f.js | 1 + public/architectui/assets/scripts/demo.js | 1108 ---- .../form_validation.98288b227c064e6a107f.js | 1 + .../form_wizard.98288b227c064e6a107f.js | 1 + .../fullcalendar.98288b227c064e6a107f.js | 1 + .../assets/scripts/fullcalendar.js | 1209 ----- .../guided_tours.98288b227c064e6a107f.js | 1 + .../image_crop.98288b227c064e6a107f.js | 1 + .../input_mask.98288b227c064e6a107f.js | 1 + .../input_select.98288b227c064e6a107f.js | 1 + .../scripts/ladda.98288b227c064e6a107f.js | 1 + .../scripts/main.98288b227c064e6a107f.js | 1 + public/architectui/assets/scripts/main.js | 1873 ------- .../scripts/maps.98288b227c064e6a107f.js | 1 + public/architectui/assets/scripts/maps.js | 1108 ---- .../range_slider.98288b227c064e6a107f.js | 1 + .../scripts/rating.98288b227c064e6a107f.js | 1 + .../scripts/scrollbar.98288b227c064e6a107f.js | 1 + .../architectui/assets/scripts/scrollbar.js | 1140 ---- .../sparklines.98288b227c064e6a107f.js | 1 + .../sticky_elements.98288b227c064e6a107f.js | 1 + .../sweet_alerts.98288b227c064e6a107f.js | 1 + .../scripts/tables.98288b227c064e6a107f.js | 2 + ...tables.98288b227c064e6a107f.js.LICENSE.txt | 1 + .../textarea_autosize.98288b227c064e6a107f.js | 1 + .../scripts/toastr.98288b227c064e6a107f.js | 1 + public/architectui/assets/scripts/toastr.js | 1158 ---- .../toggle_switch.98288b227c064e6a107f.js | 1 + .../scripts/treeview.98288b227c064e6a107f.js | 1 + .../scripts/vendors.98288b227c064e6a107f.js | 2 + ...endors.98288b227c064e6a107f.js.LICENSE.txt | 205 + .../styles/main.98288b227c064e6a107f.css | 40 + .../styles/vendors.98288b227c064e6a107f.css | 1028 ++++ .../1764892882_3cf8c713b1d8c046837e.png | Bin 0 -> 65156 bytes .../1764904340_f3f2d39d47d8dc1428a4.jpg | Bin 0 -> 117586 bytes writable/upload/notice/index.html | 0 writable/upload/notice/pikachu.jpg | Bin 0 -> 43554 bytes writable/upload/notice/pikachu_1.jpg | Bin 0 -> 43554 bytes writable/upload/notice/좋소냥.webp | Bin 0 -> 132836 bytes writable/upload/notice/좋소냥_1.webp | Bin 0 -> 132836 bytes writable/upload/notice/좋소냥_2.webp | Bin 0 -> 132836 bytes writable/upload/notice/좋소냥_3.webp | Bin 0 -> 132836 bytes 378 files changed, 24267 insertions(+), 9248 deletions(-) create mode 100644 app/Cells/MenuCell.php delete mode 100644 app/Controllers/Home.php create mode 100644 app/Controllers/Login.php delete mode 100644 app/Controllers/Main.php create mode 100644 app/Controllers/board/Notice.php create mode 100644 app/Controllers/home/Home.php create mode 100644 app/Controllers/listfax/ListFax.php create mode 100644 app/Controllers/manage/Dept.php create mode 100644 app/Controllers/manage/LoginLog.php create mode 100644 app/Controllers/manage/Menu.php create mode 100644 app/Controllers/manage/Phone.php create mode 100644 app/Controllers/manage/User.php create mode 100644 app/Helpers/array_helper.php create mode 100644 app/Helpers/string_helper.php create mode 100644 app/Helpers/url_helper.php create mode 100644 app/Libraries/Common.php create mode 100644 app/Models/Home/HomeModel.php create mode 100644 app/Models/board/NoticeModel.php create mode 100644 app/Models/common/CodeModel.php create mode 100644 app/Models/common/LoginModel.php create mode 100644 app/Models/common/MenuModel.php create mode 100644 app/Models/listfax/ListFaxModel.php create mode 100644 app/Models/manage/DeptModel.php create mode 100644 app/Models/manage/LoginLogModel.php create mode 100644 app/Models/manage/MenuModel.php create mode 100644 app/Models/manage/PhoneModel.php create mode 100644 app/Models/manage/UserModel.php create mode 100644 app/Views/layouts/loading-indicator.php create mode 100644 app/Views/pages/board/notice.php create mode 100644 app/Views/pages/board/noticeDetail.php create mode 100644 app/Views/pages/board/noticeModify.php create mode 100644 app/Views/pages/board/noticeWrite.php delete mode 100644 app/Views/pages/dashboard.php create mode 100644 app/Views/pages/home/dashboard.php create mode 100644 app/Views/pages/manage/dept/lists.php create mode 100644 app/Views/pages/manage/dept/users.php create mode 100644 app/Views/pages/manage/log/lists.php create mode 100644 app/Views/pages/manage/menu/lists.php create mode 100644 app/Views/pages/manage/phone/lists.php create mode 100644 app/Views/pages/manage/user/lists.php create mode 100644 public/architectui/2463b90d9a316e4e5294.woff2 create mode 100644 public/architectui/assets/fonts/AD.svg create mode 100644 public/architectui/assets/fonts/AE.svg create mode 100644 public/architectui/assets/fonts/AF.svg create mode 100644 public/architectui/assets/fonts/AG.svg create mode 100644 public/architectui/assets/fonts/AI.svg create mode 100644 public/architectui/assets/fonts/AL.svg create mode 100644 public/architectui/assets/fonts/AM.svg create mode 100644 public/architectui/assets/fonts/AO.svg create mode 100644 public/architectui/assets/fonts/AR.svg create mode 100644 public/architectui/assets/fonts/AS.svg create mode 100644 public/architectui/assets/fonts/AT.svg create mode 100644 public/architectui/assets/fonts/AU.svg create mode 100644 public/architectui/assets/fonts/AW.svg create mode 100644 public/architectui/assets/fonts/AX.svg create mode 100644 public/architectui/assets/fonts/AZ.svg create mode 100644 public/architectui/assets/fonts/BA.svg create mode 100644 public/architectui/assets/fonts/BB.svg create mode 100644 public/architectui/assets/fonts/BD.svg create mode 100644 public/architectui/assets/fonts/BE.svg create mode 100644 public/architectui/assets/fonts/BF.svg create mode 100644 public/architectui/assets/fonts/BG.svg create mode 100644 public/architectui/assets/fonts/BH.svg create mode 100644 public/architectui/assets/fonts/BI.svg create mode 100644 public/architectui/assets/fonts/BJ.svg create mode 100644 public/architectui/assets/fonts/BL.svg create mode 100644 public/architectui/assets/fonts/BM.svg create mode 100644 public/architectui/assets/fonts/BN.svg create mode 100644 public/architectui/assets/fonts/BO.svg create mode 100644 public/architectui/assets/fonts/BR.svg create mode 100644 public/architectui/assets/fonts/BS.svg create mode 100644 public/architectui/assets/fonts/BT.svg create mode 100644 public/architectui/assets/fonts/BV.svg create mode 100644 public/architectui/assets/fonts/BW.svg create mode 100644 public/architectui/assets/fonts/BY.svg create mode 100644 public/architectui/assets/fonts/BZ.svg create mode 100644 public/architectui/assets/fonts/CA.svg create mode 100644 public/architectui/assets/fonts/CC.svg create mode 100644 public/architectui/assets/fonts/CD.svg create mode 100644 public/architectui/assets/fonts/CF.svg create mode 100644 public/architectui/assets/fonts/CG.svg create mode 100644 public/architectui/assets/fonts/CH.svg create mode 100644 public/architectui/assets/fonts/CI.svg create mode 100644 public/architectui/assets/fonts/CK.svg create mode 100644 public/architectui/assets/fonts/CL.svg create mode 100644 public/architectui/assets/fonts/CM.svg create mode 100644 public/architectui/assets/fonts/CN.svg create mode 100644 public/architectui/assets/fonts/CO.svg create mode 100644 public/architectui/assets/fonts/CR.svg create mode 100644 public/architectui/assets/fonts/CU.svg create mode 100644 public/architectui/assets/fonts/CV.svg create mode 100644 public/architectui/assets/fonts/CW.svg create mode 100644 public/architectui/assets/fonts/CX.svg create mode 100644 public/architectui/assets/fonts/CY.svg create mode 100644 public/architectui/assets/fonts/CZ.svg create mode 100644 public/architectui/assets/fonts/DE.svg create mode 100644 public/architectui/assets/fonts/DJ.svg create mode 100644 public/architectui/assets/fonts/DK.svg create mode 100644 public/architectui/assets/fonts/DM.svg create mode 100644 public/architectui/assets/fonts/DO.svg create mode 100644 public/architectui/assets/fonts/DZ.svg create mode 100644 public/architectui/assets/fonts/EC.svg create mode 100644 public/architectui/assets/fonts/EE.svg create mode 100644 public/architectui/assets/fonts/EG.svg create mode 100644 public/architectui/assets/fonts/ER.svg create mode 100644 public/architectui/assets/fonts/ES.svg create mode 100644 public/architectui/assets/fonts/ET.svg create mode 100644 public/architectui/assets/fonts/EU.svg create mode 100644 public/architectui/assets/fonts/FI.svg create mode 100644 public/architectui/assets/fonts/FJ.svg create mode 100644 public/architectui/assets/fonts/FK.svg create mode 100644 public/architectui/assets/fonts/FM.svg create mode 100644 public/architectui/assets/fonts/FO.svg create mode 100644 public/architectui/assets/fonts/FR.svg create mode 100644 public/architectui/assets/fonts/GA.svg create mode 100644 public/architectui/assets/fonts/GB-ENG.svg create mode 100644 public/architectui/assets/fonts/GB-NIR.svg create mode 100644 public/architectui/assets/fonts/GB-SCT.svg create mode 100644 public/architectui/assets/fonts/GB-WLS.svg create mode 100644 public/architectui/assets/fonts/GB-ZET.svg create mode 100644 public/architectui/assets/fonts/GB.svg create mode 100644 public/architectui/assets/fonts/GD.svg create mode 100644 public/architectui/assets/fonts/GE.svg create mode 100644 public/architectui/assets/fonts/GF.svg create mode 100644 public/architectui/assets/fonts/GG.svg create mode 100644 public/architectui/assets/fonts/GH.svg create mode 100644 public/architectui/assets/fonts/GI.svg create mode 100644 public/architectui/assets/fonts/GL.svg create mode 100644 public/architectui/assets/fonts/GM.svg create mode 100644 public/architectui/assets/fonts/GN.svg create mode 100644 public/architectui/assets/fonts/GP.svg create mode 100644 public/architectui/assets/fonts/GQ.svg create mode 100644 public/architectui/assets/fonts/GR.svg create mode 100644 public/architectui/assets/fonts/GS.svg create mode 100644 public/architectui/assets/fonts/GT.svg create mode 100644 public/architectui/assets/fonts/GU.svg create mode 100644 public/architectui/assets/fonts/GW.svg create mode 100644 public/architectui/assets/fonts/GY.svg create mode 100644 public/architectui/assets/fonts/HK.svg create mode 100644 public/architectui/assets/fonts/HM.svg create mode 100644 public/architectui/assets/fonts/HN.svg create mode 100644 public/architectui/assets/fonts/HR.svg create mode 100644 public/architectui/assets/fonts/HT.svg create mode 100644 public/architectui/assets/fonts/HU.svg create mode 100644 public/architectui/assets/fonts/ID.svg create mode 100644 public/architectui/assets/fonts/IE.svg create mode 100644 public/architectui/assets/fonts/IL.svg create mode 100644 public/architectui/assets/fonts/IM.svg create mode 100644 public/architectui/assets/fonts/IN.svg create mode 100644 public/architectui/assets/fonts/IO.svg create mode 100644 public/architectui/assets/fonts/IQ.svg create mode 100644 public/architectui/assets/fonts/IR.svg create mode 100644 public/architectui/assets/fonts/IS.svg create mode 100644 public/architectui/assets/fonts/IT.svg create mode 100644 public/architectui/assets/fonts/JE.svg create mode 100644 public/architectui/assets/fonts/JM.svg create mode 100644 public/architectui/assets/fonts/JO.svg create mode 100644 public/architectui/assets/fonts/JP.svg create mode 100644 public/architectui/assets/fonts/KE.svg create mode 100644 public/architectui/assets/fonts/KG.svg create mode 100644 public/architectui/assets/fonts/KH.svg create mode 100644 public/architectui/assets/fonts/KI.svg create mode 100644 public/architectui/assets/fonts/KM.svg create mode 100644 public/architectui/assets/fonts/KN.svg create mode 100644 public/architectui/assets/fonts/KP.svg create mode 100644 public/architectui/assets/fonts/KR.svg create mode 100644 public/architectui/assets/fonts/KW.svg create mode 100644 public/architectui/assets/fonts/KY.svg create mode 100644 public/architectui/assets/fonts/KZ.svg create mode 100644 public/architectui/assets/fonts/LA.svg create mode 100644 public/architectui/assets/fonts/LB.svg create mode 100644 public/architectui/assets/fonts/LC.svg create mode 100644 public/architectui/assets/fonts/LGBT.svg create mode 100644 public/architectui/assets/fonts/LI.svg create mode 100644 public/architectui/assets/fonts/LK.svg create mode 100644 public/architectui/assets/fonts/LR.svg create mode 100644 public/architectui/assets/fonts/LS.svg create mode 100644 public/architectui/assets/fonts/LT.svg create mode 100644 public/architectui/assets/fonts/LU.svg create mode 100644 public/architectui/assets/fonts/LV.svg create mode 100644 public/architectui/assets/fonts/LY.svg create mode 100644 public/architectui/assets/fonts/Linearicons-Free.eot create mode 100644 public/architectui/assets/fonts/Linearicons-Free.svg create mode 100644 public/architectui/assets/fonts/Linearicons-Free.ttf create mode 100644 public/architectui/assets/fonts/Linearicons-Free.woff create mode 100644 public/architectui/assets/fonts/Linearicons-Free.woff2 create mode 100644 public/architectui/assets/fonts/MA.svg create mode 100644 public/architectui/assets/fonts/MC.svg create mode 100644 public/architectui/assets/fonts/MD.svg create mode 100644 public/architectui/assets/fonts/ME.svg create mode 100644 public/architectui/assets/fonts/MF.svg create mode 100644 public/architectui/assets/fonts/MG.svg create mode 100644 public/architectui/assets/fonts/MH.svg create mode 100644 public/architectui/assets/fonts/MK.svg create mode 100644 public/architectui/assets/fonts/ML.svg create mode 100644 public/architectui/assets/fonts/MM.svg create mode 100644 public/architectui/assets/fonts/MN.svg create mode 100644 public/architectui/assets/fonts/MO.svg create mode 100644 public/architectui/assets/fonts/MP.svg create mode 100644 public/architectui/assets/fonts/MQ.svg create mode 100644 public/architectui/assets/fonts/MR.svg create mode 100644 public/architectui/assets/fonts/MS.svg create mode 100644 public/architectui/assets/fonts/MT.svg create mode 100644 public/architectui/assets/fonts/MU.svg create mode 100644 public/architectui/assets/fonts/MV.svg create mode 100644 public/architectui/assets/fonts/MW.svg create mode 100644 public/architectui/assets/fonts/MX.svg create mode 100644 public/architectui/assets/fonts/MY.svg create mode 100644 public/architectui/assets/fonts/MZ.svg create mode 100644 public/architectui/assets/fonts/NA.svg create mode 100644 public/architectui/assets/fonts/NC.svg create mode 100644 public/architectui/assets/fonts/NE.svg create mode 100644 public/architectui/assets/fonts/NF.svg create mode 100644 public/architectui/assets/fonts/NG.svg create mode 100644 public/architectui/assets/fonts/NI.svg create mode 100644 public/architectui/assets/fonts/NL.svg create mode 100644 public/architectui/assets/fonts/NO.svg create mode 100644 public/architectui/assets/fonts/NP.svg create mode 100644 public/architectui/assets/fonts/NR.svg create mode 100644 public/architectui/assets/fonts/NU.svg create mode 100644 public/architectui/assets/fonts/NZ.svg create mode 100644 public/architectui/assets/fonts/OM.svg create mode 100644 public/architectui/assets/fonts/PA.svg create mode 100644 public/architectui/assets/fonts/PE.svg create mode 100644 public/architectui/assets/fonts/PF.svg create mode 100644 public/architectui/assets/fonts/PG.svg create mode 100644 public/architectui/assets/fonts/PH.svg create mode 100644 public/architectui/assets/fonts/PK.svg create mode 100644 public/architectui/assets/fonts/PL.svg create mode 100644 public/architectui/assets/fonts/PM.svg create mode 100644 public/architectui/assets/fonts/PN.svg create mode 100644 public/architectui/assets/fonts/PR.svg create mode 100644 public/architectui/assets/fonts/PS.svg create mode 100644 public/architectui/assets/fonts/PT.svg create mode 100644 public/architectui/assets/fonts/PW.svg create mode 100644 public/architectui/assets/fonts/PY.svg create mode 100644 public/architectui/assets/fonts/Pe-icon-7-stroke.eot create mode 100644 public/architectui/assets/fonts/Pe-icon-7-stroke.svg create mode 100644 public/architectui/assets/fonts/Pe-icon-7-stroke.ttf create mode 100644 public/architectui/assets/fonts/Pe-icon-7-stroke.woff create mode 100644 public/architectui/assets/fonts/QA.svg create mode 100644 public/architectui/assets/fonts/RE.svg create mode 100644 public/architectui/assets/fonts/RO.svg create mode 100644 public/architectui/assets/fonts/RS.svg create mode 100644 public/architectui/assets/fonts/RU.svg create mode 100644 public/architectui/assets/fonts/RW.svg create mode 100644 public/architectui/assets/fonts/SA.svg create mode 100644 public/architectui/assets/fonts/SB.svg create mode 100644 public/architectui/assets/fonts/SC.svg create mode 100644 public/architectui/assets/fonts/SD.svg create mode 100644 public/architectui/assets/fonts/SE.svg create mode 100644 public/architectui/assets/fonts/SG.svg create mode 100644 public/architectui/assets/fonts/SH.svg create mode 100644 public/architectui/assets/fonts/SI.svg create mode 100644 public/architectui/assets/fonts/SJ.svg create mode 100644 public/architectui/assets/fonts/SK.svg create mode 100644 public/architectui/assets/fonts/SL.svg create mode 100644 public/architectui/assets/fonts/SM.svg create mode 100644 public/architectui/assets/fonts/SN.svg create mode 100644 public/architectui/assets/fonts/SO.svg create mode 100644 public/architectui/assets/fonts/SR.svg create mode 100644 public/architectui/assets/fonts/SS.svg create mode 100644 public/architectui/assets/fonts/ST.svg create mode 100644 public/architectui/assets/fonts/SV.svg create mode 100644 public/architectui/assets/fonts/SX.svg create mode 100644 public/architectui/assets/fonts/SY.svg create mode 100644 public/architectui/assets/fonts/SZ.svg create mode 100644 public/architectui/assets/fonts/TC.svg create mode 100644 public/architectui/assets/fonts/TD.svg create mode 100644 public/architectui/assets/fonts/TF.svg create mode 100644 public/architectui/assets/fonts/TG.svg create mode 100644 public/architectui/assets/fonts/TH.svg create mode 100644 public/architectui/assets/fonts/TJ.svg create mode 100644 public/architectui/assets/fonts/TK.svg create mode 100644 public/architectui/assets/fonts/TL.svg create mode 100644 public/architectui/assets/fonts/TM.svg create mode 100644 public/architectui/assets/fonts/TN.svg create mode 100644 public/architectui/assets/fonts/TO.svg create mode 100644 public/architectui/assets/fonts/TR.svg create mode 100644 public/architectui/assets/fonts/TT.svg create mode 100644 public/architectui/assets/fonts/TV.svg create mode 100644 public/architectui/assets/fonts/TW.svg create mode 100644 public/architectui/assets/fonts/TZ.svg create mode 100644 public/architectui/assets/fonts/UA.svg create mode 100644 public/architectui/assets/fonts/UG.svg create mode 100644 public/architectui/assets/fonts/UM.svg create mode 100644 public/architectui/assets/fonts/US-CA.svg create mode 100644 public/architectui/assets/fonts/US.svg create mode 100644 public/architectui/assets/fonts/UY.svg create mode 100644 public/architectui/assets/fonts/UZ.svg create mode 100644 public/architectui/assets/fonts/VA.svg create mode 100644 public/architectui/assets/fonts/VC.svg create mode 100644 public/architectui/assets/fonts/VE.svg create mode 100644 public/architectui/assets/fonts/VG.svg create mode 100644 public/architectui/assets/fonts/VI.svg create mode 100644 public/architectui/assets/fonts/VN.svg create mode 100644 public/architectui/assets/fonts/VU.svg create mode 100644 public/architectui/assets/fonts/WF.svg create mode 100644 public/architectui/assets/fonts/WS.svg create mode 100644 public/architectui/assets/fonts/XK.svg create mode 100644 public/architectui/assets/fonts/YE.svg create mode 100644 public/architectui/assets/fonts/YT.svg create mode 100644 public/architectui/assets/fonts/ZA.svg create mode 100644 public/architectui/assets/fonts/ZM.svg create mode 100644 public/architectui/assets/fonts/ZW.svg create mode 100644 public/architectui/assets/fonts/fa-solid-900.eot create mode 100644 public/architectui/assets/fonts/fa-solid-900.svg create mode 100644 public/architectui/assets/fonts/fa-solid-900.ttf create mode 100644 public/architectui/assets/fonts/fa-solid-900.woff create mode 100644 public/architectui/assets/fonts/fa-solid-900.woff2 create mode 100644 public/architectui/assets/fonts/ionicons.eot create mode 100644 public/architectui/assets/fonts/ionicons.svg create mode 100644 public/architectui/assets/fonts/ionicons.ttf create mode 100644 public/architectui/assets/fonts/ionicons.woff create mode 100644 public/architectui/assets/js/datatable.kor.js create mode 100644 public/architectui/assets/scripts/apex_charts.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/app.js create mode 100644 public/architectui/assets/scripts/blockui.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/carousel_slider.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/chart_js.98288b227c064e6a107f.js delete mode 100644 public/architectui/assets/scripts/chart_js.js create mode 100644 public/architectui/assets/scripts/circle_progress.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/clipboard.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/count_up.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/datepicker.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/demo.98288b227c064e6a107f.js delete mode 100644 public/architectui/assets/scripts/demo.js create mode 100644 public/architectui/assets/scripts/form_validation.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/form_wizard.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/fullcalendar.98288b227c064e6a107f.js delete mode 100644 public/architectui/assets/scripts/fullcalendar.js create mode 100644 public/architectui/assets/scripts/guided_tours.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/image_crop.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/input_mask.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/input_select.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/ladda.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/main.98288b227c064e6a107f.js delete mode 100644 public/architectui/assets/scripts/main.js create mode 100644 public/architectui/assets/scripts/maps.98288b227c064e6a107f.js delete mode 100644 public/architectui/assets/scripts/maps.js create mode 100644 public/architectui/assets/scripts/range_slider.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/rating.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/scrollbar.98288b227c064e6a107f.js delete mode 100644 public/architectui/assets/scripts/scrollbar.js create mode 100644 public/architectui/assets/scripts/sparklines.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/sticky_elements.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/sweet_alerts.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/tables.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/tables.98288b227c064e6a107f.js.LICENSE.txt create mode 100644 public/architectui/assets/scripts/textarea_autosize.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/toastr.98288b227c064e6a107f.js delete mode 100644 public/architectui/assets/scripts/toastr.js create mode 100644 public/architectui/assets/scripts/toggle_switch.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/treeview.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/vendors.98288b227c064e6a107f.js create mode 100644 public/architectui/assets/scripts/vendors.98288b227c064e6a107f.js.LICENSE.txt create mode 100644 public/architectui/assets/styles/main.98288b227c064e6a107f.css create mode 100644 public/architectui/assets/styles/vendors.98288b227c064e6a107f.css create mode 100644 writable/upload/notice/1764892882_3cf8c713b1d8c046837e.png create mode 100644 writable/upload/notice/1764904340_f3f2d39d47d8dc1428a4.jpg create mode 100644 writable/upload/notice/index.html create mode 100644 writable/upload/notice/pikachu.jpg create mode 100644 writable/upload/notice/pikachu_1.jpg create mode 100644 writable/upload/notice/좋소냥.webp create mode 100644 writable/upload/notice/좋소냥_1.webp create mode 100644 writable/upload/notice/좋소냥_2.webp create mode 100644 writable/upload/notice/좋소냥_3.webp diff --git a/Dockerfile b/Dockerfile index d8d00b5..bd35d0a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,9 +7,20 @@ RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime \ # mod_rewrite 활성화 RUN a2enmod rewrite -# intl, pdo_mysql 설치 (이미 있으면 그대로 두셔도 됨) -RUN apt-get update && apt-get install -y libicu-dev \ - && docker-php-ext-install intl pdo pdo_mysql +# 필수 라이브러리 + PHP 확장 설치 (intl, pdo_mysql, mysqli, gd, zip) +RUN apt-get update && apt-get install -y \ + libicu-dev \ + libpng-dev \ + libjpeg-dev \ + libfreetype6-dev \ + libzip-dev \ + zip \ + && docker-php-ext-configure gd --with-freetype --with-jpeg \ + && docker-php-ext-install intl pdo pdo_mysql mysqli gd zip \ + && rm -rf /var/lib/apt/lists/* + +# composer 바이너리 복사 (멀티스테이지) +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer # DocumentRoot 를 CI4 public 으로 변경 ENV APACHE_DOCUMENT_ROOT=/var/www/html/public @@ -26,3 +37,8 @@ RUN printf "\n\ && a2enconf ci4 WORKDIR /var/www/html + +# writable 폴더 만들고 권한 부여 +RUN mkdir -p /var/www/html/writable/upload/notice \ + && chown -R www-data:www-data /var/www/html/writable \ + && chmod -R 775 /var/www/html/writable diff --git a/app/Cells/MenuCell.php b/app/Cells/MenuCell.php new file mode 100644 index 0000000..39d8f6c --- /dev/null +++ b/app/Cells/MenuCell.php @@ -0,0 +1,30 @@ +getMenuList(); + + $menuIcons = [ + 'M1' => 'pe-7s-note2', + 'M2' => 'pe-7s-monitor', + 'M3' => 'pe-7s-mail', + 'M4' => 'pe-7s-display2', + 'M5' => 'pe-7s-config', + 'M6' => '', + 'M7' => 'pe-7s-monitor', + 'M8' => 'pe-7s-server', + 'M9' => 'pe-7s-graph2', + ]; + + return view('layouts/sidebar', [ + 'mMenu' => $menus["mainMenu"], + 'sMenu' => $menus["subMenu"], + 'icons' => $menuIcons, + ]); + } +} \ No newline at end of file diff --git a/app/Config/Database.php b/app/Config/Database.php index 29f6f4a..1ebbb03 100644 --- a/app/Config/Database.php +++ b/app/Config/Database.php @@ -25,29 +25,29 @@ class Database extends Config * @var array */ public array $default = [ - 'DSN' => '', - 'hostname' => 'localhost', - 'username' => '', - 'password' => '', - 'database' => '', - 'DBDriver' => 'MySQLi', - 'DBPrefix' => '', - 'pConnect' => false, - 'DBDebug' => true, - 'charset' => 'utf8mb4', - 'DBCollat' => 'utf8mb4_general_ci', - 'swapPre' => '', - 'encrypt' => false, - 'compress' => false, - 'strictOn' => false, - 'failover' => [], - 'port' => 3306, + 'DSN' => '', + 'hostname' => '192.168.10.246', + 'username' => 'confirms', + 'password' => 'zjsvjatm', + 'database' => 'db_confirms', + 'DBDriver' => 'MySQLi', + 'DBPrefix' => '', + 'pConnect' => false, + 'DBDebug' => true, + 'charset' => 'utf8mb4', + 'DBCollat' => 'utf8mb4_general_ci', + 'swapPre' => '', + 'encrypt' => false, + 'compress' => false, + 'strictOn' => false, + 'failover' => [], + 'port' => 3306, 'numberNative' => false, - 'foundRows' => false, - 'dateFormat' => [ - 'date' => 'Y-m-d', + 'foundRows' => false, + 'dateFormat' => [ + 'date' => 'Y-m-d', 'datetime' => 'Y-m-d H:i:s', - 'time' => 'H:i:s', + 'time' => 'H:i:s', ], ]; @@ -163,29 +163,29 @@ class Database extends Config * @var array */ public array $tests = [ - 'DSN' => '', - 'hostname' => '127.0.0.1', - 'username' => '', - 'password' => '', - 'database' => ':memory:', - 'DBDriver' => 'SQLite3', - 'DBPrefix' => 'db_', // Needed to ensure we're working correctly with prefixes live. DO NOT REMOVE FOR CI DEVS - 'pConnect' => false, - 'DBDebug' => true, - 'charset' => 'utf8', - 'DBCollat' => '', - 'swapPre' => '', - 'encrypt' => false, - 'compress' => false, - 'strictOn' => false, - 'failover' => [], - 'port' => 3306, + 'DSN' => '', + 'hostname' => '127.0.0.1', + 'username' => '', + 'password' => '', + 'database' => ':memory:', + 'DBDriver' => 'SQLite3', + 'DBPrefix' => 'db_', // Needed to ensure we're working correctly with prefixes live. DO NOT REMOVE FOR CI DEVS + 'pConnect' => false, + 'DBDebug' => true, + 'charset' => 'utf8', + 'DBCollat' => '', + 'swapPre' => '', + 'encrypt' => false, + 'compress' => false, + 'strictOn' => false, + 'failover' => [], + 'port' => 3306, 'foreignKeys' => true, 'busyTimeout' => 1000, - 'dateFormat' => [ - 'date' => 'Y-m-d', + 'dateFormat' => [ + 'date' => 'Y-m-d', 'datetime' => 'Y-m-d H:i:s', - 'time' => 'H:i:s', + 'time' => 'H:i:s', ], ]; diff --git a/app/Config/Filters.php b/app/Config/Filters.php index 9c83ae9..2d029f6 100644 --- a/app/Config/Filters.php +++ b/app/Config/Filters.php @@ -25,15 +25,16 @@ class Filters extends BaseFilters * or [filter_name => [classname1, classname2, ...]] */ public array $aliases = [ - 'csrf' => CSRF::class, - 'toolbar' => DebugToolbar::class, - 'honeypot' => Honeypot::class, - 'invalidchars' => InvalidChars::class, + 'csrf' => CSRF::class, + 'toolbar' => DebugToolbar::class, + 'honeypot' => Honeypot::class, + 'invalidchars' => InvalidChars::class, 'secureheaders' => SecureHeaders::class, - 'cors' => Cors::class, - 'forcehttps' => ForceHTTPS::class, - 'pagecache' => PageCache::class, - 'performance' => PerformanceMetrics::class, + 'cors' => Cors::class, + 'forcehttps' => ForceHTTPS::class, + 'pagecache' => PageCache::class, + 'performance' => PerformanceMetrics::class, + 'auth' => \App\Filters\AuthCheck::class, ]; /** @@ -75,6 +76,17 @@ class Filters extends BaseFilters // 'honeypot', // 'csrf', // 'invalidchars', + 'auth' => [ + 'except' => [ + 'login', // GET /login + 'login/*', // /login/* 모두 + 'index.php/login', // /index.php/login + 'index.php/login/*', // /index.php/login/* + 'register', // 회원가입 등 + 'register/*', + 'api/*', // 필요하면 API는 예외 + ], + ], ], 'after' => [ // 'honeypot', diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 4dcb769..61fdffd 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -5,9 +5,60 @@ use CodeIgniter\Router\RouteCollection; /** * @var RouteCollection $routes */ -$routes->get('/', 'Home::index'); -$routes->get('/hello', 'Home::hello'); +$routes->setAutoRoute(true); + +/** + * 화면 + */ + +$routes->get("/login", "Login::index"); +$routes->get("/logout", "Login::out"); +$routes->get('/', 'Home\Home::dashboard'); +$routes->get('/home', 'Home\Home::dashboard'); + +$routes->get('/board/notice/lists', 'Board\Notice::notice'); // 공지사항 +$routes->get('/board/notice/detail/(:num)', 'Board\Notice::detail/$1'); // 공지사항 상세 +$routes->get('/board/notice/write', 'Board\Notice::write'); // 공지사항 작성 +$routes->get('/board/notice/modify/(:num)', 'Board\Notice::modify/$1'); // 공지사항 수정 + +/** + * 시스템관리 + */ +$routes->get('/manage/user/lists', 'Manage\User::user'); // 사용자관리 +$routes->get('/manage/dept/lists', 'Manage\Dept::dept'); // 조직관리 +$routes->get('/manage/dept/getchkuser', 'Manage\Dept::getchkuser'); // 총괄팀장 페이지 + +$routes->get('/manage/menu/lists', 'Manage\Menu::lists'); // 메뉴관리 +$routes->get('/manage/dupl_phone/lists', 'Manage\Phone::lists'); // 전화확인관리 +$routes->get('/manage/loginlog/lists', 'Manage\LoginLog::lists'); // 로그인이력 -$routes->get('/dashboard', 'Main::dashboard'); +/** + * API ROUTES + */ +$routes->post('/login/chkLogin', 'Login::chkLogin'); // 로그인 요청 +$routes->get('/board/notice/getNoticeList', 'Board\Notice::getNoticeList'); // 공지사항 목록 조회 +$routes->post('/board/notice/actWrite', 'Board\Notice::actWrite'); // 공지사항 작성 요청 +$routes->post('/board/notice/actModify', 'Board\Notice::actModify'); // 공지사항 작성 요청 +$routes->post('/board/notice/remove', 'Board\Notice::actRemove'); // 공지사항 삭제 요청 +$routes->get('/board/notice/download/(:num)', 'Board\Notice::download/$1'); // 첨부파일 다운로드 + +// 시스템관리 +$routes->get('/manage/user/getUserList', 'Manage\User::getUserList'); // 유저 목록 조회 +$routes->post('/manage/user/save', 'Manage\User::saveUser'); // 유저정보저장 +$routes->post('/manage/user/remove', 'Manage\User::removeUser'); // 유저정보삭제 +$routes->get('/manage/user/excel', 'Manage\User::excel'); // 유저 엑셀다운로드 + +$routes->get('/manage/dept/getDeptList', 'Manage\Dept::getDeptList'); // 조직목록 조회 +$routes->get('/manage/dept/getUserList', 'Manage\Dept::getUserList'); // 유저 목록 조회 +$routes->get('/manage/dept/getPdept', 'Manage\Dept::getPdept'); // 상위조직 조회 +$routes->post('/manage/dept/saveDept', 'Manage\Dept::saveDept'); // 상위조직 조회 + +$routes->post('/manage/menu/getMenuList', 'Manage\Menu::getMenuList'); // 메뉴 목록 조회 + +$routes->get('/manage/dupl_phone/getDuplPhoneList', 'Manage\Phone::getDuplPhoneList'); // 전화확인 목록조회 +$routes->post('/manage/dupl_phone/savePhone', 'Manage\Phone::savePhone'); // 전화정보저장 + +$routes->get('/manage/loginlog/getLogList', 'Manage\LoginLog::getLogList'); // 로그 목록 조회 +$routes->get('/manage/loginlog/excel', 'Manage\LoginLog::excel'); // 엑셀다운로드 diff --git a/app/Controllers/BaseController.php b/app/Controllers/BaseController.php index 689405b..d10f2ca 100644 --- a/app/Controllers/BaseController.php +++ b/app/Controllers/BaseController.php @@ -1,58 +1,25 @@ - */ - protected $helpers = []; + protected $session; + protected $data = []; - /** - * Be sure to declare properties for any property fetch you initialized. - * The creation of dynamic property is deprecated in PHP 8.2. - */ - // protected $session; - - /** - * @return void - */ - public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) + public function initController($request, $response, $logger) { - // Do Not Edit This Line parent::initController($request, $response, $logger); - // Preload any models, libraries, etc, here. + $this->session = \Config\Services::session(); - // E.g.: $this->session = service('session'); + // 메뉴 전역 로딩 + $menuModel = new MenuModel(); + $menus = $menuModel->getMenuList(); + $this->data['menus'] = $menus["mainMenu"]; } } diff --git a/app/Controllers/Home.php b/app/Controllers/Home.php deleted file mode 100644 index b0bb11e..0000000 --- a/app/Controllers/Home.php +++ /dev/null @@ -1,15 +0,0 @@ -loginModel = new LoginModel(); + } + + public function index(): string + { + return view('pages/login'); + } + + // 로그인 + public function chkLogin() + { + $logs = [ + 'usr_id' => $this->request->getPost('user_id'), + 'userIp' => $this->get_user_ip(), + 'userAgent' => $_SERVER['HTTP_USER_AGENT'] ?: '', + ]; + + try { + + /** ------------------------------------ + * 1) 유효성 검사 + * ------------------------------------*/ + $rules = [ + 'user_id' => [ + 'rules' => 'required|min_length[4]|max_length[20]', + 'errors' => [ + 'required' => '아이디를 입력해주세요.', + 'min_length' => '아이디는 최소 {param}자 이상이어야 합니다.', + 'max_length' => '아이디는 최대 {param}자까지 가능합니다.', + ], + ], + 'user_pw' => [ + 'rules' => 'required|min_length[4]|max_length[30]', + 'errors' => [ + 'required' => '비밀번호를 입력해주세요.', + 'min_length' => '비밀번호는 최소 {param}자 이상이어야 합니다.', + 'max_length' => '비밀번호는 최대 {param}자까지 가능합니다.', + ], + ], + ]; + + if (!$this->validate($rules)) { + return $this->response->setJSON([ + 'code' => '1', + 'errors' => $this->validator->getErrors() + ]); + } + + /** ------------------------------------ + * 2) 로그인 정보 조회 + * ------------------------------------*/ + $userId = $this->request->getPost('user_id'); + $userPw = $this->request->getPost('user_pw'); + + $this->loginModel = new LoginModel(); + $user = $this->loginModel->getUserByIdPw($userId, $userPw); + + if (!$user) { + $logs['results'] = 0; + $logs['usr_sq'] = null; + $logs['reason'] = '존재하지 않는 아이디입니다.'; + + $this->loginModel->insertUserLog($logs); + + return $this->response->setJSON([ + 'code' => '1', + 'msg' => '존재하지 않는 아이디입니다.' + ]); + } + + + if (strcmp($user['usr_pw'], $user['chk_pw']) !== 0) { + $logs['results'] = 0; + $logs['usr_sq'] = $user['usr_sq']; + $logs['reason'] = '잘못된 비밀번호 입니다.'; + + $this->loginModel->insertUserLog($logs); + + return $this->response->setJSON(body: [ + 'code' => '1', + 'msg' => '잘못된 비밀번호 입니다.' + ]); + } + + + /** ------------------------------------ + * 3) 세션 저장 + * ------------------------------------*/ + $newdata = [ + 'usr_sq' => $user['usr_sq'], + 'usr_id' => $user['usr_id'], + 'usr_nm' => $user['usr_nm'], + 'dept_sq' => $user['dept_sq'], + 'dept_nm' => $user['dept_nm'], + 'bonbu_sq' => $user['bonbu_sq'], + 'bonbu_nm' => $user['bonbu_nm'], + 'usr_level' => $user['usr_level'], + 'depth' => $user['depth'], + 'logged_in' => true + ]; + + $logs['results'] = 1; + $logs['usr_sq'] = $user['usr_sq']; + $logs['reason'] = '로그인 성공'; + + $this->loginModel->insertUserLog($logs); + + $this->session->set($newdata); + + return $this->response->setJSON([ + 'code' => '0', + 'msg' => 'success' + ]); + + } catch (\Throwable $e) { + + /** ------------------------------------ + * 4) 예외발생 처리 (DB 오류, 세션 오류 등) + * ------------------------------------*/ + log_message('error', '[LOGIN ERROR] ' . $e->getMessage()); + log_message('error', $e->getTraceAsString()); + + return $this->response->setJSON([ + 'code' => '9', + 'msg' => '서버 내부 오류가 발생했습니다. 잠시 후 다시 시도해주세요.' + ]); + } + } + + + public function out() + { + $this->session->destroy(); + return redirect()->to('/login'); + } + + + private function get_user_ip() + { + $ip_address = ''; + if (!empty($_SERVER['HTTP_CLIENT_IP'])) { + $ip_address = $_SERVER['HTTP_CLIENT_IP']; + } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { + // Check for multiple IPs in the header, take the first one (most likely the client) + $ip_address = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]; + } else { + $ip_address = $_SERVER['REMOTE_ADDR']; + } + return $ip_address; + } + +} \ No newline at end of file diff --git a/app/Controllers/Main.php b/app/Controllers/Main.php deleted file mode 100644 index 1fca0df..0000000 --- a/app/Controllers/Main.php +++ /dev/null @@ -1,17 +0,0 @@ -notice = new NoticeModel(); + } + + public function notice(): string + { + return view('pages/board/notice'); + } + + + public function getNoticeList() + { + + $start = (int) $this->request->getGet('start') ?: 0; + $end = (int) $this->request->getGet('length') ?: 10; + + $data = [ + 'srchType' => $this->request->getGet('srchType') ?: '', + 'srchTxt' => $this->request->getGet('srchTxt') ?: '', + ]; + + $totalCount = $this->notice->getTotalCount($data); + + + $datas = $this->notice->getNoticeList($start, $end, $data); + + return $this->response->setJSON(body: [ + 'recordsTotal' => $totalCount, + 'recordsFiltered' => $totalCount, + 'data' => $datas, + ]); + + } + + + // 공지사항 상세 + public function detail($id = null) + { + $id = (int) $id; + + if ($id <= 0) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + // 데이터 조회 + $data = $this->notice->getNoticeData($id); + + if (!$data) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + return view('pages/board/noticeDetail', $data); + } + + // 첨부파일 다운로드 + public function download($fileSq = null) + { + $fileSq = (int) $fileSq; + + if ($fileSq <= 0) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + // 1) DB에서 파일 정보 조회 + $fileInfo = $this->notice->getFile($fileSq); + + if (!$fileInfo) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + // DB에 이렇게 저장했다고 가정: + // file_path : /var/www/html/writable/upload/notice + // file_name : 실제 서버 파일명 (orig or new) + + // dd($fileInfo); + + $filePath = rtrim($fileInfo['file_path'], '/\\') . DIRECTORY_SEPARATOR . $fileInfo['file_name']; + + if (!is_file($filePath)) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + // 브라우저에 보여줄 다운로드 파일명 (원본 이름) + $downloadName = $fileInfo['orig_name']; + + // 2) CI4 내장 다운로드 헬퍼 사용 + return $this->response->download($filePath, null)->setFileName($downloadName); + } + + + // 공지사항 작성 화면 + public function write(): string + { + return view('pages/board/noticeWrite'); + } + + // 공지사항 작성 + public function actWrite() + { + + + try { + + + $data = [ + 'subject' => $this->request->getPost('subject'), + 'content' => $this->request->getPost('content'), + 'insert_usr' => session()->get('usr_id'), + 'insert_nm' => session()->get('usr_nm'), + ]; + + + + $file = $this->request->getFile('file'); + + if ($file && $file->isValid() && !$file->hasMoved()) { + $origName = $file->getClientName(); + $ext = $file->getClientExtension(); + $size = $file->getSize(); + $mime = $file->getMimeType(); + $type = $file->getClientMimeType(); + $tempName = $file->getTempName(); + $imgYn = (strpos($mime, 'image/') === 0) ? 'Y' : 'N'; + + // 저장 경로 + $saveDir = WRITEPATH . 'upload/notice'; + if (!is_dir($saveDir)) { + mkdir($saveDir, 0777, true); + } + + // 서버 저장 이름 (덮어쓰기 방지를 위해 랜덤으로 추천) + $newName = $file->getRandomName(); + $file->move($saveDir, $newName); + + // 모델로 넘길 파일 정보 + $data['file'] = [ + 'orig_name' => $origName, + 'new_name' => $newName, + 'file_path' => $saveDir, + 'ext' => $ext, + 'size' => $size, + 'img_yn' => $imgYn, + 'img_height' => null, + 'img_width' => null, + ]; + } + + + $result = $this->notice->write($data); + + + return $this->response->setJSON([ + 'code' => '0', + 'msg' => 'success' + ]); + + } catch (\Exception $e) { + log_message('error', '[LOGIN ERROR] ' . $e->getMessage()); + return $this->response->setJSON([ + 'code' => '9', + 'msg' => $e->getMessage(), + ]); + } + + } + + // 공지사항 수정 + public function modify($id = null): string + { + + $id = (int) $id; + + + if ($id <= 0) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + // 데이터 조회 + $data = $this->notice->getNoticeData($id); + + if (!$data) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + + return view('pages/board/noticeModify', $data); + + } + + // 공지사항 수정요청 + public function actModify() + { + try { + + $data = [ + 'bbs_sq' => $this->request->getPost('bbs_sq'), + 'subject' => $this->request->getPost('subject'), + 'content' => $this->request->getPost('content'), + 'update_usr' => session()->get('usr_id'), + 'update_nm' => session()->get('usr_nm'), + ]; + + + + $file = $this->request->getFile('file'); + + if ($file && $file->isValid() && !$file->hasMoved()) { + $origName = $file->getClientName(); + $ext = $file->getClientExtension(); + $size = $file->getSize(); + $mime = $file->getMimeType(); // ★ move() 전에! + $type = $file->getClientMimeType(); + $tempName = $file->getTempName(); + $imgYn = (strpos($mime, 'image/') === 0) ? 'Y' : 'N'; + + // 저장 경로 + $saveDir = WRITEPATH . 'upload/notice'; + if (!is_dir($saveDir)) { + mkdir($saveDir, 0777, true); + } + + // 서버 저장 이름 (덮어쓰기 방지를 위해 랜덤으로 추천) + $newName = $file->getRandomName(); + $file->move($saveDir, $newName); + + // 모델로 넘길 파일 정보 + $data['file'] = [ + 'file_sq' => $this->request->getPost('file_sq'), + 'orig_name' => $origName, + 'new_name' => $newName, + 'file_path' => $saveDir, // 필요에 따라 상대경로로만 저장 + 'ext' => $ext, + 'size' => $size, + 'img_yn' => $imgYn, + // 높이/폭은 나중에 getimagesize 등으로 구해도 됨 + 'img_height' => null, + 'img_width' => null, + ]; + } + + + $result = $this->notice->modify($data); + + + return $this->response->setJSON([ + 'code' => '0', + 'msg' => 'success' + ]); + + } catch (\Exception $e) { + log_message('error', '[LOGIN ERROR] ' . $e->getMessage()); + return $this->response->setJSON([ + 'code' => '9', + 'msg' => $e->getMessage(), + ]); + } + + } + + // 공지사항 삭제요청 + public function actRemove() + { + try { + + $data = [ + 'bbs_sq' => $this->request->getPost('bbs_sq'), + 'update_usr' => session()->get('usr_id'), + 'update_nm' => session()->get('usr_nm'), + ]; + + $this->notice->remove($data); + + return $this->response->setJSON([ + 'code' => '0', + 'msg' => 'success' + ]); + + + } catch (\Exception $e) { + log_message('error', '[LOGIN ERROR] ' . $e->getMessage()); + return $this->response->setJSON([ + 'code' => '9', + 'msg' => $e->getMessage(), + ]); + } + } +} \ No newline at end of file diff --git a/app/Controllers/home/Home.php b/app/Controllers/home/Home.php new file mode 100644 index 0000000..064109b --- /dev/null +++ b/app/Controllers/home/Home.php @@ -0,0 +1,45 @@ +sdate = date('Y-m-d', strtotime('-1 month')); + $this->edate = date('Y-m-d'); + + $this->homeModel = new HomeModel(); + } + + public function index() + { + + } + + public function dashboard(): string + { + + $notice = $this->homeModel->getNoticeList(); + $statistics = $this->homeModel->getHomeStatistics($this->sdate, $this->edate); + + + return view('pages/home/dashboard', [ + 'menus' => $this->data, + 'notice' => $notice, + 'statistics' => $statistics, + ]); + } + + + + +} diff --git a/app/Controllers/listfax/ListFax.php b/app/Controllers/listfax/ListFax.php new file mode 100644 index 0000000..dc66b37 --- /dev/null +++ b/app/Controllers/listfax/ListFax.php @@ -0,0 +1,188 @@ +initParams(); + } + + + public function initParams() + { + // parent::__construct(); + + $this->todo = $this->request->getGet('todo', TRUE); + $this->menuid = $this->request->getGet('m', TRUE); + + $this->page = $this->request->getGet('page', TRUE); + $this->pagesize = $this->request->getGet('pagesize', TRUE); + + if (empty($this->todo)) { + $this->todo = 'inq'; + } + + $this->atcl_no = $this->request->getGet('atcl_no', TRUE); + $this->stat_cd = $this->request->getGet('stat_cd', TRUE); + $this->chk_atcl_no = $this->request->getGet('chk_atcl_no', TRUE); + $this->realtor_nm = $this->request->getGet('realtor_nm', TRUE); + $this->recv_stime = $this->request->getGet('recv_stime', TRUE); + $this->recv_etime = $this->request->getGet('recv_etime', TRUE); + $this->complete_stime = $this->request->getGet('complete_stime', TRUE); + $this->complete_etime = $this->request->getGet('complete_etime', TRUE); + $this->sido = $this->request->getGet('sido', TRUE); + $this->gugun = $this->request->getGet('gugun', TRUE); + $this->dong = $this->request->getGet('dong', TRUE); + $this->target_yn = $this->request->getGet('target_yn', TRUE); + $this->cpid = $this->request->getGet('cpid', TRUE); + $this->caller_no = $this->request->getGet('caller_no', TRUE); + $this->charger = $this->request->getGet('charger', TRUE); + $this->charger_gbn = $this->request->getGet('charger_gbn', TRUE); + $this->dept1_sq = $this->request->getGet('dept1_sq', TRUE); + $this->dept2_sq = $this->request->getGet('dept2_sq', TRUE); + $this->assign_yn = $this->request->getGet('assign_yn', TRUE); + $this->checking = $this->request->getGet('checking', TRUE); + + // 기본 선택 - 기본값을 수신시간을 당일로 처리한다. + $toDay = date('Y-m-d'); + if (empty($this->recv_stime)) + $this->recv_stime = date("Y-m-d", strtotime("-7 days")) . ' 00:00:00'; + if (empty($this->recv_etime)) + $this->recv_etime = $toDay . ' 23:59:59'; + + if (empty($this->assign_yn)) + $this->assign_yn = 'A'; + + $this->pars = array( + 'm' => $this->menuid, + 'todo' => $this->todo, + 'page' => $this->page, + 'pagesize' => $this->pagesize, + + 'atcl_no' => $this->atcl_no, + 'stat_cd' => $this->stat_cd, + 'chk_atcl_no' => $this->chk_atcl_no, + 'realtor_nm' => $this->realtor_nm, + 'recv_stime' => $this->recv_stime, + 'recv_etime' => $this->recv_etime, + 'complete_stime' => $this->complete_stime, + 'complete_etime' => $this->complete_etime, + 'sido' => $this->sido, + 'gugun' => $this->gugun, + 'dong' => $this->dong, + 'target_yn' => $this->target_yn, + 'cpid' => $this->cpid, + 'caller_no' => $this->caller_no, + 'charger' => $this->charger, + 'charger_gbn' => $this->charger_gbn, + 'dept1_sq' => $this->dept1_sq, + 'dept2_sq' => $this->dept2_sq, + 'assign_yn' => $this->assign_yn, + 'checking' => $this->checking, + ); + + + } + + + /** + * 홍보확인서 팩스 목록 + */ + public function lists() + { + // CI3 __construct 대체 + $this->initParams(); + + // CI3: $base_uri = '/listfax/listfax/lists'; + $base_uri = '/listfax/listfax/lists'; + + // CI3: $this->load->model('v2/listfax_model', 'listfax_model'); + $listfaxModel = new ListFaxModel(); + + // CI3: $this->load->helper('array_helper'); + helper(filenames: 'array'); // array_helper => array 로 이름 바꿨다면 이렇게 + + // CI3: $this->load->library('common'); + $common = new Common(); + + // checking 값에 따라 조회 여부 결정 + if ($this->pars['checking'] === '0') { + $resultData = [ + 'data' => [], + 'total' => 0, + ]; + } else { + $resultData = $listfaxModel->getLists( + $this->todo, + $this->page, + $this->pagesize, + $this->recv_stime, + $this->recv_etime, + $this->caller_no + ); + } + + // total 기본값 처리 + if (!isset($resultData['total'])) { + $resultData['total'] = 0; + } + + // 페이지네이션 (기존 common 라이브러리 그대로 사용) + $pagination = $common->make_pagenation( + $base_uri, + $this->pars, + $resultData['total'], + $this->page, + $this->pagesize + ); + + $data = [ + 'pars' => $this->pars, + 'dataList' => $resultData['data'] ?? [], + 'total' => $resultData['total'], + 'pagination' => $pagination, + ]; + + // BaseController에서 메뉴 등 공통 $this->data 세팅했다면 같이 합쳐서 넘겨도 됨 + // return view('listfax/listfax/lists', array_merge($this->data, $data)); + return view('listfax/listfax/lists', $data); + } + +} \ No newline at end of file diff --git a/app/Controllers/manage/Dept.php b/app/Controllers/manage/Dept.php new file mode 100644 index 0000000..15e3bee --- /dev/null +++ b/app/Controllers/manage/Dept.php @@ -0,0 +1,137 @@ +deptModel = new DeptModel(); + } + + + public function dept(): string + { + return view("pages/manage/dept/lists"); + } + + // 총괄팀장 페이지 + public function getchkuser(): string + { + return view("pages/manage/dept/users"); + } + + public function getDeptList() + { + $start = (int) $this->request->getGet('start') ?: 0; + $end = (int) $this->request->getGet('length') ?: 10; + + $data = [ + 'srchDepth' => $this->request->getGet('srchDepth') ?: '', + 'srcDeptNm' => $this->request->getGet('srcDeptNm') ?: '', + 'srcDeptHead' => $this->request->getGet('srcDeptHead') ?: '', + 'useYn' => $this->request->getGet('useYn') ?: '', + ]; + + $totalCount = $this->deptModel->getTotalCount($data); + + + $datas = $this->deptModel->getDeptList($start, $end, $data); + + + return $this->response->setJSON(body: [ + 'recordsTotal' => $totalCount, + 'recordsFiltered' => $totalCount, + 'data' => $datas, + ]); + } + + + // 유저목록 조회 + public function getUserList() + { + $start = (int) $this->request->getGet('start') ?: 0; + $end = (int) $this->request->getGet('length') ?: 10; + + $totalCount = $this->deptModel->getUserCount(); + + + $datas = $this->deptModel->getUserList($start, $end); + + return $this->response->setJSON(body: [ + 'recordsTotal' => $totalCount, + 'recordsFiltered' => $totalCount, + 'data' => $datas, + ]); + } + + // 상위조직 조회 + public function getPdept() + { + + $datas = $this->deptModel->getPdept(); + + + return $this->response->setJSON(body: [ + 'data' => $datas, + ]); + + } + + // 조직정보 저장 + public function saveDept() + { + try { + + $type = $this->request->getPost('type'); + + if ($type == "create") { + $data = [ + $this->request->getPost("addPdept"), // 상위조직 + $this->request->getPost("addDeptNm"), // 조직명칭 + $this->request->getPost("addDeptDesc"), // 부서설명 + $this->request->getPost("addDeptHead"), // 총괄팀장 + $this->request->getPost(index: "addUseYn"), // 사용여부 + $this->request->getPost(index: "addDepth"), // 조직구분 + session('usr_sq'), + session('usr_sq'), + ]; + + // INSERT departments + $this->deptModel->insertDept($data); + + } else if ($type == "update") { + + $data = [ + $this->request->getPost("pdept_sq"), + $this->request->getPost("addDeptNm"), // 조직명칭 + $this->request->getPost("addDeptDesc"), // 부서설명 + $this->request->getPost("addDeptHead"), // 총괄팀장 + $this->request->getPost("addUseYn"), // 사용여부 + $this->request->getPost("addDepth"), // 조직구분 + session('usr_sq'), + $this->request->getPost("dept_sq"), + ]; + + // UPDATE departments + $this->deptModel->updateDept($data); + } + + return $this->response->setJSON([ + 'code' => '0', + 'msg' => 'success' + ]); + + } catch (\Exception $e) { + return $this->response->setJSON([ + 'code' => '9', + 'msg' => $e->getMessage(), + ]); + } + } +} diff --git a/app/Controllers/manage/LoginLog.php b/app/Controllers/manage/LoginLog.php new file mode 100644 index 0000000..280d5f7 --- /dev/null +++ b/app/Controllers/manage/LoginLog.php @@ -0,0 +1,56 @@ +logModel = new LoginLogModel(); + } + + public function lists() + { + return view("pages/manage/log/lists"); + } + + public function getLogList() + { + $start = (int) $this->request->getGet('start') ?: 0; + $end = (int) $this->request->getGet('length') ?: 10; + + $data = [ + 'srchTxt' => $this->request->getGet('search[value]') ?: '', + ]; + + $totalCount = $this->logModel->getTotalCount($data); + + + $datas = $this->logModel->getLoginLogList($start, $end, $data); + + + return $this->response->setJSON(body: [ + 'recordsTotal' => $totalCount, + 'recordsFiltered' => $totalCount, + 'data' => $datas, + ]); + } + + public function excel() + { + $data = [ + 'srchTxt' => $this->request->getGet('search[value]') ?: '', + ]; + + $datas = $this->logModel->getExcelDownList($data); + + return $this->response->setJSON(body: [ + 'data' => $datas, + ]); + } +} \ No newline at end of file diff --git a/app/Controllers/manage/Menu.php b/app/Controllers/manage/Menu.php new file mode 100644 index 0000000..376aa99 --- /dev/null +++ b/app/Controllers/manage/Menu.php @@ -0,0 +1,225 @@ +menuModel = new MenuModel(); + } + + public function lists(): string + { + return view("pages/manage/menu/lists"); + } + + + // 메뉴목록조회 + public function getMenuList() + { + $params = []; + + + + $total = $this->menuModel->getTotalCount(); + $datas = $this->menuModel->getMenuList($params); + + $lft = 1; + + if (!empty($datas)) { + foreach ($datas as $k => $v) { + + $menuTp = $v['mnu_tp']; + $menuCd = $v['mnu_id']; + $menuPid = $v['mnu_pid']; + + // lft + $datas[$k]['lft'] = $lft; + + // ROOT vs 나머지 level 계산 (지금처럼 코드 길이 쓰고 싶으면 기존 로직 유지 가능) + if ($menuPid === 'ROOT') { + $datas[$k]['level'] = "0"; + $datas[$k]['parentLv'] = ""; + $datas[$k]['expanded'] = true; + } else { + // 예: "M" 제거 후 길이 기반 + $levelStr = str_replace('M', '', $menuCd); + $len = strlen($levelStr); + if ($len === 1 || $len === 2) + $datas[$k]['level'] = "1"; + else + $datas[$k]['level'] = "2"; // 필요시 더 세분화 + } + + // 아이콘 + switch ($menuTp) { + case "A": + $datas[$k]['iconCls'] = "ui-icon-play"; + break; + case "P": + $datas[$k]['iconCls'] = "ui-icon-document"; + break; + case "D": + $datas[$k]['iconCls'] = "ui-icon-folder-open"; + break; + } + + if ($menuTp === 'A') { + // 액션 + $datas[$k]['isLeaf'] = true; + $datas[$k]['rgt'] = $lft + 1; + $lft++; + + } elseif ($menuTp === 'P') { + // 화면: 내 자식은 mnu_pid == 내 mnu_id + $subCnt = 0; + foreach ($datas as $v2) { + if ($v2['mnu_pid'] === $menuCd) { + $subCnt++; + } + } + + $datas[$k]['rgt'] = $lft + ($subCnt * 2) + 1; + + if ($subCnt === 0) { + $datas[$k]['isLeaf'] = true; + $lft++; + } else { + $datas[$k]['isLeaf'] = false; + } + + } elseif ($menuTp === 'D') { + // 디렉토리: 코드 prefix 로 자식/후손 판단 (자바와 동일) + $subCnt = 0; + foreach ($datas as $v2) { + $subMenuCd = $v2['mnu_id']; + if (strpos($subMenuCd, $menuCd) === 0) { + $subCnt++; + } + } + + $datas[$k]['rgt'] = $lft + ($subCnt * 2) + 1; + + if ($subCnt === 0) { + $datas[$k]['isLeaf'] = true; + $lft++; + } else { + $datas[$k]['isLeaf'] = false; + } + + } elseif ($menuTp === 'R') { + // 루트 + $datas[$k]['isLeaf'] = false; + $datas[$k]['rgt'] = 1 + ($total * 2) + 1; + } + + $lft++; + } + } + + + // $datas = $this->buildTree($datas); + + return $this->response->setJSON(body: [ + 'total' => $total, + 'rows' => $datas, + ]); + + } + + + // private function buildTree(array $items, $parentId = 'ROOT', int $level = 0): array + // { + // $branch = []; + + // $lft = 1; + // foreach ($items as $k => $item) { + + // // 현재 parentId의 자식인지 확인 + // if ($item['mnu_pid'] === $parentId) { + + // $item['lft'] = $lft; + + // if ($item['mnu_tp'] === 'R') { + // $item['isLeaf'] = false; + // $item['rgt'] = 1 + (63 * 2 + 1); + // } else if ($item['mnu_tp'] === 'D') { + // $item['level'] = 1; + // $item['menu_tp'] = 'D'; + // $item['menu_tp_nm'] = '디렉토리'; + // $item['iconCls'] = 'ui-icon-folder-open'; + + // $subCnt = 0; + // foreach ($items as $item2): + + // if (strpos($item2['mnu_id'], $item['mnu_id'] . '.') === 0) { + // $subCnt++; + // } + + // endforeach; + + // $item['rgt'] = $lft + ($subCnt * 2) + 1; + + // if ($subCnt === 0) { + // $item['isLeaf'] = true; + // } else { + // $item['isLeaf'] = false; + // } + + // } else if ($item['mnu_tp'] == 'P') { + // $item['level'] = 2; + // $item['menu_tp'] = 'R'; + // $item['menu_tp_nm'] = '화면'; + // $item['iconCls'] = 'ui-icon-document'; + // } + // // else { + // // // 예: 루트 R 같은 경우 + // // $item['menu_tp'] = $item['mnu_tp']; + // // $item['menu_tp_nm'] = ($item['mnu_tp'] === 'R') ? '루트' : '메뉴'; + // // $item['iconCls'] = 'ui-icon-home'; + // // } + + // // 자식 찾기 (⚠️ 여기 반드시 $this->buildTree) + // // $children = $this->buildTree($items, $item['mnu_id'], $level + 1); + + // // if (!empty($children)) { + // // // 자식 정렬 (view_odr → mnu_id 순) + // // usort($children, function ($a, $b) { + // // $ao = $a['view_odr'] ?? 0; + // // $bo = $b['view_odr'] ?? 0; + + // // if ($ao == $bo) { + // // return strcmp($a['mnu_id'], $b['mnu_id']); + // // } + // // return $ao <=> $bo; + // // }); + + // // $item['children'] = $children; + // // } + + // $branch[] = $item; + // } + + // $lft++; + // } + + // // 현재 레벨도 정렬 (view_odr → mnu_id 순) + // usort($branch, function ($a, $b) { + // $ao = $a['view_odr'] ?? 0; + // $bo = $b['view_odr'] ?? 0; + + // if ($ao == $bo) { + // return strcmp($a['mnu_id'], $b['mnu_id']); + // } + // return $ao <=> $bo; + // }); + + // return $branch; + // } + +} \ No newline at end of file diff --git a/app/Controllers/manage/Phone.php b/app/Controllers/manage/Phone.php new file mode 100644 index 0000000..f3f91b0 --- /dev/null +++ b/app/Controllers/manage/Phone.php @@ -0,0 +1,115 @@ +phoneModel = new PhoneModel(); + } + + public function lists(): string + { + $codes = $this->phoneModel->getCodes(); + + return view("pages/manage/phone/lists", ['code' => $codes]); + } + + // 전화확인 목록조회 + public function getDuplPhoneList() + { + $start = (int) $this->request->getGet('start') ?: 0; + $end = (int) $this->request->getGet('length') ?: 10; + + $data = [ + 'srchTxt' => $this->request->getGet('search[value]') ?: '', + ]; + + $totalCount = $this->phoneModel->getTotalCount($data); + $datas = $this->phoneModel->getDuplPhoneList($start, $end, $data); + + return $this->response->setJSON(body: [ + 'recordsTotal' => $totalCount, + 'recordsFiltered' => $totalCount, + 'data' => $datas, + ]); + + } + + + // 전화정보 저장 + public function savePhone() + { + try { + + if ($this->validPhone($this->request->getPost('phone_number'))) { + return $this->response->setJSON([ + 'code' => '1', + 'msg' => '유효하지 않은 연락처' + ]); + } + + $type = $this->request->getPost('type'); + $data = [ + $this->request->getPost('phone_number'), // 연락처 + $this->request->getPost('use_yn'), + $this->request->getPost('s_date'), + $this->request->getPost('e_date'), + $this->request->getPost('address'), + $this->request->getPost('owner'), + $this->request->getPost('applicant'), + $this->request->getPost('relation'), + $this->request->getPost('cpid'), + $this->request->getPost(index: 'memo'), + session('usr_id'), + ]; + + if ($type === "create") { + + // INSERT dupl_phone_list + $this->phoneModel->insertDuplPhone($data); + + } else if ($type === "update") { + + array_push($data, $this->request->getPost("phone_number")); + + // UPDATE dupl_phone_list + $this->phoneModel->updateDuplPhone($data); + } + + + + + + return $this->response->setJSON([ + 'code' => '0', + 'msg' => 'success' + ]); + + } catch (\Exception $e) { + return $this->response->setJSON([ + 'code' => '9', + 'msg' => $e->getMessage(), + ]); + } + } + + + // 연락처 유효성검사 + private function validPhone($phone) + { + if (preg_match('/^01[0-9]-?\d{3,4}-?\d{4}$/', $phone)) { + return true; + } else { + return false; + } + } + +} \ No newline at end of file diff --git a/app/Controllers/manage/User.php b/app/Controllers/manage/User.php new file mode 100644 index 0000000..6cbc138 --- /dev/null +++ b/app/Controllers/manage/User.php @@ -0,0 +1,183 @@ +userModel = new UserModel(); + } + + public function user(): string + { + + $userLevel = $this->userModel->getUserLevel(); + $bonbuList = $this->userModel->getBonbuList(); + $teamList = $this->userModel->getTeamList(); + $deptCode = $this->userModel->getDeptCode(); + + return view("pages/manage/user/lists", [ + 'userLevel' => $userLevel, + 'bonbuList' => $bonbuList, + 'teamList' => $teamList, + 'deptCode' => $deptCode, + ]); + } + + + public function getUserList() + { + + $start = (int) $this->request->getGet('start') ?: 0; + $end = (int) $this->request->getGet('length') ?: 10; + + $data = [ + 'srchLevel' => $this->request->getGet('srchLevel') ?: '', + 'srchBonbu' => $this->request->getGet('srchBonbu') ?: '', + 'srchTeam' => $this->request->getGet('srchTeam') ?: '', + 'useYn' => $this->request->getGet('useYn') ?: '', + 'srchType' => $this->request->getGet('srchType') ?: '', + 'srchTxt' => $this->request->getGet('srchTxt') ?: '', + ]; + + $totalCount = $this->userModel->getTotalCount($data); + + + $datas = $this->userModel->getUserList($start, $end, $data); + + return $this->response->setJSON(body: [ + 'recordsTotal' => $totalCount, + 'recordsFiltered' => $totalCount, + 'data' => $datas, + ]); + + } + + + // 유저정보저장 + public function saveUser() + { + try { + + $type = $this->request->getPost('type'); + + + + if ($type == 'create') { + + $data = [ + $this->request->getPost('addUserId'), // 아이디 + $this->request->getPost('addUserPswd') ?: '', // 비밀번호 + $this->request->getPost('addUserDept'), // 소속조직 + $this->request->getPost('addUserNm'), // 이름 + $this->request->getPost('addUserLevel'), // 등급 + $this->request->getPost('addUserPosition'), // 직급 + $this->request->getPost('addUserTel1') ?: '', // 연락처 + $this->request->getPost('addUserTel2') ?: '', // 연락처2 + $this->request->getPost('addUserAddr1'), // 주소 + $this->request->getPost('addUserAddr2'), // 상세주소 + session('usr_sq'), // 저장유저 + $this->request->getPost('addUseYn'), // 사용여부 + $this->request->getPost('addSmsYn'), // SMS 인증여부 + + ]; + + // INSERT users + $this->userModel->insertUser($data); + + + } else if ($type == 'update') { + + $addUserPswd = trim($this->request->getPost('addUserPswd') ?? ''); + $usrSq = $this->request->getPost('usr_sq'); // hidden으로 넘어오는 PK라고 가정 + + $data = [ + $this->request->getPost('addUserNm'), // usr_nm + $this->request->getPost('addUserDept'), // dept_sq + $this->request->getPost('addUserLevel'), // usr_level + $this->request->getPost('addUserPosition'), // usr_position + $this->request->getPost('addUserTel1') ?: '', // usr_tel1 + $this->request->getPost('addUserTel2') ?: '', // usr_tel2 + $this->request->getPost('addUserAddr1'), // usr_addr1 + $this->request->getPost('addUserAddr2'), // usr_addr2 + session('usr_sq'), // update_usr + $this->request->getPost('addUseYn'), // use_yn + $this->request->getPost('addSmsYn'), // sms_auth_yn + ]; + + // 비번/PK 같이 넘김 + $this->userModel->updateUser($data, $addUserPswd, $usrSq); + + } + + return $this->response->setJSON([ + 'code' => '0', + 'msg' => 'success' + ]); + + } catch (\Exception $e) { + return $this->response->setJSON([ + 'code' => '9', + 'msg' => $e->getMessage(), + ]); + } + } + + // 유저 삭제 + public function removeuser() + { + try { + + $data = [ + session('usr_sq'), + $this->request->getPost('usr_sq') + ]; + + + $this->userModel->removeUser($data); + + + return $this->response->setJSON([ + 'code' => '0', + 'msg' => 'success' + ]); + + } catch (\Exception $e) { + return $this->response->setJSON([ + 'code' => '9', + 'msg' => $e->getMessage(), + ]); + } + } + + // 엑셀다운로드 + public function excel() + { + try { + + $data = [ + 'srchLevel' => $this->request->getGet('srchLevl') ?: '', + 'srchBonbu' => $this->request->getGet('srchBonbu') ?: '', + 'srchTeam' => $this->request->getGet('srchTeam') ?: '', + 'useYn' => $this->request->getGet('useYn') ?: '', + 'srchType' => $this->request->getGet('srchType') ?: '', + 'srchTxt' => $this->request->getGet('srchTxt') ?: '', + 'addSmsYn' => $this->request->getPost('addSmsYn'), + ]; + + $datas = $this->userModel->getExcelUserList($data); + + return $this->response->setJSON(body: [ + 'data' => $datas, + ]); + + } catch (\Exception $e) { + $e->getPrevious()->getTraceAsString(); + } + } +} diff --git a/app/Filters/AuthCheck.php b/app/Filters/AuthCheck.php index 839a11f..42fb98a 100644 --- a/app/Filters/AuthCheck.php +++ b/app/Filters/AuthCheck.php @@ -12,11 +12,11 @@ class AuthCheck implements FilterInterface { $session = session(); log_message('debug', 'URI PATH: ' . service('uri')->getPath()); - + // 로그인 체크 if (!$session->get('logged_in')) { // 로그인 안 되어 있으면 로그인 페이지로 - // return redirect()->to('/login'); + return redirect()->to('/login'); } } diff --git a/app/Helpers/array_helper.php b/app/Helpers/array_helper.php new file mode 100644 index 0000000..f5ac062 --- /dev/null +++ b/app/Helpers/array_helper.php @@ -0,0 +1,71 @@ + $value) { + if (is_array($value)) { + foreach ($value as $value2) { + if (empty($qs)) { + $qs .= '?'; + } else { + $qs .= '&'; + } + $qs .= $key . '=' . urlencode($value2); + } + } else { + if (empty($qs)) { + $qs .= '?'; + } else { + $qs .= '&'; + } + $qs .= $key . '=' . urlencode($value); + } + } + return $qs; +} + +// ... 기존 다른 함수들도 그대로 넣어도 됨 + +function siteURL() +{ + $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) + ? "https://" + : "http://"; + + $domainName = $_SERVER['HTTP_HOST'] . '/'; + return $protocol . $domainName; +} diff --git a/app/Libraries/Common.php b/app/Libraries/Common.php new file mode 100644 index 0000000..6e67193 --- /dev/null +++ b/app/Libraries/Common.php @@ -0,0 +1,36 @@ + 이게 모든 페이지의 파라메터를 동적으로 할당하는 것이다. + $base_uri .= make_query_string($parameters); + + + if (empty($num_links)) + $num_links = 10; + + $config['base_url'] = $base_uri; + $config['total_rows'] = $total_rows; + $config['cur_page'] = $cur_page; + $config['per_page'] = $per_page; + $config['num_links'] = $num_links; // 페이지의 갯수가 일정하게 보이도록.... + $config['full_tag_open'] = ''; + + $CI =& get_instance(); + $CI->load->library('pagination'); + $CI->pagination->initialize($config); + $pagination = $CI->pagination->create_links(); + return $pagination; + } + +} \ No newline at end of file diff --git a/app/Models/Home/HomeModel.php b/app/Models/Home/HomeModel.php new file mode 100644 index 0000000..a579043 --- /dev/null +++ b/app/Models/Home/HomeModel.php @@ -0,0 +1,151 @@ +getCodeList('RECEIPT_STATUS1'); + helper('string'); + + $columns = ''; + foreach ($codes as $row) { + $cd = sqlstr_quotes($row['cd']); + $cdnm = sqlstr_quotes($row['cd_nm']); + + $columns .= ", SUM(CASE WHEN SUBSTR(b.rcpt_stat, 1, 2) = '" . $cd . "' THEN 1 ELSE 0 END) \"" . $cdnm . "\""; + } + $columns = substr($columns, 1); + + // 상태별 개수 + $sql = "SELECT " . $columns . + " FROM receipt b" . + " where b.rcpt_tm BETWEEN ? AND ? "; + + $sdate .= ' 00:00:00'; + $edate .= ' 23:59:59'; + + $data = [$sdate, $edate]; + $query = $this->db->query($sql, $data); + $status = $query->getResultArray(); + + // 녹취필요 5개 + $sql = "SELECT b.rcpt_key, b.rcpt_tm, a.photo_save_dt, IFNULL(DATEDIFF(NOW(), a.photo_save_dt),0) elapsed_dt" . + " FROM result a" . + " INNER JOIN receipt b ON b.rcpt_sq = a.rcpt_sq and b.rcpt_tm between ? and ?" . + " WHERE a.req_rec_yn = 'Y'" . + " AND a.rec_yn != 'Y'" . + " AND a.result_cd1 != '90'" . + " ORDER BY 3" . + " LIMIT 5"; + $data = [$sdate, $edate]; + $query = $this->db->query($sql, $data); + $status2 = $query->getResultArray(); + + // 동의서없음 5개 + $sql = "SELECT b.rcpt_key, b.rcpt_tm, a.photo_save_dt, IFNULL(DATEDIFF(NOW(), a.photo_save_dt),0) elapsed_dt" . + " FROM result a" . + " INNER JOIN receipt b ON b.rcpt_sq = a.rcpt_sq AND b.rcpt_stat = '701000' and b.rcpt_tm between ? and ?" . + " AND a.result_cd1 != '90'" . + " ORDER BY 3" . + " LIMIT 5"; + $data = array($sdate, $edate); + $query = $this->db->query($sql, $data); + $status3 = $query->getResultArray(); + } + + + if (in_array($usr_level, ['1', '2', '3'], true)) { // 시스템관리자, 관리자, 상담원 + $sql = "SELECT a.rcpt_key, a.rcpt_tm, IFNULL(b.rsrv_date, a.rsrv_date) rsrv_date, c.cd_nm rsrv_tm_ap" . + " FROM receipt a" . + " LEFT JOIN result b ON b.rcpt_sq = a.rcpt_sq AND b.use_yn = 'Y'" . + " LEFT JOIN codes c ON c.category = 'RESERVED_APM' AND c.cd = IFNULL(b.rsrv_tm_ap, a.rsrv_tm_ap)" . + " WHERE a.rcpt_stat <= '20'" . + " and a.rcpt_tm between ? and ?" . + " LIMIT 5"; + $data = array($sdate, $edate); + $query = $this->db->query($sql, $data); + $reserve = $query->getResultArray(); + + } + + if (in_array($usr_level, ['4'], true)) { // 현장조사원 + $sql = "SELECT b.rcpt_key, b.rcpt_tm, IFNULL(a.rsrv_date, b.rsrv_date) rsrv_date, c.cd_nm rsrv_tm_ap" . + " FROM result a" . + " INNER JOIN receipt b ON b.rcpt_sq = a.rcpt_sq AND b.rcpt_stat = '30' AND b.rcpt_tm between ? and ?" . + " INNER JOIN codes c ON c.category = 'RESERVED_APM' AND c.cd = IFNULL(a.rsrv_tm_ap, b.rsrv_tm_ap)" . + " WHERE a.usr_sq = ?" . + " AND a.use_yn = 'Y'" . + " LIMIT 5"; + $data = array($sdate, $edate, $usr_sq); + $query = $this->db->query($sql, $data); + $assign = $query->getResultArray(); + + + + $sql = "SELECT COUNT(*) assign_count" . + ", IFNULL(SUM(CASE WHEN b.rcpt_stat IN ('39', '49') THEN 1 ELSE 0 END),0) cancel_count" . + ", IFNULL(SUM(CASE b.rcpt_stat WHEN '50' THEN 1 ELSE 0 END),0) complete_count" . + " FROM result a" . + " INNER JOIN receipt b ON b.rcpt_sq = a.rcpt_sq AND b.rcpt_tm between ? and ?" . + " WHERE a.usr_sq = ?" . + " AND a.assign_save_dt BETWEEN DATE_FORMAT(NOW(),'%Y-%m-01') AND DATE_FORMAT(NOW(),'%Y-%m-%d')" . + " AND a.use_yn = 'Y'"; + + + $sql = "SELECT " . + " SUM( case when a.result_cd2 = '2000' then 1 ELSE null END ) as assign_count" . + ", SUM( case when a.result_cd2 = '9030' then 1 ELSE null END ) as cancel_count" . + ", SUM( case when a.result_cd2 = '6000' then 1 ELSE null END ) as complete_count" . + " FROM result a" . + " INNER JOIN receipt b ON b.rcpt_sq = a.rcpt_sq AND b.rcpt_tm between ? and ?" . + " WHERE a.usr_sq = ?" . + " AND a.rsrv_date BETWEEN DATE_FORMAT(NOW(),'%Y-%m-01') AND DATE_FORMAT(NOW(),'%Y-%m-%d')" . + " AND a.use_yn = 'Y'"; + $data = array($sdate, $edate, $usr_sq); + $query = $this->db->query($sql, $data); + $personal = $query->getRowArray(); + + } + + return ['status' => $status, 'status2' => $status2, 'status3' => $status3, 'reserve' => $reserve, 'assign' => $assign, 'personal' => $personal]; + + } + + // 메인 공지사항 조회 + public function getNoticeList() + { + $sql = "SELECT a.bbs_sq, a.subject, a.depth, a.hit, a.update_usr, a.update_nm, DATE_FORMAT(a.update_tm, '%Y-%m-%d') AS update_tm + FROM bbs_main_notice AS a + WHERE + a.use_yn = 'Y' + ORDER BY bbs_sq DESC + LIMIT 5"; + + $query = $this->db->query($sql); + $rows = $query->getResultArray(); + $total = $query->getNumRows(); + + /* + $data = [ + 'noticeList' => $rows, + 'total' => $total, + ]; + */ + + return $rows; + } + +} \ No newline at end of file diff --git a/app/Models/board/NoticeModel.php b/app/Models/board/NoticeModel.php new file mode 100644 index 0000000..06ef8b5 --- /dev/null +++ b/app/Models/board/NoticeModel.php @@ -0,0 +1,276 @@ +db->query($sql, $params ?: []); + + return $query->getRow()->cnt; + } + + public function getNoticeList($start, $end, $data) + { + + + $sql = "SELECT + SQL_CALC_FOUND_ROWS + a.bbs_sq, a.`subject`, a.depth, a.hit, a.update_usr, a.insert_nm, a.insert_tm, a.update_nm, a.update_tm + FROM bbs_main_notice AS a + WHERE + a.use_yn = 'Y' "; + + if (!empty($data['srchTxt'])) { + + $keyword = '%' . $data['srchTxt'] . '%'; + + switch ($data['srchType']) { + case '1': // 제목 + $sql .= " AND a.subject LIKE ? "; + $params[] = $keyword; + break; + + case '2': // 작성자 + $sql .= " AND a.insert_nm LIKE ? "; + $params[] = $keyword; + break; + + default: // 제목 + 작성자 + $sql .= " AND ( a.subject LIKE ? OR a.insert_nm LIKE ? ) "; + $params[] = $keyword; + $params[] = $keyword; + break; + } + } + + $sql .= " ORDER BY a.rgt DESC + LIMIT ?, ? "; + + $params[] = (int) $start; // offset + $params[] = (int) $end; // limit + + $query = $this->db->query($sql, $params); + + return $query->getResultArray(); + } + + public function getNoticeData($id) + { + + $sql = "UPDATE bbs_main_notice SET hit = hit +1 WHERE bbs_sq = ? AND use_yn = 'Y'"; + $res = $this->db->query($sql, [$id]); + + $sql = "SELECT + SQL_CALC_FOUND_ROWS + a.bbs_sq, a.`subject`, a.content, a.depth, a.hit, a.update_usr, a.insert_nm, a.insert_tm, a.update_nm, a.update_tm + FROM bbs_main_notice AS a + WHERE + a.use_yn = 'Y' + AND a.bbs_sq = ? + "; + + $query = $this->db->query($sql, [$id]); + $notice = $query->getRowArray(); + + $sql = "SELECT bbs_sq, file_sq, file_name, file_path, file_ext, file_size, img_yn, img_height, img_width, orig_name FROM bbs_file_notice WHERE bbs_sq = ?" . + " and use_yn = 'Y'"; + $query = $this->db->query($sql, [$id]); + $files = $query->getRowArray(); + + $sql = "SELECT reply_sq, lft, rgt, content, update_nm, update_tm FROM bbs_reply_notice WHERE bbs_sq = ?" . + " AND use_yn = 'Y' ORDER BY rgt DESC"; + $query = $this->db->query($sql, [$id]); + $replys = $query->getResultArray(); + + return [ + 'notice' => $notice, + 'files' => $files, + 'reply' => $replys, + ]; + } + + + public function getFile($fileSq) + { + $sql = "SELECT file_sq, bbs_sq, file_path, file_name, orig_name FROM bbs_file_notice WHERE file_sq = ?"; + + $query = $this->db->query($sql, [$fileSq]); + + return $query->getRowArray(); + } + + public function write($data) + { + $this->db->transStart(); + + $sql = "SELECT lft+1 num FROM bbs_main_notice ORDER BY bbs_sq DESC LIMIT 1"; + $query = $this->db->query($sql); + $row = $query->getRowArray(); + $num = $row['num']; + + $sql = "INSERT INTO bbs_main_notice" + . "(bbs_psq, lft, rgt, use_yn, hit, subject, content, insert_usr, insert_nm, insert_tm, depth)" + . "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?)"; + + $query = $this->db->query($sql, [0, $num, ($num + 1), 'Y', 0, $data['subject'], $data['content'], $data['insert_usr'], $data['insert_nm'], 0]); + + // 방금 insert된 PK + $bbs_sq = $this->db->insertID(); + + // 2) 첨부파일 정보가 있으면 파일 테이블 INSERT + if (!empty($data['file'])) { + + $f = $data['file']; + + $sql = "INSERT INTO bbs_file_notice + (bbs_sq, file_name, file_path, file_ext, file_size, img_yn, img_height, img_width, orig_name) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + $this->db->query($sql, [ + $bbs_sq, + $f['new_name'] ?? '', + $f['file_path'] ?? '', + $f['ext'] ?? '', + $f['size'] ?? 0, + $f['img_yn'] ?? 'N', + $f['img_height'] ?? null, + $f['img_width'] ?? null, + $f['orig_name'] ?? '', + ]); + } + + // 트랜잭션 끝 + $this->db->transComplete(); + + if ($this->db->transStatus() === false) { + return [ + 'success' => false, + 'msg' => '저장실패', + ]; + } + + // 성공 + return [ + 'success' => true, + 'bbs_sq' => $bbs_sq, + ]; + } + + + public function modify($data) + { + + $sql = "UPDATE bbs_main_notice SET + `subject` = ?, content = ?, update_usr = ?, update_nm = ?, update_tm = NOW() + WHERE bbs_sq = ?"; + + $this->db->query($sql, [$data['subject'], $data['content'], $data['update_usr'], $data['update_nm'], $data['bbs_sq']]); + + if (!empty($data['file'])) { + + $f = $data['file']; + + if (empty($f['file_sq'])) { + $sql = "INSERT INTO bbs_file_notice + (bbs_sq, file_name, file_path, file_ext, file_size, img_yn, img_height, img_width, orig_name) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + $this->db->query($sql, [ + $data['bbs_sq'], + $f['new_name'] ?? '', + $f['file_path'] ?? '', + $f['ext'] ?? '', + $f['size'] ?? 0, + $f['img_yn'] ?? 'N', + $f['img_height'] ?? null, + $f['img_width'] ?? null, + $f['orig_name'] ?? '', + ]); + } else { + $sql = "UPDATE bbs_file_notice SET + file_name = ?, file_path = ?, file_ext = ?, file_size = ?, img_yn = ?, img_height = ?, img_width = ?, orig_name = ? + WHERE file_sq = ? + "; + + $this->db->query($sql, [ + $f['new_name'] ?? '', + $f['file_path'] ?? '', + $f['ext'] ?? '', + $f['size'] ?? 0, + $f['img_yn'] ?? 'N', + $f['img_height'] ?? null, + $f['img_width'] ?? null, + $f['orig_name'] ?? '', + $f['file_sq'], + ]); + + } + + } + + if ($this->db->transStatus() === false) { + return [ + 'success' => false, + 'msg' => '저장실패', + ]; + } + + // 성공 + return [ + 'success' => true, + ]; + } + + + public function remove($data) + { + $sql = "UPDATE bbs_main_notice SET + use_yn = 'N', update_usr = ?, update_nm = ?, update_tm = NOW() + WHERE bbs_sq = ?"; + + $this->db->query($sql, [$data['update_usr'], $data['update_nm'], $data['bbs_sq']]); + + if ($this->db->transStatus() === false) { + return [ + 'success' => false, + 'msg' => '저장실패', + ]; + } + + // 성공 + return [ + 'success' => true, + ]; + } + + +} \ No newline at end of file diff --git a/app/Models/common/CodeModel.php b/app/Models/common/CodeModel.php new file mode 100644 index 0000000..b273109 --- /dev/null +++ b/app/Models/common/CodeModel.php @@ -0,0 +1,22 @@ +db->query($sql, $data); + + return $query->getResultArray(); + } +} \ No newline at end of file diff --git a/app/Models/common/LoginModel.php b/app/Models/common/LoginModel.php new file mode 100644 index 0000000..c2ad6b9 --- /dev/null +++ b/app/Models/common/LoginModel.php @@ -0,0 +1,51 @@ += b.rgt AND c.depth = 1 AND c.use_yn = 'Y'" . + " WHERE a.usr_id = ? "; + + $data = array( + $userPw, + $userId + ); + + $query = $this->db->query($sql, $data); + $row = $query->getRowArray(); + + return $row; + } + + public function insertUserLog($data) + { + $sql = "INSERT INTO user_login_log + ( success , usr_sq , usr_id_in , ip , useragent, regdate, reason ) + VALUES + (?, ?, ?, ?, ?, NOW(), ?) + "; + + $params = [ + $data['results'], + $data['usr_sq'], + $data['usr_id'], + $data['userIp'], + $data['userAgent'], + $data['reason'], + ]; + + $this->db->query($sql, $params); + + } + +} \ No newline at end of file diff --git a/app/Models/common/MenuModel.php b/app/Models/common/MenuModel.php new file mode 100644 index 0000000..babb66e --- /dev/null +++ b/app/Models/common/MenuModel.php @@ -0,0 +1,40 @@ +db->query($sql, binds: [1]); + $mainMenuList = $query->getResultArray(); + + $sql = "SELECT a.mnu_id, a.mnu_pid, a.mnu_nm, a.mnu_url + FROM menu AS a + JOIN menu_perms AS b ON b.mnu_id = a.mnu_id + WHERE a.use_yn = 'Y' + AND b.mgrp_sq = ? + ORDER BY a.view_odr ASC + "; + + $query = $this->db->query($sql, [1]); + $subMenuList = $query->getResultArray(); + + $data = [ + 'mainMenu' => $mainMenuList, + 'subMenu' => $subMenuList, + ]; + + return $data; + } +} \ No newline at end of file diff --git a/app/Models/listfax/ListFaxModel.php b/app/Models/listfax/ListFaxModel.php new file mode 100644 index 0000000..1746067 --- /dev/null +++ b/app/Models/listfax/ListFaxModel.php @@ -0,0 +1,10 @@ +db->query($sql, $params ?: []); + + return $query->getRow()->cnt; + } + + public function getDeptList($start, $end, $data) + { + $params = []; + + $sql = "SELECT + dept_sq + , (select dept_nm from departments where dept_sq = a.pdept_sq) as pdept_nm + , pdept_sq + , dept_nm + , dept_desc + , (select usr_nm from users where usr_sq = a.dept_head) as dept_head_nm + , dept_head + , case when a.use_yn = 'Y' then '예' when a.use_yn = 'N' then '아니요' end as use_yn_nm + , use_yn + , case when a.depth = 0 then '컨펌스' when a.depth = 1 then '본부' when a.depth = 2 then '팀' end as depth_nm + , depth + , insert_tm + , (select usr_nm from users where usr_sq = a.insert_usr) insert_usr + , update_tm + , (select usr_nm from users where usr_sq = a.update_usr) update_usr + , lft + , rgt + FROM + departments AS a + WHERE + 1=1 "; + + if (!empty($data["srchDepth"])) { + $sql .= "AND a.depth = ? "; + array_push($params, $data["srchDepth"]); + } + + if (!empty($data["srcDeptNm"])) { + $sql .= "AND a.dept_nm LIKE CONCAT('%', ?, '%') "; + array_push($params, $data["srcDeptNm"]); + } + + if (!empty($data["srcDeptHead"])) { + $sql .= "AND a.dept_head IN (select usr_sq from users where usr_nm LIKE CONCAT('%', ?, '%'))"; + array_push($params, $data["srcDeptHead"]); + } + + if (!empty($data["useYn"])) { + $sql .= "AND a.use_yn = ? "; + array_push($params, $data["useYn"]); + } + + $sql .= "ORDER BY a.insert_tm DESC + LIMIT ?, ? + "; + + + + $params[] = (int) $start; + $params[] = (int) $end; + + $query = $this->db->query($sql, $params); + + return $query->getResultArray(); + + } + + + public function getUserCount() + { + $sql = "SELECT COUNT(*) AS cnt FROM users WHERE use_yn = 'Y' "; + + $query = $this->db->query($sql); + + return $query->getRow()->cnt; + } + + public function getUserList($start, $end) + { + $sql = "SELECT usr_sq, usr_id, usr_nm FROM users WHERE use_yn = 'Y' ORDER BY usr_sq DESC LIMIT ?, ?"; + + + $params[] = (int) $start; + $params[] = (int) $end; + + $query = $this->db->query($sql, $params); + + return $query->getResultArray(); + } + + // 상위조직 조회 + public function getPdept() + { + $sql = "SELECT dept_sq, dept_nm FROM departments" . + " WHERE depth = 1" . + " AND use_yn = 'Y'"; + + $query = $this->db->query($sql); + + return $query->getResultArray(); + } + + // 조직관리 INSERT + public function insertDept($data) + { + + $sql = "select ifnull(rgt,1) lft from departments where dept_sq = ?"; + $query = $this->db->query($sql, [$data[0]]); + $lft = $query->getRowArray(); + + $data[] = $lft["lft"]; + $data[] = $lft["lft"]; + + $sql = "INSERT INTO departments + (pdept_sq, dept_nm, dept_desc, dept_head ,use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt)" . + "VALUES (?, ?, ?, ?, ?, ?, now(), ?, now(), ?, ?, ?)"; + + $this->db->query($sql, $data); + + if ($this->db->transStatus() === false) { + return [ + 'success' => false, + 'msg' => '저장실패', + ]; + } + + // 성공 + return [ + 'success' => true, + ]; + } + + // 조직관리 UPDATE + public function updateDept($data) + { + $sql = "UPDATE departments SET" . + " pdept_sq = CASE depth WHEN '0' THEN pdept_sq ELSE ? END," . + " dept_nm = ?," . + " dept_desc = ?," . + " dept_head = ?," . + " use_yn = ?," . + " depth = CASE depth WHEN '0' THEN depth ELSE ? END," . + " update_tm = now()," . + " update_usr = ?" . + " WHERE dept_sq = ?"; + + $this->db->query($sql, $data); + + if ($this->db->transStatus() === false) { + return [ + 'success' => false, + 'msg' => '저장실패', + ]; + } + + // 성공 + return [ + 'success' => true, + ]; + } +} \ No newline at end of file diff --git a/app/Models/manage/LoginLogModel.php b/app/Models/manage/LoginLogModel.php new file mode 100644 index 0000000..b8ab9d0 --- /dev/null +++ b/app/Models/manage/LoginLogModel.php @@ -0,0 +1,93 @@ +db->query($sql, $params ?: []); + + return $query->getRow()->cnt; + + } + + public function getLoginLogList($start, $end, $data) + { + $sql = "SELECT id, success, usr_sq, usr_id_in, (SELECT usr_nm FROM users WHERE usr_id = usr_id_in) AS usr_nm, ip, useragent, reason, regdate FROM user_login_log "; + $sql .= "WHERE 1=1 "; + + if (!empty($data["srchTxt"])) { + $sql .= "AND ( + usr_id_in LIKE CONCAT('%', ?, '%') + OR usr_id_in IN (SELECT usr_id FROM users WHERE usr_nm LIKE CONCAT('%', ?, '%')) + OR ip LIKE CONCAT('%', ?, '%') + OR useragent LIKE CONCAT('%', ?, '%') + ) "; + $params[] = $data["srchTxt"]; + $params[] = $data["srchTxt"]; + $params[] = $data["srchTxt"]; + $params[] = $data["srchTxt"]; + } + + $sql .= "ORDER BY id DESC "; + $sql .= "LIMIT ?, ?"; + + $params[] = (int) $start; + $params[] = (int) $end; + + $query = $this->db->query($sql, $params); + + return $query->getResultArray(); + } + + // 엑셀 다운로드 조회 + public function getExcelDownList($data) + { + $params = []; + + $sql = "SELECT + usr_id_in AS '입력아이디', + (SELECT usr_nm FROM users WHERE usr_id = usr_id_in) AS '사용자명', + ip AS '아이피', useragent AS '사용자 에이전트', + reason AS '사유', + regdate AS '접속일시' + FROM user_login_log "; + $sql .= "WHERE 1=1 "; + + if (!empty($data["srchTxt"])) { + $sql .= "AND ( + usr_id_in LIKE CONCAT('%', ?, '%') + OR usr_id_in IN (SELECT usr_id FROM users WHERE usr_nm LIKE CONCAT('%', ?, '%')) + OR ip LIKE CONCAT('%', ?, '%') + OR useragent LIKE CONCAT('%', ?, '%') + ) "; + $params[] = $data["srchTxt"]; + $params[] = $data["srchTxt"]; + $params[] = $data["srchTxt"]; + $params[] = $data["srchTxt"]; + } + + $query = $this->db->query($sql, $params ?: []); + + return $query->getResultArray(); + } +} \ No newline at end of file diff --git a/app/Models/manage/MenuModel.php b/app/Models/manage/MenuModel.php new file mode 100644 index 0000000..48f3f69 --- /dev/null +++ b/app/Models/manage/MenuModel.php @@ -0,0 +1,50 @@ +db->query($sql); + + return $query->getRow()->cnt; + } + + public function getMenuList($params) + { + + $sql = "SELECT mnu_id, " . + " mnu_pid, " . + " (SELECT mnu_nm FROM menu WHERE mnu_id = a.mnu_pid) mnu_pid_nm, " . + " mnu_nm, " . + " mnu_tp, " . + " mnu_url, " . + " use_yn, " . + " insert_tm, " . + " (select usr_nm from users where usr_sq = a.insert_usr) insert_usr, " . + " (select usr_nm from users where usr_sq = a.update_usr) update_usr, " . + " update_tm " . + " FROM menu a "; + + $sql .= "WHERE 1=1 "; + + // if (!empty($params['pid'])) { + // $sql .= " AND mnu_pid = {$params['pid']} "; + // } + + $sql .= " ORDER BY CASE WHEN mnu_pid = 'ROOT' THEN 0 ELSE 1 END, mnu_id"; + + + $query = $this->db->query($sql); + + + return $query->getResultArray(); + + } + +} \ No newline at end of file diff --git a/app/Models/manage/PhoneModel.php b/app/Models/manage/PhoneModel.php new file mode 100644 index 0000000..3235053 --- /dev/null +++ b/app/Models/manage/PhoneModel.php @@ -0,0 +1,79 @@ +db->query($sql); + + return $query->getResultArray(); + } + + public function getTotalCount($data) + { + $sql = "SELECT + COUNT(*) AS cnt + FROM + dupl_phone_list AS a + LEFT JOIN codes AS b ON a.cpid = b.cd AND b.category = 'CP_ID' "; + + $query = $this->db->query($sql); + + return $query->getRow()->cnt; + } + + public function getDuplPhoneList($start, $end, $data) + { + $params = []; + + $sql = "SELECT + a.* + , (CASE a.use_yn WHEN 'Y' THEN '사용' WHEN 'N' THEN '미사용' END) use_yn_nm + , b.cd_nm as cpid_nm + FROM + dupl_phone_list AS a + LEFT JOIN codes AS b ON a.cpid = b.cd AND b.category = 'CP_ID' "; + + $sql .= "ORDER BY a.use_yn ASC, a.s_date DESC "; + + $sql .= " LIMIT ?, ?"; + + $params[] = (int) $start; + $params[] = (int) $end; + + $query = $this->db->query($sql, $params); + + return $query->getResultArray(); + } + + public function insertDuplPhone($data) + { + $sql = "INSERT INTO dupl_phone_list " . + " ( phone_number, use_yn, s_date, e_date, address" . + " , owner, applicant, relation" . + " , cpid, memo, insert_tm, insert_user_id)" . + " VALUES ( ?, ?, ?, ?, ? " . + " , ?, ?, ?" . + " , ?, ?, SYSDATE(), ?)"; + + $this->db->query($sql, $data); + + if ($this->db->transStatus() === false) { + return [ + 'success' => false, + 'msg' => '저장실패', + ]; + } + + // 성공 + return [ + 'success' => true, + ]; + } +} \ No newline at end of file diff --git a/app/Models/manage/UserModel.php b/app/Models/manage/UserModel.php new file mode 100644 index 0000000..3394a8a --- /dev/null +++ b/app/Models/manage/UserModel.php @@ -0,0 +1,443 @@ +db->query($sql); + + return $query->getResultArray(); + } + + // 본부리스트 + public function getBonbuList() + { + $sql = "SELECT dept_sq, pdept_sq, dept_nm, dept_desc, dept_head, use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt" . + " FROM departments" . + " WHERE depth = 1" . + " AND use_yn = 'Y'" . + " ORDER BY lft"; + + $query = $this->db->query($sql); + + return $query->getResultArray(); + } + + // 팀리스트 + public function getTeamList() + { + $sql = "SELECT dept_sq, pdept_sq, dept_nm" . + " FROM departments" . + " WHERE depth = 2" . + " AND use_yn = 'Y'" . + " ORDER BY dept_nm"; + + $query = $this->db->query($sql); + + return $query->getResultArray(); + } + + // 조직리스트 + public function getDeptCode() + { + $sql = "SELECT dept_sq, pdept_sq, dept_nm, dept_desc, dept_head, use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt" . + " FROM departments" . + " WHERE use_yn = 'Y' " . + " ORDER BY lft"; + + $query = $this->db->query($sql); + + return $query->getResultArray(); + } + + public function getTotalCount($data) + { + $params = []; + + $sql = "SELECT COUNT(*) AS cnt FROM users AS a WHERE 1=1 "; + + if (!empty($data['srchLevel'])) { + $sql .= " AND a.usr_level = ?"; + array_push($params, $data['srchLevel']); + } + + if (!empty($data['srchTeam'])) { + $sql .= " AND a.dept_sq = ? "; + array_push($params, $data['srchTeam']); + } + + if (!empty($data['useYn'])) { + $sql .= " AND a.use_yn = ? "; + array_push($params, $data['useYn']); + } + + if (!empty($data['srchTxt'])) { + switch ($data['srchType']): + case "1": + $sql .= " AND a.usr_nm LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + case "2": + $sql .= " AND a.usr_id LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + case "3": + $sql .= " AND a.usr_position LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + case "4": + $sql .= " AND REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%') "; + array_push($params, $data['srchTxt']); + break; + case "5": + $sql .= " AND CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + default: + $sql .= " + AND ( + a.usr_nm LIKE CONCAT('%', ?, '%') + OR a.usr_id LIKE CONCAT('%', ?, '%') + OR a.usr_position LIKE CONCAT('%', ?, '%') + OR REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%') + OR CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%') + ) + "; + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + break; + endswitch; + + } + + $query = $this->db->query($sql, $params ?: []); + + return $query->getRow()->cnt; + } + + + public function getUserList($start, $end, $data) + { + $params = []; + + $sql = "SELECT + usr_sq + , (select dept_sq from departments where dept_sq = (select pdept_sq from departments where a.dept_sq = dept_sq)) pdept_sq + , (select dept_nm from departments where dept_sq = (select pdept_sq from departments where a.dept_sq = dept_sq)) pdept_nm + , (select dept_nm from departments where a.dept_sq = dept_sq) as dept_nm + , dept_sq + , usr_id + , usr_nm + , (select cd_nm from codes where a.usr_level = cd and category = 'USER_LEVEL') level_nm + , usr_level + , usr_position + , usr_tel1 + , usr_tel2 + , usr_addr1 + , usr_addr2 + , insert_tm + , (select usr_nm from users where usr_sq = a.insert_usr) insert_usr + , update_tm + , (select usr_nm from users where usr_sq = a.update_usr) update_usr + , use_yn + , case when a.use_yn = 'Y' then '예' when a.use_yn = 'N' then '아니요' end as use_yn_nm + , sms_auth_yn + , case when a.sms_auth_yn = 'Y' then '예' when a.sms_auth_yn = 'N' then '아니요' end as sms_auth_yn_nm + , last_usr_pw_tm + FROM + users AS a + WHERE + 1=1 "; + + if (!empty($data['srchLevel'])) { + $sql .= " AND a.usr_level = ?"; + array_push($params, $data['srchLevel']); + } + + if (!empty($data['srchTeam'])) { + $sql .= " AND a.dept_sq = ?"; + array_push($params, $data['srchTeam']); + } + + if (!empty($data['useYn'])) { + $sql .= " AND a.use_yn = ?"; + array_push($params, $data['useYn']); + } + + if (!empty($data['srchTxt'])) { + switch ($data['srchType']): + case "1": + $sql .= " AND a.usr_nm LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + case "2": + $sql .= " AND a.usr_id LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + case "3": + $sql .= " AND a.usr_position LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + case "4": + $sql .= " AND REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%') "; + array_push($params, $data['srchTxt']); + break; + case "5": + $sql .= " AND CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + default: + $sql .= " + AND ( + a.usr_nm LIKE CONCAT('%', ?, '%') + OR a.usr_id LIKE CONCAT('%', ?, '%') + OR a.usr_position LIKE CONCAT('%', ?, '%') + OR REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%') + OR CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%') + ) + "; + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + break; + endswitch; + + } + + $sql .= "ORDER BY a.insert_tm DESC "; + $sql .= "LIMIT ?, ?"; + + $params[] = (int) $start; // offset + $params[] = (int) $end; // limit + + + $query = $this->db->query($sql, $params); + + return $query->getResultArray(); + } + + + // 유저등록 + public function insertUser($data) + { + + + $sql = "INSERT INTO users + (usr_id, usr_pw, dept_sq, usr_nm, usr_level, usr_position, usr_tel1, usr_tel2, usr_addr1, usr_addr2, insert_tm, insert_usr, use_yn, sms_auth_yn, last_usr_pw_tm)" . + " VALUES (?, SHA2(?,256), ?, ?, ?, ?, ?, ?, ?, ?, now(), ?, ?, ?, now())"; + + + $this->db->query($sql, $data); + + if ($this->db->transStatus() === false) { + return [ + 'success' => false, + 'msg' => '저장실패', + ]; + } + + // 성공 + return [ + 'success' => true, + ]; + } + + + // 유저수정 + public function updateUser($data, $addUserPswd, $usrSq) + { + $sql = "UPDATE users SET + usr_nm = ?, + dept_sq = ?, + usr_level = ?, + usr_position = ?, + usr_tel1 = ?, + usr_tel2 = ?, + usr_addr1 = ?, + usr_addr2 = ?, + update_tm = NOW(), + update_usr = ?, + use_yn = ?, + sms_auth_yn = ?"; + + $params = [ + $data[0], // usr_nm + $data[1], // dept_sq + $data[2], // usr_level + $data[3], // usr_position + $data[4], // usr_tel1 + $data[5], // usr_tel2 + $data[6], // usr_addr1 + $data[7], // usr_addr2 + $data[8], // update_usr + $data[9], // use_yn + $data[10], // sms_auth_yn + ]; + + if (!empty($addUserPswd)) { + $sql .= ", usr_pw = SHA2(?, 256), + last_usr_pw_tm = NOW()"; + $params[] = $addUserPswd; + } + + $sql .= " WHERE usr_sq = ?"; + $params[] = $usrSq; + + $this->db->query($sql, $params); + + if ($this->db->transStatus() === false) { + return [ + 'success' => false, + 'msg' => '저장실패', + ]; + } + + // 성공 + return [ + 'success' => true, + ]; + } + + public function removeUser($data) + { + + $sql = " UPDATE users " . + " SET usr_nm = '***' " . + " ,usr_pw = '1234' " . + " ,usr_tel1 = '***' " . + " ,usr_tel2 = '' " . + " ,usr_addr1 = '' " . + " ,usr_position = '' " . + " ,dept_sq = '14' " . //소속조직 : 퇴사자 관리 + " ,sms_auth_yn = 'N' " . + " ,use_yn = 'N' " . + " ,usr_addr2 = '삭제' " . + " ,update_tm = NOW() " . + " ,update_usr = ? " . + " WHERE usr_sq = ? "; + + + $this->db->query($sql, $data); + + + if ($this->db->transStatus() === false) { + return [ + 'success' => false, + 'msg' => '저장실패', + ]; + } + + // 성공 + return [ + 'success' => true, + ]; + } + + // 엑셀 다운로드 조회 + public function getExcelUserList($data) + { + $params = []; + + $sql = "SELECT + (select dept_nm from departments where dept_sq = (select pdept_sq from departments where a.dept_sq = dept_sq)) AS '소속본부' + , (select dept_nm from departments where a.dept_sq = dept_sq) AS '소속팀' + , usr_id AS '사원번호' + , usr_nm AS '사용자명' + , (SELECT cd_nm FROM codes where a.usr_level = cd and category = 'USER_LEVEL') AS '등급' + , usr_position AS '직급' + , usr_tel1 AS '연락처' + , CONCAT(usr_addr1, usr_addr2) AS '주소' + , case when a.sms_auth_yn = 'Y' then '예' when a.sms_auth_yn = 'N' then '아니요' end AS 'SMS인증여부' + , insert_tm AS '등록자' + , (select usr_nm from users where usr_sq = a.insert_usr) AS '등록일시' + , update_tm AS '수정자' + , (select usr_nm from users where usr_sq = a.update_usr) AS '수정일시' + , last_usr_pw_tm AS '비빌번호변경일시' + FROM + users AS a + WHERE + 1=1 "; + + if (!empty($data['srchLevel'])) { + $sql .= " AND a.usr_level = ? "; + array_push($params, $data['srchLevel']); + } + + if (!empty($data['srchTeam'])) { + $sql .= " AND a.dept_sq = ? "; + array_push($params, $data['srchTeam']); + } + + if (!empty($data['useYn'])) { + $sql .= " AND a.use_yn = ? "; + array_push($params, $data['useYn']); + } + + if (!empty($data['srchTxt'])) { + switch ($data['srchType']): + case "1": + $sql .= " AND a.usr_nm LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + case "2": + $sql .= " AND a.usr_id LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + case "3": + $sql .= " AND a.usr_position LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + case "4": + $sql .= " AND REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%') "; + array_push($params, $data['srchTxt']); + break; + case "5": + $sql .= " AND CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%') "; + array_push($params, $data['srchTxt']); + break; + default: + $sql .= " + AND ( + a.usr_nm LIKE CONCAT('%', ?, '%') + OR a.usr_id LIKE CONCAT('%', ?, '%') + OR a.usr_position LIKE CONCAT('%', ?, '%') + OR REPLACE(a.usr_tel1, '-', '') LIKE CONCAT('%', REPLACE(?, '-', ''), '%') + OR CONCAT(a.usr_addr1, ' ', a.usr_addr2) LIKE CONCAT('%', ?, '%') + ) + "; + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + array_push($params, $data['srchTxt']); + break; + endswitch; + + } + + $sql .= "ORDER BY a.insert_tm DESC "; + + + $query = $this->db->query($sql, $params ?: []); + + return $query->getResultArray(); + } + +} + diff --git a/app/Views/layouts/header.php b/app/Views/layouts/header.php index 4e28b8d..c7f4b3d 100644 --- a/app/Views/layouts/header.php +++ b/app/Views/layouts/header.php @@ -1,12 +1,56 @@ -<?= $title ?? 'Dashboard' ?> - + + +<?= $title ?? '컨펌스' ?> + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/Views/layouts/loading-indicator.php b/app/Views/layouts/loading-indicator.php new file mode 100644 index 0000000..8545b0e --- /dev/null +++ b/app/Views/layouts/loading-indicator.php @@ -0,0 +1,15 @@ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/app/Views/layouts/main.php b/app/Views/layouts/main.php index 7945d7b..ca05963 100644 --- a/app/Views/layouts/main.php +++ b/app/Views/layouts/main.php @@ -1,5 +1,6 @@ + include('layouts/header') ?> @@ -10,16 +11,22 @@ include('layouts/topbar') ?>
- include('layouts/sidebar') ?> + +
+ include('layouts/loading-indicator') ?>
renderSection('content') ?>
+ include('layouts/footer') ?>
+ + renderSection('modals') ?> - + + \ No newline at end of file diff --git a/app/Views/layouts/sidebar.php b/app/Views/layouts/sidebar.php index 0275e1f..ff71bca 100644 --- a/app/Views/layouts/sidebar.php +++ b/app/Views/layouts/sidebar.php @@ -100,140 +100,89 @@ --> - -
  • - - - Dashboard - -
  • -
  • 컨펌스
  • -
  • - - - - 현장확인매물 관리 - -
  • -
  • - - - 일반확인매물 관리 - -
  • -
  • - - - 아파트단지DB구축 - -
  • -
  • - - - SMS발송 - -
  • -
  • - - - 실적관리 - -
  • -
  • - - - 시스템관리 - -
  • -
  • - - - 금리비교 - + + + +
  • 컨펌스 + "WEB 1", + '172.16.100.3' => "WEB 2", + '172.16.100.4' => "WEB 3", + '172.16.100.5' => "WEB 4", + ]; + + + if (in_array($serverIp, $devServers, true)) { + // 개발 + echo ""; + + } elseif (in_array($serverIp, $dockerServers, true)) { + // 도커 + echo " +
    + DOCKER
    {$serverIp}
    {$this->load->db->hostname} +
    + "; + + } elseif (in_array($serverIp, $testServers, true)) { + // 테스트 + echo "테스트"; + + } else { + // 운영 + $serverName = $prodServers[$serverIp] ?? 'UNKNOWN'; + + echo "{$serverName}"; + } + + + ?> +
  • + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/app/Views/layouts/topbar.php b/app/Views/layouts/topbar.php index 5a87913..dc57ee9 100644 --- a/app/Views/layouts/topbar.php +++ b/app/Views/layouts/topbar.php @@ -60,6 +60,7 @@ --> +
    @@ -78,23 +79,25 @@ - +
    + - diff --git a/app/Views/pages/board/notice.php b/app/Views/pages/board/notice.php new file mode 100644 index 0000000..92f33cc --- /dev/null +++ b/app/Views/pages/board/notice.php @@ -0,0 +1,135 @@ +extend('layouts/main') ?> + +section('content') ?> + + +
    +
    +
    +
    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    +
    +
    +
    +
    + +
    +
    +
    공지사항
    +
    + + + + + + + + + + + + + +
    번호제목글쓴이날짜조회
    +
    + +
    +
    +
    + + + + +endSection() ?> \ No newline at end of file diff --git a/app/Views/pages/board/noticeDetail.php b/app/Views/pages/board/noticeDetail.php new file mode 100644 index 0000000..0be82b3 --- /dev/null +++ b/app/Views/pages/board/noticeDetail.php @@ -0,0 +1,127 @@ +extend('layouts/main') ?> + +section('content') ?> + +

    공지사항

    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    제목
    작성자작성일조회수
    내용 + +
    첨부파일 +
    + + + +
    +
    + +
    + +
    + +
    +
    + +endSection() ?> \ No newline at end of file diff --git a/app/Views/pages/board/noticeModify.php b/app/Views/pages/board/noticeModify.php new file mode 100644 index 0000000..0becf43 --- /dev/null +++ b/app/Views/pages/board/noticeModify.php @@ -0,0 +1,134 @@ +extend('layouts/main') ?> + +section('content') ?> + +

    공지사항

    + +
    + +
    +
    +
    +
    + +
    + + +
    +
    + + +
    +
    + + +
    + + +
    + + +
    + +
    + +
    + +
    + +
    +
    + + + +endSection() ?> \ No newline at end of file diff --git a/app/Views/pages/board/noticeWrite.php b/app/Views/pages/board/noticeWrite.php new file mode 100644 index 0000000..2367f07 --- /dev/null +++ b/app/Views/pages/board/noticeWrite.php @@ -0,0 +1,126 @@ +extend('layouts/main') ?> + +section('content') ?> + +

    공지사항

    + +
    + +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    + +
    + +
    +
    + + + + +endSection() ?> \ No newline at end of file diff --git a/app/Views/pages/dashboard.php b/app/Views/pages/dashboard.php deleted file mode 100644 index f9547f4..0000000 --- a/app/Views/pages/dashboard.php +++ /dev/null @@ -1,196 +0,0 @@ -extend('layouts/main') ?> - -section('content') ?> -

    Dashboard

    - -
    -
    -
    -
    -
    예약 미확정 매물 목록
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    접수일자예약일자오전/오후
    -
    -
    -
    -
    - -
    -
    -
    -
    공지사항
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    순번제목등록일자
    -
    -
    -
    -
    - -
    -
    -
    -
    검수지연내역(녹취필요)
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    접수일자촬영일자경과일
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    검수지연내역(홍보확인서)
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    접수일자촬영일자경과일
    -
    -
    -
    -
    - - -
    -
    - -endSection() ?> \ No newline at end of file diff --git a/app/Views/pages/home/dashboard.php b/app/Views/pages/home/dashboard.php new file mode 100644 index 0000000..b79b8ef --- /dev/null +++ b/app/Views/pages/home/dashboard.php @@ -0,0 +1,161 @@ +extend('layouts/main') ?> + +section('content') ?> + + +

    Dashboard

    + +
    +
    +
    +
    +
    예약 미확정 매물 목록
    +
    + + + + + + + + + + + + + + + + + +
    접수일자예약일자오전/오후
    +
    +
    +
    +
    + +
    +
    +
    +
    공지사항
    +
    + + + + + + + + + + + + + + + $n): ?> + + + + + + + +
    순번제목등록일자
    +
    +
    +
    +
    + +
    +
    +
    +
    검수지연내역(녹취필요)
    +
    + + + + + + + + + + + + + + + + + +
    접수일자촬영일자경과일
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    검수지연내역(홍보확인서)
    +
    + + + + + + + + + + + + + + + + + +
    접수일자촬영일자경과일
    +
    +
    +
    +
    + + +
    +
    + +endSection() ?> \ No newline at end of file diff --git a/app/Views/pages/login.php b/app/Views/pages/login.php index f656d26..cf57fbe 100644 --- a/app/Views/pages/login.php +++ b/app/Views/pages/login.php @@ -1,5 +1,203 @@ - + -echo 'login'; + + + + + 컨펌스 로그인 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +

    Welcome Back!

    +

    Sign in to your account to continue

    +
    + +
    +
    + + +
    + +
    + + +
    + +
    +
    + + +
    + + 팩스 수신 확인 + +
    + + +
    + +
    +
    + +
    +

    + Copyright © Confirms +

    +
    +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/app/Views/pages/manage/dept/lists.php b/app/Views/pages/manage/dept/lists.php new file mode 100644 index 0000000..84c3553 --- /dev/null +++ b/app/Views/pages/manage/dept/lists.php @@ -0,0 +1,559 @@ +extend('layouts/main') ?> + +section('content') ?> + + +

    조직 관리

    + +
    +
    +
    +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + + +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    조직 관리
    +
    + + + + + + + + + + + + + + + + + + +
    순번상위조직조직명칭부서장사용여부조직유형등록일자등록자수정일자수정자
    +
    + +
    +
    +
    + +section('modals') ?> + +endSection() ?> + + + + + +endSection() ?> \ No newline at end of file diff --git a/app/Views/pages/manage/dept/users.php b/app/Views/pages/manage/dept/users.php new file mode 100644 index 0000000..30ca895 --- /dev/null +++ b/app/Views/pages/manage/dept/users.php @@ -0,0 +1,159 @@ + + + + + + + + 총괄팀장 찾기 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    사용자 목록
    +
    + + + + + + + + + + +
    순번아이디이름
    +
    + +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/app/Views/pages/manage/log/lists.php b/app/Views/pages/manage/log/lists.php new file mode 100644 index 0000000..c2d2766 --- /dev/null +++ b/app/Views/pages/manage/log/lists.php @@ -0,0 +1,164 @@ +extend('layouts/main') ?> + +section('content') ?> + + +

    조직 관리

    + +
    +
    +
    조직 관리
    +
    + + + + + + + + + + + + + + + + +
    순번아이디사용자명입력아이디사유아이피사용자 에이전트일시
    +
    + +
    +
    + + + + + + +endSection() ?> \ No newline at end of file diff --git a/app/Views/pages/manage/menu/lists.php b/app/Views/pages/manage/menu/lists.php new file mode 100644 index 0000000..8a92631 --- /dev/null +++ b/app/Views/pages/manage/menu/lists.php @@ -0,0 +1,133 @@ +extend('layouts/main') ?> + +section('content') ?> + + +

    메뉴 관리

    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    메뉴 정보
    +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    + + + + + + + + + +endSection() ?> \ No newline at end of file diff --git a/app/Views/pages/manage/phone/lists.php b/app/Views/pages/manage/phone/lists.php new file mode 100644 index 0000000..208ca9f --- /dev/null +++ b/app/Views/pages/manage/phone/lists.php @@ -0,0 +1,431 @@ +extend('layouts/main') ?> + +section('content') ?> + + +

    전화확인 관리

    + +
    +
    +
    +
    +
    + +
    + + +
    + +
    + +
    +
    + +
    +
    + - +
    +
    + +
    +
    +
    + +
    + + +
    + +
    + + +
    + + +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    조직 관리
    +
    + + + + + + + + + + + + + + + + + + + +
    연락처등록일자만료일자매체사주소소유자신청인관계사용유무메모
    +
    + +
    +
    +
    + +section('modals') ?> + +endSection() ?> + + + + + +endSection() ?> \ No newline at end of file diff --git a/app/Views/pages/manage/user/lists.php b/app/Views/pages/manage/user/lists.php new file mode 100644 index 0000000..36e48e4 --- /dev/null +++ b/app/Views/pages/manage/user/lists.php @@ -0,0 +1,658 @@ +extend('layouts/main') ?> + +section('content') ?> + + +

    사용자 관리

    + +
    +
    +
    +
    +
    + + +
    + + +
    + + +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    + + +
    + + +
    + + +
    +
    + + + +
    + + +
    + +
    + + +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    사용자 관리
    +
    + + + + + + + + + + + + + + + + + + + +
    순번소속본부소속팀사원번호사용자명등급직급연락처SMS인증여부사용여부비밀번호변경일시
    +
    + +
    +
    +
    + +section('modals') ?> + +endSection() ?> + + + + + +endSection() ?> \ No newline at end of file diff --git a/public/architectui/2463b90d9a316e4e5294.woff2 b/public/architectui/2463b90d9a316e4e5294.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..16721020f0a7172e5d8a8a8484192a7a8fbd67cb GIT binary patch literal 158220 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

    J5RPh~>9IQEDv|8fkW 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 literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/QA.svg b/public/architectui/assets/fonts/QA.svg new file mode 100644 index 0000000..985171d --- /dev/null +++ b/public/architectui/assets/fonts/QA.svg @@ -0,0 +1,23 @@ + + + + QA + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/RE.svg b/public/architectui/assets/fonts/RE.svg new file mode 100644 index 0000000..7e13093 --- /dev/null +++ b/public/architectui/assets/fonts/RE.svg @@ -0,0 +1,28 @@ + + + + RE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/RO.svg b/public/architectui/assets/fonts/RO.svg new file mode 100644 index 0000000..dd82b26 --- /dev/null +++ b/public/architectui/assets/fonts/RO.svg @@ -0,0 +1,32 @@ + + + + RO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/RS.svg b/public/architectui/assets/fonts/RS.svg new file mode 100644 index 0000000..892dd5e --- /dev/null +++ b/public/architectui/assets/fonts/RS.svg @@ -0,0 +1,39 @@ + + + + RS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/RU.svg b/public/architectui/assets/fonts/RU.svg new file mode 100644 index 0000000..a9ba65b --- /dev/null +++ b/public/architectui/assets/fonts/RU.svg @@ -0,0 +1,28 @@ + + + + RU + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/RW.svg b/public/architectui/assets/fonts/RW.svg new file mode 100644 index 0000000..43b2615 --- /dev/null +++ b/public/architectui/assets/fonts/RW.svg @@ -0,0 +1,37 @@ + + + + RW + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SA.svg b/public/architectui/assets/fonts/SA.svg new file mode 100644 index 0000000..735b986 --- /dev/null +++ b/public/architectui/assets/fonts/SA.svg @@ -0,0 +1,26 @@ + + + + SA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SB.svg b/public/architectui/assets/fonts/SB.svg new file mode 100644 index 0000000..768c45c --- /dev/null +++ b/public/architectui/assets/fonts/SB.svg @@ -0,0 +1,39 @@ + + + + SB + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SC.svg b/public/architectui/assets/fonts/SC.svg new file mode 100644 index 0000000..62b380b --- /dev/null +++ b/public/architectui/assets/fonts/SC.svg @@ -0,0 +1,43 @@ + + + + SC + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SD.svg b/public/architectui/assets/fonts/SD.svg new file mode 100644 index 0000000..c68d6b1 --- /dev/null +++ b/public/architectui/assets/fonts/SD.svg @@ -0,0 +1,33 @@ + + + + SD + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SE.svg b/public/architectui/assets/fonts/SE.svg new file mode 100644 index 0000000..bb4f4e1 --- /dev/null +++ b/public/architectui/assets/fonts/SE.svg @@ -0,0 +1,27 @@ + + + + SE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SG.svg b/public/architectui/assets/fonts/SG.svg new file mode 100644 index 0000000..2701148 --- /dev/null +++ b/public/architectui/assets/fonts/SG.svg @@ -0,0 +1,24 @@ + + + + SG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SH.svg b/public/architectui/assets/fonts/SH.svg new file mode 100644 index 0000000..e0dde76 --- /dev/null +++ b/public/architectui/assets/fonts/SH.svg @@ -0,0 +1,53 @@ + + + + SH + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SI.svg b/public/architectui/assets/fonts/SI.svg new file mode 100644 index 0000000..497f870 --- /dev/null +++ b/public/architectui/assets/fonts/SI.svg @@ -0,0 +1,28 @@ + + + + SI + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SJ.svg b/public/architectui/assets/fonts/SJ.svg new file mode 100644 index 0000000..bef7e50 --- /dev/null +++ b/public/architectui/assets/fonts/SJ.svg @@ -0,0 +1,28 @@ + + + + SJ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SK.svg b/public/architectui/assets/fonts/SK.svg new file mode 100644 index 0000000..2b8ba80 --- /dev/null +++ b/public/architectui/assets/fonts/SK.svg @@ -0,0 +1,46 @@ + + + + SK + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SL.svg b/public/architectui/assets/fonts/SL.svg new file mode 100644 index 0000000..817419e --- /dev/null +++ b/public/architectui/assets/fonts/SL.svg @@ -0,0 +1,28 @@ + + + + SL + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SM.svg b/public/architectui/assets/fonts/SM.svg new file mode 100644 index 0000000..abf6217 --- /dev/null +++ b/public/architectui/assets/fonts/SM.svg @@ -0,0 +1,25 @@ + + + + SM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SN.svg b/public/architectui/assets/fonts/SN.svg new file mode 100644 index 0000000..0948416 --- /dev/null +++ b/public/architectui/assets/fonts/SN.svg @@ -0,0 +1,33 @@ + + + + SN + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SO.svg b/public/architectui/assets/fonts/SO.svg new file mode 100644 index 0000000..6372e37 --- /dev/null +++ b/public/architectui/assets/fonts/SO.svg @@ -0,0 +1,23 @@ + + + + SO + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SR.svg b/public/architectui/assets/fonts/SR.svg new file mode 100644 index 0000000..97963b0 --- /dev/null +++ b/public/architectui/assets/fonts/SR.svg @@ -0,0 +1,34 @@ + + + + SR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SS.svg b/public/architectui/assets/fonts/SS.svg new file mode 100644 index 0000000..e8d68dd --- /dev/null +++ b/public/architectui/assets/fonts/SS.svg @@ -0,0 +1,44 @@ + + + + SS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/ST.svg b/public/architectui/assets/fonts/ST.svg new file mode 100644 index 0000000..4b355d7 --- /dev/null +++ b/public/architectui/assets/fonts/ST.svg @@ -0,0 +1,39 @@ + + + + ST + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SV.svg b/public/architectui/assets/fonts/SV.svg new file mode 100644 index 0000000..9bfdd5c --- /dev/null +++ b/public/architectui/assets/fonts/SV.svg @@ -0,0 +1,30 @@ + + + + SV + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SX.svg b/public/architectui/assets/fonts/SX.svg new file mode 100644 index 0000000..ccefe03 --- /dev/null +++ b/public/architectui/assets/fonts/SX.svg @@ -0,0 +1,45 @@ + + + + SX + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SY.svg b/public/architectui/assets/fonts/SY.svg new file mode 100644 index 0000000..040530b --- /dev/null +++ b/public/architectui/assets/fonts/SY.svg @@ -0,0 +1,34 @@ + + + + SY + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/SZ.svg b/public/architectui/assets/fonts/SZ.svg new file mode 100644 index 0000000..fc4120d --- /dev/null +++ b/public/architectui/assets/fonts/SZ.svg @@ -0,0 +1,47 @@ + + + + SZ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TC.svg b/public/architectui/assets/fonts/TC.svg new file mode 100644 index 0000000..c3ea149 --- /dev/null +++ b/public/architectui/assets/fonts/TC.svg @@ -0,0 +1,40 @@ + + + + TC + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TD.svg b/public/architectui/assets/fonts/TD.svg new file mode 100644 index 0000000..74756fa --- /dev/null +++ b/public/architectui/assets/fonts/TD.svg @@ -0,0 +1,32 @@ + + + + TD + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TF.svg b/public/architectui/assets/fonts/TF.svg new file mode 100644 index 0000000..d1ea691 --- /dev/null +++ b/public/architectui/assets/fonts/TF.svg @@ -0,0 +1,35 @@ + + + + TF + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TG.svg b/public/architectui/assets/fonts/TG.svg new file mode 100644 index 0000000..e9f6360 --- /dev/null +++ b/public/architectui/assets/fonts/TG.svg @@ -0,0 +1,33 @@ + + + + TG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TH.svg b/public/architectui/assets/fonts/TH.svg new file mode 100644 index 0000000..1bf403a --- /dev/null +++ b/public/architectui/assets/fonts/TH.svg @@ -0,0 +1,29 @@ + + + + TH + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TJ.svg b/public/architectui/assets/fonts/TJ.svg new file mode 100644 index 0000000..77d6728 --- /dev/null +++ b/public/architectui/assets/fonts/TJ.svg @@ -0,0 +1,29 @@ + + + + TJ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TK.svg b/public/architectui/assets/fonts/TK.svg new file mode 100644 index 0000000..3cde960 --- /dev/null +++ b/public/architectui/assets/fonts/TK.svg @@ -0,0 +1,31 @@ + + + + TK + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TL.svg b/public/architectui/assets/fonts/TL.svg new file mode 100644 index 0000000..41b8952 --- /dev/null +++ b/public/architectui/assets/fonts/TL.svg @@ -0,0 +1,33 @@ + + + + TL + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TM.svg b/public/architectui/assets/fonts/TM.svg new file mode 100644 index 0000000..dac62a1 --- /dev/null +++ b/public/architectui/assets/fonts/TM.svg @@ -0,0 +1,74 @@ + + + + TM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TN.svg b/public/architectui/assets/fonts/TN.svg new file mode 100644 index 0000000..3ff74a9 --- /dev/null +++ b/public/architectui/assets/fonts/TN.svg @@ -0,0 +1,23 @@ + + + + TN + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TO.svg b/public/architectui/assets/fonts/TO.svg new file mode 100644 index 0000000..e0e42ee --- /dev/null +++ b/public/architectui/assets/fonts/TO.svg @@ -0,0 +1,28 @@ + + + + TO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TR.svg b/public/architectui/assets/fonts/TR.svg new file mode 100644 index 0000000..e5c0924 --- /dev/null +++ b/public/architectui/assets/fonts/TR.svg @@ -0,0 +1,23 @@ + + + + TR + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TT.svg b/public/architectui/assets/fonts/TT.svg new file mode 100644 index 0000000..69bdb9a --- /dev/null +++ b/public/architectui/assets/fonts/TT.svg @@ -0,0 +1,28 @@ + + + + TT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TV.svg b/public/architectui/assets/fonts/TV.svg new file mode 100644 index 0000000..839c97f --- /dev/null +++ b/public/architectui/assets/fonts/TV.svg @@ -0,0 +1,36 @@ + + + + TV + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TW.svg b/public/architectui/assets/fonts/TW.svg new file mode 100644 index 0000000..488d112 --- /dev/null +++ b/public/architectui/assets/fonts/TW.svg @@ -0,0 +1,28 @@ + + + + TW + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/TZ.svg b/public/architectui/assets/fonts/TZ.svg new file mode 100644 index 0000000..d652e21 --- /dev/null +++ b/public/architectui/assets/fonts/TZ.svg @@ -0,0 +1,37 @@ + + + + TZ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/UA.svg b/public/architectui/assets/fonts/UA.svg new file mode 100644 index 0000000..8dac836 --- /dev/null +++ b/public/architectui/assets/fonts/UA.svg @@ -0,0 +1,27 @@ + + + + UA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/UG.svg b/public/architectui/assets/fonts/UG.svg new file mode 100644 index 0000000..7fabd77 --- /dev/null +++ b/public/architectui/assets/fonts/UG.svg @@ -0,0 +1,37 @@ + + + + UG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/UM.svg b/public/architectui/assets/fonts/UM.svg new file mode 100644 index 0000000..1a8fc6a --- /dev/null +++ b/public/architectui/assets/fonts/UM.svg @@ -0,0 +1,28 @@ + + + + UM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/US-CA.svg b/public/architectui/assets/fonts/US-CA.svg new file mode 100644 index 0000000..8860c7a --- /dev/null +++ b/public/architectui/assets/fonts/US-CA.svg @@ -0,0 +1,33 @@ + + + + US-CA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/US.svg b/public/architectui/assets/fonts/US.svg new file mode 100644 index 0000000..846ec9d --- /dev/null +++ b/public/architectui/assets/fonts/US.svg @@ -0,0 +1,28 @@ + + + + US + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/UY.svg b/public/architectui/assets/fonts/UY.svg new file mode 100644 index 0000000..81c2815 --- /dev/null +++ b/public/architectui/assets/fonts/UY.svg @@ -0,0 +1,29 @@ + + + + UY + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/UZ.svg b/public/architectui/assets/fonts/UZ.svg new file mode 100644 index 0000000..f6cf214 --- /dev/null +++ b/public/architectui/assets/fonts/UZ.svg @@ -0,0 +1,29 @@ + + + + UZ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/VA.svg b/public/architectui/assets/fonts/VA.svg new file mode 100644 index 0000000..14c78aa --- /dev/null +++ b/public/architectui/assets/fonts/VA.svg @@ -0,0 +1,39 @@ + + + + VA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/VC.svg b/public/architectui/assets/fonts/VC.svg new file mode 100644 index 0000000..22cc1d5 --- /dev/null +++ b/public/architectui/assets/fonts/VC.svg @@ -0,0 +1,37 @@ + + + + VC + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/VE.svg b/public/architectui/assets/fonts/VE.svg new file mode 100644 index 0000000..1a14634 --- /dev/null +++ b/public/architectui/assets/fonts/VE.svg @@ -0,0 +1,33 @@ + + + + VE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/VG.svg b/public/architectui/assets/fonts/VG.svg new file mode 100644 index 0000000..c3c31ed --- /dev/null +++ b/public/architectui/assets/fonts/VG.svg @@ -0,0 +1,42 @@ + + + + VG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/VI.svg b/public/architectui/assets/fonts/VI.svg new file mode 100644 index 0000000..071cf62 --- /dev/null +++ b/public/architectui/assets/fonts/VI.svg @@ -0,0 +1,49 @@ + + + + VI + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/VN.svg b/public/architectui/assets/fonts/VN.svg new file mode 100644 index 0000000..2bb7956 --- /dev/null +++ b/public/architectui/assets/fonts/VN.svg @@ -0,0 +1,27 @@ + + + + VN + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/VU.svg b/public/architectui/assets/fonts/VU.svg new file mode 100644 index 0000000..26e0298 --- /dev/null +++ b/public/architectui/assets/fonts/VU.svg @@ -0,0 +1,38 @@ + + + + VU + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/WF.svg b/public/architectui/assets/fonts/WF.svg new file mode 100644 index 0000000..26a5e41 --- /dev/null +++ b/public/architectui/assets/fonts/WF.svg @@ -0,0 +1,28 @@ + + + + WF + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/WS.svg b/public/architectui/assets/fonts/WS.svg new file mode 100644 index 0000000..756c78f --- /dev/null +++ b/public/architectui/assets/fonts/WS.svg @@ -0,0 +1,28 @@ + + + + WS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/XK.svg b/public/architectui/assets/fonts/XK.svg new file mode 100644 index 0000000..a9c245f --- /dev/null +++ b/public/architectui/assets/fonts/XK.svg @@ -0,0 +1,28 @@ + + + + XK + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/YE.svg b/public/architectui/assets/fonts/YE.svg new file mode 100644 index 0000000..535406f --- /dev/null +++ b/public/architectui/assets/fonts/YE.svg @@ -0,0 +1,28 @@ + + + + YE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/YT.svg b/public/architectui/assets/fonts/YT.svg new file mode 100644 index 0000000..be67985 --- /dev/null +++ b/public/architectui/assets/fonts/YT.svg @@ -0,0 +1,77 @@ + + + + YT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/ZA.svg b/public/architectui/assets/fonts/ZA.svg new file mode 100644 index 0000000..f3ad372 --- /dev/null +++ b/public/architectui/assets/fonts/ZA.svg @@ -0,0 +1,44 @@ + + + + ZA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/ZM.svg b/public/architectui/assets/fonts/ZM.svg new file mode 100644 index 0000000..3e6f42a --- /dev/null +++ b/public/architectui/assets/fonts/ZM.svg @@ -0,0 +1,42 @@ + + + + ZM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/ZW.svg b/public/architectui/assets/fonts/ZW.svg new file mode 100644 index 0000000..dfaf1f3 --- /dev/null +++ b/public/architectui/assets/fonts/ZW.svg @@ -0,0 +1,43 @@ + + + + ZW + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/fa-solid-900.eot b/public/architectui/assets/fonts/fa-solid-900.eot new file mode 100644 index 0000000000000000000000000000000000000000..c867e7ebb538206ae0918f042080903dceb38a09 GIT binary patch literal 192758 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

    jA0*O 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 literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/fa-solid-900.svg b/public/architectui/assets/fonts/fa-solid-900.svg new file mode 100644 index 0000000..401b7f7 --- /dev/null +++ b/public/architectui/assets/fonts/fa-solid-900.svg @@ -0,0 +1,4667 @@ + + + + + +Created by FontForge 20190801 at Mon Sep 23 12:53:50 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/architectui/assets/fonts/fa-solid-900.ttf b/public/architectui/assets/fonts/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..16d4469b02add8bc87a91e4eaa69983864500c00 GIT binary patch literal 192472 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�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%0A!#6bE1npH=d5vzo~5q- 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ℑ^NhX#{FOmqacy9^ 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 UySFn0x4_^rl5COuA7&Ilc)vo;l>h($ literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/fa-solid-900.woff2 b/public/architectui/assets/fonts/fa-solid-900.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5a60d47c110162f63eb46519e9c419c1a7a99a00 GIT binary patch literal 75728 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%0A2_Sgi#b-O}0D8D3IGRd7sRfrg*_?$_aU3qjHBF z#H61G(23NxH6w@VTNU%H2YHA`!Anr;$?{?(=JX4=b7taoMk-Rv^lXtC(V`}g$Zo`? zVGs=>6vv47fC&dtQ(nxuB-(prl~~32-qg3K0I~0dJa+)ZnH^ppXn{?=dF!xRZDvn^ z{Qc|=l-Y8N0+Npks0$cOYaDf>D{u)Xwx5!DwsIoGByd3{>&~a;hLVASY4LAQl_e-=Z=QSv?22 zQEwDQXk?ohlNS%H!c-c?(D-CA&)>V|AYph(UXav#PYJac6ekgm7~aN&d8LMmdN0NL4+S%9egVr zTv>P16v9tf7%f8fi2E7mL_8SgV`hAom65WgDmDd?QlB>mWRKZ|Y+6H^YhS&vGqY++ z;)Ml4;dgvf;^qNq3dKX^5&$K%E+JO45nICO8fBrGL!kwYZrXski0*+NF-3vC#(HvH z3MgZ$USz8@+19`c&K5C=$P|rp$jvLgsV(LffQE6}|M_5`iO#uVP0SE`91)tk(&aRg z3k|ZIOj1mQF$rl$HNnVSh9hDP3o!CtK}dTEmW{KD@0{xuWraa%+vOv(rdOI58cHo5 z@bIJo%A&ldEVtLrpZ?HcuCAe0wMU+&48|v@>dodvbv1H4zF@UkLn+8>Qwh83lCDVt zsj{kumhV)4Bj88Tyi3GiBk77RiEKgJSyM<(u9$xBOpPQX9l0my;8pz#%~fH z;PQ#+tr0Uiy!02*t;U`CXZjyVrAw{<1&kL7MwJAv%h&W0mB*s|F8&WdsuU=n$)p^X zhy8Tcq0OJyJe*fKNnCVYf00~(okX^uP26R56n7<$O1+AzCIT9<5n!s$w!AnK5Ek8H zzA2K7w@fq26UCp`VP4%OSCuSIS!UwUWc-Xp=0MDjftT{U5P-BaabUT^%lH7H`#uoW zlMmE*i(Uqp6X?rac(ef9A6%`a&rg`7ic*H%uee;cQ33s-ofq`S^;$|D>}SV()qL9k zB-}F12!ICwbb?EZ@MPZiWZis{o)7>LBhI#9xjdavmH|f~N6On+T1V10PaLT8)TSX{vxAVlJ$DFBcU-zhPoJYxY0-O&maP}!|fNBDk}Ma7eS z1gYJr`WwT=iT4W!xIh593pWMyPI@YEzIx%6;?fyr0fLZX2`OV}HfUyRb)qIE3VILJ zhu|YMW;$qbbt8MFEoRYx7+73tjNcNS1Wp6uJf?bAyTB^rSGVIV&wN^TlEQABizj!J zs%NK#@Gk=wu0Jh#Wsp@;uN2h(xR!n9!3qSQq&mPT3FX)9<9VkE^&CPdgcM1L7FTs~ zA|7RcvSG|7^Z@QK=*Hl>ELcse9(KLXOmaPEujf+Bcw}{)jzDE!cdf{nh zmqXrlk8BM#a>32z<|-nmkM@&BF*>GSQ65%33JzxepxR48@DWDSja z9~xpHyY838iIT6VQP1;)4QdPcsx_f8HYqNfTPbm+&qHQSC?I(4wiCsBJN=;G z7ay)|G0sdz!A{FDq@AGRMJypebe(*TXl7kD#n~>tjzf9r)RI0x`b$Ot zY;E04>Ue4~M5UdRl+t*%gE1#Y_SyvRIPREml8&?F1KLaz8WaV5K<14W3~O=uJfByI zgfz1N1wH?3b=nB*(2S5(D`N^lDzCdYoOmdtjA_{?ieny!Br}aN1z_@aqCY%^3duT_ zao!Ko1#9ny9beZbgp(T(nu{{Ba>nF^$w;o}{zspLBD#f9YScwRufwI&EQZ6yJewmO5Nz>)k2kST1{gqa(?4Hlen$VlJ<{oSMB*JX;(iLkxzI zK_e2Z)Hf7>X;ApB=%Y9Pyb|s(#1|Kp5lj}PNiw-~1B>U|7W@Ds{M~DhYMEu}YA?M2 zU@#$(jL~N}k>^sekVM4<)pEAy2rU$tr6Uy1-av4pj(bucQ_P0U+|z_9__Qd&PrZv% zwECXh@GzD5+}7(;wtyWJX(aR>p7TGcFTqz`;h9tNZW`ikl9#^LE_*ClC>q!Iy+b*! zB#gH>GFLUMGis2IZJ6tXAUnh;BL_2z(acF(nmWbCB^1v;BskhgTart`#)&cyvVC}Y z6vxL_=;ecS3Kh}Aqb?Fd>1&G2ZhzA1l^#s9>)wo|%(BZBbBPXZn4bDj!lCcTB5A7G zwwK#^a!}juiak9cI?XPGnqe1-5Qk5dKCj-chY?FL&2f&m+ivSmy~U-ON%A?qGxqGU zsq|uKfRDi;Vr6pi$=-u4xm=CLQsd5f(+^g18}yBm069YP!|`K`8Y#GOd0dBQUvNCr zB|5_5S`H$v3Ixujq<cDbS>$-Le8jz;N6qACHzl;p_ zuw|>fS0oGRKCVhcD&pBBmZiSb0VX(J~}tMX<>UI8)GeKx-C6f%R%yZjw1qTkboS``c=Mu;7t$Pg^AZb2|4KOQUDoSqcVV0lh$duDZ)+EYZThd;hcw9`NY zI=fpts|WuDlQ{5_Agp6LQ_I zS$D6TUe=>*>)TbHn>l@y~;311wN!- zLDn!^ERpo|%$l&zM+`Nhr(lJ}l_wZUVFwFX^E`!A5kDLOeoG5Mp}b4&`&}${eBkML z5}E-oJ5G)z&2sr0cs!goMUZFukCcpVX1Im!qMu7h;RF-VKlsW-HvxjdW4&u6Foy+) zi24YsJcj$(01-tfXaUVoVi>yez^aFUSGg8Z&7H@VvqZTS`dw5Y7Jf%`Zl589kTGL! z3J6sIzUCnZJOXd{w^uUNn@h??KUF#n(}{Y{z=5@6+Qrx}$0~d!Q!b>+*-O=|cbM{n zt%50@*f{FQ{VE#C-qLW5EvMbw1y^aUtnb_`)|b|{Z!a{4yrkjHoAZm-)DD(JubVHS zLv;2Vi<|hKnbYxa0a4%MP)t&u?r*Pk7${qLt2D(n)2Za$jItoLN|X1gKYjJx4^9|n z+h2eNt6IC1v2jP4ukt@VxVXZ3ljZ!v0SnMgn%h?^Y^e?t8{}vljfJ34g!iMNOQX!o z`v(A)E?>D4ZPsVcZe9ntHCh(5vV8Sw((Er^-nb=5AoDSKYJAb{DbCqGTo71J6yz5V(gPQ66 zWtmg@(nsGRnRzlS8e5Y`+=mAkOrR~I1XX-_VV*_v059yf7R)I& zr!vKMiTLM|y%^22t%XU{A7TG9u2VoZfGh{?xGIO2@rP~z~sq_1VuN9nFGT_9AzSe zL?ke4CKJ@ZXMDLNimS=tKe#jN>(ec&*Jh%!a;L>gLOzSBZyTriE2lz%XR5hrgi!rT zsbN=qVcnW*JOk>33HVu#TU9xuMYMIb+_Z|kZj_KA+Gr9~+%eCo-9>-zIwA@QVtjYP z_R*>XHLR-Y%RA|ivnzvEec-t7&PM>u3WT~qp2BX`z~ zr#kJPudF%><#1-~A6@oBjg<}f&{TZeIu{-~ya;^&TPh5djl|)oINUF~`m*6VX^iil{N<3AH^+w`%kReLJIJIz!gZ zk>I%7C^Cu!9@2CRJr6~- zJ%R*yz=;j>3k)RG$zXBhLm+gIKQq&e(r8?rW^&4V?1hSf>~^X3y-W2(z=}P0K%Nh< zZ~)C~oR$@Rr=!{G-PaSk1=b~Ujp^)1>Rt0|)IU%z-5-%;ifERH<23sb4y$Y^gT3;o zgoG@I@>rdKrgm8Bx-(7aG9+c?Gf1T^f_|_Y67O|^fSyXxSFp>HF%z}Jn;*2bJ1lOy zU%?*H;Z5Soqh}tt!kZ(6Wt@bqOk2%hNOUKo+x;$IPV#V$wuo_k!!GSSa4#k8e=!51 z5op{}tHe}+KmoL|5fw<@s%+1LIR9#&ja2Z$+0Ud+;)rBv)6$r?Xsm&pcEM2QcXvb&9>Z^gnWhKaplG~E#(id1YR@s-6W zp14KQzSV&NIG%Pt$9PFo^Eeq{H&7z7nWx>gkEtaX-=6Zu+LB9!DdYBmq3?X)lP}kA z@yhfq^#F5EL-f?gb+HJFV3=S5mC!M+d-fq9;xo0V6`xhD2rh{4Js~-PRon91AJo1s zEQk(Ts+5BTBSfK`*a{5Kd0L4AwzsT*s{#iI>YsZUiZ;s#6<7i;X^Sz-gIYlps)3$) zaph4IB^pLycKCcynRM{?vL?2C#$U4>n?VQ}$SjGqOAtWJiDtiWK zR><=WrT%f$YK}LEv)lXT80=H6bWZGh{4-UAW>@SgNHF67$0Vc%-8pVx9Y=K1YpwqMf(DNI zdz~$4_s7hZ^>=vXq11+V)V%5|qkk#a@Z(ye{z;v{p&PqRhL7c_Ddww3jPttr=KMu_ z=9t<1*f@8@JoZE5a=|!%)TsT)eC@b#{*<|T#9Yzu2kU}P2Wy_x^ieG)iQT~p0jctE z-HKQS@2ohO2Ag2wt0r1!0()e~L%>Fv=-0=vz z)7bxm8WRL%tAo}A`jvJ-KW#VZ7o%YvA>EyWyBU+N8+&#|m1TCJ?%I}|!22K5GDlXi zcMdH6_Th89b&W9T#E5HKTRs{wXeI0yY9SWBLGe=vOrmay;0JvlEhzcQA(yCD1H(B%ep=;a=uhp;~A8TVput>_6!(dF6F(tTik`SU@R$_77%D$ zJU9|3oS>ONYa;rHsK0cXg^M>kH+wx7%lLq81Q7&?t@mDZ5ABujb+EjHWtZAEVrbsH zd7J4XYAbDO_npB4tzEaka33yWVu<2xYuSY2nJ?Yj$TKy>V88`%ZYKDm)2|@`;-2E+ z5Au?pUgT-s+Lg7$7XF7pw0liu_BnD7Mumca(BMlV=9|FPUubp z_^26!+48&8_EJnl+u=o?M=uxY1`Ve+pNp|U6UMGae7)TjK3qn5|WW@5Bh*F64Y z1hovDFAF;vu`CwDa%~tlel#+{Oi4!MO4W)r2O|7-%*QctqujrDiBA_>e~P%%d5%to z^GVoJh6t8N{EHCjAmFx2ggdGrQD=9^z&+qm3Md49abr>YMx$S4jb9KGCGrogPkTAF z;=1a1_%7l0Yuk?jWHnI+sQo-c(FySEbrbXDM%Sv|OeS zIeD2ettGT2k79;a%}W?qo4$9OQEq5%xiMxTGF7p`4m%;UfcBqSDSmSAoNMe|pYH+h z#)60MQwBnj&_%uT0?p9ZjID#y6W_Lp~f7KsswliWAH z7Prhj7{97?oz-m}gPWXwT0XxQdM~kge3g?ZNI{5}!%vbdZ`JALwJk-{bT@XPgUZ@& zb~ChfvO_|q2K#Z{k-!Tqxe7S`25)zL%?pyYM+m_dr_`cIs;TottbOsOIBzF~L0CT? zkqJ6&{-N74&fs%&##)xJ*r%=h%lYHh`DZip+FHMLI`b(Fw<-`O59_AH{L}_1!t)9O zCwCeZrps5h;}gv>j%i6SCW>uSb#)_{uv4+lxy2*aNi%Y$+^=1nos&bz?6k39-Q}4M zSzY&R@tE#r(?mC~$zh}CGb=GI+xnKa^Mrq+asB1BVGdlrUkeh??}fb(gy^8`Rjc}; z-D#?83&PGIpcZK=RMI!y}B!@-lGoX$*W zT#97%?2>(#h9z0z?yp=6Qc#|UuYLKAVS*U%uf7$DTQ98pAHHJ^{pL!7)q8Z}E#t&D zB&~qG8h!WOM+6DV>lmv#=Ff-728D&}^p37TTO55}LbSGnq zYc(+YK3;Rm-o#f$->-)g>JGG<|@E(+N{E7+mRF+lFDEvOR1(Idi6WcQYWQzT&XK^I;ho^7IddcYy{%QeNBE8}A4SH!l~= zPb(V*<&A0JF0;Kf#H;s)<~n2vA;iUKF!bgS&sW0CZ^C&E#g?dr4uqN&v4r2r%j;(EcFu&9-lbZ2OHxEDb6so{?o0`$`Rs&LP9$3uiUI$9Ad{C?m8B+Vs_dPGD zt#GZ;sBi2s9NW-`dKB8Ien;u;n(_;*JBLs<5!AEk!GoyCbxAawRNpS_;r1ievU|nn z^~*E&Y=-8v$7m43jT(h(Vv39&tj=Ajn9WzUx7+n)*egeXm98kN={nqy^%zl+Qyw{Y-|+WQWK2)X#UPJ^ML z{q;4B;)Ir6bN3B9kZrf8?!ic%^rjBief)8dk|ZoVoBJas1V_B#C`j#B_KD+dvm1x( zjsk+YhzR6%1Ue;?{v*ecgl#FWNTpdGX_VUfYw$&V@#z{9ZGjCa%4S+e ziWm548uF`Lmq(;IJnKxL(lWv<=IMX0F%o#Kz?uyU33-+X+PLXt086O*Ed%BqTmkyM z_Aly_KkzrTauhA1xE*yT(^;->=%iQ!%|tq-&$(ZE_t6>22nX-?7DcRkH&o)dr0+{- z2wQB4tncZQ-jS(uVSu+}EY$|D3&4|(pUB22lEPxb`ZoyW8 z&Pb4VVB3nWlO$2m85^G&y~7jsBFJ2PVvRb99SPm0R2i;SQ7B|Eu!{e=7ong0l`~kF z)UgnVyc3mj%rH5(p97&e3oJw}e;VD8yzYA58E}6>ZThj=T*B{N#Ya#w}lk}b4m#ivhp~bC!g5`b` z22J73i9tMd%7hX+Z*t8ZHA`r(3?MVf>kDg??~uCL_>Hx2^3*gV7Qct3C(Fw^nW@fLj+f zN0_V_gT9=eUugdF09M=2%{S~y4O4r-Fn0pr#}(whQKoAid7-raqpMgBM`E>4IGKon z>l%3AsPQCmJ7p}qwbX-ibP8HnV|TfgZP4k7M2qF}7Hv)N#vX6+#QlT$^4IVs!%lZ1 z>CuzWMxo%$RbzdJh=pgT)=LYNm^3xp+4bRa$=}zT^Uk>9gDJ`mh(1?*Wj;>MHTF}J z9*@n9&IVRvk3O?*`b7{hoiy|%syzZfI$_hpR$^1t5E?@Oh4e48 zrN>b=t=KC@_Vb%pj1ktC>3(+{A>;+O73yS2{(`}I4yI>;n8$aRlxo-h2 zlq|`T=g%yDN5<2s9JIORg-6eAzj&30sh7@wWN0jJq}}>pJqmSK`fee`OCu~o;pXxh z+-(7p&M&XPS|lv$1D{Y8pmwxhxXDhM((bFl0SXSxT$qpNok%*6N~0`2G_98KZs$c9 zseq;O{sI7DVS}jNv_WIa))(h#l#ceq+hvcPdjFp|!y+mJZ46){%i(P{>T8q7+JXWm zSZG2)U5QZ(p(;Rm`WLkI;$Ew-l;Hz>)D;W(WcW+`mn%A6PiLKQk2M%5ll9PG7IGqJOgMiaTF4IXl zcx8wQ{FTOxe^O6UWP~gcI0j5)@%39`1dp=v4qZAX+!VF3jOz(E?9)~^$&5{ye41Ug zLyz3#;3t_OgatgI_PEN$G4Y+eO}CfgIKcOowzu;Q2~AOv@E6zENoFj(Av7kp$jnpf ztUQF~FkMAm!J1o-VUrOXTULvgYZZ z3X;n>@vXxPKwAl}vSeR&6{6h@Af+ds?#c5ra+=4>tqERPKm+4Q2t*L>e5aTr|04U9 z14AnVu<4p8f}J#+AWc{1X$^Cmi}8MqSAEu*t-u!lln}z`5QM1>o`;-CBr2Y!WgE_3 z)0UHgf22AINd3z#Uq9L&);l7J+*b5 zx(po$D!C1?J_H@5?2fchQ&P(k?du5ld7Gsf3$(JEN3N(>d)}b0vNpS-3Vr4uFTSDM zR3A_a?NT2}GG0spS!V8r-!X%I1ff!nNQK$cI0gm)olEs5@<{)M8QUi8Hn}1~nqMGt zbOfxRg)YOyg|Tp%g;fEk2CHJ^Obo#0+ zr9@Yhvw^(o6g?$uP>b0v;uy-sH%=Zup}S8h(^ralhm9KNT}_g!W4uwl#kDDJ0H5d1 zwo|KI)W6-Uv(Y1V48L$S0ITpw6qKq%_4j(Eg?n4dE_Af({l4V%z48PKTbdnueQI49 z;H{L8Tmzem?K>TSG}7bUwD!h>@FUw|_s$>D8{Q8U}gHcN|hU|_rZiqX0d1v?4nqk`$(V)p;{-<-TGsb>ulslKw>h~nX+BS{J zIv5kk_TZ@f;pI&nH9h|~fo)uztu_y}R!pn&lqbRFq_29)^neoSWn1n2Xnd66k-yz? zP0!x;t)s~(n@8;Dsa(_UnXBefl*T=~)y&8mT8baIfeGRqJEk_XQKGoQ3d|AdE-z;_ z*;yr>ib+rgi;ai`0z?eo!II3302Vr8P}uqeusj?8=~Mh%_UBQfWqNRhm)%ORyffPQ zgaJuUA=;QmhkpkQ;Z`QAuhwBwO{#;#V@85CBE<(B|{W5Nrk2?=#6~PMvuP8 zAYtvH)Ow1Jl9G0QsSlU+KQxxc#c?H00=?|w35}bNyXL;z75x`LL`YMCkwGRNJ!}SJ zBH9zfm+ZC?yC{3!EKW)$9+)oiT~T6jgH;@I*~P(#u{hEh1##GxBBsCv_c=ZkMyI_0 zKm}qB%Wp@;S5caa>j$Zor0}!b(2=ckPFOM3!8#Vr&lIC(3rddRos23ADupLX=@4Iyu*p|0$}gAf8no|d?Y~#?&e_J;?Spf6=0|y$BDaZkhC0;zQ{X+ zEsVJuI3ndr#ViinKh0AlJP~Q3j7zhb-1=#9JJqh?9iSGrgG0f>6@L%e009{nnxdQX zQ$HJH$xt#dEE7e27EiioQ$4L!?SS|#A6^+~NUQ7xqVLav8LFR7C zBx1gghk@M5-K04BSZe9U=muXRCr4qxwBX`Uj+gubl+<-V=v5*Jvx{L`f*qdar@j zQZ$8(*dKvOGH4nA!88(17}A2m-Ddsh;K9fiiW_RMIJeoGR3`N?iu(Z@upzLfyI8DVTYPA0!iZhD&?BtX*G=D|mEvot&n^R6xr z2Dd(lUp3x3Hcg$p#k++7mWtg#Huev%lmpG{2L~4`K3}5dp_xDobeL-M;jWx)7v;}9 z8_3S8De(gf%31X*Z?lY^Pu z@?{{&?%pfbQT&|m{Yxyv0yfJPDLc)wI3Omh`1aUb%PG2Bl7eo@XZO&67vBoxd)OZ$ zerPCuow7Lv6di*`)ZqC5`9cMZjAIn-x@JZkGPKgR5*qbBqm+gC0mK8|}xMEC27Bo>TUXoun+wJ}~))i)Ig-P+V{ zolMi(2r+mVMNV?U$XuOr#(Du`5DlwN|3?+t&TX#Yxt7 z@qQ$1I^wgdm{Aj97G@v84mgyE)^Z&76I50+b*kmk$K9pwh3dmqIvjfvwK1SbW>U4@AHl6K0v@UqoTa5zs7Ixn41&*v+cD1EwA+<} zXFt%dA=GS~h+LQF$y&vl1fxyqq=jd$Y~S(0_&G#LCSm zqDPsNzX~5#zcIsICts*vrQe(6H@^2Punyli{?5U+UG9yQj*Ln0p6Fhzy@&x}pfg0s zj{Q%cp^;pfM-ooLutZKn)?1w>St0SLX&yw=6S+e=!V`%`B11ySfhGlOnAt^CJ3D$& zb(>kp)|E^e+Tz%T)I~%ri6`3Rd%=*)&HZn<|H+b7$=qjz6ZOBzF&IX1u+#)QxBNkW z#Zqlgx40Z7>qNgTHO~iZJ!(%|7b`7l-1cu+v&T-hT@lV(0g&F z=%hGXX*UkUz~+_2WhwyVU^qrUW5{~jT4rG=EnT}~<~C2ThPNu)@fC?xf90C@R6yY@ zXRBhZX+1S#?SPu?R*a85!F@aCVh&PDO+DD&Pq=d)n?@%oJ2%mrs~ z;`sLQx0n{NwCkEUdyVj|0TwaHO#A@nF1QR&$d#naP*jm4DT*iIL_#iFlTT?*t+%5(~ zzN!iTQwNYWKi>WkTr7poZENN}ap!-_{70$=iCOT%q82$x(EuAf)i_yAKGko7Dq^-Yw8y5 zT$^3U>ePxmZFpYO7uKA8#OQd|Rb84L``(IQ?U?j7`8n1L`owUF`*x8aTf3gFW%j3m zRb7^lYg@aI-Qj{| z@<{;}VhOsC!5kZ2KafkB3^W02_l29pp9`dA{CrL;8U7hcq%iAd539Rrs_54ES;(n$ zNOH>y=kU(}7Oq&o1A*|H#wGpsYPN^Y9xw=!9}2w5nVDro{7w0g;d;C|xKug-RzRu0 zbVn$q8?+Lvh0)j4vP!s`I4Pb>MeGmSJ{Pb%yepisvt1(7QLkoar`Kk@m-syV+c%wL zQK0fA{8HH?LR3QPQ`8ey!-8X%U0jbudn5p7c|zKS6hyx?yq3R%GamXDp99dp3f(Uj4J8F`4WTNOj%O>7Bn2_mm_}8a{*ZM0sT4U z7C8s{h!Sd*fG4iWAA4BgK7iHmhtQg&t9+YOx=1&`a*?W>gX?xKVFU= zd9mt1qVN&=9}_0&^~r^tSF8ITMJKr6Uc}xz>y7WfZAy(U8%#k%oz0j*503sMIPccN z=yAiKZlYT$xCj@s72R>zr+SJ8@XAW$Vg?Zf(vWt3Zab6_%_*Y8(X>(iiHk$fB-S{CNV^giihseTYjb-oEu5(F zY^3ac=PbV*IyG3ODRoiL!zq+&%Usu+J#PR=yDdlVI2-4cMbNP zE&l`5$|DTtJ*tH`wMZ{BwlrB~WML4Ybb{SOm7D?f0$@J#^Z@W?MvLLVkQScL@?Z@B z20qM?A12mFBMi95nqAEqtTSLhHZqr_JqJ~rEDS6J4fZ<}PNF8FxKH&ww<*5j zV+qx@qK`}lWMUa{ZFRVnlTt&m_HMqBbjWP@tFS_xD2tiG*PJUD}pd!*6zenqb;p--$&Tw&9n`}khlKvM-)mL&K=_r&zT1V8o=H& z>FZrjmD^K*xzWJesl}N%2I;oJn&2UY1^<`QKfsU){pxYDs^C;XsN0=v<`Qhh>t!q z-W8q8WY&>IUN#Mv1*CWQsAp?$$A+%dU_oZC!A$!MFqH$w(r6{tGM ztvp+3)T$;p_0u#9Wrhrvq@VyPDr#C&fDR{=d5b{={W6KPg)-=b1U!uR-8K#={of@p zWNRa)mb~qouz!JHWDK0nO$||Bd101k>iS4II?PTeYJ}d_p)B@m_a)~ca&Q%1dT34t5_Vk6S;)EkdxG>_ZpQ=5*R6lT15Wc7Kpv*~KIF_Mj}1Q`$qZwThfpHKJ9Tjz*M*Z8J$p^<~zb zu^;R`vIU$4KX4UQTSAC44$ojqn)dD779G9MY*`J%>zi5feC2y_k+bSFXRDEU(cPC9 z@=%D{?~}moahmli!ap8S2rDW;e{J%z!dZfeTD+B zp+`v@Qv!_rlrS~>_^z9PQ=Yx)kUY-&Bc*B1frP_{S|u;Z9+ zRC6^){@1W?*i03pw8bp(xWZM^RTxk)i|L-KlhsP537C<`HZ%vk$R-CUK?3`)H^D(r zFn&%WQ>53d8UuI6EsXpMev>3vgdk_EGpUF=MEP@9Q0kAX-G)lW)~O}b{?@3R%LB#p z3;xmai0qJ3yo((3Q@&>Qr`@%=>F;M3v4-pB0aNS;j!WpeD3}Lld*i{y``DUgAf zW2Vjle?zM!kqa<7&CVk?yzT6D?BOHKFfqT}oSa-6Hrqa^A$V2krW~_UpLul!!i)PL-WVkDxO-OL) zR4x8&lB4aAaq^auo(fTj$WmS2J2{%jse4JtOX*UEYy92jA~B9?K6{u7e~%TE!w!@;)G(K8I; zx<|A(;D1hs-Al{SI1oLw^e?Phz>kB2mH$3$!Vx6sKpq8ahSUm14r|@yi>D4lv0fzu zx-RC>_HviO)JM~Z2*P*8JJMOD)*R0r1`J_p!U669v1|?=AOV!%2-4Xk12s5;O!}Hx z?GfZM*BQIP%SbY8Ia_El#@M*c;EwJAF=-M+p3Drl`X!Wjdz0^KhaD1K8)(?^gBqun zW{azyW~0N0M2wV~V*y9~np4LI0GxtHqTX@p3r^Oh_OP{&pT{!?09-o_|cmW!E zWBTS^X9g3{6y>u5N7@&zUs?*Xf8wUmArIbO{`K*xRY)Mt@jTj!G+u3iDb;_c@M@;) z@@BT#7%5lC%l730Lb;W1!v$(3l%2Rd@?O?RwMc_*5gac#_=Ze;$3iQ%7QIwflX7n* z+M?Y(7?!cKyNDTB1AWgtTjG|yGWdMj?V zUj8{@=B(U+riswKnratnu@6Q zV{MAo@s-KJI(tpA#&9!E*QWGIy9T}X)6QtT7&D>Q|$l>A@gP@+*CX4tEZSh$ier4ZyuA? z9X_VlGg4#8DjEy5byTdEMsW@6(zK;Bk_GSEyD{y>cjmMkOux>3u)}hg3+zo>jQL$| zuYq+L>&zFs$tJs_EdUu59xrqBM3PjXN-UuU*e4!?rWB1Nuo>TS?}X$WK3yECV!P#* zwiLCbEAiW4xh}pSzB~kyhl#l*RhD&BONm!Uq-~iNc8vC3L&OGA8r~+=J4jIa4ceXQ z|F_;NZFz@lj_P`t%?JT^;_04qEU&7NA%FgK|3jOdT3CEWJZfF3b4iOM3H4h^6Ir zoU)x%*!Cb>%FRrq1N-4tiXgXfk~AE5u7}6&i9IF<_3Re94^nOJsG# z84=i7Ln+?C`2_BXw4-TOl!ORXrQyeqZ0S?TWyri)3Q$LA-*T4^}A7T|_EMB55Y3vsLB_oIc%5ygcvQA})68PpF4;-02-*xGkR90JGt~_tFAeyB zc{q8n!8>W8TMQQ5h7^-dig;n$M0%eoz=BL?_Dx2aU2(PzQxFiIUC6MLFuAa19n+4( z=7&GhN@?GG8g1cCEo8K%BntR!_NsrW?@|RR`aL_{mt$7AU`w)ug&RXMjYIE)OCI$xpemX7}A+%({ zbDuoibY0+?G)OXS8)pd#^`a|+dIEyP`fnWx?VA2hpH_XN&@n6{ysS6Kt>wC|CGt|L z6jb?22DSLjW4fnc6M{M}-X^G6&7_T3)iO<{`p2k^#c-FW`S!5IQ&7n zURHm(FKQ0@kXZY!aCMu^;Une)h4HnJ_?W?=DWUCHIC&^T+U@0I@z)3S+PLdz2#1^Y z48zIW8iHavX+ktI1NV+xkc}IlC{Paqu0kDteycqph*cmcgyw-C49n<)yiZT&(p#E- z<4sj^$i2t(mw`(~n=HRj-g#9n;hQgQ13d4JwE7kw78Yva9eG3M1^1>%zgB2jFGbR0 zY?YcKlCyx~+&oX<THTJaF%cbMN2fE`ivpWl^_OXqgMjh?2LEp#?fH69y6t&%i!*ddPcxF_Yj9@`QOF3zM zK<@e3@q!5Y^C<1Us0Az>rLNLJ7lO@t$b*_ZKk2VewhY{eF8Y)tWDZc2n>JkKa$$_pj&<|yVI#)p&dicrImFea4$B+?DN+~F zfGGZNkuTdE0N z#c_)h^qub53U|vFuUHF58=Q3-v6zimK7#26Q++pvESHnNn#zZ%p)yH-yL5~INr58V znGs#uxbcig%iK?XG^(xzxKOS{m7=5=SNW6p9LruuCWMqXiMR85sd44V+OZkUXNAfn zk`kA}F*?n>=y8f!zkYD(#MHV?b)gZ-kI2yoxaQFQ^{iyZ+{VORRxSm>Y*?>}0Qu_%d zZB6q^OC73^*XUX8vrk(!CKa(6wHrp;Q(OPA9Z)={NiC$1zVn;~rz`;&@hngjiQDRL z4Tz;Hcf7U|&3i`=VxhMAK18=)|M*-hd3kGVv)r5wB(Vcn4W*0rx>t+V= z;-PBUQm6Q?pY3Tc-ZP$SakmXVAv=B-T?U#El_HsYBJsb3zpk48~BNmFdsf{8I3{yxuR%%QUvQktGf~A*=AdPlYpK{}6xS14oNXgnu zBLIhYv^W<0TV-{0%KEu#(HLY0Xx3EpQqNgnQ=07KS*bwuUu9B*17>JG$sAvG&8Ra&+hhKwAGifz7aME@~+U= z34PY7IPy*e&C>>?8x(aQPyyB(kFL*WcayR`$5zR(&VWUqyM1&bcP z20hO^P7;m)oCsBh3kOO7uY52)1WgkpEDH=rLv8h;yqrDk6-XpGbTHXElni-?7ZJ3+aLf%T&cJb1ffJ&0@;0C&Z$H_ELA8!PGw>iis}-$ zLRR10woQsz`K(^HR&$kDu}+IxiEYq{st})2L!5bJ>|VtHlivHNf({KS8;}l1Swpkw&h4>0*D*5o>EINsc}!9r9JqRhd*;3;h`!B!V!Jj5@?+D+ zRO*5ZM3&}#UBc!q+qM!B$4lc%* zoi4Ot!O*1ARzOD}*4I(O8JKbV67MRPpVJ;Qp|}DF&c+VuWJM&tmFz4!!2cm2@KEP; z6O3M*#DEX%vRrFg)XB)C4FkUq-i`U{;HC{3?L@wxlCQ18JYl@1sNVw*0iH&a&E;!5 zmRka*TF!w=QMW_IjbrmAAUd%j`A*^$38)?Q)0JGMShR>Lwt=F$;Q$OW8ZX}#sAIF~ zRG`^dKJKvc!a~3R?cZc1yg|>8!G$*``8kaQwOrwHGq6`$^+KbkcEGUSs-K%n%uuL$ z4^zxDj~qm&tGDFm>}Bkd5!W(OW_ENigPyfMdCHW5Hz9fB62)7uv1l)-J%nu6q-v+)eQK%PUeekY$tuQ%ecgU|La^|A z3v_N$@5tSSUB^wJC}xdcsdakEE{Sb=(wU=8jHK$YDst=w8ii7>_l9eg2oAPS4#{ z1U9>lViDA~(Vljpwvj0hrf+I2RDliE9q>2igr!vd26Kb_jSU{?F_72z6mt=bMX`uh zb|A8~Le;qDy2FDroXE5r{n*H3&%-$)bji}`u<2Qn#Uro2+gG4k&ip(Ko^W*M)q(sK zzWC_5NIVze@a_-xXH{pn&vMaFc{Z~BiadhsTC=)Vyh6fS-FJfopD#VqT-1eHE;j@U z&!dgXRRFdzbrV3{S}5N~ts%2>p=Wi)x<~bI7xIOV#9<0CN`b^4HML}&LF-bo!yBa* z37oCxf8{cD1m4Dkx=xD!S8y{xDC6`ai;Bx{}{!&=gw|||KJct4LhPC z6TOyHsBq00vn(U-QHbB7)ftWk3I#UAe^IO5aJf7U>YPxQE^PK6`ksjD!6S7WLKr+p zXJ0ap3)wRPuezWzLF%IcpVLR?c~7( zfG5NscQMU-r>s5kGd6dNG1lQ}hAAjjHTIiAB?FBG(#eVWQHx4A_5+@jZ7JInGH1*A zv`CiAh$y-UKX)iR2!%&FVB3bG_ChXEa#FA@w)(x!%yTUIkk8c z6urmnQ>|Z|`RaF3>E85Je|Vy}MYPxBFGr>>oSA`!Gf2;R7YQkkwNUR;9oC3Y3+J)0 zb0pktq4K|7e^?eOvO=B+C9KcNzWl(bF&v^scFXywi#_XDv|uV4{*-qRXm2rV3N{Jr zJOa+@56i%UJuRgBY8eEVCxtddK2e6F>bfHaR_sVPo#?GW3!j35woLl%=6(>X6Ivq! zRUTY@zaKKUx&1z+8zFmKiMp~RP+NF+zvq8&-*5gPGm-SSEIZD7l`xY?&k<&7$WU%> ze)#{1SGT>rT-{W5TU-yXADO?7{u9xi_2tYoTv}S)B1;&2W9oSs02==J7%5jfJ#JRn z6V#Vo$^3rS6RzQMG+s^(tcJVPHs0+!RUMHrB*V#?ojBHQK#@!3lvN3p~O_G#0 zF$e@S&E;;vO7lMNRkFQH18``q6JbOzD5iT)Gwv6jtVISfqn=@uDhiHm8@53;wOu8t zf{&aLjfmKGELzgk#j;(ZULA{i!(uY}lmw5Rlu>3wM8AkyJ-$);7^nYcuml`#xh7HX zj0@}uE|&(Il2tZs`>eE=N(O>NEb>q+el5@MH5vGQn(;L8pg7o1BdKsgIe7LQ}*}VR(lf`Kkq%yBO7?sB$8zAf(hbqk&kRkG9`R(x*&@ z22r`nph80l?C_KtlRtLVCn)pBoDMAG+tD9nor+js7i_>|! zUxLNU690W>pu3%O$v6`~^+U&mgCBr;_DmBR%e!i7;yi>|CZ9VmUAs$YcSBI&jHNH; z{*fzj>*mW6;_5Ya&)s<^=`p-vjYe2W`Q#xh9hYP3z|b4LzEJ?UEgRv+F^@J}3$^7< zM!4jN_7NyyzyNO?^au)I=rT-$VlK2x#b_!cMu;vr8(Z|5QmCLh#z0(>4IMxTt~tJI zCH2`w0nV2Sf1}OcBsT4?fWCC6m78Tr*LR2#TimgMMR6~DT^O6mxp~C(FclXk{nHZ7 zO{&FQyH&k%ZC?lT$1|K2(`(yt${6@e5{CzZILu^FS;5+?|KZ0kPswou8_ssv{2eLX z5P_tC#&k9ew>SFc+vsO|PzR#ldV!|7XUN~S|J@#2A|a%?lT{HKNocc`V}!Hd1Ub!h zh#~C@{#_AKf;>;yuK6qdVIwX0pg9*Y52?sSA{8j}9abFL*x(-+Ky{=EiG(786uOq+ z+M^zD_>+Z!8;`KA1vE*P`+Wp#1Pz#QI0W!lFkbGhE-)eG8(K_nl|*`_$d@dHA)1>u z!)S60>qCsvXK`j-7XIOs-t9c|7)|6}sUI-{4O%%J{4PJ;U_a~coA&Qoi6gFOvj`ZH zFDLi{5%1xrWB*lTA9~h6p0I!>Q;>0fHvcPY#^;zmP$5d__9~4=)KhLwt(7b4D#m<~ zGvzn5i_1c!pAqc%qI>Z$d5mMp_|*Gi(VnQ;7s7ra`P_*6pSF66Bojq`K7(Dq<^AZ8 z;Mxtph2iRrWK|uZwVBJiwlG`x|0D9{w2?Jd2MZy9AUMI6>O?gmD^6&qhr|zz0WGN? z5@?kF_nbjn?D8~WNyQJ@K$4Nckfl3Y%_JN|!t*vJjVs^i_3Ft*y^n|t6Xkx8A*2EY-u+L-~ z`{GezQ=`a&wCundGiy<1v^`4ISM(3Q-64P6{zenqH!Qa`Z~5OJ4xJkoIngA`(VIz* zV_)AUF68}`rb?Q@@pLP;8$$7{SckCAeC+PIGq=^iU|;|6(0-vtIdq6}&4>mLzlk1> zP~PJhN)Tw*2|U38-_c>f(gYa`QBw%DlsQnk4LERILbRJ%8?_x@s>Lrz7n(ap`|qc= z8KkM-FL{Mahamug+Pak0u-*XDbDaSam7nE|yaCOnT zKuKpxxHn3{McNMYZ~>wz(x8jw5<9h{NH;g~;$^J{Vm{1Z;L5&GopgJ4@Rh@tm+Q8% zcqKbQlnhNy=)~E(McF=XTn;EPzV4_U)}E6QmpfIqQYStkI*~z~%jg2}9qTl({~E{r zH6ozY)FB}PitVwNXU5rt?8X$mYP9q%yHlfO@g>4M(_CQC5fwYODi@ywBX(V24Yen> zaUsE~qod41Wj8Ys+2U@tQuqsZ&-dqq!g8l8!z}rQn$64t%?Zo=w|dEU3aql1;^xEq zO5F%rEIX7r#UJz$bfP>A>$vK2Rz)-`5^S|a%80LR=Ip=p&*9$jb3>9srFK^`y$T~G zz5K9-5RufLV95g&49z&ax`*}HlzqWCML@sZzanc4#2VU`pEPR!YnA#g7Y_M$HwvS-E& zdjK#}C3@PD#Nd96=^qT=*X$2?O_{2Lm#mI*nCrV6N=SYf8=j8^g3MWqkEy9vT$7h9 z%4)=81o@Tac7RuwiXQyj>$tBpg;Z3q`6+;7PO;XJc z;_s&b$Hu0vRc({qlxK+HRj&IJqOJvT3rsJ}zW)XDDvbE3|JwHZ4B@h^?;GM8d9TE} zlgnJTM4qR!ftAPrM`hyZMu*&^DQ)dAXIPYiP3m^aqUneQYw z^7R?o0*^AaG6?wWY2roZ}u8nyOmPLG9}7TWxe+!U=EzO zw0h@}2M&6nY_KL84a(uJLOS?9t~gd}5z9fXDkUKrgeFaY` z!<-Nee*8p(;Sb zBaW&E;JxYiiRhZwM<+a(@<%9rHD&GN3m`!5I{fZ}k?)*_x01_0b^=^5d@bSRMFfQAfIa;G;5%FL5hj;WwNWb2eNQ@{dpD z0=r(!RWn=m$u{&?wgV} zMNMoa)+QkZuK4&TwL%%ocSv#~Tck02mD29)rD*BY$Dy3lm~HMh4_FCh*TuBO z@D{b0kvIo%b|U#Orv9spET_33akl^fpE!Z{0pMpw2!g>zF}>rom>fkLt^d5OMAqWy zQk0MEB$-BB$w90OSscV-He|a~nROZ8dppGlt3;rmPFQ6~He5El<}ZOF4ayNHDi}Y2 zFFMt5iALH)*U3my!xynZVr8Ao)SpoU8!(9-Tz>HrjF^Hi-tz_gk#EfyIgJ` z&58329M*Zy7(A`47cFE0jorwx6`j*@uyD;2F@Wa1;8pyiS_`*KY zg$orV<^TgFC%~Z)=M5jPn_P-ngr~ zO(-89l5zm*?$C174;mX7o`Eng14*g9J8VlT3a@4?+4@3yMkx7MDpz|AQYO;I6_e%; z2x<6`JZVNVQ5B1$#}P#u;*y_C;vG8ejGz>!Kmt^6fE)x`zxppb0FKYFK#RDSRKzp? zpk-5}P$gkZqyl<|1w>9T2G$2$FY=;;hikEA=la!3QryIU=CY?wbb2NZf;c6cS&=cc zUY+nO^t*%>#9r_B(cD;+;F8Dn2#LaNvp!Q zx(1kFaXLT9S>$f*dDhrh8ZyxBgXUpu_}Sl>`!RfTGYHb|-pBL{0Kg9f^5~cb;_$Ce zJj9HY=g)qjg#1&^PNTbOTbzFx8=ary;MJ1+K_kTh1d6yB`d5hZndb+B%kE&WYfd>L zpGv*yK+a9*K6}T{i`t@tsPZsmlQ}_Xkw*u3K^h3y?xrEh3J4-PCZE$-gw+1Y`N5Us zmGns%=C-1VJ$0HQvU|2!5A+UbCHwEPiGDWP-c`Tm;qGY*`+Z43kF@W7;K;H z4n~@$2?o_;BWTi{7VSRmT&~?xD_uvz?~J7!MoS*7+#Ib8Ybe7nQlKQ*>pM+Wyoyjq z!?w_Z%lKkIEP*bvXGLBB-V4iFX@$MQh*maBV?~hfor_mrV8QGs399<96Ro+eWKeV7t*bLVjyRx!-zjl~ zZ1fSnt)JLDfH-fXy|H^AC9o1TmZ_hpbhd`8y_-s7)d!1j^M^%4Be`+yooZ6)=Da{= zTc^nD_e0UzXlK3l#>Q^H@O=TqoE!NV3kEr`v=|;Ewg|`u>Ki%XN)MF4(Kzm7X-YUUTXRdlSv^p zyc|5peU{PS`_4K`pc^4dvP9Z)V*eFzFRy@ya>me8xJf#m7bEg?+ul^jbS;2fWtb}Y zPeO64ptV%zIO~Nsar2SpKUWmllUIZr^#$;!>@SYw_gmwJ-~SGV3EAtaj@8qA-{K20 zzp(Gg$qL96SJ*R(eH&cSQm_nR!z%-R^$B%$$FmU`r<8B;{fC!sY;1@-su3enV-|*Y zsO4A7Uti@`c=<}L0|Cc@>-Xwbah!&ryn$UxI7?1$oLxT(D=uGiHAdM1Ss^Og0Yl6L z2XPUic4XR*r#y_&8>Hu7*B^yEpPan_QpHFI66~;o+h8&)rhnHGY6TeWDIoWb85`)X zxO(XX*^!H=yu{W}3=h%n;{b;3zDkQpa&Lbl14ngU|3GLDWVWAj; zMGM~$L&0_>=TmOeKQU{xIQMQol~wVu@I08$%nYa)sAneQ6Yt%!cFf(c&&R!>Yh>H! zWQge37%VCg{H1&3!+6nn!ko@s6C4(0=tOnW6wV5~)rqSbUzd=c(WLi3R{xpzGG6Qz zkNa%2nx_sfF=Bi|u)B|b-`DcVe-8;I)p=(*pArNCv9UR$Ra0ys*R@2{6Bw1B)NN+0v z&WqZjM(q;Qp%Hz~p|IUsr(GgPWw8D6b8;Z^w#B+r7ccf63G}NS2w8lDz{2{+7a~5F zPxOPEcL!zp6H!p)*Org3p%jvMeFa5Cgkqv`X!l4O?|N7(VYa^P`{j4;jK?wT3D{8%-q~>D&_V32SHDM`5js z3Ofm&pPD~+?m@a7+JcO6M1ZMhMm7w@&Q_+i&o-C$$bqo?32eL*K$A@^{0}wCN?`eHkduiwm~6S zQ;89g83BBlG)Xdn;Sifbky9va1Qh~V=}x6wMp7ZQn>6|b8-;R}LIKvJ;7IFM9hd^* z$vA0}GyoZ7ldPRg;t@DVl?voxePG_CnA55g0Ce)PzX&yZ@b*0jN{ITg_eT=r;;Nc( zZ1LCaUyv@vJ3(%{1Y4@If1yP=JYqeZ3e5AxtJL}f%RkbBeOr%?T`#om(@4TtWnh;D zwyO8;v2*P@2dA~J?#-K4jzgziflTV)g3n_W6>dR?rB~ptsMvi_ucgD(;vEPgn3zI| zi=$As6TB)<$$&~?@B6ymX#B>$kp0Xd+<(y5P1ls)V{4{3y1N~^2935sALNxW`C+*} z^`F?t%70d)HgXJQ<;jNfvXnso4o3Y>yO=o5H7gBrOn>JZsi_5rssfGJVlaa0U zO(xx-AgbL1UMIZVaM8s0a$hD^kV9CRAi!;gcfu{ZS}5-`!a3F6oRZz9Rdc z>5V`LD`rLg;G4NG$wo^U@PL7GmO-H$hr}+Fqcy$>I*H@(85 z(WH2CibDeCliM3M)F`0trn}zA)G$72k~A_Iz>h$ojrH~0(Pc!VA}p30hD`Oo+tdvy zYQWtggO6Yn{AjSS&~DCm({IEM?hZEjseFr>;a0danxkFXWf|ca%e1a&mwhy=j_Ve7 z>NlC=b5z61Ww_tG(gG9X9AH_cVO8KcTWF4Zc|b~P)bfxEzlQ&MA!K<}w`z{t7VU5I zljGdxbRvpVtu&}TYPE4Tky`AsiN!W#+$Kg`V(=aq12|WRizq;e51@FVLWBlP5y8sE z6bKQpSSR{`i>`a-wb!$>SdF`4Al+e=a@=;+j_%vxo*<{+ewRURc4)YyzEB9pr4Q?Z@BPPVZOZ^;a~ zH&H?KmLC^<(N!Am0-4u#f1%Ww4Kd%Ax|&$5RJszMkz440(`GARpRKBFG5>A&TYf=3 zP)pdb+Nh53k&YvieLsjGr8-=N#c>MxiVn~pDObdaAwe0Dk=)c`G^%JSpHWK_S@BGv zSHQ4mjiwX9ZT0*U3-jySU;qjF7GsS@9ZhG|5$jW_Scg6q=&iU`oD5PtDuwgxmD;L~ zaH)O|Fr4+=>|;vQI6F=b=}S}sl;&5o4dtM-ltQCPJ)oN;c z{o2!EmlQ!I)oN;c{SnZqiPf46P6KeC#>ug|&|_`<$@cl4{rAy!mu}(_ad>-ItJZs` zi8%MM@B)+4zhO2Av;HzGeLJ|3HyIR~mJ$wxa?YPz^#uj3t?litTtZ3;7^>2kRM5lT zb571M)zuBCuZbZ)w};*H%xM~D2!N`vs?f)-&YU^3x6hUdCN{o{E)NW) zW#W`8s_E~l!nk7uH_c7(d+mpo6t2;Lbv=uU?DmHbONgdD#W-TgIoQ6RJ|rHBvfEAT zM-7QbmuBIjS`E*k?RPK;Yx_c_d9D7qpAZDR+g~@SK62scZyL6Xt@-W3kzs=l^wo_5 zZ|~4nQ?g9r5j%Zo%Tge0S_}iay{CLnjrDWm)cv~mB-mH7FlM3k`Ye+7fUi6Ybd|RS z4^}0F5&9FdfkdVg{c_*)Bla}KZ$fzP@hKD*%+yst15~CfO5{!+9(x-6)N>}gMIg$1 z?wp-%x7acE%{714u!6|BCN<)T_b;Mqo`T(WhiQGv}3^05%@nnYI*)= zus9U<#@2t5##XxmEPMJ#$+us*AE*{?%kZXCXXu4Mr{&K;zDms6Cy&Sr4fWCRGx$bG zVWOWo1t<$zqUbc0yu9sHq8^H|WY4dh{jd0`!EWY>9dBBf`I(46A1-5FsSE9dUd zSoZ&aricZ8DMfDNKy$7Sz93(N$rO1wcii57WRxT`qVE1oWmgY9VpxO*fiO?V zi0HfKSCqMayBDZ+RR+s~jGJsFNwY&O*++Fv#})I(>!jS=BuLu8h7;e&Ta9f-cOW(K zB+MRV!>f(}wT*f{u0vX~$rfaEHQR&QYEwY%AEohm5H29j;2lw!mv?(P%LT{`jJuqMEwq}e7;+piKyqjmK{PXD!m8b4G8}LyhR_5<4pvJ{sXhT<(>Pp+7pw2} zGFexvcdE0=bdXWa9%U=W6%yN5(4ufDDd1;N*9n$^^lFkju-O)0p@C4hBRVXP!pmRd+hE{5W{CuXHIJ zY3)NNArc~(%>8%JinZgx#&oH*Rxo!p)7OdkwYDrzVr4%NUBBO|8 zxOB^+)H#p1J*kWS_~ZPL9?s)A5c6Tgs7TTc3)529r7rwqn@`D-3-H^M{WF+Y-a+_= zc%%8D1Ug%vpYQq%lKj#=5iuH?SNOm%^$w-y1wjzgm}=EpO3Ay1Y#u*o1T)c zzu!_$giGhCaOxcCpC;*W(4Gi=hOG-zTOM&BowpSLkO``R{>)`_r{^ch_lMsCef)Lb z6)LrluGqnM^S{&i$K%5H%aagC^n3=bVs*Wd3@uJEMJfTHCzt4;5B~h_KJkr3tz{!i z7lWYJtE{zNq)C#y8jW(YNGvA`UF}}P1pH$r&k2^PBD+Bp2nO+(sT~*h`1iX%7*Z9& zECJ>ApNk^M5-L(7A4K1~`}^a#IJ{OZKjZ~QKFt;C*zb+NyfH3}c<*3au(;&Fp@+7Jx`u$7@2{aSXWM}T zZIr_Z4TUDf`54d`LSD8cJzesnfq)Ske3p{XC>jz1B%1XRs>8P?l z_S(9iM_KD~S|d~5Fo0jvfA1r`hsi7QbQ+b#TMdV-9cHpJ*!9a2V3DL3g}1?_jaxLT zJlzU1{GQaOz91mxYG>MJ`WFuPiazd}cm9pf6y>dN{|`If@%7go$HV^r_Lg#r&ztk} z`W|EcmT$i4+ZXyw1J6gs0cPa{$#?D1d$FEy0g8t5PxfclpCJG}K*GNs6rK4^AKG}v zTX1?)#_A2s1O1Hgl*%BF@Kjn^c1rYy)ft;k3%t)X>O+4!BRWVtQ_oEH_xGv1ydvk` z(Y3y$iAv@HhKjecTtnpXy5&J&5@l?T#-M@kyfPL_W8{nzALECcu^xYmYu|+G1FwC^ z(A=X}|4f@1{WqTy-m-PbhO0;C4&CZnV5t6^Yu;-FzvF@6)-lqB8D8HFI5z*8HnX}Qn3K*aj--~<<{TGUv#m=k?rIcI75}UD^=ouZ zbv23u7rD}U(wu0vh2X0a{FAekl{)m;$e4Efwj^2~ExCQ?BEvK>n8u1L3)QEklXN;# zdYbVJO{W+#wnl_@EDV3dhUYe8bAmW(`F zIB;oFl&5pGT4G*&P$fhF@`BDR z8rA7WyW*F$Xw+g4B$7Jh_OJCMy&*}j)$0AOrq@+KsL{L*>x^N0vDcrf!0X|~TYG$? z)6=8tE6nSQh)&y%!)T{Z*M_Er=$t~XiZCAT#-x@}B(t4TZ}usz@gfcY|6tYk;0zrZHUne zgZs%?r9_E+PU#hLyv){9lO!Y(+yr?a8bn9b-@oSvWu)p;N#RoYPJTn~TYQ3#Z``CX z=kht9RumSc?kR_85D~^gDJWS%zQMx#7ngV!iYJq?fF~FRw)$iqmfHXHU>QbeSba&r z@gb-XHa=lpKZT5CdXqV(18v-K8(D$iK^*y2;Tdx03~w~S@HsAGx_pk}gNi~tzmTrdFS3QpyHNX-HWHF1bCo-sMS-(} zPoL~;`}_qhEITW*?Rl*xlf^A`H#UmWq#UuBOsxita|Bq91@kFB9|rXG_4=(B1cH{{ zyu%SQX_Rk6!p^l4PL$w9Z)zliyD2w=gBAlPdfsJ(^-_!qMFQPU{|b>Cs0(@J$X8Z! zf}%0+WT_P6A$BJH)dX-o;Z)0(%<`2n6d9;$pFeNt!3#D~)DkJ9#H_5CGSqU4z%K8c zTS8<$lWSrg&Mh{$^%VpDZ%LQ=V6UyMnJ3&cGZM;_UVv3Et6$iNm__L#GfGNz^FZQ| z`*gVf=jy9t7#bA3+o8KbTEK2Vqp<^Pplm=!N+E7zOl7R`O0kMkDylQm&+`Sehtl5w z)Bp-7MTdshcGJ`Fe*4U^LE6WE!>RP;c5_-*bQr6TWryiuk?Qo1W^6619sd0~bQ(M7 z(9Tl{U!oKsZBL?4DDB%H>hWqqgG4C)^vT!Tzk#5}*MB%i4faVq3ce7THz-W$?+pff zd0L9S6s4<4EsWnnJlOE-+Q0b`Uc-x@&zHB$1Lp?Ld%kwqOO2a*#P(amLE@J9)Pk9U z$snI_O;Sh$3P)72j5N0p1{idwywvV7r`RPPGXgbMVN|FPrB>w$UBZp^ z9TX~)<|4ja1W`Hw^8) ziu~sV)q@ptoWPH^UxqQM^q9=vMlhDl9%oZ1>?HFPrrrpgfuOe_>-M0RS&ww=kphC^;vfi=-14SC3j>>2aej|eh;2`& z+h7~~fnz$@2aCF*!1Z+HAYXm}WGkC%WjpB}eshnUL*X=0;N1$XQ8H+NUTXrZi!juGl{Bo*gF znyCPF4e+RSx&hfzF4H3~(~zYaF=6#T&rHIyx4peQ;;np89}=olp^0`SSpZ~=mw01GSv0C`xQ{ta10okD|Y=ju$rlv&@5 z+8>PO`X4+ypVnR_!MyR=i^?~7s0#{jYuFSjY6YlzU-%6SzAtC7q9)?P2WUUAt+@fU zzUB)5*?_N^<_PwW^@mL8`UO^2y3e ztBLz`Tz0UGDeu{JDc^>+e}>C+!C^s@C=K)(ZWn`I~y{6AOm; z6pBjqY|ebET~?2W((+SfKQKLMcrmDW7rEFx)K<-1Y0M?xB-;FPJ1=9wXVhZ&dp&G_ z^2LW&u>KC!eqK|f<8CbciAqUlE{8zz!}qDoMaiL=9Vs?xsbi#X zt%U2=HQ8Ps9+I0sp<9DPqn6RrgYSUTCV0?FOuK&m{UP?p^(oaSz1k6J%qJWEyt?9N zp=Ms;&nvp;EpKRiSbdOy-SCEKqRGQ63>vpZ-ufY?AFw61yC)jz%7lC1`j!*=q`oBm z#IevHwVKC%S88Y5Po5MdyF3s0l4@raA>!_I-Fhjm zUt`Ybr_a``>CQ0~D%q1(>!f_r;}N&?_ka6OQp{gqG&btA0Kc8N^9)0HUckmM7<_b8 zXb1`Ohw{7SPpJ$w$17CGxJG0$r^XQ3Iz;Ku$^w7Yk)nvd^8~ZJ1)&1An#s^edbS95 z?E-KPvnGh>3+^COt9+oo0;hdaXLt#ZMsErJ1>v1gw^L4F?;!O z&hHYS^X#Wkun(#bmNFLd44el#^TMTz9QY3fR*E<45k*9E~QE&IB`r^G=ao7KVK4N<6n*2dI%i|H<#}3kf zhF-TxF?f%p%=@H1Y9`#Gu3}5d_@3d>toAlCdW^-yC#o-R&h^n%(J|t`g-j zIZKP7PeuRy`K_%9vcV&abqFXC z<)t_<*8^PMXw}}@*zDvfvEQ$lalx_trjUracc69(gyh)-@|^RPp`0CfZ=VUx{dZ(z zGwp?EdY(@nqj%%aEG-onxCXnA*R4nek{pS)_Y%jJ1RhH3L=xFRbV`QdL#axZQYaTE z+1(q3iw+~2C#p;Dw+pOG2(s)+VKt<*c7!lfYTS_UT6?HaC9IWcZHtQ0=|WW@HEV)# zgLEcA1Ic3Q1u5vG-&dLp0w3@+@eZ$q9XVM{tUor$c`*{gZtJG&SnV#vl$@j<3ctO$vfY`-Wq(J)PUn6gkkx8K5iZIx<=vd&f;6O6qIX<0r z<~s1yPMRdSQ+s$|-~2oDYX4lk%Y`S|%gXF_y1EIv4)aFR(oig_);%QGzp5k`l;X%#RriDxp7t986A7R*F4YuY3a69s>b2(aa1ub~9vAeKJ=FCe4^@at*25L1r+^T5&btvv z_V?2~HecfOWM4emt~|Iw^S`L%N#;bh5F&E7pzz2+H`9ENMEEh-QnwSlql#esz$y16 zQWMgAKKA@=u%ONBe|(jfgy$8r0l0mDH2Y++5{k!uF!bc{iC^AEkv~Ir93vt{q`+`oss-~76`k$P9iLKG9mO@aYxep8pfX71P75x5dBN z^?~8j)3$ixTgtz|yk2%uq(Uf-Nt^Ty2D`4tTjl|RQ!k11W-HjUA+$guE18W&it z>FfU@CHyQb;5O0C;^~X z97n?8<~bY}62rKEG2jPYjrdhi9JC65BtL+epNQE1ZOafpbcayug>?Y~Y86uJw|Ydd z@Wvk5o_hUFXG~J~h^N&=p&$^_1ld+g|ot~pwE%|mWy%#)?GfT8nN@arS60ZzC ziDL&SnuN4~*9UR9>sfaQ^zVERUU#GyXZfwZ-_Z$op3%or&|_J#M0CHf-?*Y* z174n~_L|L&uZaBk(V=Y4={yI-b7y;1+x%<2vqF0DVwSJ=s)f_?{0%Lgs496ldnG9& zH6u@E%-dWg14ji}47$4Dz(FtXewbAiT5f<9LKsn|j%5KmXYtL)@$*wV13JBn zel*yVoZ)?@=1h>LZMk<4e-?MIc@}?Xz_PgqxBL`6@0!r|k&^rLX{NG`1@{ll*vQ^6 z1H7YGLhBUBiR>I71^@S$YwH&StFrN!-}wrk95zv2fUCwQ5lho|{KardmX8tr8Ihnu zJr_-wCGK-H6+d7umtyI#H>1hfH1T;(Bi4N&Vx{Hg0X!94xsrRBrwI5X$nSFp{VrAT z4(D?6YIX?8uXiVrg*$30&o|cUtEO>bEp`+3E+vd|$ao3C(A>?Z=^gwVv7JO4u`~7t zzk_~yv$04-KeaNu*oQuS+U8l!5;NW`sa>0=O{e?(e)N^6=psM|h5IfEo<7CS8euCp z%y%@M*8TZ9k`+|lw0U1Z}!^W|Fa+3NwYW0v*jBHDu=Vhc}PS~rMIuJkx%p? z@oTv}60_8c6*~{yjb0q#AJ(J*1kOt^c z0XnJDuQobyTH7nYNUAcw&zmdTvm9 zKg23~D-F*Hn>*&5R3$10fAHdLc2@SRzI_F&hO&nS`n7`Ukk#-LFu;9G!g>Z@AaR|ya;qWBy(v8$Km>og4w zTAic23)q`gFE_DwhEW(yc7I0MJ7i7j>l>$^%>)mQTz2`U3=1;WFHov8xBksAzYPdz ziSqq-M#vqX%iyEz>+ZFVLS0M?wsp`VuH+$ZpGulWVs9d^CAbM|$+31uioU|(ZzzbG zgG9L>k#DE!t~sm%FoqEE_>mKfUE?m}$O(=HRB8?s)r%G88HV>Q!Ch5gEHo1=mxfJ- zJI&bd;6*p=Zva0)c#KvY*{e#uUZQE0OV)qWyvSCF61X;5dNBre{mT7cC+E_**8k`7 zJ`ij%t2D%HBND8F+zF@hrNv2rpZY@?ykU#Me!^yDCYiz)#DBIcaQalB`%b(HCF~bh_gTI5B(Qf?$0L86(b@?4qJTYb3#Yumqr} zyYeMs3^^rOAAp0bmunAqvNce1R~p;Ni$sA#L?$2vh@|+`x*H+5tu3#U_y@!Tqe>PF z#eBtQPq@5j@@iHxIn)B+c-xPaQRpoh61hvS^9&#Zz!OnFjzOw#mX?9V38@7&6-Y%* zc@o6wrmc>SkT9dzL1qZu=K=GRbRH7Z1C22B3I6ns&|V?ElC@f$NUYVgVUr~9genV$ z#pq~y#^B(rieNcw07FmH<(qzp3+;bSd(BH~(_?oXIPiS`bAwetpP%uvbCr3;liHBq zcv$wf1q1As>yOMi&$e+dOKrz))`cJLu0tk9goNj%SQ40Nrsz>kM5yPHJhgd`D?V&AaN@luoE?F=2xoIax>{~ ztDc06Z(xVUMQTl!_+Sp15=OZpnWM+F}RR*hH#xeoSO}_KSzLraq8T z7g5KL0MALLDgtGwdk5T&P;eB9_r|yli%6Vkrjkprwiq5U?H?{FPsVQCwSzC}+X-j5 zuPK%4sd6W~Xw+4m-yJZn%4-1he!^xvIp@m*gWI=FB7_dYvuA`}LLtuS^y=HPMNi8; zoer$+nkJ*I=#rMzMP%E4s2I=uphxZ!0lwu9?e$pEvk^TtZL%X<)#)|PfFCyb0mdIw z({WVfT-mv={plG?^hP4_>+sHAYo%HSfL&%L7Mq@iDALnaam!y=R@P8e2lUaQhYyZX zWu&Wku}>q1W`Z?)2?aUb-}plLT&WyFt;t$Y5Slh8Bs#0{=PozX?#~ZRZ6FSVuH%9= zt<}}4w*G5nh$Mcm{YYy=Q>39eS98wKVac&H+9-Gd>lS-Kd&y5I_=+~}%wVBs0CKQP zAz2)DMq!C!0ljYRkC+DP;SAE~b?YgB2fv@barS|yzg(6|{=AnPO=U{lW;CJ`tQ;Tu8 z9&@o3CJv2L`Awds1ptpKr3P^s875RM@$$v+-ZKQ^Yf@g8og*ea6NgSoVVI;xK8fR| zV4f6bc(GZn{TgPX&9oFb$YDKwsW~5#Yp(O>Ei=E;8I-3Zgp6DHZ3g3a3Dlr41%&2a zNv}(bH0O&YBF1-vpl%>S&JOdIZ-~9EX1VuO9wE0i@vz~C$-KGZgBZqxzmoBqGH*V1 z6z7k3(nR(sn?jHg#+5U7R@5^w5MC;ob?lUdZt$F?J}GgF;@EN5C@M@fq4oIgNh`|Y z7pHRK{VjF^rds7!FxxSD#y&eAhy>--ERrhV35?0MM@5>NrF@gt^Hk99cJ3xjp%|g( zdSDWBfOuJhm0UeNnvCxk~X* zZf~7vZBu%rd3$*Ph?DArXVbNgTtev!iwe_^W{2jXwjNog@Lm0T$$)mytksy6)6QOecO{1H9K{9x?)Fi4+azO~p9e{SGL1$S7%XMHYHhpL=AJ|y$hP-) z`t~fTt?zN0fX#BpviW?d)Y8iDu}p{fUXwZmZL*sS#k~fP&b7D4=Fs^3IDb35+rKWy z|8=`}4p?U+LEecC=W^!RZ$+0Xp1bw^k=Wn;}tPl7@>!OdOc zXdb)tW*hy+v+nBWtOx|wk5hdY6^vKlgQLDvZ36;9e1o{i@u<@u@p(P26a%#0Xr?bC z@U!`2V>OtSxlo>E*bxi!zlfzp$-{@;Rm2;T_Pr0(e$6S!;^=TQXc9nG5cc zVZ58?V8*xKatF2!O>{xQ2EI1ROS|FPc~=dySEM?3A4 zmbTluC*AqXuF$(vy6E((ROd*bwG9o`+ufDj)xAny(q;_=PFf7wrPI}DG)Z+@tI4W2 z#NnGACiJ0?B_`$N>(D0p`iTSUydX>xUO46XOmai=8F1hyX0AN$+TxviBXOf;fg3Jr z)+Oq4c0)u{0}Dea-a~jRoS(q?udd?X5H0%}n{|e*XmKkaAc7R_5s=t)#n{(CFC+!8 zC2!>E1@#fT;mf3%1q+6@Av>|F|M`u)Hkia{Weh|2)k@I&K`V3*Is`l5->oB1!E6G1 zRAOg9;`U6s7`nlH?MmLD9nv3tCr@fn%g&~EuDW=+PThQj^p=LZ*)CGxObmd*6x!ap zB{DAd% z*}~JHfIEHOBpc*KEV$b6?vPs2ON#hLEqu2l`n5p$j2>}LJ^qoR4*87i>rw;ivEeYH z_AnFe27Amod|ZURyZTi~4&Gl5@fAMAw|Z>q@Dx~=UNF&TO-=sS_7;EpRDim!HuL1m z^t0vfvegaxL$rhDA|aIl0<0KqG&uL|$SrgCHcQmd2;u14gX*Dc_1mZW~Sf)_y15Dh4sp-JnIG z8bEO}v_RaFvPw-#`k6&OnBl02V-Dox&x7f2Af?~qZXa!Pd+Pn#M%#_LgBi|SQD_}) zYo9UWNo)J4yWO1I-rBjw4IY*`v4+-JmUgFq-is>>Y@UrC)Qv^^qPLk;6qQN%Am5VG zMWFC0GK);A=iLhat~q^r$W2>(%ewa0(vHB3xr?*MTq0OC0!OO9hOG`sv1stBr{-wleD{gW==H1LT}?k`4ab5A@I$*2e2^|a@eA9R0V>1bZ7MT(#DAXKLQLJ+g3Pni} zna~(g^G7X?&^^#4=?WOoSuC+Ja7^q7=mttH9Y&t&++IU_Yi4t1YrCO0e`n#&xxJPa zN4z%P(PHTZ&ikcuEpY6+hHW%$y}7w0bG7v=$;{$IW9H1#z@5Vs58p$nmLU~hYKmeH zF>1Q-mo(k?#IV<4cIn(nu2M(*)2~a78&AN z%r`hKiu2s&9X=#{=1E&w=9jzISEi*U2O#UYbQPV{{gKG+nau#MO3oMF|MbO4e9Ko%(D02 z2W|FcI5Kbm3aECcMo^>3%@011;@|vbb5y}Um2uu@X$%H8r=w-??fC_V>H`z2Uc7Lw zrb?L`T(myF{WMnzF{~(P3)z~>bTcVC6Djf)dXUKnyD-&lKd*{fJ7?4BEqbcXn2P$6 zv3ZN%SE#b0cItVx4OBa6P@DRQS`Hjf^o?E5&@SSppp~oU?(EgQU-iQ&5!Rq6HZz~u z-PAmDdaf{9wX@v<_!>=gMR0PIO&`L0(p4Y$ z_Y#9EqSr9cSV_Dgl3{vKYhW8{AD9>|5--7`87U&iq@M*;Q3#*|98uV5cSNnu-*XX{ zS^P3@Twrh@j`>;uv!JhtM~PnndOwRCG(SwA)wSQdjL#=LO@bk)o2kIDbVI4DOl){f zs9<;X7)JaL$LSs_#27`gJXwJeD;^eVGMJjGRuKx3*rW+_oO^-y+6yD_tRfNGjgf-=ik8?G;Ka`cL#p=1bXap zy69;V%I|d`n`gX+XKW674F%CwG4WlYXZsE>w{P1vJjP>NgUVhM!WB=7qmZb?oSeki zWt%pe?KMiu9Y$9GEuSlF-6*F~oUP5$+iJG4t;+Hwd476+H8qbH>I&uIJ7e?b z`rHSzV+{|dPRY+Zx7cigP{==q*x3(q^%L@-{fjkvwg8Jhy=2LBtzqUozg$cLCM6^* z+=opbHhZVp?WtiwS+RZ?bQ~tvZ>4^wcKSu{^O1#qgwWNluAzD=a2=s&+5zh-*-L(9 z{VAM1;#z=IT?B>lBZZ>+7oDBasTSUCyRs;FJX78HU_~%qJ(PC6=Q}bd;%)C-oYk-% zu)j-AXu#jKcQHkrV)GB?<2YvW57~M>RX>;sswg?37f%D6kJ9m{6ZdsnvVUMEbM~5l zFqPnDVD8rbz2F{mV_7k0DsFF?f%)g3qgL5o+*D3+*+%BQ1wjsG1sW7TC>ku7g`B4f zqJ3y6ipF@1JW54VowgA2!rX#8{$b`~PSGDr?UlK~Q!GfIX1A#-P+pnmpa*22J~EVr*b{eaR2lT zo`qMqPF(>%8dN6hfv1~1{>(je7KuHOCS=8HCZgVt9$yGF)}Uw;ij(j0N%8n<>@W*S z6)Ae<;G+)YfymCfm72`YlL&7yKVODcK76@d~$SB z{)13k8Hbz8Im8fh=9Y+*eShF`+5Qeiz?kQs01(x|>Ev)4C?g&+rQt`puYlX>bjy># z?{hR2PY34Z=Hy(w$Y_Z9(No{-mwm27(Qq1Ui9du>b`sGLqhbz1e%u$M5WFacfej&*8Jg>uh?+?qa%9+uMGpIXiE$s z5KJZJ1c8Y?dQ7=+MnXyj8;?KA!oxYI07Jv~yVRfI`YFJj+#N0TXE>LMLsf3w(&iMX zG_SF-wKX3)uM|pYrce+Hk*2(Ko%2o44FJ8va2XJRT(}J4%v?U?wA(SkO>p6vu{XNf zjle$S0`;@tI#t>q?+B-rcYmD1EbY^j0{=)J;5mQZ-Tu1GU7{!IRlslKm#?6TyO*Mx zH2Gpp`#&@L5wlH8URiB#B5UfQBwyC`8gi3;#*D$i&9seKE}fa_e;{~Hi~6hd{R%m_ z%`Q`4LY25`-ajZUD*1oDdkPAR(rWhdRS*A1X+gZ*QP;|Db?W9bFaqb{{9B__xCq^g zL*O$YKHmz~{)-oxgQYn4T1{k zPZ@3XdEqhHHPZy=#dT%Ww$4V@{uFGS(w4u0#c7r8Zk@L(e#@!MOE_P>S8a?7Scaz$ z#KH4t4OBWy9%DFA)es4^66%-~Mks^N_tAtdhIg8)GH*W4g9{hG#Rb=T-2O;c`!t5- zBx&8JdA#mSt-4gUI0YY^=2&4KGd8iC7^l($%6Fh<4yVyD5w4%I&8d#mSvHW@`}enI z%e0-$GtABkX19u}d!Pf+GXrt?Dijk1lK$Q!W0tf~kte`aVTrL-k?Z*Kq!Wt+ycnIc zI~hLZ8H=_vivFEAbJ%3Y@sJoG<49MNyeychE6#|;Oom_*s7auu3ccw*qVN$2uttbQ zg_;*bcV_r$H4$;UTitFzw1T-Q2Gli{(NgI3J9EJQF<*nxD!R{=a{BEz(*IHnSIr+P z{rc_c0WrEk6bQCtM*PnlEnEA(>wO&$*cy%w+}exE+?bV>QT^p)oB@n-DMN zU)wf(Sr*6J_hQg~MWj0{8P@#o`d2I3*LCI zC5-`KmYzsEuncWp6mA?wr-SBh+3EkbOw>o{2fOdiN)4RPp-YHB+A-HRB29T^%t?1uD0+80acb z|6CX{kv|b4{Cv8X&2SiJnm01fgoE`ZpFWLFEkbO-FEzM6w1N8xl@OLybyJ~@u`tBS z>nFAr6qC>>@isQD6&FbMiZ~`d7U4w>)Gd)Y4XwbDiVL=$0Cj}mCX9IU^=Sfl^F1RR zA15{`2qc$D)eA((JwGLK-FXm`oQT8(Tdn4w9+_XgdM&jxPqALxG}e#;b^iUX{i=zn zE_gcb0(R?GQ`o(0yOn7em*Cl(y6v=k_xU-ha<7eA45tl-YxXmFdAXmyqxlp1yrDce zcZWqZtobL_PgIRsETB1qJ|pyE>cFsWTJ>Y$?Jd#MA74{Vi!C`sjx450XroHsH4!r> zC45bjxp&5eIXs%bI@1i^b@0>Fz6?n_sgA2Yp*dz_oP8?+?5F%%Z1|NQzWjIhGT5w% zsVlAX&sQAdr(ND-VtGUDk|)|Hx+i{&GnQ-Hkgca)j0ge}O+%L26#*kk!HYvzw*ZeC z{CNi7EcDce`rf+L`ugze*F4wnZVS`rz_M$~LVG^LqPH-r?1hpE$fTLFt5e3eM)1?+ z2}|7%uW3u*WNU*?r18(5EG_S(nUcHo((rF5s{Y2sEKdGU8mU~lG%q7C2e^ig+&8e- zdOiI1=j{AB=9R3g)BI#U>Fmz!U#@wZt_v!S&Yhh9Y#88idf5`NP83L}BU~NQSmXb| ztM$KMB&0XiA}3dyPg;BJ!l~4|-Y^mk%2!IKx=oF8k35xYY!N{7me+>ZBw6iQl5uUa zNR0p__eFtPqneeHvu2r|3iyWyL2t&_kaERpxCesUiZzpBrYOd!22ND;k?CGpKxtlP&F+NKnmL0iTbeLq zcSvJiUT~bXI#v@G43g&VrBAE57?1=nIX$CvLwEy~H~d-nvODZQ;rInxozPjI3ZJK5 z5^9b|rac$JCxz7`y+vgyjj&iz_iKCLZa>qC2F=NR$pel^<&>?94;4Gg>P`!({_O|f z$39hUOLC3xZ=5A>1l1WQ_INc_i!7q_Bt0kfkMHlCnRO+xT2QlogHL(Mvyw*YhV?PN zpRhK93#R0otMSypw3sI%ohEf+BAx3BJqf^XCWvW1Jg+z}o)1k-*octe559Lj1rT*5Bel?&AKsw#rUkK9Q%ALFF% z!=pm6YXeB?c6mIbyEQD~hMp@Ye4aa?z{{$T8%{?1Fl&9cw`@dq6I2IYaYsV{5VqCY zpDZ!3NUXSqlHwX0RvU_C;ntitCGKT#p5E$hwS)Sw;Z7c8XT&%%?zz5EA)44+D?r4A zmFqwSIG3x<-b6gPy{k;5zsYhU^kdX9p*)c;e;-L;KE1tR!<%0B-P>K%3vGoUQ#Tb5 zoDCld-L`R?p?~3wlf6$tTe*z_!;-jLp{@Nk7asA5?!Jkp_?@okRTzRsqFo+=ivLWE zBh+6gv|e*Ur&EEn7c@7;J zR@eYO?yO#YUFLvEz>0FIo4z5}lUeIXgK}Nflig6S*PTzg^)sR~!x5 z5z>EFTT${x6w)nxp_O6zkx-lFEA!X2M=NMkSMysPYaKFz5HxG=`+4mN zjXR~$K1~iScopK~0T)baq`m#v(V@H#8f~6_RBzB~>Y@iXw;FOhs{Lya$oqG_z8JKi zWppAnEziQR7(n|ZU}>Ukxjed}p*%gPU~R23JJ1%40%O2*gqKSx#hFRIl|3Vwzx}>7 zxt~3}Ap8cy&Fcca&I%rH7Uzuq_itrkp`AU+wpXC)Yi3@M#TEvDJ66eWawroA9t9fo zi~`w{djEbhB;to*oO$y1w}S=)BQKBe%An8A?&$$3c}H?XQu%L@(ehixm15hU|17A$ zlMX&wIZ`j>*J-XFbI?EL{>n$<0*5L66IDW6M3YcI36TQvBYJ&>TL)v9hQHq;Z~?zy zt8)0PsB&wCXBn|4e2ezSGaPUmu)6dizidv%(W6pO0#hUDIO3?(^^JR9(mHml*0KQ` zx&lLxTU>p`(dtSdqf^Chfm@@C5%yJwn>3N?LhRS;hQLNjFuP@k$v4*BkN)A^z36o} z$cNoBGr{|=x+dnj`=%~tdc&pIBgG|~{t}I_H)$Fv=k;I~AGs9UFg<2)DXno%>9yoK zrjibzN3cr&Pm$ca7Z>jjX&)co1y`A)+MKGg)ohrXpV|TXYw{ZKwk_vF`WdOg4Q=1eSXo!5^(CJ-yfzyeFPclFN;S>(uUPD2pt46 zp)UyNbYt|*7vlqOBt|(OBvY_WvAFj%at}HVYKZUdSCb$ZBGpPOLr&fWB1;xM9sKE# zdJ**}>eA~y4C*Urvyj+Llp0J}N>2M?yZo&nuef^3#yC#AkA6Wx7Ba?_WJ_tEe+u%T_Y^b4nEsa6{j=Ov>E^}>2R#amdB_yP}dc{`8!@U2T>x*Va)ASR) z^K#||S$o!OF;;oV*jl}!IwXX$EDK8sSsRx*x5pafShsgVPm3;^xt`fCgQoTqzpr}A#0}SYQ3Ar_tID4s?RaaDpjAHdY1xK_PE)* z_W7hA3vxjZis7Y-gg%hfm9f8~e@VDa0zGpLv7)X}n?amLSbY~lVa~my5=;EQ8Gw^3 zb3(_Aam7pW?tb{=^dMyK@*6MIz6SnDcdYf|S^QoHqxBL8X3|6a`iWg2n?DXBQM#Jr(MN%cZ9Y z4$gADP;YRLx9%;y_Qjs?hd$(-!`glJST3J|<;h&zz|)2B>qT0QK# z7$oo`jPvK)EVWus;^1jN$bFun_bLlto|6&)5KV8kX6t5zZVjl>nK{47nFsy*`Oh6b z1K>^k@2Rg>val9Eok;x*c?ODV-?qjG);L1%wY-3!F;X;%o#F?*u=MViote$T*t=!v z7GAnkNGQI3Y9Gkyx4ov9YBd+t73`}KnXfp-3baIKviK!W`O`Al7@Jmwjy#DkF1r_B zwl`xT=&q1m7@6wrp4q_rn%7V?T~C#`#|rzAp4TOUd|qerpmfUz@ph{bKe^K>mjzQT z6cEqQCKE{B{F}rc5HX>cHmJv=SyZb-HNO(B9_nZoXUwW)CH=`BWgq_7F)O`S;0gxR zh=l%rmf%aqlMe0)=#h!?Y`xjUtRuIN7@t(?cwzjWc z-Rd@(+uf(z+!NJ~_BL=tu6yo#T|*&}WHAZkrc6Cl66p;+G%zEuB!JT}$mcl0DchMF zlof5);`-Z^noeqrFW!Wo&EXqE-L6qq_j7VORjST4j_Q}&?&uuW){oO}S9L_3_oBh3 z;O;*)l!W7+pzrtdkAbd7p`_@fzT-_8O!M*Hq~l+VGDypsvefs_=TL3sVZD>`_Qgkg-PL=;@Qz?wglKr9{@KksuNtRvU~ zrj9bFXU33D^sJ9@w4f}3Zn>CPy>@V!0irLW zIfKd#&>I`GncT+E^BPIN(h{=bt`-!22q0T|@ zI|Tk4GT=$zx6_vXuNnOHR5TgDXVkz?(HJ*{>wy-Ni*m`ZFSTve!IUx|J-RNIg^18 zxe-arp`fU%2-!02j%r*ju_7~kUU&tu7JAu~En7vPq9{4E$QykSSimU3b7STPQzX!8 zUUO(OZ#7i9|JVE!B@ zFAhP(KVrG`kSb!uHl!`P;@^rVY(s3u5@Agk8Arf%6oF_WSTGua^}ZKYoGeckXWPp) z64+-rNt`q6_sbt-A}$0G+oHbn3pbZRM|6?Cd4qFU8gdA_~x5G2S_NcR*fr&;^u>R$*U z#HXFXhIIpV;o1S`Z{ud@(1%&rfDq;^M50n)FK_VT>Zjkh$$BJ)+|yG6MBXg4(oLGo z%5(C%gk1$k5<*&0Xf!HN>d;jxYfJiRoIyX?6u`N7cLa8&P3XbS)E-N{rY=kF!XPQ* zE@=p+Y*~#IpAx)xZ?U=4muqTebA7LR#T$>O1jm!uKxA++C=Ls6cQafY&?f>f!#Vgw z{^aw|U&&vYRkedZJ7{axD1St11NXxRFhS@WMXpcIt;~ZZ8ygkQdc>O^;mw;qj&z+T zFxyPU5URO#wlE6oKa^Zua>4t-X@t|M75}J|bmsMXZi+&jseTRTEL+Sz%UM$!7`Oh> zx?MJ;o_&UGeDTE(OW~&ss$yr6zg@TdH+HrU#Hj$0!Y}C@`@q#+pJON5p(P>Zt@d?_ z@&n1fdP0vyqk$XA81(RdPweoaJnyECD%9iAQn85%jvoLkw_^0PT5=0B6P0UHdoxKMv-l9cn9BV|8~=5jIqp>gPkY}0zctoJ;Qgg8(h z)p^XF@wmi&>|xb|s*CQD$C>yA2VxqRZ%U_d&Snf<3~ROXV4gj+_4ZK4*~}{!hIQjl z8&(elHVALEH1?|pK`(s+Aq*6d>ed>l5^DeGf`zmFqeg+=m`n9f7Rn`4s|LYclw3Z2 znRX_d4cU=r)-3b!(}*{3BG{mIuwYLn#UgxKK@#loHLnS%Uw)t*L8D2rY3>n9W`=@P zo!EXMDe?xIKPP6k^7NC+LRFAZ7yVD);#{U7LK|ixh3k`A(m%b$NVuhzI2_5bw*pji zwJlFT>8Q?=ql1{&C*q}HtrxdtT)F5B?}aOwku>FPohC|V#kI;#&d-AA{M!|-irakO zMg6nhr2c*v;u;sd{bRNp;7dh_@1S+yg|2zl{vWcof4Y;pLi>a8ZaTS?-}0WZoSstx zxl@RpFCd)xVC2;IQ>Lm7h8;9NDt{4#iYerR{|*Zx1)PUWqE7G{9%%4gH#Z^bVbu5B z=aGFk34es5@zuV<03f5Ws>Y2yPAULUoiG#?NwTv*APNmpp!e8j3e;$d>nNrGh>T?7 zsZhHDi64jRh;-iVi6tbQ1LsZ1%~77VH$Mb0_hW-Qm=48nMBBchpRn1q*~Gpj1EQ3t zTR%&D>V3?avFhs5t6QVAv8M2nbnDmeL7sWW7KaZ|YWdFuxOB)!?@Y>Dlr6LfO)@9y z*Udlv?i>g&_UKh#{mzh%^R>wq_M3Id!%$Tl-aF%0w6$o&~ zkVt3`A1bki+kJvQ24g8%I6rXW=wn5%S|o;foJFCo3y4T{+AK@;GhHnPIv<(CCp{za z=S-WXC25ygjIOw*5ArrLv#wgeaY|6ibx{XV21d@qb6Srzl5ACr5izZ`mk@bhr!H^6 z@Q*}OpYsogetvkqXR%c3EH-ugRa9B;~H*k5TLcH*F6a1X!G`MK`wl804(TuLl*?9 zqR{q83K6as>;r{}cUBw$r+_EU0+K;#4)smMU_2(scc>pQ<{*TLEiJAyhw-4lrkULw z^*5GgOdU*>P~n$ZOb8gG9xI-jlT+i_>p7;59k)y!oN8%q9`qg5i#iwsIopuf^;96Q zODqf-ORI_um!)Vj;V+eb6a6ml!IvSPZ~2+<#z%% zlEv4epatb5N#h!%7qzRJUK0O5>GA&)UpB4EIchmmQqFnnk3VPr{3G}Q?*8>3Hge2; zqWxISOg94S&kd?Mg`t->)P^$BrVb@)svCaYd?bBVaoha1lIb2FMQS;2@y#0q|G9@& zPxLD1&i^*UJwzwJKBE^*K+YpJ2z$U;Q-J2{Ib65Co8~5HuP56X)h@L?KQ>E5b5JOt z4<0kYWi#^1_HZybwodV&ci+AOmbKt{`Fkdh6P;r#_fJhO+hH!|Vl4FvFV2GxCXZIx z82>G_-X?66+T(W8){%VJ8NxPT6UHzAuSjjB{^A*aT_FF=MT?JWZ6h|E`ZMDUKd?S@ zzr&0>PlP?&o{43K3KNycsm$Xp-m4 zBr2VOXp13|xGgZO?$iabX|YON7`TlXX|SLJl};klHxDo>FGj;+^o3Jt=)S|pm-Ck& zKinr#Mn%D8;>BW1eqQPuU};Lq%LlIuESCJ`t?*`G$t4*q;LUh_zGW(Ap`;JwHz8RJ zTMF`)DPAis7wh!xvT;L)pu-6gfzN-FlLH2+lao)G zx~V`N8Gd)+kEyhhd|K3STz0QX{>9HyQfzlB_WQDc7oI#Gy7hBr>W#}Dj-ut4&{8dB z?^*QM+8`A^mcd(;DrMox%~!7*-;r_yP!ryq0o&c9rw4~dmC}mbgP%n!x4@77HON3* z?t7NK#Mcxr8aXR^V7v>g32yOjuDAzUwBA;dvYY$vNITs zKGuz+!KzX@aw70YMT_eS7Q`@PR9#sfiop+qBId}wc7V+mtl|gn47QA11)pF$+a4I$ z0SYYnR*|1Q;Wz1%r z9Xk9A$F5U4i^>C(a`p`~yWrF%)h}r(0BV^@vlix!=egZXVqr&98#n=colY3o_2~fr z#%IX<^=Y#5^?LvEjhSTh?lbml#SC(W7g_Y!U%v?T(N5X$g!g2hDdaV--gL&r|6z8$HX zbBvElOgyG6^#3=i;J@PILRtMoB=Hq7uNPeYA~)&hBd4#%wp^2U{6Kh$$X<01wN5=$ zt$cX(p{cD)w5N!|2Ymm%W2T&A#m|_P9EBsstoHX+sQh#>e{O(~q^sL7CsT_hrmSY+ zpvu(nwfy|KQUP;8Dcqf6XL|H_G%(o6M9zX=w#?N@xjcjPfbnF~_qluyZ51nN!D{ON z|Bp-+9R07!@Y?+KWI9(ToxA0i1%<#f1}zAkHA7{-|9+jKsym(V{SRU{?BhrKuur5m zGG7;49G1E8OCj%tx_A}S6OtN!TOu&+b#kb-Vu!3JJVl>ydT=gx9krL zVIJ!*J9p@GJ9ZlQpBxy`IiQ{~gHQ4w_M#do;b>c`9`Xlj`bp`1@8C^P}?1(sR+?|gvo*K>s|#A-jwZPzFSPx4J>YE%q^kC zyK&MJVqmh@z*@!H$^x0CK>2r6>c}IGwT)8%MkfQa1&^d#AK*#fkT{@oUP^k}Odyh{ z{RNVd!Y2RFC}{jpWffEF5{n8nD-yi;v!ahz!p3|}(Ua$N)d|)s_A4T8X_XvD0`-3| zTPlLTPKq_7yl=L!b4wFd{mIfu0YuR^q$u%hboG)vEw*-;1TB z(Av^&PyYGjE|D&BIv&2er<_1+{8@~~>)II@JT8{?8lbU^J_eSEVYFH-N~QGa2L~rc z4v||HzuxC3`-+m6ub$rvepBEIz>_r5mw z6yfa4p|SMm0QF-bCv`i1H>90#aKvHn)nXt^@F5%y=sqU9C_qiiytxrduv*XcE zeBR+8U0$3WJc9C37H=aHVs7NI{vqyED;?gQ-I0F3f#&xrgW%~ONqPb7nS(45d%hI; zWV5lOI`QwQFh!T=HfD5QvJ7okfyQ>yaq3xf>&q` zEyozq{KP>Z_!BJ+QGYN91jmzRV}w%^mtc_w z+agb9?Q3h>$4Zu08{y8f%@S4wa*J^tWkuYztZtQ#7&+}t_V?lzVPh(g&3p5amBF`F zB*U>YYif=+F`BcJ{)z1`h*CNtm-Oafsx;4@Mb5$G^h)GNz#A5c^~OMsW{d2Cxg~&n zi>B%*P(`Ec&M~2-5RP1%d%y@m} zv~xQmN7Kuau+(|^UMbG&Gl!1iTn=O5!W6+$cKGI8^S5vA=5Y4X6hYxaqhoV^=Kd`> zx(|h7C@LZmVV;m$12!4deAMprU;>xMC2$A70|5oNBV0W*z@j@y763_)RxkNxnIB}S z!XGjB5q^F)pweSTY&HM>_K1S@5l~hiNLKu}Q=Gm5f^b*>X564M5C-)IEz^9YcR+)B`R^lGX=MK)Z| z=XzVbvwvF$$cUw4LWf$htJ0Tp77Hb!HgQ2*lykhKcO;(5P$q#D?PW zuYPIKCa19|_8T$T#b4s}|J}^N$7zuCFUy>cB01dLfy$@xxsyRX)AmAU63N9Ozj*h3 z&J7FWlF&YgDKrP4>XnMukTv*JK?=bfX8LX=X|T>P=|;Nr2*D>Q+v2)3amUFJWaPNl zJs5Z~g|+xO0)K{;0d^zKS~)i-#4b97I;@sA{P}v2#LY$hsLBrOg_Cze`dm~wxqs1K zkWG7=25k%7_tunDF1&UmX(;_%@BYC3?y7q+%o$Mo{Dshq0>XCjF|q%~no_DRw}+$= zHsh;IDY4&=qetV5l7$3H|%1?35zmzL&hb$d~6S#xK;LsYNm`=3NnlcQ*$@oSKE>tqjH~jNY5wqp&H! zTUwo#rkdKY+(0w<@lRE)S<@0xb^qs%sgVu2G1$L}hyGg~`i!vt!BN)I@3T!=hAlS^cjP@cRQVBW&Zj3rw8qWgVl~9zfqlj z5In8*^Dncv7r01u%>Fz&$yKnW|MIiGv7h;6|GM$nz_(ulDAD>%TkIkkO|~f3mZ{HM zia(k2@@39R{L;IHyI?Y%)Pm$rZ($jOgRW2aGoIclv6Na~XIok(XsNObF7{0T>O*eL z%orNV6SPJ=kd4gkg5dpEB4M*J4SGr|_UF(FTDOG><^ z1O(O$LkR7u8>h5g?%E_A`CzFsb`Veaqtn7#fJm39E^#;6G z<>orJB^*LJ9xyq@s1~WW9gXzprJI#EFR72`skRR8h$a8j+aZDvk^+}j zM-ADUrAc`sjUbl<8`F$ch+X2VyJNIy;+mJlsWb@{6Qd!lx(nT;_-YkI>uSw@-b1RZ zVb(3~Ct7W=wY~q~zMhRIx`Y&CcqL+WZkEQ26=-Y>JS=9pe$30G(Tl1GOixbn5m z|MXsmWAEwpd+&86VRq=oUbNS2LsCmiauRe^P=Sz8^Y zxH8-1NlcEz73|ND=wFj-lV5zpxgp?`yWZ+uuzc2 zojP<>L`aKmv>Ch0IG)%8)K``O&Q7*3)0GYXZH!w$tl;>Y=cKb{v*mi%8+TOpDtcG= zz&FNFN~-PvrLWk-6Nh<3d^PNO>b?Q-2o}Mlq1fZ%qf|; z^ktE*C9d*=#7r=XULp5zT0+j%1_6acIM%`STbX3`HYe4;b_M;*p$HnT5^`|bdz#-G zn7mJt3U%)JfHhan_kcfE@|d7s)pDcZ%F={nv^}-x;4k6~YiS6z=LT=BpjdKi%hbiF z6zG0qRe)d`A#IBHj3(!^ze>Gw3^@cmYSPHD+E%Srk(gGOSZo_dWE$sd0RK?cSNQ|{ ztJSIgAyjgb6`nT9{&Z6kbZiyxoY&PiVv?m@4gGlIVI_ijqdJb#Ru0aZXUnB6AYMs3 z+A-Z0NnTgou&_A2Y-N*+uie$_$dMLm6zj9DcqV=ZO6%B{lrE~7M^08B(7-`g#8-k~ z%>nhk+IcmLN|)H1Hpj176TkV#$5nr_p7}785@l8z%a{+g(wOwy7xIbzmIZQF^M%{P zZ1H5*56(oC{`(K)glzCvqOd4YO>NGBjmyRC_gwD#$YPLYZIwta(&-l^*%`RD%6@+( zLfDd1TO-2i1{=G2BIa^5yI2mF2jy}g-%(%w%odc1J*{Frfr)F#Nmj;V6HzTQ`L@SF zoZKKUUGPM5ws4xoRk{p}mGcAZq!#8^c*@&c=mX(Og+VeOH}IPLlp-2wCnOS}yYr!^ z+E>jbIP?X6ph@ZF z5xch#Pxu|d*{X_p^Vl|Fo`5UJ`vKPf7{l|b_jxhvTfp(RTpPPb@jYxCcQmpu@jrW{ z%H&cm*Q_$dHn zQFbOu2=I6>SkK*Ih?rZ3W8I~GJ-4=fY3^gj)?2nLsdd-hOl#4R{E0bEwU4fb)p~-T z+uQtnnCEBtdSO;GH2Dx$%bTh=w|1P|(*Cm`K1B^#l+d8HOoGs=sv#sC#yaqNGDNSz zw%`)EIlA(M0Py{8hoIx>(_TTZS+&Z%-z=8AEJ+V8rXFUe34+8Lir8XsJraNs>*|Q; zrbsFT@BjPF-?1Lp_658QStMTMbd(5svFL^s1%B;~vffzqVz`V2bfbH#T2xY`Hl>39 zr#7EHy?O97qOMt~%+8_Hd0bT-w0%S1`UumMDnkxA=6&qt3=KtNG>_lC`+vqUpQF4p z>mT(wc3>d&DF5h=)c8IpN+QI`0!P;tqbCf->X_lp>yfm#;?D zAE*8~ja1w}{27nw4sf%tg|IZl-Lw`5IED)Y=3H4aXT+kTQ6;8wPinqkMRb++_sjad zSXTtN(>FIX;A6mroc8Q(N8PmTl5;MYcZTM+XN8H=y)ZdSDQ4jZB1(yXjsw5C4*7-X zERgjQWt)|*`h#vT330t+D^iQO+uUNFyTe4CZ9y`7z+gckP8}9IUME(&@WD}Y;AYzK zPP|LL!#@=t4KH4`SdDioocX(i{9WA4&yUcK$3~amI>9#==l#v1Pwt%-8f%CwKHqP{ z_!s)8=`5ndDz2A3ZcadS&xf~5Z|9*fsLDbG;8Ct%uZsV6{Ban@68Oizk#6@r{%47| z=ty-=icO4=vXN+OwZDE}Yd7=T4?2HMV8y}j4-2m6&K2L3oK z!s4M5z{w~DN1i3^k|7-IFVa=?>b^#d$WAFlOD^ZVAHx3gE2*sK>9BRS6^aMA z*zA>I+?weT$h3abwITauf?@`tPj+D>H^Vo?h29)Tx|)Wlt;-_J5u&RHy71zHi*EBK zyTZ!#yKo!%aXUAdUy_zE5--xCB=yFAB^>E}cK3JDuJyrU#(!|;j}qWm|4haS^eZXq zum$9Pqb~0KYugpcW47&?*4yfkJc+^}la_C1vwP@y{!;Bl>CHtx3zS)eC_p zI$b{;y4II}pEZPhgna>RiThY0V$Q(**@^l(ev3hTT1DngD1Hj{SnShPBhiGqM~QSD zw~Afj6;B=fV5$GqH5K4wV?iMZ5?{SSsV;7>ZBS`yx0Kg+zxCE+HjdPJ#Kj+Xf9@;8 zGNSb^hs6nICj%p=*ueAX~3a;-UR$a>-992v*1VHti!Tg}G#Aq?!6 zUOy)E5`4uV7*^*iy8o$4n*QJq`v9TC#?kRI?&k;fH03?MnmP}7!(49M6T7fT{r%N} z+l4s8?SZS`*JkCt3tyd)k(WhU9j;wrtwpxvv&9lzL;f>&*L|^1qFV|FE|n|ME4S^NfRk-PXZCX~M&6Nqwv^nb0ZG zY<~@U;Q`7Qa)>bvh+SgaU+44>m`tfxzR8C1v;OHGF5s`$G!72d6;@=5Q6e`g(2rd@6DL{r|UqYDeLE^=ai|A zrH{{|2RSko$EPRy)g%d$>^#2RA6H}sIl>pjzD$Xn_~Va>$ds3{i5w!417su@rz|fp z6Y!asMftvZ`Jf6#1-8kYDobJ%4%!yjD@fU#N6T9l>(g`o5(?R&>y1|Q+Gw_3MRc$3 zHdzG05J~i-%?)MLxlm{+nK(NZ@KJFf96$y zLW2;#lPSiFS!+-zGz0B99$@RR5EeW8B&=gDWZBBhMQ(UM|MRUk`FFCpZySA?+uy!9 zU4m?BPXZqW8h7of0sW4Z?<~PomgpP9_Syr zFtYLgjXz}0-D3>8@C*T@NmBov!?2B2F}PK}pT>ll@X2=-bdA_r_0ocjCl`!Cd*;R> zDZPAsxN~f;yJJRsgj{OCWk$1)*yHNAe=qXA*;yRdvU~S~XFk32rmyJx?e+5fBkYW5 zj?^HJX!pnARqnhd@vizymrBk%{Uqlz?%c8M0`Dt&$kO6}L`v@YrKq&g@2j)OfNelT zxQ8g~ni3wiww_L!mNfj{v!cWtT;X{?hGd_YRaG{!2F)Q7AT^l2v#hep;qh2IKy|N> zE4*yQG9r5DhAykvHl7&Q6IehOB)AFPNcVk-)zO}rt1b`;Bvi;VfB1h)YW?f&zH0H@ zWI6PiX(z!%0PqYy;D(ooaEj8GC~%c8R?`e}U?;76~M=*zNLFkwAE7&R|ewz%Hq< zRziIsG{Z=ZW2i0ey3WWiv>R}IWTyQ5M5yZ)q6#mKgRpDWfw(*c(a zmdW^Pr>&Xlbl^!Q8`N+CLYxCx>zO5aH$F;Xt&*z!e$@;j2bX*!b)s*_< zZVKneQW;OqCdJwnJ>r{$=H?%@ixzBCF~vN%|LlU>kmpKp{}=ObLj+ro3&nOGRl(C) z!vXse_5}>HbPIR|EJnF{Yy{}`g0uawcl>@KKFm~YTTmn`ZEhyqTrFcJ+z4gDU7xmL zyDs03koLOl)%TV+7ABh;s~hF!-l_ZaQGr>Z5!Eg`s4Z?BAkuM2@?->MxHZfjN?rfN z7-GP`O*D5#`p{6`jhog))ca zhZnFc!QIToHATlZE}ww{1GazkF~|I~t!v%06pcZ_aTqKLRZ@~mz+&QH6b8L?4+@*0 zjnHXrx_R*&nFfa^0Dn|qYj$fO3IjMao`#QUZj8N0^3XhP01b>E)M})Ggd@WS^|yI+ zW(S<3r~vK{u%A}uNPCha+Fz`%_Xx@W1FC3%8#w&>EBjYy&kFy)|J#M}_ z6-YQu0+pfD&_5E0)VomDlJ^c42@7_GnpS6Kb;r-h(+a%Fpm8w4jVJFK4zD3WoTVmw z>}aTv3LJg~^XGrAB^01-JO8nTD61$L7&{g%*7?U0#As|4mXcAW46$X9{Pa?a)U$vM zR8_b$moqbV`i|fo?Tlw~a(AiUn%M+`mOuc5iLa5l)fTUF6-X90s^u+E zIeV1ESF~+4GJOeF#D?^%mj{5hv}Piqslvr*1M1Q$nh3<^LIqN`l)bbi5*fBcR2;WN zY(<1+7-@;L7*K|&pCaRk$4+K{l$MDat&P3+5Y@aJj+9U}_5LPH2C< zPAsIB(9LlXDto<7Q>CrGy5#EC_V%rE)9MFnc%8=WZ|Z*uBrLj$w4F!CeB&+L?X-%a ztHKC8m%-7fDQ}hMhswf^3|c)a>e9n2JT&9BT!mRtw+p%yt~6RemS7bLZ@Hwn@ps=# zEm@fCV7PX|1=M-qgwp;wyc*sdkl*gRZG`sx+wJHg#g`NuW8}iqml=Y6sLr@8Gu5b6 zNG=v*#MPv3h=sRr^ro2V>x>Mh$y@6$Hv}cu7K5onzf_2vcvy^=MQc$Q42nHhM3OuC z7c+?Ep)j9u-lV)~#+RVr9i}d?v7`VI(Q?QVWpRx2N*myCZ9(nsJw9e{7o8{1@rjn_66R)P<&Jq`#UU zx&M%r5aH#vm^i>0wvim`I2{cUV`tU9B+&~8H$*?YuKe`_^=il6Qwq`9of`zxk>x9z zo2hGst@$CrFQ1aYY_wRvNaG1%hNq|%@1Q=2b~Blt2aocL&|gQD#>_goPx8rcYb3s3 zy@I!@8_< z7`~4Xw9^ol`{T#aUU%#AeHs2mvWq#JQhy3Gq5sud%34{h5LN$sC{d{1H>V)+(0?RQ zvXy5^p}Ga;e;|;#0TzOw5G!*93_r?&(F8KZ-j-ret*!DxrjLo`{MtwK*I%Nx zBi)jcJR$|u*c0ScbiOHMd>BfdOxPrV@Te;j@CPesPz{22mPq~ZX%RB(`*QBCz`_=1aFd~);f(9oK_Yg$up z|KZIi7dv9fkZI-|{3J8wgc|=&j}{d@9?4}Ix)#?5B&AtJp|6*{p6FXTF*JCZKme6G zz51V}(yJo>f0YbgfJ5zV6SqNepz&p6s$wNb;27vh1A=JeTHVQD%&(1)a}DDH)%M!@ z*-y#%(?vxsG;$Vwl|&E`_Le}xq^H*-W*#T${Wz#(ukMF+ta6Es921kM)!%$2Opw6NF_DjgFp^q?0U_Z zmW46vU#$U)v&kPy6L90>d3)xyfhpg-+xbi`RiWi1g3qkUsk)#x|H2* z>Cz8&fC_tic*D15<8rRktD3h8(o#bB67kUN(?5QB;6S#X z-coQ4^L%&8_f%z(YU{~vQ0J)>tvI}=Hu066NE{{R5iKWM{2Z|k)|^vUq()Zo<*v`_ zg4d78;|_1Hd;Apy2)>tA8=2~xFGzVcAyOA?7zrF%UVs>F?Mx%r+7OZ^%zjr2ty~E$ zTNLv5X9&zQrVybR7Yl*@iiv@UDWb9MlI?&vFxCzzrxJor00CyKBSD0ya zB>MUCRF00%eW`MO0#TvWg}BsC#Dde?d*qQNaZ@#v}s z*ZTgMIb(88IQmPO%oNvK@Pffc2_zF;Y0eV!>5H?nS`r>r#eg~Z;X3ow^27}}w>3** z`BWogpf22xdN4KUew*SBuO7hFKAB}g{-~szB4IjjUHKT2CiH8wn!44 zo8G3@Xi3pM-0O2_5wzW_XJf+VS`x=;jcT=@!g2+$(XvNIz+t_zSg1i(YHQ@B#By+H zxK#(&T)lFCbwo-;k}ZXpeZI=3rM37_<+VAra+>!=(`+t(HZdj177>xM`u>%xYn0jB z7}IxgAwJFKBC^ydxnf&2fA>d%NeH#M;m5l#t$LmRl3Ce|x3}i;uRZKh_HrWcact}oyFC0>G+kfNF?XCR z@5XRkdDV^Ca_dYRVDB!{<^1rETv%dsXd;(IPqYYFEynv_Z%j13`{*nhP0a+WUY5H*R5iDFYtTqmmFjzeB&lTzsLZ!8kB6ANSHWS|0ip}LaTgJKcQ6y zD4@mEGNql$l6WM4L-xbH6D*TUXEuBq17Zu zwLZ_$?!SGrsZ}0Q(xLa&Cy74yw2=IHQ1hjLbmK(C$fE_)sHsTgqEH}#Yy0S8hL4s9 zqR%H|xA|*eusrh0N2brwCjunaf42dH;9-g6s_gHbLAk~R>N&(qv;9Y3!SpPjLuc+S zRHqQJk@ZDll%6j}>vYf$OC$v$`*i-4_Z$i*kHO%ak)Pqf%sp)Fy=a%GQP~T$t{U~e z5gaN$7AjTOg)ZbMQ%P&l^X(qq?&|I496`eGdpHjKJ8iF(cyy^Oc={rhUzM4O#)36{ z2YLMTWJv{F;j;X6-e5yIUy>XH$22*eZ~v=^4uA%+Uyr9^`bJGO#PLgelo|)526|olo+Ay464s-(~qmtFB_Q5_$H)|yR zwaN6GOzUsd&=@#O`FbWEy*mfPVR&LNI=}dMKOH83u`*E*bgZ) z`o*O98tm8Bi_4-sq%A;5&Cpwx=#^TvG;bs@ZmZKtb5lEL9n{n~Mg5<^|JuW2rAjmS z<=B$PLEbh|(Vyb7=`p*v)qSl84Box7p<$;RX6Q6)Gb-+I(WWBN|2x|GXgST9geNt# zIMYsTBl%TT#LeyoC9o#-=GC=u#$JW^av?G9A%OWRP4NC2;s9$;o|WQCh4*xHSSKDI z*oddT)nbsR3uwtxeK$Lwz}*N!v4@SY4ZHt_toJre`yw&&p1r02NJXoZ>F z`Lmbhkg6z~mRA{PTG71uvzbNtOQ*ZaMKd;DzE=_NRROCjo{gc zxW2nA3%tA)`EnnXJ?5ELX660!%~AJP3g>yo*wlSrB3mzat$QD0e6Y&)i)cXfi*3~d zW5}QPSJ#x+tiBJrx6S?>#MrDmPT?FSFwvfj6B`8HV-HD4f|8*m$||1ub`R!6hKr)4 zv|!S3)CSfGfarBf?Y8CH-0D;7lhZ?t;X5gm+c<4n;n)25FW-fKq>y)phZqwWHP5X{ z(&MV9FArD+kp*652VN>|G}|?6XIxyT^^u8Y(!V(1RTf!b6&!eRLv@^!XIG^@hdI#$}SCO2M8=*3%eaC7G1a;)FBc0yW?c^S4c1}i4? zJ(QGo%Xa%P;;|dAvL7ufV>2_P(1^HYe5&Y`x0p)4X@Z#j?`IYrvwe&7xl~B<%2tCIw7U7#&MB_SWx-4%PC0e9f-2-$QUCSEr_*Lt4c6TE4fYZL zAX25rrsBR0s0`j4QCfX9)2A)dQ`5+FwNsm3NKrQzfALV3JbP-6exQIAD3Se3TO%%{i(p zFN5>Nhum|~t5x2)cYN53SF=pEaaRi8`;_S#w~-70QwJS|qVogUi4^bo;#hHdIDM(- zdy|v?jW+TrUl7UdlCRM1Wa1YTzA-uyj55f|cW9deOTT$uD07UUSwmq38OA@wdu(B{Xkrb2qSgUZ@{njxm_Jupqc=lYobX0r($ zc%TqCT&br{!&Cs-gp$su&X@apuUqJTo!6L{k#Sph+3!j8g;;8In_mqnCx=ucY0bUS zI3@QLvsRUrk#SUJcV~tY6;7y zHhubj6=6Y)sXl$@a$%+IthCG!a%30kX3vrYWy8xL;$O{Em)UA%Hs6#x?cl$riYNEn zR3*Ii=`_C2o0FKul2KK_Z&eJG-0Tcv{zjEh&1!mCK%OSy_b=0Xyzcy?GmKQsjivus z>3?7TEgTJ}nHe@z%?kJ}3%e*^{g6@r1#AjCpD{HE9;eFyT)v22vrwN-|EAw%(>>Po z)_F}W9d`D+w2yWDYFgxO`p?S{iCj^Xb;;`}Q7)&)wlMV|n?kP8SKynYCb6sjt)IObqKcM&_~B#KcBh z$8vAlExRBT*s1@`Ag%Pf+<3eOn_P(-iT*3#FT)E*Xs#$#lp8A5wh{X9cujonchVs3 zP5-?gr&sS8oSAdb7Q-J}kyP1hDk0=MN^GCy&$>F6@|`g3q@~dr=WMi~_Fu6O#Ln*; znR1lkb|pbf?$8+7=5VuC`Z?pk_v3D%+h$w-+Ax~>c<7>J>38~?nG777$`ne3epIxH zF|$VRn^ReYZs;|cTt+;7-hHpdTY6}5dVOlD(jO@~@s@%!otv60qKeLTW|@uI{wd~n zeRK0^4r%xs+>D=6#L(2VZ_5TS9C12D{WgWoH5Y&-{EDQ^I^pTy`3O4!VmcvU888i2 zTM>XTwHUGWfZ@HI>GEAP;u4o_oIZq942VnyPU>{XXQwOZs7WUZ9g`&`?!(YKBEGG% z)c#t4NX$7Xz)d`27nwkp?!A;e4FWFQyI*UJwn?_VPs%2=f3-Acv2@v`sxW5pJy4p=77ye)Z#sg=6E0X#TF9ILm*F*$?Y3YZQZiRN7@72LukCdoke1` z>sMn__%}rQGMLA5r)qp+mds*TO}$g(_vekBV{j!vl!as4ezEmp+s?!`Cbn%G6Ppuz zl1!YuU?#S0+u7OL{kglf|NB;TpSpFss_XRmHp*%TdX$-|8jgh*nJIeX8TKZ2Ex&j+ z2L1{Jki`R-aO**`xPdzB!1~{%M<9>A^IU&;*Y<(^&1rVKA75tqXk5fHa(574ki7W3 z45ljDjM>#vOxhH{vd_UPW5a&AR+op$Yy>w3Q}R^!A1AXVhpGU(pz%1~n4%rpzIHc5 zhDXA?%Z6gxJSMPk1mPLqm$+;e7l}P5da9$uyGUqspGR17(PJv(yqTjvB-1~wa-$V1 zCQWZJ((|j^qi#AApfpDf>wW0K8AI0-jV63kQg?jn0@|My9&eDUF-)l3j`djzt1;Gw zCy8>b3_Sw7*#oeGOCMn|J5;p3XnUVQ3oITyvJW+UPO{frs0{Q1p3F47{MO;2SUn|786P*i~DYI8W@H_I7gS9Yhms;Vp-cb{DA)0=Y)p%Cjq zljf`@Z`Sm5U7Yf_6k|l^%%)kG4^274ryo{{e+!;?O!9Jka%kq5=?-l3k>1E#O3x#Q zzEen8%|lxP#{AQQq}0TC*cFxYEES95n?RlW2E{+$8wtkEm9;8r5E_|voOQQQYJp`R zRh<_8gF_u&mL@JH&fRULD?q;xP>lQ%C_Lz`4*u@F3)gM85@oiWE*)%g2Vo8aLI)rm z7A7okZHy9qx+wgrsi|JN)zH&jGn3&wH4#tS;P`#z&D{Q(T_6aNEL6(GmEe&5g;|?z zNuOfp0$RZBP5UA+b7EqVX+;jv_F5g~r(<|8jhK89mCxt0gksmu6cH8d%4;Y=0v1Aa zSOB)?`cguR-&qam?`>}8tc0;8wFl`$X589uGwPM7kI_2Kl)ie<8XB36cV00eiv(je zI+z~g-9mYFQv+56@qdO3Q!|up6V9WDiEUzjPrIQ-to%<4Vqvwrvb zqz7jzSaUv7DDsN)cwpojHMVkeE~BPF%0=%$)3*Fum@R?Q#t!BezU~9-*@0!~h}2fD zeBMv}=Rlh((V>Coa4JXjDkQ~ z6Np6EXGvs-tsWa#_aF_tA8)EqaI^EcictA)pXf6ROD_wi4aye+K;A2J6e{1=iq{-t+P zeXDIBi8P^O99MdZO@2!#rvb9!MQ?0LXpb#Y0F9xULSE%2d}PDJX8R+U|8U%8EA4U2 z%U@<3sXjm(dz-wnwOAOo;>BMLmZ&1*-_snk4YNCvSpCfwx)FN4OR#kDTMPT)<rv8nm=BSqp5Z96+?X4ubV?tPND zLFZpt8jFw>(Iz^fLoETWKAK2@w{(*;SgyhO>Ygrg*M`aJjlCKntZa@?4G?$DE2nFnYgY+Q#J`leBhs^?aRrD@F80fDG4GwAim% z?F}6?Znsz8xOEE&G{)qxThsqeWW_l44{)OKVt#EijVJ5$#us}w%NMin0@1f;HAzuO;)3NVPPKVl-ej@{`>EQKos(qdmN$%O$Kl0^ zY%zjox<^SB*r7SLh2+P_2ZiMt&5F6bMhJ9$VpMhGd3vp?kRG|8y^X9KRVj8Py&QU2 zg1Tj+tGjpGfIz>GNnyI4-t}SS1@KItP#(Pp3Qs589^z}t__c#3+jid$%u@iSOY9}x zu?<8Wur8U?PZgEQr{BzLS=>wl zqPLO(!CR6C%UWZI4!#}t?6PpWU~M9dh)w`Q?7LJ+epcw5Gdv5akFo*A!qJiyQXnjN{?v5ujzNd8)mtvZT5#=^CN?Q-xOlXugq4Il?e&U z<@#Hr!5`5eW_2{6^-Aft3RO<%uAJuFOg_3Ci5YCr86MM7aJ45NkhMJI#gt33YH&}a zZ?Q?>*6XNJVc@qvf4n7a6QzXfHq}!7M)v8Qk6$63xTjXy0S?9TmUEQ(`WNCaWH8*Sytpy9?1FSrbwaG5t0B z#mOwdGp~zcL}1fcEzt~B?L$9GpJPxEI_-d9@{j@{NoXblBA$KgwfuvBa~Ot*r7uD* zrryK9V7(ev)s`!^2ytc4Sh)Q=M^IDd7Tkt`y`lF+_4^-evgETKL1E(ehbW}J1MfnI$`x0%lJ5U72N}w|1n-jcaNemaXsZ69DnPT$hF@LWl zMR9zLARsmZ=kWpOv9GZ#^3DFf*`|$sJqQIhL`~ewHdAhCf(z+|w5D8oe|ucIcRvj+ zPbc~%9Lp^MS<$U*`U1L)8Bfp?TL1`hSUO88$-4J-rSc8_aXcEbn;g*w7O$CZKopRT zl_q|9-m=1pba4K8igkPxNKfCiuFqJpPJHjh%3wL2+e+=EJQbEd#1u}4C?G!vhg_e2 zJF9oWi_a#+N%S!fJ!kcx*JdG#Q7~I*v1)?VQtMU&o+v{ui@YNyrQQGfbA2Yl0+c)z z`C6kmVf^-<*i7x zLEScLk?yymr&bS#jyO$Zz7)P2R|&}<(gc)>3)oum{rKXuH;gAV$2R3#={0bZOclaa z=qGuyumX!H8fpR@GkNvSAcCaiuGq3q;rer~m8*LtEPj6U^*7KI5K%7{Ne2TFyZVJ4BfXQb6caR$((4;1tVe$oLt8A#DIBtr>l!-e zOB>wAx~`(aUtaZjv|y3Q>@6)`{ZuUlq~QO%Artv#8g%$g|3TUs?l-hrmHl{iej2hq zGts?^Q>$EUDD1TtD@7bG=}*yn6aerTj0{Yd_1g~Ie8PHeF!}|09s(n1uRq(XAHvK# zEQ5I*mjZ)fxW`SDPIxf9b&LWr(C3BMODeAY;B9Wm0CGXqi4gzHL&dZn+);RyaL_tEow$=*e^@%C&_& zFB2HxxJj>V4sA5PTh2h@$V$_+BXUy8{s~vQz+@v3iBeXJINF&D=WzdNfF^e+`sapX z?wyl(6PZy@Vf0=FfeC5#A%MA^u}xyoKZckUfkq6Y-$9`;j^lJ9hO;P7iO}+gG_L@q zIG5G=E&=}pMjl+brxS;@o)9k@-c+ebga8;&I)e>Di)JLWT0U$4rlGR%!L7ZG$6$W} zj>W~$#tWP5Y`Z8_6u}X`ylrKMiz46$(@Kt*6GMwo!}$ZH57eWLB^JB%d*1gi3BI-D zKZcx99a`_`4gbiq4GSYY>K((<0jS%(z#(b3H$aXr-@EJ6m1I!RBzx2gO4CcPbH54Z zR?d~k^wif!h%(%(uz`tlS#pMpwU^Pgoj++w0g05d1+f^Wl+98|?;6$gs?YHBcoVbq zZAX=i@82Q8cs<#@P+DxM*%EITBqOT?!@`qsnzR)H<8r*KE^DdWwX_c{^(+1)zg#NN zLxl#&WDz@OC6vAFjyfNlQ?ABcEHH7PkH=Sh1aB94}pw_hNt zabAR!-0~}{?USf4#7?tzQS?{E@qOD%u|cG)f0SP;?+eS$QvFi&eQUf^)D;abkXoHOKVp8}OMf9fz^YVrDxQP75KVx0psE zOuaZSwF_;lBFlD-T6#7*X+TT4&j;C|td3}7wPBe?MxPF)Cz1j(hnw!G10#{&mQZw?p)(IN^EDxsYr}jpGklQQ}%AzrIy`RB@?r(zD3{9pkq{+bn+++4Kz*f|~x8LS)jONk3yujOP zC!YL6_cg8)p8PkU=9_cn1y4!H7u9QHXkPJG%`T>VrFH&!Va#N0^SK)Hd+|#};SC^??-9!5&wDgu*F!4O{kDX_F=0_3oi`8~;}8dk^22nyA3K#PwbxWA>bj?DBy0DcI!rK9;X&*5zQ;S`4k`Lk<5)5tA!C_0%nZ@Iogbbs z`E|LKO{QEn_uW!$yIMpqE|#Yy+ABGfd|n^lPcMChAYJ#Nm!l;=Va#p)N!7hWccPjb z>@*+}5b;r_K z)BkQ{DW$@e+q5;VoUTo+&y^8*Z}cw@C}Y_BK0HNNVOTEjaeyQh!;{s$8=B#5x~=%b zB7rV-#A1nDmvJln4lz&AG%%q#(y5kyS5{bFq1I1sRG z5Tj%a7_}h_I>BuV1}r{ot&i~n>d2EUxv~s*%idT;N-47DqPZVnG=#Sz>8Z%8YLE1N z>!R0oJCG;F1RQ}3PqYZQ%v0b{7VoYPhEAR4OqR~I=qxATS@u7Up7Qe3a2kihS5e?M?EJc#gq^f6OEEP~MCmmPQsj4ZK#uXYMJIfDl` z&|=Bj)W_sV%HC)dd58OU+(C#<_PIhQ*Z1#b|{%3TsTS7Xmx5W zS`C|c%?fTjMax(X*27ilzZ5@Dw4+L`BZd#1?yiSpxwqc0!A0PtRFG(7Vl4lCMEmbb zt|7hfZ)JVo_Ce}c>V8LW6ctpVxML_Lb zK)wiNGMzd>UcY%GuRe(pDONPqEV|xKiGGoK6{l|ArZI>2W0ODtxX6D=BlDla{NK7r zrLLH^t`I9tGOvDVZ9|g|gs~;yO2}%eD{?DLc<4`|4$vyiGO~uKDrZ> zOuUbFPY*A5P7W?GJD$Mckb(!c;V2Q}`*+{3p~#~Zie`_IsAK=`+&)7T$uK65?<17S z)y|yW!<3x79AJa}>lI)wDP6V+uOS+hjw5(KK_(1-HQ# zJJ7>BY1}U5-`nDv)AEZ~liWiK?6_Z#s&}I{V&r4A)#Zfc7W{Qbkfcx)v=Nw;lI)C; z6MKkZqw~0NG(Lk5kE}Oh+k4FV}RoBworl@)+ zp^pGS}bGui7`U)8*E`l`D;K~`Q9!9F5nx#xwjcMjDt(}7GWbm21MoOS>TTJ#i0 zbD9dpB!o!a3o%mQd-nXd9q%g+&`-t;Ryphi(VZXhEiM{j30eA-F7FH! zn6OxdEnMQ)86`OgAd!oUC%obEt2>(OcR_X*&@!E^YVDr`TKK^J} z_&E~e(cD>_@KV`d{@$FsmHyiD3*d;*NH3h~xgeY4r#4-&jXIAh{gehTERS}utTNK= zmva&eRH5jCQd&w|3Av7gD(*G4vDEY2c5(su;aLW64j%#@5uQc^uQM~$GMGKn^?bZ# zhZ_d(YYXYpmo1ocgTtnwd}fu|fYH$=p?+&`|41x%28pU<~%&kI4X6+P@CdG05c9TSr z6wFkHnyg$3>Z@v{-b9CTL~Y(gh@x2BH<>k8LRB{Es6TVjcis(L4a;bS%Cq6vPv>i1 zYRu``Dv-m-$0SyRlZ&EKu!{kJpDL5b5H=h&1T4cohplTg@Xtaf$@Y@|Rr4jO-s(0T z^XoB2EXAADWz>TL(>v9CO%;pykLGIiRYLH7*2t-)+%N-bB=uuUP%Dt9uEd*hOcCbY zVktM^(L6n7O48`!(+rdfCKc6r-#i&w4Jrez@lN&54AshSmWEM+DI_91ene-LT2uxN zCR6^()be+ntR-xSi7EQJ)kT!+cp8EeJCjXSIgWLq99fToL>|j#Dg5(f!9tI=H_Z91 zOzCYe7;(k1+v9P_mmTy|A?2VOvoobKQ{7&qen)Oivy#&FzCbvOR3cwWE1t$a{NyFZ zB7GjQw0-xdJlyJE3=sQ?)NJ{O(xa()aFn#8vef9DY z#BA4J)QS~Ep16}LJ|Fn)D6Z*jubDyB>PtFcwev8ij%-r3617<5J1R>2w?$+^6N40c zUm?J|H1C1&=7-wW-C5Ds9IWhZ?dZGPKuDfenX}jjV9VRMoZ2g3eR{nE(NjG@-m%je zbQxT-!CS5Pdt`%j{8NaJ5#De%97o|EDr$~#PJFXru;?mT-)r!^GjYJ_bT+>55s^qa z&h6~^;+GmqbV+K`&vl3bDIY3aM$xX)Ucd4jk?aA-YD4q~ghA|9Ve!V^h@9iru$vyE zF7NTgxFlgp8|Xk%2?@)A7NWp=l}L4Rs5~cs>+wY$AM{e5Nvyo<<#(?>& zF78s@NhdJo2$Tqq$v9oK7x;38oOKb2trzyTW9_<2qr1CPam9-J_>qwS!GZ0=({w4( zNwA#!u9rzn9U;#zq|-2`BX z;dfHv5;ONN%-uznv0^L{6((#YA{wZRG#ydm(jJxkS2$$6iJ9XnC7Uwp<8V7Sy=3uE zlDvkn(d{UqQ1oF7N_c-fUF{n;m;orDAnD!E#XAH2pL?_~9n*Ici}kuZI2D60hK!o#-Et92yN!7LT87 zESHLnaUeZXW@BCeXH^+@RvUuz1>2?E@$?r(FjH|%k_a`%aj6J4n^SK* zhLOBxt@8_{bT$I&s8HvQQtUbOwW?RSAY2th*LfpKFcis9reRS5KdV@&QiN}tAOl9C zOH#6m<7Ob20xeH7UTJnWU;u0Mty6sdePNb-JhIeec`-axx)p>Sc?%A5Tp3kOCeWgYpZt6Y0B zhS83r+rIVL{4u%92TA}o42nI3X6=#(4C2k$7NmCC0abwS%($JCIIuI|)6B=XOQ^KA9qFdsY9y^h> zV9VLp3$reMd{H?+;Nrx(XeM81<}d@1J||g(J{GI-;|U&e)N5@b=DoMtp&B$kUD-RP zwn@|ta70-TanyAoLIU{XNg=dcP%^UNp~#o;Vs0Q{uIz0L5WDWb&xc|)b&5%$HKk&A zaM`t}e0O$-GQm%zn}n}_`Q0g`%Y0zMZKDG&}ryN zq&d?@lXDgN8^eI~)!Ys}*`<%ZLqLp($3@j{XXqwixm-G zC#OL1zQ{9o`Wv1bJHh60=+8pxxbWM^p_93Bpq%mM%g`{8kNro4c17Tk+)CibB*;)Hn6j9*j^chp=;CTXl|8V^g^4(|kA zL*%hZ9S=H@`Giix^`un>u$8qhgdCN~2@JRDPSBYx7>M9yaHFMmKOAUFPoc3BDdite;S%ulCDZ@pgPcZ-6d$`VEHLaNyZd07SEyLtQHj@9Jtk9B?#aE*m(P(dN@d|EaxbsZC69=8 znkR0Kt$CA*>0s8R9m2wWvZx@<>O-;wN;5bSrj5@03I{ByC9-Uhy`B+${C}g*KoIFz zGzH{~Ls`V1WUc-$RL8k(1 zInYIy>mOD&I`o=-%BIVFS`V8g;f9Dv(q=eIr5fwezFb=G44&UZT{z%&4QzjF*~itj}(I|QBjAamHp@g60e zLhgQTKq$OKWD{F5AGU+5y-UD03=WhqH%l&i5B~vgz}5dLEuUV>F%TBw!}xoUlNffa zNkD5CZYKqVp_$c4iKYK**`pT*oRDMPaiXZ5JR{6YS`;E_4+F$cE28%CP8n=iN(dYi zX)bQOjL_sAN|#I3MWzDM&XOpsk7@9j=(3UEm}qyE>F;7g7m6sur}5;#HcWrpQKi}+ zygR802f!UM;N)APCxxO_?u%jDAJimxayZ@sH+~`^I$<)mN*Yt;`ML!^foB-*$C&?9 z^tRBxYC0K_$8D($!Ki-Ugq-#HWUf;uejh&UJz%ld+R^$v$E-FB$3d}%ughJ90!16r z@BA3>^k;5V5cV7rEtp$_x+KYQuJo&kXITiWH zz9Ps*wD7zqJGnBOR+K>-Iv=`j@~!Yk>o7tM+~Hq0;B)wY_wC-s686?3HpH)Y!tJ`xSHkXg zt*kgbwt11_Xmp!od0f);=e%ENyjyb%s-Y6!5F8{_ZIMBuvxLv#zw1-HP@7rUu`Pf~)w{ zgBZE9@<7xl+I}vdNPpDT*=Cn@V7#F>7K`-<bCj6X@H?!v2q*9wa%rvN zRb3&orhHo^Q&MQ@=&9YC@UYvDAUcP{c<4;wk4E%&^o{Ue<9=tYP@|vKDXg=7^n@rN zS!Ao|uc<Y6Z>yLpW! zl14damlq%?A{-pXtiEvrT>y69Px6qDE9-}WCylB7j23ylP{{S8W@ukAS33jd9=7ZG#)a-^ zD@RjG1qN!tWr0OqYz`p zw;NuJC;|#w#xe78%Em5D*QMc>@QEq(;0T@4o?D-QbMII~ooqB-U|qkk7yCyhd^?L9 zqVm@el%MpO#!9;3I}b$O$h4gE@qs{$|*3y{Wa=sT-&}2*M9JtaL}0 ml=ya0)4_CFIU)K0$)!E)@AyMEd<#dVEEwBS^+;e~VE+LCWlB&0 literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/ionicons.eot b/public/architectui/assets/fonts/ionicons.eot new file mode 100644 index 0000000000000000000000000000000000000000..9caa348954355e4b19ce5ee2fd7ff321efd94626 GIT binary patch literal 120724 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 AasU7T literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/ionicons.svg b/public/architectui/assets/fonts/ionicons.svg new file mode 100644 index 0000000..2a47a0f --- /dev/null +++ b/public/architectui/assets/fonts/ionicons.svg @@ -0,0 +1,2230 @@ + + + + + +Created by FontForge 20120731 at Wed Jan 14 22:40:14 2015 + By Adam Bradley +Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/architectui/assets/fonts/ionicons.ttf b/public/architectui/assets/fonts/ionicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..180ce515fe85c1ed1a28d915491809b17c7fd623 GIT binary patch literal 188508 zcmdqKd3YSxbtign?R!`CR=uz2ZUBwF(cL6L07Z}>NP;B5)q=PP)Iw2|B~!9w$&w{Q zqTv&Wuf;y9a=ym^my-uESw$(xaBCvoyJ(EFWg zfCOcEOXizD9?;!YU0qdu@44rm<#*1x%{XH$!q%9`F74fW{Llmc_^v@5`4>EMOUFhh zc5OfRM~v|l-ml*Ez`08g2oDzV{&772`K~uTQWAgRm7izApB|_4&tJOtfp-{>PvQL~ z#`N#M_uLz?WiH+y#8$ia^>04^k!SD!RmQ|enDC->;huAM3x7WN7fkpN?#DV8a6o)n zx`OvF;eFqQ2OfERm%;Yq{U0-CKK=SP+;vX;;ZOep6F!RXGoO3l+~b$z*O?D9;S*oP z`K1TXJ#f$aookQc{nr^2zUR^#-uTE5|N5Wc{-0Vy^FDX!;d?Iqz`y^%D@?d1;rx?$ zQt#RCP5*~KpzY`XkG~(<*p4uXzlDE|$vEX8KaZme8{5BUY4#lM&J>Z(?fto%JJ>Ft zpTC=3{R;cqKk}=uTxBEtDhqHp{HBf5O5r=Yo}Rgl&%TCtbXJZ@jQTUdO4y5jrTdi~ zU)l4O#p_R9|K;nyb^Uj)fA0DpU;p##|K<9%>;L!l|9buJuD^W!>(~G1SCy|?UyXb< z|FwU7&B_c+I2y@n*BhC(|>vWv9GwKXGgHFFwcPdWVDL7dt<#>+cSdMQ0%`N>wW52UM zuG}O97jO+dxBhLV($?eu|JoOrhYtNPKY(!-|)}yHD=?^3AR1xV01#{pHA7@;V`P|}5&hl+R zKd$E&1$2*H)VL%|7tuvUk``oSBe>=trW0 z*qRx9=Oe4D_Zi9E@%Zkf(VY>8hs7D90J^@0F;ZAEh~fS0X7kuNe6bj9wt8QD_3EW7 zm#$vD+M6n?Jm4jaY9Yv)ASUB;IL_G;-R&6NVZomiyk@N4p6s;B6Ujt8A}DCIC>km+ zsD>y!ugCT0xhg8EuB);rzNqUj_U`TSD8Ix~#DOtOz-{M5a2{uK z6J0tj(8P;VvxWNPEdPlf9TZU@I`A_f)B2Zhkg0d?E??#QL6>S!q5~H(ImP=K$Fy8R zdxhg5j<7FY?ejnp%#&n1!tpI}rOAD~5`Ef}-3RncR3E?DbC5#k!B+Z!TDGHa^k#bzO6I?IWE%e?gt@w$R+$Z$is;yKGDP{Hsnf$2#)WXq-jGu^VL^z#JC>K z@ZcLc=T$W6&6j|rPYtbQ`Gc~l5W;jM`Rv?Dv z)3-d(xk|KojVZ&$ z*Psw?#$LGwd3c4LV{7bUaPN~`GtY4Wa^DcdIi|{rtST3nV#u4GYZ4a>O*qXA#*8Iq7{nF^Te$1ahcDf^cGue3(}xc>yx3qR+8nMpsb?%Xyp+$zTY4(~XoD$z*fQOe!6V+LmEBsfR4pkxeI)9q7xY zlW|?Q?R2J4sSXxON#C+uyYNezX&O=6GZal#3{8nRR>ZOu)lg+vme7uy<7zXXwb+T^ z=y-oECuu65GdM0$HH@mjWG=|3Buf;zsSB#c)fFfa7AiYZs0xFf(3%(?YShc6Y$lyb z#@q-@0lVdScC^W3Hxk&dH+e-7%VIS_Q-CG_srfDY{7Pv(Ckx>7j>_OuT@@JzsdutwSRw0!e719S^orQeMZ!QWf3*{Ztl^%1P`+S zJRGnXEa)JZjzeJh9HNzk6b3_HVUoxsSU;ePAf959#EvPX=NC9bpAxQP>Z-(IJgP>T z-O4ndgucszXYxGWg?OB^crjkcfzE!yb4*R4CdG_M zliz4a`9|aXc9T!@a-uxVTl^E$ruEBV`y!Fj`p@zsCCRf|tlMF^*XC@bI<%qIB|!=yTfA(V+@FhXfkLpQlb|0Y}$wrYxFq}p3}C;5k^ zpDSUMwsH>!C&2JvJUHy!{|R|K%64G#)r0EP_(-!_DaKXFAf14ry2VBt84PWaA|EgC zE^+Pzi9o2x1QY|=nU!gwuBZuBX~5d-v`J)k6Uh$tCt*&2!+U!p+;YV|u;(pVdQ{fb zaXVCxESrb0G38@SHsytOJDqB8Yj5jz#z%*m{f)j#F_)T5Pr|}< zomewU>ak~7#*7g!A|F3=O1#pU)nJ+uw#G^$DGg6=bv+8{iZSSm)(Qi?!hZy5enm}`+x4n9(QTI#$yOJRnM%$Xp8Ug>>ssrN)2oNZt_h|otm8Fy z_3G-CfUn}iuhWNIv)qyuk6W)W>ybySz;#QmJ2uuE-&bD7_`bm6KwW5jXM>$yXmhKw z0In8KX^H@@mzHP?eI)2YPa)BW_QsPG6S@!&bwIbrvE+!+xI!(B@M;I+2!0L6bL;kC zX=td#HF^c>J;cVk1PS3Y3w^=OAxqnE;SsN#&BlWl_RJAgEyp zdWs!`7zEUiNjLh+#q>yKxK*pRv{LAVAPDfMXqZ14{m zu@JjmRoZSmmyHSa%%l1nGqqaATa@g3GPOeHXf)!9!()E*nONqYbcJuPrazLd20Nu{ z`p&(X3bmhPS8uFoF88xBc04%ZSkUf#E`mN_uwk={@O-(h3Nm_f3YM~hLy8dYDeRcZ zF?~SHk>Q)ePdX;%0i(f$wjxcRydCnwRfi{(gx{#c?ybbD$~R+z&!2qaiH|)|=7N+w zE@`61d2MbB3-s85KlfYduUY9glb z1@w~PaXz#pdMqMCc2lRec0~CW9eIrgzee-6@Johu+1cP!ty)$A*9?F4p*{qOl~ zDkMucm@F6Ip~w=Z47vynD_ww|5F~)hoZpA@Z*d*7wSkx`$D7d&(J#Y|f*n9zf@Oe> zfUd%H@RJkW%fEaX500r;1P}8!3<3M$VjArd4x>#XzY?Ai#rShj``v^19G~J;zKC74 z6*2^kxWeBG+uQ*dMhwH)xdL~atN`T5;f)cFub=EBi#*ohmotj-2S(A>_7sX{s$|~v ziw1u-UUt^MU@L~Qzf!R(DQ@4-Rl9d@hI_BEEMZtl#{dU{2Jq70$^*)yZ|ZB-fPcY7 zRz-{*fEsw@JoGl{`(P~b9~Fduf{vBnB?^L&b0LkD<=+(~$mpZ+J=U)(^7A5@hC;zr zl*8ycQy>S22w|Ju)JT2a&fL^Q-d3HN^JCp4{~ zX}>3mzZdR=_hPU76>PpA!M&7Uuw>p3Ax5Sf(FKhS?|Aa&b*hdV{KVBQcUI|^KZ9FQ zyI%P#^u2d4TcLZ6hlU^SLcj^`+5IWHm#*Gu1Kp~isW%(h>)&qlFSyaa6!lM~>(L|v z9m1P^L;rr}Z*MjKUxiKU!M2-Wb8Ig=z(C2xmwdpkw=u4PSyvepod{p) zl$sD^_^4dgVDH4ZU`l{_%_N5|wpN&z<`Buz6&68@?1;OFI>&h{v z=*mJi06Gl7BE(Pr7vFm&m|I+2SlGRLb~c@gMHyQ>ymAxrI4CQ&m`kfKjwoDULutt2obcrVUzl;q~EB-TNAM1LtwEfz+3^C zMph{leg!5BR4a~z>Wh=PLeIv=a~X3lk*#MFLP}f(D)GIh>zeOmsM-s7YHkNQ@wY-|k!LoUOXxUr<$e@|_`ll?5FW9DLUkN?P zfc%tFPX_&8u=PHK(H&-^!BAf|s!NzAb0kq=*a)W(BOt>Kn@z*5FWU#%qa<$1o<_F= zh9cP$iXN^MfnSmInV1FO*}^NN(}ol}xOh-elJHQ)g9q^c+=jD_)}!s{+!8i`r(t0L zpN^;EF~X;NC|d}x&GsaQ-GEUNA3THgiey*=NmUj`j<2_Wga$zFP15G2;j#-vr936(A5HfEzd7ijbUt;;hQXd97Z_7UU9DZoO68>GINK{@yZ>ywS{d)u3Zr^5uNG?a<1}`?0eq4_3Es2dWlRR+ngk{3 z*rqPZkm7S_5HwQgSZrF0blE~*nSA%S2UC^g7r4(?{Rp20?$~QnIN8+d=1k*H+IFd1 zw5_@B&jrpGO1827pAFkKK3jUPX>eQTr!BkKE!p-!_op4qi_g-Be8R9x#`@O)fo}C{ zRm8%5R%Gp90v02XAb59Z6s(d{AShP^LWE>lSz-VX;m<1aLag`aYW|HGvuWhlH?;TW z`%f-!-@d$ksV|f1%Z!Iw`=`(E+jo8+FXQm`<>NS<>AN1zjxXZyzVrBQ^4AzIVGhJ$ zw+_MQ-h+tv2R^ajfp|3JBN*~+CP$!0FjhfR(SX~6#%j8ton|_0D;*X&EGd;NDTsM> ziK!|9zbb?D-5y>l8X;c%U0u5p#P-h5@87$B&#qSZ*KN106vnLQ`D{u>ARUkwi8zdV z2vG<{e0*cyZ{Ix9-Ll_kH4<@N5N!Rcy5s0q6xcDx|C_iV(&I@%cv8F~d{7iWD3pXx zi{ht+(VYw2SERo;9LM0xh9d~#Y1cpuOuQVv9@?^h`0$*y$)7~m1ZGf~b%K`1WuAl~ zCWpK!3j|5R-GjB(^Jor*9!6}3aGvFjr@+?HDSC3ZR9X!m#9|N^ zti%Jp3g9@+#)4t;;vrNRR0QO>02KkE9wX_o5OD;Sh&t&=N>iCF*l-tWKxW7cBAWxw z4?&>-YcSv~KDz#8PkaZ0kna#J%Ub`UWv#iA^ch|MRlx5htKY(-_x%Cv#DGQFG;0N8 zJL)l5{gcC>%mB4u4hlZjQ+l&yynVd^j7~(KnUv z+qtt+*>z9iK)ZdQeS6daWH?kPBms*B&t#pkXgoSptnQlq%g%vL=fJ!ZRn=s%I8-FL ziO~ShycIlSz;ozhKxq5QU>QEAf>#N(M%n>JO(wpT!Knn%O2@#t(gF+}R;^@H5yy;K zQShq4bu^t%6nLJODVW`b!l_O|@ob62W9$G3@o80+*RSd3XHD%YqBj2$6+J1w{>O32 z6BIMTckx-S8@ZgLloeaogac;blZnKqVvcH%Srqa*3w@FdT0IqPE26o;=W^HiINK}2b z%U__#`}&%y+alLRmp|-Cy5z3^)Mw+ZnRslr6`OcjSH7UYCjJ6IIC0Kj$*eZ&o)xbs497aZETt!S!)m25m zz;sR3wew7qR82aM5r8j_NTCdz7?K~lKp`L#Z{#J65rw#AVc*{QL|?8i7wwPMj8xMf zp@=^r*92Y{$lRsiAjJnoa=Z!A4qK`t#9sW zaG-`eW6Mc^CnOt7?f%YiXZ%P4Gb(&PIq(Y)eefYLV(8;Q$}pLHQI2tj^-Ea?3>hVy zp93LeCPziL*^a3#v3srcgV$PDIJ^1^yNb^QJfSi8D&}pOT?lmBA`cY&zW7ocYPiH` zs-K0jh1w8qCu9ZI7dD%z8rh(TQ(&BZ(=%2A7c5rD_)*WG>FhwZ0wl(cKuiYyYSsKQ zunPe?ltuv?{-C9Diz2)0zhP%)e7tP6 zbf^)_mWU>741HRLm4-M5W+ki&gY&?G)zeEp*pffsyNF|SD~dWJwc5UV?Y6sWf?6Iv zF?r?657h%LztA0Ce&KDn<;EOagMMuyvI)u19LS{NlAsDA8LPrvty(HbJV5wWlfo~8 zvk#00t*G@zr%o@36nDDGZiikcx=A1MonAMD z9zRu+%}OqcUV$ByM4U*3ZgwOqPp%C(we z)W_(gdL@~3wOlH^6bDl|E$My$XYW|PrJoH%gBF8*g!313h{F1YD!CEZyBcE6u&fke z4&$zhuqkCiUx0ow1aiU2WKB}Wi^As-a!%nv)?}@!VA3=Y6{@!D4Ykp&H<0szm^tPa z0pUr%>#K;i-{|bxkYbiPWhZqoW0gB4QyFT)x$oq?^ue^3?-WeA`KLpr(opFGv3RLd z($tX=O~p<;b};MUJVPBAPz{_IPn^bCr7#(i@>5EoT|hCPD*8CZ7BDz>Ap7HRun36( zZHRCj3=|-)NLn@E*;#zcXu$oqua9_ zTdnbEsu@EVmrMq*bi)58`@qEhmz)!*6Dl5Sw`^Wvx4hl>@U@Tf23>#4$y>VGH{frnXN`lnUTTB>p57 zAj=z|Ib<L2(kMN&&_vBz8|nRq8mimtTRDEt1xLlD}2ZRHu|l zRf@@+Ya;F=XP`b{55=8qxso-Lu!x|zGqNsmB-pvRWU-RUlpGak&}2-u-TG~H80hZg z7aDh^#!A)H#dIa5M#@Dm0@KJ4xu@8+9Obx+qC~t>Ni_u_h0{{i(pc)Q#>%$1XlU`c zYO3xwk{cwCSg4yL%nKY#f)pZ}oQtO+dO~;%sYK{N=-2b7E0v%5nM$Sbx8 zsz{T;Foc#S8CxRXHx-LDsn4h}6*mHZvbkb!;N zgGs)|J===9mK`0p(y4kbmK&G!iVGMl19L@czz)@&*amR>n|9RAc#(H`$m59GvGIfw zNm`mEDUpbslO$8qHQgb3`^s0qFYiWdW1Ky(_>uvI)K3OH7go_PM9!h_@kZpQ6y#0H z(h@cjIkA!qKX9OTD&imC?%b8Y85|fH9vB}Suf|4ps>t^WyGmRKI{@>uO`rifyM-cE zbiXwr7P!Ml_zeH^MocdzBC@E?sDiELOw*JsGm=S1)I&r0k?FZaM#%MNge-q!p1>^$WsKbk}!ltC5E0hrK74yM_qg=jS(56%U}?bVfLL}7mVL} ziFo1Le%H!M5ZASlp@IIsN+Ihxny(`zNcWn3z35b&Ol!)CghfHnWlQ$GNxV_L5TX(Y z*u!Y?yZdvw{#@V9I4dvTWv_q06rR>}Q|U;Gp+;3jyM~i;{m%iF{A7qq?z7zAzQ`r` zdjIl%O`QUhxiU20CQZ|bIPV8;w=aMdD9H^jDj5-WL5o}J05{CpenB_7gC@LLu7cVT zkPVK5gv4DyW0bwCT%?$^DuS^!%QUoArW@SQS3!G>IkCBFi7;m^hnt3Fo??c+k?wYs z(%trAEGoF^;cszMOEY0Je|L8cU^;)(R^GfJr_8+XsGS(c%Hjc(6dXQqZ1LE_{9Lee z$HXvY5|oOC9NhGD+>bygZp3J6BbaomLb{*>F9fiQOx_c$hI&;7?BaK2U@X;90a5h` zPlRKP1kez`C490$+yQM7SNKmEHfE}0tbYPKLPWQD0=Z|rA3O5;%iK2plCtd9|6jw6 z@)L%+Bma9yL{ydYil)m=#KAu+U9;Zo=oxvzcHDZVg976^?bLPx*LiqamFf3~&=aR|a*gS?$#==1C`ahZFi$ z>|`VoF-%RhW0IHXJKR^L1Chxpc0YQRPj%+Qhy;o$@lscjXw)#iEOB}cAa z?e!CcDnS;T(BB1iZt*1#bGHUR3jV?>B)dc~H)za=#v+%NDf6b6ghDj{I1fajm@+OP z75|!NuKZG~RgJdB0qJ>^SGbXE)PdfHN*BFQg@-X69h|JMU)P__>9TXD@<*!rM+$!o zhkgKT>wwbL_5TOvd<;k{sExm?Xgi_GS>Vc5_U^@(T+#y&0C2F*N~S<)J#dE*u)W>l zIy8rlp}OH1peqW8h90F$*v0So3J8x9GF><;RZHZP6!Mg`m~wp=U=a`u_>?wbMZG8% z-%tff>gi;Y5Ayg#6v; zK9^2yQDT&EuV8w-y5-SLqzm3sRq3J3cZPHJ5sI#TgkCy32M2c!zF#n&x17uN+fk?x z%Wz|>=32jk69#ww;G1Bl+7Cxa-mntD(p9vTB+ibY8$q(26wWddJH5&p1gy3ovOS|p z)1sb(_?%`&Cp;DLZDgqtZ>fM{>FI#x{Mve8@Q)d#^|e4?-Mc?`H$S=l&s;HH{`}|L zvh11=DKw2ipdUwkJ_GA68bqr3Y#NYRfX~jw5%R4SxYEEsre^2{AY=lt6KWx;cG@H2 zD2J#0q9z$?V$k)Yot3@=SqB2UcJDp;fgw#EGKNoVA2JQeZMB!?c_PZW9Wym8S=#-f zlW|FGWZhKx!EwzpoJeyJF-j%g9zg;X(PkCcK?&Ou+r{4Yiv$|)>e-%6CP?rOR{<(X z@>w0(aIB0mnu28MMOa5K)91Tw{Ox_JIupT81h1RhLp>r9L_`)hrG zKcf)`^)4l$grvIJjjTFYq7A@ulqCqBrVuVtiYSr6heK4|$btr+;8SvxHk>M)n!I|c zJUUvw)Jm#jQRfn64Z5NW>_oZc?O1qHYT)Iu(Q>IgI_5=6o5_VvN|wjS-Py=Er1#-T zS&$0jNq_$XbHiathB_&gP$)ti@fiR|I;B@a5G%Myj6fC$pkGPOPA``xUSFo8;djCRS%d$RVS{W}Ff-6!t-zNHqo^vj zf^rIkCvCJuTezJ_=?XJ~8c13!=Hei&ZH0(u8Y#3$Z~`HLvlA9LPOc^NM2La%1RZR^ z*cgX_p(K$GuZyvhGczZ{-SvO;J{Zkq`}?!GlCA%-ZWrfIpPnyb- zgEk*Vn|-7ebl)(uw z+N-n)2ZG;SN+e2&c-D30M1o_^!$EYj@ftsoq)!U@*u$uBFz#FbGRhVrKlWpeX*#@c zA02x*M&SsU#Q1})^EB+KGSIqx>^Sh9d)Nc)F?N~#aPUKypILk2&1X*Ee%rAl%Lhk? zBZ~aG6Eh-L-t_1r4_$iw{r6qC_xxRVu1@XPPFcNUgZ-$%xTjI;gWf&99~LJPB@tEt z+C2B{bfYN(*&$TA%s!QgI2Oql^Zl{nt2G#2&<3Iw6Z8g#L+dv7y5bXx=G8OK*-^F2o zXkHa3vEK|8pMO46g71Ox{V4yWUe{8Oq* ziDKu@Y3jLiDrzF{!_J+W`nL=B?w8~Ul;VC<0HDh6+s_pXiA#dKAFd13`%4P~@-Be3 ze_d5g4L6ZF{|Q@wzWDu!B-`R0sOCZ5glO?UHVwlxP)mX*@1hj*uML21b8`Ut@sxF* z*5!rXoAobUpSV6T{tWU+Y*~C@{2qndoPTWm0pN_L!jane*!ZOgfB5?NZ5+lp=Wl;b zkkKqbfPB#eOOw+GgIbzSVJ!>!uA<3hl)G4fk?ECKr8hrI;O_>w1+^TNQrZXd&F8@1 zu&0@N0elTrKuKNHFn|U%O%Y8A3Pq9PF%D^gq+G5_rl@Gz{T6_@yzO#9)dhr5 zFc@4%;Sx5S=TO>mrIbw-?T7-ihRd)?;hIP6Vk-M~OL!S|OOhzx@s^xmQF z5nk42xHqiQUI5yOT7qoatwyUTf`d)bYbs0%!2O%09W9Q&`_)Q!az{!;0AW4G!G85BvJY@vWT6=WcT8*8L5RUF$LKD{O;-H`=_! z13rq@Z|2ERdJHDpN|-Q%HgECDzHOciae565NE46;>sNcvpDmSEdxd#KCz^qeQ|(jG z23g>b-w5bJO@Qr@13~}`MGRyr{TUmrl=9hRTvOO2pG4(ijB;Z_X%1xvGbNc&L5`kP z9o8~Z5iCAx)Kzj~drI-WX38&@#`1-1o}+#!u1Tf|Kgo-FUS*`hYu0ZxQvT?`-_~8v zi}rmfp7IkvEos(ICnVMQQd&0*J^i;u$i?5-)ZfIUm=QGAeL)%QPeY8tuW&X%+hH=; zR&PLC<1%8tA+ArgR}+b_6bt+ZTdTEd?X&QB553SIzd)}@Po+JgRyYASWX4WH>zWlH zg*!Wf!UR+rrb|p2nj}5M3^BMH6*5^v{hvDje5C-r zC##=w4JZuOf$v|31p!qOPZChIVenJ1i@$5I)xyKRdR34PS)Q*&WdUZF4BKbu^blU* zdTN3kRfJIiZF!td9{gy=iRUHYnn_8p{JddBbysjH`^)#Rqem?x?^^{)@Ho%MxAu3E z-OY{$*7D)~3oTnv$#q$L$%1b5!?@B}5)-{Loueel0ZRu-e1hzNSAVb)=m!^3p<9U| z4qgMUTb*nmxd$Dd5qF~Zn|+_Gx5LiIDIMcx?>8t#blN=g8>y6o4-6vVKf&ML5`;UU zs4{8M2AC^xON3AdP{ngQ^YC7UjS?K$Z|3Q#;^&75)A_4kXs2#536w$tCpd};#xxD&+oFL>4=#( zVrf)wX|@0md2}p>#4}5GEiD~0T+P8OQ_@kZO7sFL*TBzXB-_UZi%HD<5TV(iFjxu8 zj$|_>!EKhmYsSGU3*QmPe3z_3?SAF+m>Vx4uM_#jFksN=fh;Q5$zqX>Ek16wlJd#N zh2%&kib6wes9ktElbr@&*?Ki1klPa)(h17ILkQrX;Y_tezQ?lmaA6W}Fu7;e^k0&_ zxF`RTzBZ#he*lGkysSl$2}OZtA3H4&sG)cTNupfAaR z5J;3L9YhMPFp~ke#Gi_wB|5h$0m&k}awWJ%FITRFatAgz(UWjyWE28z6D0)7aQ*#M z&FDt3C9pdP|T6^>mhYe59#A#4Q8p&C|uY*u~n z=lyae*{^BWOu0W#k_Xy8h5?_5iZ@rgM8+)U%Ygwntd{x3xf5RUV4cykBy;9 z^#xR^h7aPGjoL+E>EAf_Vw996ZCI+jj!?|Uo^UB5^Dz>OL~QWI8rubJv@|(^$i2*X zF`G%oZKev$0Z)jO34sjMRYb1g^)UhdJ0vI^b;OVetRfHwacn`{w+k^yf_ZAyiigU( zTBC&u*Iot$szE}#rZL%o{W1#w|U^eAV|>FGprSMBuMUU=d8?Mr)5T}`y! zl1oRC{@yx1lqVGOfn zJQ#u3MU|q+7N#!+P)1QM#QDNno}1yXSRz*Kqhtpv10$4-WHU)BI1!t{PX3gtHbo?; z9j_1WI(zonGl_Fli?9tTwnL(L(m(UunKN^PeLovkD4>62&y_+yA;wBXwY z4qKwFz_AJm`nWJKz}Y}|pffsLMGkN(=~$-Day&;%e^eYnbwsQn(VCbMu;dp!HD4v@ z5pr_^7@`A+5eKRjK#M>glP!KURxC$j$<%NwKROyK_SwlqdT64MKXT+Bs*TannU)b1 z)UO>mk`LN)7IstLAUEw&B9qTIW3zV6%jfa~(aw?MW3?)u9kWuR@$l&JBb~O~2WYX; z!FZZUB|V3i`OZlLQR?P@}eJQZ?BC?f=D zI&H{H2NMA=>1}#008)`Y4Q*|_NkBr9D8C7?x%_DyO3vmN9 zf|gUl0vh2f`6NhXXm7sqM__wcpO(eQV|Yds;V~o~eVQ6ag$QV%7aSHnUhss&vmP}M zP20f3S25p;Y$xh%mf3Bv*rPwv5O-1>N=;&92K$=n?YMe65Qhv z?-UGaWJus9TssAm0J#td6_AUfqx@VK^o4hR-}!q=r4PLShu-`B@BY5`yz@PmpMA@d zk3agxhcCV1{)_iKbpD~$J8oY&dE)4igNu9T=XT9Zmv)wRZtqUE#zqk;t9s>lD^_v) zu(ne*kK|!O4X1@E0b5iyPVsSi2dEYALmLO=r5GB88+zu>v``A6#%Ye~CQ^pstd(Bl zSQiC@irS)dluL=y`<=3^+*aZK4*GOO}yKpRtD zOz>r>aap@FW6RphJ69r;nuffDNhmjLR}LP$J<>89S+!c&I7TaS`$270(^gZCu}TM4 zF(kLXUsa^YK))*~1uQ@Xa3^WhGnN+1rPZWxKtpszMs=qy6F({R!ik?q7EMz26Fbd~ zAijU!?6hQB^SgGoCC3!z0&WF8{B)LCrgf2-NFP4yf?1r45UJ?X9kkMc%?!mhZif*C z%uYilJnup5G+jbq3+V#ATELmtyp3@GcY2p#dh-V6#hcCej;}`oQ}x90#RIqBcKq~- z(;I0_d-u%k*giH2?7td|x2j$Y=4HF}O&PAe5fBLZtZxg?b%~9T4h_$Tl2!aJ=Dpg> z*XSi=Qszb?9$YhXC<;T?AaPLMT<>wu{~2!nI%E-P5`b6?^EYIhCv95aMZZ_3A^b&f zhBFy*#w0e5G3k8b21|r|5x(4GG%{9zd|J*!ZV>j_xZKdd2ae6ilw!cC)?nrCg)~`V zj|Yz)T0o}s$Y8yIY!zY7<+fs9WEQXxi(N2K-!GuZ%2e2C_y`1;L%A~z_ypyStEx!4 zN(@1BQC&E4WB_*Mk(DDWCy&qXo+lV+I&j%$$Fw-a+0q7A19ti?UAEvm&M5lodknBnD3$T_Zs$M$( zJ%ZA8JC#IUD++pKshCT0#fgu_9XVOhwHTHafb$+nrUwdzXs&45eR*zHy(mf!3YC(P zD2zphO=C#$uvVQAHO#n_^vhiK(;T%(Afy@3PPE2`QNW;#IiBgIvjsnD#odM%?6flR zZLZs%xKxD2yjOD!8yRR3r%@^t^2GvdmQDH>FaqQo5!l1$XqBQ6f09wuc>$su0Z15w z8>!gzp7G-CvEK(vL}(Nbpgd8+8NxPP&i5(Ln=DC!3gHbC>kaFkV^KAW5}d55Tm*E zF8cYKx6!ba#dmg>mB2f}}K+U&K6n@kPn_RUFV<4ac*H zMm>pB-i(BlcfA;U(#RN3#&E_j-ncRgMY8n_tjiFd!E;y)_Na(QxcTtnB9>2B6h4B0 zAr{;^f(_s_X{RVof&cDa)Td;5N?#NrH?MM#|1>3vJMj5ki~3HSjL(6B;xELvBH-Uy zhU(-RxN@4HxHdq4U*Hv((h-{g0Hia1NuLKpW8ezm-F6vq(C5xs$ zfTU7sj(osf=?HTEj15iNM(G>yG{iNqXy#dmBcWA;WIjc9B@8QsN+pCO0Y|8Zuu%zh zRsj_vf{E*p=X@c&ke~lfuUrX=(>o_8e1F&M&bjHiZhK;CatbSYjW;H@Mg4Lzf;7uS zL#_FVY6Fs#)^+g{t%eUzr`>4hg{D9Un!+^2d`Y(Y4O~Fd8ObdZlwaTG;;vuk1MmC# z@6J{SBVuhpnC<)C$09XdDsy)LYeZO4FX4XZ2N7d36~%A#$M{J5-VcBHvCqCZTq`8R z{QY;{dHmYXpXQ^-JZ)moby4}_sOnq(dAp)U^6u~uf+r!*ZPGmfy9F!QL?f`!k>Ske z0M?3d^x)v3*f69dnD7u$6lw^&Y`$DYUy19`{MI*i6<`+mN-$}H^Edj@F9dzR(;tiV z^U?PCH+}9$HX3`^UB`s5Nf?*SdC-gF6@Z&=V*$HAxR6g_)eb{LDn>sbW()GGj+EEw z?cLUB1@l?PG(pJ+@FM6@om067i8)$C@D#$&RD(rPXbQ?A*K%aISoGYTQ^VUvwxQH@ zAeV7{&xh1EZw6^=3Tm%9KH~JW?bb0?7^6Dkb9jgM(2$k7k0S`>(?BNaAWltUac4aE zj`U7N-PRF*#7h=Ro%HZCK`gy%TmFgu`f(YOdFNp%{$epB8%U#<7fVC$oKvUz;Q;Wp z@cL9OYe!|Vy($;BC(E^Hd9OElw>CYzP!$AMiwXQA#$e4WiDD(FWSaXWsi;;d0s2<@ z6TNN* zlIBLT-{srh&?*TfT`h`{Y^!fj6=Iqzq|zy?V&;bdC=gHDkj-zzj8UPHDT9jE)Qbh~ zK%-WrQa}ro!ioJ@7g=qfYza?FL2ASQQIT1Ogd|d5-IfoJ2$@OPZ9KH}@Zs#_$@Z@w zKK$^*crL~6yfe1+(Bz4Br+s2_2?r)mPM+XzoLiU`2HPW#&bAu!dteDK%vtfNskk-Q z9_kJaZEG&$$lT;0Dyzs5x!F#N-}@{QzoMWXAb-hzURNpCDVKMq>~$XRhai2gS^HXk;D`lF@*+st|_M= zN5D5GQ&+I+AYeI;YVZ|?RkbYOyB6WKmN1W8{qgwN$Z&I@zg{lZ`pQ+pqumIsgqFGq zgcJClfO!fs(n_na4dA_!aSK6;ghcqaEhKfU1=_Y_!^4B)+bS`0P#X4hGZXC}awCyK zA%b-uSa9`f&>Uqf1Ea54!@P zhsY&PLyb6WMaaIep~&Zdt%lyxmaX3$=1gy3__Od6j<65%m7sx)WIz`rF7MQ z+dVhiXrQJEvhCk`Ke(HXUBSP5*E`?w{P(`?dyusFRwO7s{NMv;&m2A&?A^7uTBoJ0 zhih&!wUJY+R)IT^VhvMAI}LCS6&E)-%8aR`9g>^8r3TDTWK=`Ilm4YT_*kWp^nq&E zu?bzLNfP^E`YB{p=v+}T94;f#g$f*E%yGP{^1Vqk#TpDw%8+FIbgC6)iP!TF&t+ z-+Ra6{xR?ein`zETzeq-eHWt&hxaPk4qEM^>R5;Z}K9Jy$Gh0#9P0C@!eQQm%eq z-1b_^mRvH5W6iRE7etBe0R+|@#00z0=py`>e(>QKIGC0ILH!+~hP@I_u~)*`OU6S6 zT*$v1>CAvf;Ixc~mmr>joW$?!8vHQC4VJ+VL-f+H|J5w>-4E<{KN=f#7h$}o0n~dh zJIX%sai7a3B_B{p=rr`QZpwTWYD|JV5>{wisGhS8Nl>@0;H}v$HimG&s-?_oh)RXGWu&MWwXL zA+0!%X-HECHWXefoA0I&Dj;-%rW$4;<{!)iiid9=>23{~UhQi}9ApGK`)AtQ`}6ZI zx{54{Qf0@*@*Y7I^8nxx1@xnKwcy)krGN^JF8ZsH&@7j7It9tl(hu7jN0C7bIQ6iKH+Ask4+pukm8G+M-os@j&=jiR;_$B*40 zX04p8k9zgNI@BZpvR4s~WEoL$imO!!5#-0fM34Io$f*qnBP5*ku9ET`c0PmL7&(=o}hR56n(Bblz8Eyjuf=}fG6|3oI8HH|pd+PBTGJNRW0&B^(> z)IU^?9I1ekH+^BUw_J)qxwe5g6Ghrk1BRtd5I2UOLhFa(bTk&95nbs0EmU)bsmboz5>Z{_XcO)#lFf%zlG*F%B8>ehp ztYsf}D_%v4NRc?2iTOw2{>C`Xx-ej<_yoNoDK<2&u+swi2f%)788NEd!#ZLdY(3WP zW^C8XxZeA6)ow1X3Egh|=`h3Zs*Rr<;?sh#{+ogrd^F=(Hh!qU@{;x1-DhiY$vF4X zRPOsdd;K$ZJZ|${wzqyo;5%{tZy`Q+gDw$RV|ir!+#B58hsX#hj}#YVaiDG&xQH%Z zz*;7o#ePU-#F|ViSZf3;wonRgZx01Xl!d#mP@p=w!dPK!WT+oW0M#5jWG7g-R! zN;wohA#d@P-cr236UrQzpK-Y-c5n>8uRt(qo^K>KhTT2cMGZe5oKUm7-ihu3e0qmWpa<3nsXwfl(CZ$ch68 zSO)xzp9wjINE@gVB{V6@yhzkTGCL*}zI%@!o!`Cv z;Escn6Jw)QBq%kA!{dl7O#-HZ_Vk2$LxukgYY27}d}(r( zd%_&DoLLT>q^djMvR71b8i$h!tg6D#O&t>@| zM~^+ivxR=UdqB;fwDQqRCK}7krw+EAxZzledVo@nFqK>rcNDQW(+iH7(G3-gSkSCK zGQlN1fd#mP_MyY=NCL6SiT2?`Z*-#Yo-&Wxh0(Esof_!BQY@BAc+M9cS>Lg|yxou; z{91%v7w`0PnL57JIV9GxK#Jx3D2yfYr?G^(h~?Bx_a|Mm;G;eS8F$KiE91Iir7><2 zuhozXXDRx4rS^UuzpSD74_bwSl_H#qWCZa=6H%p|p|(HG?qPo)^!Z85fWE4r=?%n@ z`Q0Oesh%0a0w0EXWck2;$u$EK6YAY2&h$rw}(fwxf1ca&}kU=FY{?kN#;_HVr@P_=yvcb!|g z?f9`niwj5h9i7L@S39SYH7v#2s`MwZe9Q)`g?0jQ8d=yOt0BUHjAM#pz|RhuEh+bS zDiQCa1Y4}kj&#wDsSM1fp}^Xpb8k-XkQa%)_^)O8qaP+_Lae-dKq%hsq4YH1Pu>YT~zuTectR zaZ4f(Zn-y_0=M{{b3m@z`2jyFM~ujSqCsR`umzwQ<*K`xa-)OUPzq&e7+dNHgEQ%y&sl!foQeiM2p ztcU20kP>e|09Rq$!KI>H-$nu%tK#M{BoyIbB3T|OQZ>_EKW?7zWBcTmRGL~^bPKbM#NF+&IA0?mp-)i z(!tj~_3rp&rx$ePc5J+e$(dZV*z^~`(W_?1}q#%e(~)J7FOEHb!Q|c7&_9Y zv^Emo)H!C^sM>TcFj{mO=$vlYx^dp+5*7jj3`#Ja2vh$Q^a)LL^7}PzV8KuUm?#$f z0t;{z?*v+=Sx^@0HO}7k&S%%2c>KZF-*$5O@ZLS!I+GKF{k5PTlnRuV!TNY#7+{3> z2BY%qs;Xi#w zpOV_3bj8hUdXdf0@rJ)1euz5gMEqj0X<#XY+h!g7ijW&GHZ}Yb-cU1$qNq8RC}fP} z!TTk1W+<0*qu7hgeA&$S)kY>}0==^gyr`NLNk(Xy0ttB?NyD^kKVHd3;-*Ev90d?f zm2}le;K!k`+yki!Ii8Lr4a?=L%|bM4T9L@~ZAfs{o3J(vGvZC7zD!Wfk}KS|=mV1& znzqD?i&iR|8Jb@I8`#l~8F4*i0wd>KlVn;a18ZvF&KOJ>#;yxYO+|!4w+t0~Di$9= zoD|xF(mYYWg+p2{dLt)&4SFJrn$Fh+#}n}W9j?h(U8JVxu?gD;SANtG$c z!ljkHfdkPRxH>pOr-96z|wD$5hjAaONfZ^jPLk}@r zj2+@iQ9yU=ax4Jw(I8>mTdk621a@2eYXxp zI6Sj%Dwd%kMv*3F2Gq8rDhQg$u8x{atlTJTy6eW14pN0>Fd7uPgCIEZ1@5c^wlp1N zv4+?vayc2+2dT0Jid;m2v~R~aP}*e;CRv{-mhK~k6q1HoIh7WPPz405 zAmL4hu|f%-xx`TVgs_E4DN^&hr*=S|j*X7=*L$lyz`Ie9E>*=!4_%;FH|AED)Pu5C z`VY$~!YP9~*^Rl^tAwL!M6$3@BiEZ~MEPGU7b*@atP?2*aMM^K5y1*~GpnnTXj*gW zB$O7^%4$h6YzV(GNsQpfMYFM_I~m`F{4iC=7)A2$+@X4w?=~+5_tbU#JX$r67_)2j zKU%t!PoyIet@vWbLQN9}2f@uS|FuW6-9dmnOqgT+f%3 z!2{Ljl5qra%M-DPD4Ia3gjM7}>OccDf^liZs1sNi1WR{9&8jkhdRSy|O*W4i71^eVm>O8 zB-KG)ZD7qbhkRw2_Mu)01qJrNj!+V`Yy%`e<&+Vh(hWnFp5_hy#c1JuPc83p)!psl zgbpa&Ee|J?P5aOj{~vE}0%ym4)%n)Hs%~v}tGlm#*Y10J-#0DYx@t*oNw%!EEo-&q zmhH&09XoOoJ5Df3C(iEd!C~hKNL~`0Fd~@{Pd1AQkPu+T2@ZsT0q12t@Zdeb!yA}9 z2%Y(!y0<0SWP<^Exwmdr-CF+j|DXR^e&=`e#T)x7HLqT+<8y|-H5WXQiw4MgmbLe4TWRnyBD4OPy7WRB%C z?fT64cm!jQ&U?B4taT0%N9qHb60+zmp;R1zs&o`&Hmg7!hA>?4X)?1I`dOYoqMzq2 z10W#oAHkgnQp@GN~0;90D`oll;z)SADeRyWDe|WGpJQUE6 z2VLPRK_^{CY(l>=Tmr24FvOVy^Ejanp5u}CkT3z3P+Qwo(cH&&8PDIT#BHWfQ@Kv`zZH)3Hs zo`?0;h1bK7|$!QiER+pX@?nD0(1xomgT1}XwiVwps= zD{VMh+G;`D3)-)ij95&qZaCI!yksUenAzqxuH3cX+PdpdD7foTDb>0=5lJM_&3d=3 zocT%|-HPjE$o1lG;!~8^Xo~2l-e4R@X{Acw$wrG=Lp?dTV|%Ss$l@|1-A3kR58B&v8ePp}+6r8; z<|$m+A>orjVeQ&ZTQC817+tMG1aqKzU_V@UBp~mUM3Y%jXGTYcD&;{Rvb!J%(;Jhm z*&H#tww0S-z`%$zk-*{6wKGsKcYr%?*hJTGQ(8?6=8p+n0Q0aWbXV{#F-g!d;|dIc z?%vYz-L>l&Kj9MsIrFu2w0@f>}gDZ^#yzLQ`>9#T)r5OB*zW`;&jxfA2

  • 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%0AsRRTZC(N>vB>bhOQ?PsgOH zgMB(SRUP8f%~I8&KHWT39p=+52_CQaL?<5R)ZTKqJoY{(w?6fO@jcQFE$gv#HHd%YXB!9r;C8 zW3o+NVr*m363p=Dm<@VnfB%f+3_Ekm3vCP$*}2?ekKPzn0a7as>LaU0PfZxqF*AnNw#(eydxdpMAw{vMtnTU2uX%pPhEVS1*RELmXZ zElTYyN;Jhb#rf{uWF+~XUORa?-&1e-?uwlWR;|Z`%?^{Lo@{;6+9_G@EvdC-O~g%^ zf*FEs*qk&)b#_ea{Jyqdk5y@`wQfJn{OXepl`mSfqZj(|1g23p0pm$dwPCtiaWvG< zkRT`}ZQhzJ2%00U4c~gkn4QG@a!WAPY})q=h1S@YrmxYqX4*#N4HX}Y>1|~4FSV&r^wpirGeVl4% zqq*6Jz#16h{~kFr{(r&ZXUCtbQziGc2*q`tBk&0 literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/ionicons.woff b/public/architectui/assets/fonts/ionicons.woff new file mode 100644 index 0000000000000000000000000000000000000000..5bb6aecbe9ecd244e125cb673462253011a7b35c GIT binary patch literal 67904 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 Gf&l=5@hYeQ literal 0 HcmV?d00001 diff --git a/public/architectui/assets/js/datatable.kor.js b/public/architectui/assets/js/datatable.kor.js new file mode 100644 index 0000000..140a97d --- /dev/null +++ b/public/architectui/assets/js/datatable.kor.js @@ -0,0 +1,24 @@ +const lang_kor = { + "decimal" : "", + "emptyTable" : "데이터가 없습니다.", + "info" : "_START_ - _END_ (총 _TOTAL_ )", + "infoEmpty" : "조회결과 없음", + "infoFiltered" : "(전체 _MAX_ 중 검색결과)", + "infoPostFix" : "", + "thousands" : ",", + "lengthMenu" : "_MENU_ 개씩 보기", + "loadingRecords" : "로딩중...", + "processing" : "처리중...", + "search" : "검색 : ", + "zeroRecords" : "검색된 데이터가 없습니다.", + "paginate" : { + "first" : "첫 페이지", + "last" : "마지막 페이지", + "next" : "다음", + "previous" : "이전" + }, + "aria" : { + "sortAscending" : " :  오름차순 정렬", + "sortDescending" : " :  내림차순 정렬" + } + }; \ No newline at end of file diff --git a/public/architectui/assets/scripts/apex_charts.98288b227c064e6a107f.js b/public/architectui/assets/scripts/apex_charts.98288b227c064e6a107f.js new file mode 100644 index 0000000..0e89446 --- /dev/null +++ b/public/architectui/assets/scripts/apex_charts.98288b227c064e6a107f.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,t={8667:(e,t,r)=>{var a=r(9661),o=r(4692);function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function i(e,t,r){return(t=function(e){var t=function(e){if("object"!=n(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==n(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}window.Apex={dataLabels:{enabled:!1},stroke:{width:2},tooltip:{followCursor:!1},xaxis:{crosshairs:{width:1}}};var s={monthDataSeries1:{prices:[8107.85,8128,8122.9,8165.5,8340.7,8423.7,8423.5,8514.3,8481.85,8487.7,8506.9,8626.2,8668.95,8602.3,8607.55,8512.9,8496.25,8600.65,8881.1,9340.85],dates:["13 Nov 2017","14 Nov 2017","15 Nov 2017","16 Nov 2017","17 Nov 2017","20 Nov 2017","21 Nov 2017","22 Nov 2017","23 Nov 2017","24 Nov 2017","27 Nov 2017","28 Nov 2017","29 Nov 2017","30 Nov 2017","01 Dec 2017","04 Dec 2017","05 Dec 2017","06 Dec 2017","07 Dec 2017","08 Dec 2017"]},monthDataSeries2:{prices:[8423.7,8423.5,8514.3,8481.85,8487.7,8506.9,8626.2,8668.95,8602.3,8607.55,8512.9,8496.25,8600.65,8881.1,9040.85,8340.7,8165.5,8122.9,8107.85,8128],dates:["13 Nov 2017","14 Nov 2017","15 Nov 2017","16 Nov 2017","17 Nov 2017","20 Nov 2017","21 Nov 2017","22 Nov 2017","23 Nov 2017","24 Nov 2017","27 Nov 2017","28 Nov 2017","29 Nov 2017","30 Nov 2017","01 Dec 2017","04 Dec 2017","05 Dec 2017","06 Dec 2017","07 Dec 2017","08 Dec 2017"]},monthDataSeries3:{prices:[7114.25,7126.6,7116.95,7203.7,7233.75,7451,7381.15,7348.95,7347.75,7311.25,7266.4,7253.25,7215.45,7266.35,7315.25,7237.2,7191.4,7238.95,7222.6,7217.9,7359.3,7371.55,7371.15,7469.2,7429.25,7434.65,7451.1,7475.25,7566.25,7556.8,7525.55,7555.45,7560.9,7490.7,7527.6,7551.9,7514.85,7577.95,7592.3,7621.95,7707.95,7859.1,7815.7,7739,7778.7,7839.45,7756.45,7669.2,7580.45,7452.85,7617.25,7701.6,7606.8,7620.05,7513.85,7498.45,7575.45,7601.95,7589.1,7525.85,7569.5,7702.5,7812.7,7803.75,7816.3,7851.15,7912.2,7972.8,8145,8161.1,8121.05,8071.25,8088.2,8154.45,8148.3,8122.05,8132.65,8074.55,7952.8,7885.55,7733.9,7897.15,7973.15,7888.5,7842.8,7838.4,7909.85,7892.75,7897.75,7820.05,7904.4,7872.2,7847.5,7849.55,7789.6,7736.35,7819.4,7875.35,7871.8,8076.5,8114.8,8193.55,8217.1,8235.05,8215.3,8216.4,8301.55,8235.25,8229.75,8201.95,8164.95,8107.85,8128,8122.9,8165.5,8340.7,8423.7,8423.5,8514.3,8481.85,8487.7,8506.9,8626.2],dates:["02 Jun 2017","05 Jun 2017","06 Jun 2017","07 Jun 2017","08 Jun 2017","09 Jun 2017","12 Jun 2017","13 Jun 2017","14 Jun 2017","15 Jun 2017","16 Jun 2017","19 Jun 2017","20 Jun 2017","21 Jun 2017","22 Jun 2017","23 Jun 2017","27 Jun 2017","28 Jun 2017","29 Jun 2017","30 Jun 2017","03 Jul 2017","04 Jul 2017","05 Jul 2017","06 Jul 2017","07 Jul 2017","10 Jul 2017","11 Jul 2017","12 Jul 2017","13 Jul 2017","14 Jul 2017","17 Jul 2017","18 Jul 2017","19 Jul 2017","20 Jul 2017","21 Jul 2017","24 Jul 2017","25 Jul 2017","26 Jul 2017","27 Jul 2017","28 Jul 2017","31 Jul 2017","01 Aug 2017","02 Aug 2017","03 Aug 2017","04 Aug 2017","07 Aug 2017","08 Aug 2017","09 Aug 2017","10 Aug 2017","11 Aug 2017","14 Aug 2017","16 Aug 2017","17 Aug 2017","18 Aug 2017","21 Aug 2017","22 Aug 2017","23 Aug 2017","24 Aug 2017","28 Aug 2017","29 Aug 2017","30 Aug 2017","31 Aug 2017","01 Sep 2017","04 Sep 2017","05 Sep 2017","06 Sep 2017","07 Sep 2017","08 Sep 2017","11 Sep 2017","12 Sep 2017","13 Sep 2017","14 Sep 2017","15 Sep 2017","18 Sep 2017","19 Sep 2017","20 Sep 2017","21 Sep 2017","22 Sep 2017","25 Sep 2017","26 Sep 2017","27 Sep 2017","28 Sep 2017","29 Sep 2017","03 Oct 2017","04 Oct 2017","05 Oct 2017","06 Oct 2017","09 Oct 2017","10 Oct 2017","11 Oct 2017","12 Oct 2017","13 Oct 2017","16 Oct 2017","17 Oct 2017","18 Oct 2017","19 Oct 2017","23 Oct 2017","24 Oct 2017","25 Oct 2017","26 Oct 2017","27 Oct 2017","30 Oct 2017","31 Oct 2017","01 Nov 2017","02 Nov 2017","03 Nov 2017","06 Nov 2017","07 Nov 2017","08 Nov 2017","09 Nov 2017","10 Nov 2017","13 Nov 2017","14 Nov 2017","15 Nov 2017","16 Nov 2017","17 Nov 2017","20 Nov 2017","21 Nov 2017","22 Nov 2017","23 Nov 2017","24 Nov 2017","27 Nov 2017","28 Nov 2017"]}},l={chart:{height:350,type:"radialBar",toolbar:{show:!0}},plotOptions:{radialBar:{startAngle:-135,endAngle:225,hollow:{margin:0,size:"70%",background:"#fff",image:void 0,imageOffsetX:0,imageOffsetY:0,position:"front",dropShadow:{enabled:!0,top:3,left:0,blur:4,opacity:.24}},track:{background:"#fff",strokeWidth:"67%",margin:0,dropShadow:{enabled:!0,top:-3,left:0,blur:4,opacity:.35}},dataLabels:{showOn:"always",name:{offsetY:-10,show:!0,color:"#888",fontSize:"17px"},value:{formatter:function(e){return parseInt(e)},color:"#111",fontSize:"36px",show:!0}}}},fill:{type:"gradient",gradient:{shade:"dark",type:"horizontal",shadeIntensity:.5,gradientToColors:["#ABE5A1"],inverseColors:!0,opacityFrom:1,opacityTo:1,stops:[0,100]}},series:[75],stroke:{lineCap:"round"},labels:["Percent"]},d=new a.A(document.querySelector("#chart-radial"),l),c=new a.A(document.querySelector("#bar-vertical-candle"),{chart:{type:"bar",height:200,width:"100%",stacked:!0,foreColor:"#999"},plotOptions:{bar:{dataLabels:{enabled:!1},columnWidth:"75%",endingShape:"rounded"}},colors:["#00C5A4","#F3F2FC"],series:[{name:"Sessions",data:[20,16,24,28,26,22,15,5,14,16,22,29,24,19,15,10,11,15,19,23]},{name:"Views",data:[20,16,24,28,26,22,15,5,14,16,22,29,24,19,15,10,11,15,19,23]}],labels:[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,1,2,3,4],xaxis:{axisBorder:{show:!1},axisTicks:{show:!1},crosshairs:{show:!1},labels:{show:!1,style:{fontSize:"14px"}}},grid:{xaxis:{lines:{show:!1}},yaxis:{lines:{show:!1}}},yaxis:{axisBorder:{show:!1},labels:{show:!1}},legend:{floating:!0,position:"top",horizontalAlign:"center",offsetY:15},subtitle:{text:"Sessions and Views"},tooltip:{shared:!1,followCursor:!1}}),h=new a.A(document.querySelector("#bar-vertical-candle-lg"),{chart:{type:"bar",height:318,width:"100%",stacked:!0,foreColor:"#999"},plotOptions:{bar:{dataLabels:{enabled:!1},columnWidth:"75%",endingShape:"rounded"}},colors:["#6086c5","#d2f5fc"],series:[{name:"Sessions",data:[20,16,24,28,26,22,15,5,14,16,22,29,24,19,15,10,11,15,19,23]},{name:"Views",data:[20,16,24,28,26,22,15,5,14,16,22,29,24,19,15,10,11,15,19,23]}],labels:[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,1,2,3,4],xaxis:{axisBorder:{show:!1},axisTicks:{show:!1},crosshairs:{show:!1},labels:{show:!1,style:{fontSize:"14px"}}},grid:{xaxis:{lines:{show:!1}},yaxis:{lines:{show:!1}}},yaxis:{axisBorder:{show:!1},labels:{show:!1}},legend:{floating:!0,position:"top",horizontalAlign:"center",offsetY:15},subtitle:{text:"Sessions and Views"},tooltip:{shared:!1,followCursor:!1}}),u=i(i(i(i({chart:{height:200,type:"bar",sparkline:{enabled:!0}},xaxis:{crosshairs:{show:!1}},plotOptions:{bar:{horizontal:!1,endingShape:"rounded",columnWidth:"55%"}},dataLabels:{enabled:!1},stroke:{show:!0,width:2,colors:["transparent"]},series:[{name:"Net Profit",data:[44,55,57,56,61,58,63,60,66]},{name:"Revenue",data:[76,85,101,98,87,105,91,114,94]},{name:"Free Cash Flow",data:[35,41,36,26,45,48,52,53,41]}]},"xaxis",{categories:["Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct"]}),"yaxis",{title:{text:"$ (thousands)"}}),"fill",{opacity:1}),"tooltip",{followCursor:!1,y:{formatter:function(e){return"$ "+e+" thousands"}}}),p=new a.A(document.querySelector("#chart-col-1"),u),m=i(i(i(i({chart:{height:200,type:"line",sparkline:{enabled:!0}},xaxis:{crosshairs:{show:!1}},plotOptions:{bar:{horizontal:!1,endingShape:"rounded",columnWidth:"55%"}},dataLabels:{enabled:!0},stroke:{show:!0,width:2,colors:["#998787"]},series:[{name:"Net Profit",data:[44,55,57,56,61,58,63,60,66]},{name:"Revenue",data:[76,85,101,98,87,105,91,114,94]},{name:"Free Cash Flow",data:[35,41,36,26,45,48,52,53,41]}]},"xaxis",{categories:["Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct"]}),"yaxis",{title:{text:"$ (thousands)"}}),"fill",{opacity:1}),"tooltip",{followCursor:!1,y:{formatter:function(e){return"$ "+e+" thousands"}}}),y=new a.A(document.querySelector("#chart-col-2"),m),b=i(i(i(i({chart:{height:200,type:"area",sparkline:{enabled:!0}},xaxis:{crosshairs:{show:!1}},plotOptions:{bar:{horizontal:!1,endingShape:"rounded",columnWidth:"55%"}},dataLabels:{enabled:!1},stroke:{show:!0,width:2,colors:["transparent"]},series:[{name:"Net Profit",data:[44,55,57,56,61,58,63,60,66]},{name:"Revenue",data:[76,85,101,98,87,105,91,114,94]},{name:"Free Cash Flow",data:[35,41,36,26,45,48,52,53,41]}]},"xaxis",{categories:["Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct"]}),"yaxis",{title:{text:"$ (thousands)"}}),"fill",{opacity:1}),"tooltip",{followCursor:!1,y:{formatter:function(e){return"$ "+e+" thousands"}}}),f=new a.A(document.querySelector("#chart-col-3"),b),x={chart:{height:397,type:"line",toolbar:{show:!1}},series:[{name:"Website Blog",type:"column",data:[440,505,414,671,227,413,201,352,752,320,257,160]},{name:"Social Media",type:"line",data:[23,42,35,27,43,22,17,31,22,22,12,16]}],stroke:{width:[0,4]},labels:["01 Jan 2001","02 Jan 2001","03 Jan 2001","04 Jan 2001","05 Jan 2001","06 Jan 2001","07 Jan 2001","08 Jan 2001","09 Jan 2001","10 Jan 2001","11 Jan 2001","12 Jan 2001"],xaxis:{type:"datetime"},yaxis:[{title:{text:"Website Blog"}},{opposite:!0,title:{text:"Social Media"}}]},w=new a.A(document.querySelector("#chart-combined"),x),g={chart:{height:350,type:"area",zoom:{enabled:!1}},dataLabels:{enabled:!1},stroke:{curve:"straight"},series:[{name:"STOCK ABC",data:s.monthDataSeries1.prices}],title:{text:"Fundamental Analysis of Stocks",align:"left"},subtitle:{text:"Price Movements",align:"left"},labels:s.monthDataSeries1.dates,xaxis:{type:"datetime"},yaxis:{opposite:!0},legend:{horizontalAlign:"left"}},k=new a.A(document.querySelector("#chart-apex-area"),g),S=new a.A(document.querySelector("#chart-apex-negative"),{chart:{height:350,type:"area"},dataLabels:{enabled:!1},stroke:{curve:"straight"},series:[{name:"north",data:[{x:1996,y:322},{x:1997,y:324},{x:1998,y:329},{x:1999,y:342},{x:2e3,y:348},{x:2001,y:334},{x:2002,y:325},{x:2003,y:316},{x:2004,y:318},{x:2005,y:330},{x:2006,y:355},{x:2007,y:366},{x:2008,y:337},{x:2009,y:352},{x:2010,y:377},{x:2011,y:383},{x:2012,y:344},{x:2013,y:366},{x:2014,y:389},{x:2015,y:334}]},{name:"south",data:[{x:1996,y:162},{x:1997,y:90},{x:1998,y:50},{x:1999,y:77},{x:2e3,y:35},{x:2001,y:-45},{x:2002,y:-88},{x:2003,y:-120},{x:2004,y:-156},{x:2005,y:-123},{x:2006,y:-88},{x:2007,y:-66},{x:2008,y:-45},{x:2009,y:-29},{x:2010,y:-45},{x:2011,y:-88},{x:2012,y:-132},{x:2013,y:-146},{x:2014,y:-169},{x:2015,y:-184}]}],title:{text:"Area with Negative Values",align:"left",style:{fontSize:"14px"}},xaxis:{type:"datetime",axisBorder:{show:!1},axisTicks:{show:!1}},yaxis:{tickAmount:4,floating:!1,labels:{style:{color:"#8e8da4"},offsetY:-7,offsetX:0},axisBorder:{show:!1},axisTicks:{show:!1}},fill:{opacity:.5,gradient:{enabled:!1}},tooltip:{x:{format:"yyyy"},fixed:{enabled:!1,position:"topRight"}},grid:{yaxis:{lines:{offsetX:-30}},padding:{left:20}}}),v=i(i(i(i({chart:{height:350,type:"bar"},plotOptions:{bar:{horizontal:!1,endingShape:"rounded",columnWidth:"55%"}},xaxis:{crosshairs:{show:!1}},dataLabels:{enabled:!1},stroke:{show:!0,width:2,colors:["transparent"]},series:[{name:"Net Profit",data:[44,55,57,56,61,58,63,60,66]},{name:"Revenue",data:[76,85,101,98,87,105,91,114,94]},{name:"Free Cash Flow",data:[35,41,36,26,45,48,52,53,41]}]},"xaxis",{categories:["Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct"]}),"yaxis",{title:{text:"$ (thousands)"}}),"fill",{opacity:1}),"tooltip",{followCursor:!1,y:{formatter:function(e){return"$ "+e+" thousands"}}}),A=new a.A(document.querySelector("#chart-apex-column"),v),J=new a.A(document.querySelector("#chart-apex-stacked"),{chart:{height:350,type:"bar",stacked:!0},plotOptions:{bar:{horizontal:!0}},stroke:{width:1,colors:["#fff"]},series:[{name:"Marine Sprite",data:[44,55,41,37,22,43,21]},{name:"Striking Calf",data:[53,32,33,52,13,43,32]},{name:"Tank Picture",data:[12,17,11,9,15,11,20]},{name:"Bucket Slope",data:[9,7,5,8,6,9,4]},{name:"Reborn Kid",data:[25,12,19,32,25,24,10]}],title:{text:"Fiction Books Sales"},xaxis:{categories:[2008,2009,2010,2011,2012,2013,2014],labels:{formatter:function(e){return e+"K"}}},yaxis:{title:{text:void 0}},tooltip:{followCursor:!1,y:{formatter:function(e){return e+"K"}}},fill:{opacity:1},legend:{position:"top",horizontalAlign:"left",offsetX:40}}),B={chart:{height:274,type:"bar",stacked:!0,toolbar:{show:!1}},plotOptions:{bar:{horizontal:!0}},xaxis:{crosshairs:{show:!1}},stroke:{width:1,colors:["#fff"]},series:[{name:"Marine",data:[44,55,41,37,22,43]},{name:"Striking",data:[53,32,33,52,13,43]},{name:"Tank",data:[12,17,11,9,15,11]},{name:"Bucket",data:[9,7,5,8,6,9]},{name:"Reborn",data:[25,12,19,32,25,24]}],tooltip:{y:{formatter:function(e){return e+"K"}}},fill:{opacity:1},legend:{position:"top",horizontalAlign:"center"}},O=new a.A(document.querySelector("#chart-apex-stacked-commerce"),B),N=function(e){for(var t,r,a=e.slice(),o=a.length;0!==o;)r=Math.floor(Math.random()*o),t=a[o-=1],a[o]=a[r],a[r]=t;return a},I=[47,45,54,38,56,24,65,31,37,39,62,51,35,41,35,27,93,53,61,27,54,43,19,46],q={chart:{type:"line",width:100,height:35,sparkline:{enabled:!0}},series:[{data:[25,66,41,89,63,25,44,12,36,9,54]}],tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}}},E={chart:{type:"line",width:100,height:35,sparkline:{enabled:!0}},series:[{data:[12,14,2,47,42,15,47,75,65,19,14]}],tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}}},z={chart:{type:"line",width:100,height:35,sparkline:{enabled:!0}},series:[{data:[47,45,74,14,56,74,14,11,7,39,82]}],tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}}},C={chart:{type:"line",width:100,height:35,sparkline:{enabled:!0}},series:[{data:[15,75,47,65,14,2,41,54,4,27,15]}],tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}}},T={chart:{type:"bar",width:100,height:35,sparkline:{enabled:!0}},plotOptions:{bar:{columnWidth:"80%"}},series:[{data:[25,66,41,89,63,25,44,12,36,9,54]}],labels:[1,2,3,4,5,6,7,8,9,10,11],xaxis:{crosshairs:{width:1}},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}}},F={chart:{type:"bar",width:100,height:35,sparkline:{enabled:!0}},plotOptions:{bar:{columnWidth:"80%"}},series:[{data:[12,14,2,47,42,15,47,75,65,19,14]}],labels:[1,2,3,4,5,6,7,8,9,10,11],xaxis:{crosshairs:{width:1}},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}}},M={chart:{type:"bar",width:100,height:35,sparkline:{enabled:!0}},plotOptions:{bar:{columnWidth:"80%"}},series:[{data:[47,45,74,14,56,74,14,11,7,39,82]}],labels:[1,2,3,4,5,6,7,8,9,10,11],xaxis:{crosshairs:{width:1}},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}}},D={chart:{type:"bar",width:100,height:35,sparkline:{enabled:!0}},plotOptions:{bar:{columnWidth:"80%"}},colors:["#4a47c4"],stroke:{width:0,curve:"smooth"},series:[{data:[25,66,41,89,63,25,44,12,36,9,54]}],labels:[1,2,3,4,5,6,7,8,9,10,11],xaxis:{crosshairs:{width:1}},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}}},P={chart:{type:"area",width:100,height:35,sparkline:{enabled:!0}},colors:["#3ac47d"],stroke:{width:2,curve:"smooth"},series:[{data:[25,66,41,89,63,25,44,12,36,9,54]}],labels:[1,2,3,4,5,6,7,8,9,10,11],xaxis:{crosshairs:{width:1}},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}}},W={chart:{type:"area",height:152,sparkline:{enabled:!0}},colors:["#3f6ad8"],stroke:{width:5,curve:"smooth"},markers:{size:0},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},fill:{type:"gradient",gradient:{shadeIntensity:1,opacityFrom:.7,opacityTo:.9,stops:[0,90,100]}},series:[{data:N(I)}],yaxis:{min:0}},j={chart:{type:"area",height:152,sparkline:{enabled:!0}},colors:["rgba(255,255,255,.8)"],stroke:{width:5,curve:"smooth"},markers:{size:0},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},fill:{type:"gradient",gradient:{shadeIntensity:1,opacityFrom:.2,opacityTo:.7,stops:[0,90,100]}},series:[{data:N(I)}],yaxis:{min:0}},L={chart:{type:"area",height:152,sparkline:{enabled:!0}},stroke:{width:5,curve:"smooth"},colors:["#f7b924"],markers:{size:0},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},fill:{type:"gradient",gradient:{shadeIntensity:1,opacityFrom:.7,opacityTo:.9,stops:[0,90,100]}},series:[{data:N(I)}],yaxis:{min:0}},$={chart:{type:"area",height:152,sparkline:{enabled:!0}},colors:["#3ac47d"],stroke:{width:5,curve:"smooth"},markers:{size:0},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},fill:{type:"gradient",gradient:{shadeIntensity:1,opacityFrom:.7,opacityTo:.9,stops:[0,90,100]}},series:[{data:N(I)}],yaxis:{min:0}},R={chart:{type:"area",height:332,sparkline:{enabled:!0}},colors:["#3ac47d"],stroke:{width:5,curve:"smooth"},markers:{size:0},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},fill:{type:"gradient",gradient:{shadeIntensity:1,opacityFrom:.7,opacityTo:.9,stops:[0,90,100]}},series:[{data:N(I)}],yaxis:{min:0}},K={chart:{type:"line",height:100,sparkline:{enabled:!0}},colors:["#3ac47d"],stroke:{width:3,curve:"smooth"},markers:{size:0},tooltip:{fixed:{enabled:!0},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},series:[{data:N(I)}],yaxis:{min:0}},_={chart:{type:"line",height:100,sparkline:{enabled:!0}},stroke:{width:3,curve:"smooth"},colors:["#007bff"],markers:{size:0},tooltip:{fixed:{enabled:!0},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},series:[{data:N(I)}],yaxis:{min:0}},V={chart:{type:"line",height:100,sparkline:{enabled:!0}},colors:["#f7b924"],stroke:{width:3,curve:"smooth"},markers:{size:0},tooltip:{fixed:{enabled:!0},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},series:[{data:N(I)}],yaxis:{min:0}},Y={chart:{type:"line",height:100,sparkline:{enabled:!0}},colors:["#d92550"],stroke:{width:3,curve:"smooth"},markers:{size:0},tooltip:{fixed:{enabled:!0},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},series:[{data:N(I)}],yaxis:{min:0}},X={chart:{type:"line",height:120,sparkline:{enabled:!0}},tooltip:{enabled:!1},colors:["#3ac47d"],stroke:{width:3,curve:"smooth"},markers:{size:0},series:[{data:N(I)}],yaxis:{min:0}},G={chart:{type:"bar",height:120,sparkline:{enabled:!0}},tooltip:{enabled:!1},stroke:{width:3,curve:"smooth"},colors:["#007bff"],markers:{size:0},series:[{data:N(I)}],yaxis:{min:0}},H={chart:{type:"area",height:120,sparkline:{enabled:!0}},tooltip:{enabled:!1},colors:["#f7b924"],stroke:{width:3,curve:"smooth"},markers:{size:0},series:[{data:N(I)}],yaxis:{min:0}},Q={chart:{height:265,type:"bar",stacked:!1,toolbar:{show:!1}},plotOptions:{bar:{horizontal:!1}},xaxis:{crosshairs:{show:!1}},colors:["#007bff","#16aaff"],stroke:{width:0,colors:["#fff"],curve:"smooth"},series:[{name:"Marine",data:[44,55,41,37,22,43]},{name:"Striking",data:[53,32,33,52,13,43]}],tooltip:{shared:!1,followCursor:!1,y:{formatter:function(e){return e+"K"}}},fill:{opacity:.8},legend:{position:"bottom",horizontalAlign:"center"}},U={chart:{type:"bar",height:174,sparkline:{enabled:!0}},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},stroke:{width:2,curve:"smooth"},colors:["rgba(255,255,255,.3)"],markers:{size:0},series:[{data:N(I)}],yaxis:{min:0}},Z={chart:{type:"line",height:148,sparkline:{enabled:!0}},tooltip:{fixed:{enabled:!1},x:{show:!1},y:{title:{formatter:function(e){return""}}},marker:{show:!1}},colors:["rgba(255,255,255,.3)"],stroke:{width:2,curve:"smooth"},markers:{size:0},series:[{data:N(I)}],yaxis:{min:0}};o(document).ready(function(){setTimeout(function(){document.getElementById("chart-apex-area")&&k.render(),document.getElementById("chart-apex-negative")&&S.render(),document.getElementById("chart-apex-column")&&A.render(),document.getElementById("chart-apex-stacked")&&J.render(),document.getElementById("chart-col-1")&&p.render(),document.getElementById("chart-col-2")&&y.render(),document.getElementById("chart-col-3")&&f.render(),document.getElementById("sparkline-chart1")&&new a.A(document.querySelector("#sparkline-chart1"),q).render(),document.getElementById("sparkline-chart2")&&new a.A(document.querySelector("#sparkline-chart2"),E).render(),document.getElementById("sparkline-chart3")&&new a.A(document.querySelector("#sparkline-chart3"),z).render(),document.getElementById("sparkline-chart4")&&new a.A(document.querySelector("#sparkline-chart4"),C).render(),document.getElementById("sparkline-chart5")&&new a.A(document.querySelector("#sparkline-chart5"),T).render(),document.getElementById("sparkline-chart6")&&new a.A(document.querySelector("#sparkline-chart6"),F).render(),document.getElementById("sparkline-chart7")&&new a.A(document.querySelector("#sparkline-chart7"),M).render(),document.getElementById("sparkline-chart8")&&new a.A(document.querySelector("#sparkline-chart8"),D).render(),document.getElementById("sparkline-chart9")&&new a.A(document.querySelector("#sparkline-chart9"),P).render(),document.getElementById("dashboard-sparkline-1")&&new a.A(document.querySelector("#dashboard-sparkline-1"),W).render(),document.getElementById("dashboard-sparkline-4")&&new a.A(document.querySelector("#dashboard-sparkline-4"),j).render(),document.getElementById("dashboard-sparkline-2")&&new a.A(document.querySelector("#dashboard-sparkline-2"),L).render(),document.getElementById("dashboard-sparkline-3")&&new a.A(document.querySelector("#dashboard-sparkline-3"),$).render(),document.getElementById("dashboard-sparklines-1")&&new a.A(document.querySelector("#dashboard-sparklines-1"),K).render(),document.getElementById("dashboard-sparklines-2")&&new a.A(document.querySelector("#dashboard-sparklines-2"),_).render(),document.getElementById("dashboard-sparklines-3")&&new a.A(document.querySelector("#dashboard-sparklines-3"),V).render(),document.getElementById("dashboard-sparklines-4")&&new a.A(document.querySelector("#dashboard-sparklines-4"),Y).render(),document.getElementById("dashboard-sparklines-primary")&&new a.A(document.querySelector("#dashboard-sparklines-primary"),Q).render(),document.getElementById("dashboard-sparklines-simple-1")&&new a.A(document.querySelector("#dashboard-sparklines-simple-1"),X).render(),document.getElementById("dashboard-sparklines-simple-2")&&new a.A(document.querySelector("#dashboard-sparklines-simple-2"),G).render(),document.getElementById("dashboard-sparklines-simple-3")&&new a.A(document.querySelector("#dashboard-sparklines-simple-3"),H).render(),document.getElementById("dashboard-sparklines-transparent-2")&&new a.A(document.querySelector("#dashboard-sparklines-transparent-2"),U).render(),document.getElementById("dashboard-sparklines-transparent-3")&&new a.A(document.querySelector("#dashboard-sparklines-transparent-3"),Z).render(),document.getElementById("dashboard-sparkline-carousel-1")&&new a.A(document.querySelector("#dashboard-sparkline-carousel-1"),X).render(),document.getElementById("dashboard-sparkline-carousel-2")&&new a.A(document.querySelector("#dashboard-sparkline-carousel-2"),G).render(),document.getElementById("dashboard-sparkline-carousel-3")&&new a.A(document.querySelector("#dashboard-sparkline-carousel-3"),H).render(),document.getElementById("sparkline-carousel-3")&&new a.A(document.querySelector("#sparkline-carousel-3"),X).render(),document.getElementById("dashboard-sparkline-11")&&new a.A(document.querySelector("#dashboard-sparkline-11"),M).render(),document.getElementById("dashboard-sparkline-22")&&new a.A(document.querySelector("#dashboard-sparkline-22"),D).render(),document.getElementById("dashboard-sparkline-33")&&new a.A(document.querySelector("#dashboard-sparkline-33"),P).render(),document.getElementById("chart-apex-stacked-commerce")&&O.render(),document.getElementById("chart-radial")&&d.render(),document.getElementById("chart-combined")&&w.render(),document.getElementById("bar-vertical-candle")&&c.render(),document.getElementById("bar-vertical-candle-lg")&&h.render()},1e3),o(".minimal-tab-btn-1").one("click",function(){setTimeout(function(){new a.A(document.querySelector("#chart-combined-tab"),x).render()},500)}),o(".dd-chart-btn").one("click",function(){setTimeout(function(){document.getElementById("dashboard-sparkline-carousel-3-pop")&&new a.A(document.querySelector("#dashboard-sparkline-carousel-3-pop"),H).render()},500)}),o(".dd-chart-btn-2").one("click",function(){setTimeout(function(){document.getElementById("dashboard-sparkline-carousel-4-pop")&&new a.A(document.querySelector("#dashboard-sparkline-carousel-4-pop"),G).render()},500)}),o(".minimal-tab-btn-3").one("click",function(){setTimeout(function(){new a.A(document.querySelector("#chart-combined-tab-3"),B).render()},500)}),o(".second-tab-toggle").one("click",function(){setTimeout(function(){new a.A(document.querySelector("#dashboard-sparklines-333"),Y).render()},500)}),o(".second-tab-toggle-alt").one("click",function(){setTimeout(function(){new a.A(document.querySelector("#dashboard-sparkline-37"),R).render()},500)})})}},r={};function a(e){var o=r[e];if(void 0!==o)return o.exports;var n=r[e]={id:e,loaded:!1,exports:{}};return t[e].call(n.exports,n,n.exports,a),n.loaded=!0,n.exports}a.m=t,e=[],a.O=(t,r,o,n)=>{if(!r){var i=1/0;for(c=0;c=n)&&Object.keys(a.O).every(e=>a.O[e](r[l]))?r.splice(l--,1):(s=!1,n0&&e[c-1][2]>n;c--)e[c]=e[c-1];e[c]=[r,o,n]},a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),a.j=181,(()=>{var e={181:0};a.O.j=t=>0===e[t];var t=(t,r)=>{var o,n,[i,s,l]=r,d=0;if(i.some(t=>0!==e[t])){for(o in s)a.o(s,o)&&(a.m[o]=s[o]);if(l)var c=l(a)}for(t&&t(r);da(8667));o=a.O(o)})(); \ No newline at end of file diff --git a/public/architectui/assets/scripts/app.js b/public/architectui/assets/scripts/app.js new file mode 100644 index 0000000..ee1bca3 --- /dev/null +++ b/public/architectui/assets/scripts/app.js @@ -0,0 +1,370 @@ +// Imports +import $ from "jquery"; +window.jQuery = $; +window.$ = $; + +import * as bootstrap from 'bootstrap'; +import { Dropdown } from 'bootstrap'; +import "metismenu"; + +// Stylesheets +import "./assets/base.scss"; + +// Import fixed timing loader (simpler, more reliable) +// Temporarily disabled to debug webpack error +// import "./utils/fixed-loader.js"; + +$(document).ready(() => { + + // Page Transition Animations + function initPageAnimations() { + // SimpleLoader handles the loader, we just need to trigger animations + // Wait a bit to ensure loader has been handled + setTimeout(() => { + // Trigger header animation + $('.HeaderAnimation-appear').addClass('HeaderAnimation-appear-active'); + + // Trigger main content animation with slight delay + setTimeout(() => { + $('.MainAnimation-appear').addClass('MainAnimation-appear-active'); + }, 100); + + // Trigger sidebar animation if present + setTimeout(() => { + $('.SidebarAnimation-appear').addClass('SidebarAnimation-appear-active'); + }, 200); + + // Trigger tab animations for content with tabs + setTimeout(() => { + $('.tabs-animation, .TabsAnimation-appear').addClass('TabsAnimation-appear-active'); + }, 300); + }, 200); + } + + // Initialize animations when body has app-loaded class + const waitForLoaded = () => { + if (document.body.classList.contains('app-loaded')) { + initPageAnimations(); + } else { + setTimeout(waitForLoaded, 50); + } + }; + + waitForLoaded(); + + // Handle dynamic content loading transitions + function fadeInContent(selector, delay = 0) { + setTimeout(() => { + $(selector).addClass('animated fadeInUp'); + }, delay); + } + + // Sidebar Menu + + setTimeout(function () { + $(".vertical-nav-menu").metisMenu(); + + // Ensure Perfect Scrollbar updates after MetisMenu initialization + setTimeout(() => { + if (window.sidebarScrollbar && window.sidebarScrollbar.update) { + window.sidebarScrollbar.update(); + } + }, 50); + }, 100); + + // Search wrapper trigger + + $(".search-icon").click(function () { + $(this).parent().parent().addClass("active"); + }); + + $(".search-wrapper .btn-close").click(function () { + $(this).parent().removeClass("active"); + }); + + // BS5 Popover + + var popoverTriggerList1 = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover-custom-content"]')); + var popoverList = popoverTriggerList1.map(function (popoverTriggerEl1) { + return new bootstrap.Popover(popoverTriggerEl1, + { + html: true, + placement: "auto", + template: + '', + content: function () { + var id = $(this).attr("popover-id"); + return $("#popover-content-" + id).html(); + }, + }); + }); + + // REMOVED: Conflicting jQuery dropdown click handler that was preventing dropdowns from opening + + var popoverTriggerList2 = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover-custom-bg"]')); + var popoverList = $('[data-bs-toggle="popover-custom-bg"]').each(function (popoverTriggerEl2) { + var popClass = $(this).attr('data-bg-class'); + return new bootstrap.Popover($(this), { + trigger: "focus", + placement: "top", + template: + '', + }); + }); + + // BS5 Popover + + var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')); + var popoverList = popoverTriggerList.map(function (popoverTriggerEl) { + return new bootstrap.Popover(popoverTriggerEl); + }); + + $('[data-bs-toggle="popover-custom"]').each(function (i, obj) { + return new bootstrap.Popover($(this), { + html: true, + container: $(this).parent().find(".rm-max-width"), + content: function () { + return $(this) + .next(".rm-max-width") + .find(".popover-custom-content") + .html(); + }, + }); + }); + + + // Portal dropdown implementation - moves menus to body to escape containers + document.addEventListener('click', function(event) { + var trigger = event.target.closest('[data-bs-toggle="dropdown"]'); + + if (trigger) { + event.preventDefault(); + event.stopPropagation(); + + // Close all other dropdowns first + document.querySelectorAll('.dropdown-menu.show').forEach(function(menu) { + menu.classList.remove('show'); + // Restore to original position if it was portaled + if (menu._originalParent) { + if (menu._originalNextSibling) { + menu._originalParent.insertBefore(menu, menu._originalNextSibling); + } else { + menu._originalParent.appendChild(menu); + } + // Clear portal data + delete menu._originalParent; + delete menu._originalNextSibling; + // Reset styles + menu.style.position = ''; + menu.style.top = ''; + menu.style.left = ''; + menu.style.zIndex = ''; + menu.style.transform = ''; + } + var toggle = document.querySelector('[data-bs-toggle="dropdown"][aria-expanded="true"]'); + if (toggle) toggle.setAttribute('aria-expanded', 'false'); + }); + + // Find the dropdown menu for this trigger + var menu = trigger.nextElementSibling; + if (!menu || !menu.classList.contains('dropdown-menu')) { + menu = trigger.parentNode.querySelector('.dropdown-menu'); + } + + if (menu) { + // Check if this is a header dropdown (skip portal for header dropdowns) + var isHeaderDropdown = trigger.closest('.app-header, .header-megamenu, .header-dots, .header-btn-lg'); + + if (isHeaderDropdown) { + // Simple show for header dropdowns (don't portal them) + menu.classList.add('show'); + trigger.setAttribute('aria-expanded', 'true'); + } else { + // Portal approach for page dropdowns only + var triggerRect = trigger.getBoundingClientRect(); + + // Store original parent and position info + if (!menu._originalParent) { + menu._originalParent = menu.parentNode; + menu._originalNextSibling = menu.nextSibling; + } + + // Move to body + document.body.appendChild(menu); + + // Position relative to viewport + menu.style.position = 'fixed'; + menu.style.top = (triggerRect.bottom + 2) + 'px'; + menu.style.left = triggerRect.left + 'px'; + menu.style.zIndex = '99999'; + menu.style.transform = 'none'; + + // Show the menu + menu.classList.add('show'); + trigger.setAttribute('aria-expanded', 'true'); + } + } + } else { + // Click outside - close all dropdowns + document.querySelectorAll('.dropdown-menu.show').forEach(function(menu) { + menu.classList.remove('show'); + // Restore to original position if it was portaled + if (menu._originalParent) { + if (menu._originalNextSibling) { + menu._originalParent.insertBefore(menu, menu._originalNextSibling); + } else { + menu._originalParent.appendChild(menu); + } + // Clear portal data + delete menu._originalParent; + delete menu._originalNextSibling; + // Reset styles + menu.style.position = ''; + menu.style.top = ''; + menu.style.left = ''; + menu.style.zIndex = ''; + menu.style.transform = ''; + } + var toggle = document.querySelector('[data-bs-toggle="dropdown"][aria-expanded="true"]'); + if (toggle) toggle.setAttribute('aria-expanded', 'false'); + }); + } + }); + + // BS5 Tooltips + var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); + var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { + return new bootstrap.Tooltip(tooltipTriggerEl); + }); + + var tooltipTriggerList1 = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip-light"]')); + var tooltipList = tooltipTriggerList1.map(function (tooltipTriggerEl1) { + return new bootstrap.Tooltip(tooltipTriggerEl1, { + template: + '
    ' + } + ); + }); + + // Drawer + + $(".open-right-drawer").click(function () { + $(this).addClass("is-active"); + $(".app-drawer-wrapper").addClass("drawer-open"); + $(".app-drawer-overlay").removeClass("d-none"); + }); + + $(".drawer-nav-btn").click(function () { + $(".app-drawer-wrapper").removeClass("drawer-open"); + $(".app-drawer-overlay").addClass("d-none"); + $(".open-right-drawer").removeClass("is-active"); + }); + + $(".app-drawer-overlay").click(function () { + $(this).addClass("d-none"); + $(".app-drawer-wrapper").removeClass("drawer-open"); + $(".open-right-drawer").removeClass("is-active"); + }); + + $(".mobile-toggle-nav").click(function () { + $(this).toggleClass("is-active"); + $(".app-container").toggleClass("sidebar-mobile-open"); + }); + + $(".mobile-toggle-header-nav").click(function () { + $(this).toggleClass("active"); + $(".app-header__content").toggleClass("header-mobile-open"); + }); + + $(".mobile-app-menu-btn").click(function () { + $(".hamburger", this).toggleClass("is-active"); + $(".app-inner-layout").toggleClass("open-mobile-menu"); + }); + + // Responsive + + var resizeClass = function () { + var win = document.body.clientWidth; + if (win < 1250) { + $(".app-container").addClass("closed-sidebar-mobile closed-sidebar"); + } else { + $(".app-container").removeClass("closed-sidebar-mobile closed-sidebar"); + } + }; + + $(window).on("resize", function () { + resizeClass(); + }); + + resizeClass(); + + // Enhanced content loading animations + function animateCards() { + $('.main-card, .card').each(function(index) { + const $card = $(this); + setTimeout(() => { + $card.addClass('animated fadeInUp'); + }, index * 50); + }); + } + + // Trigger card animations with delay for better visual effect + setTimeout(animateCards, 400); + + // Handle dynamic tab content animations + $('a[data-bs-toggle="tab"]').on('shown.bs.tab', function (e) { + const targetPane = $($(e.target).attr('href')); + targetPane.addClass('TabsAnimation-appear'); + setTimeout(() => { + targetPane.addClass('TabsAnimation-appear-active'); + }, 50); + }); + + // Smooth loading overlay (optional enhancement) + function showPageLoader() { + if (!$('.page-loader').length) { + $('body').append(` +
    +
    +
    +
    +
    +
    +
    +
    +
    + `); + } + } + + function hidePageLoader() { + $('.page-loader').fadeOut(300, function() { + $(this).remove(); + }); + } + + // Auto-hide loader after animations complete + setTimeout(hidePageLoader, 800); + + // Export animation utilities globally for other scripts + window.ArchitectUI = window.ArchitectUI || {}; + window.ArchitectUI.animations = { + fadeInContent: fadeInContent, + initPageAnimations: initPageAnimations, + animateCards: animateCards + }; + +}); diff --git a/public/architectui/assets/scripts/blockui.98288b227c064e6a107f.js b/public/architectui/assets/scripts/blockui.98288b227c064e6a107f.js new file mode 100644 index 0000000..711b8de --- /dev/null +++ b/public/architectui/assets/scripts/blockui.98288b227c064e6a107f.js @@ -0,0 +1 @@ +(()=>{"use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,o)}return n}function n(e){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{},o=n(n({},this.defaultOptions),t),i=document.createElement("div");if(i.className="blockui-overlay",i.style.cssText="\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 9999;\n background-color: ".concat(o.overlayCSS.backgroundColor,";\n opacity: 0;\n transition: opacity ").concat(o.fadeIn,"ms ease-in-out;\n cursor: ").concat(o.overlayCSS.cursor,";\n "),o.message){var a=this.createMessageElement(o.message,o.css);a.style.cssText+="\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 10000;\n ",document.body.appendChild(a),this.activeBlocks.set("page-message",a)}document.body.appendChild(i),this.activeBlocks.set("page-overlay",i),requestAnimationFrame(function(){i.style.opacity=o.overlayCSS.opacity}),o.timeout&&setTimeout(function(){return e.unblockPage()},o.timeout)}},{key:"unblockPage",value:function(){var e=this,t=this.activeBlocks.get("page-overlay"),n=this.activeBlocks.get("page-message");t&&(t.style.opacity="0",setTimeout(function(){t.remove(),e.activeBlocks.delete("page-overlay")},this.defaultOptions.fadeOut)),n&&(n.style.opacity="0",setTimeout(function(){n.remove(),e.activeBlocks.delete("page-message")},this.defaultOptions.fadeOut))}},{key:"blockElement",value:function(e){var t=this,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e){var i=n(n({},this.defaultOptions),o),a=this.generateId();"static"===window.getComputedStyle(e).position&&(e.style.position="relative",e.dataset.blockuiOriginalPosition="static");var c=document.createElement("div");if(c.className="blockui-element-overlay",c.dataset.blockuiId=a,c.style.cssText="\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 1000;\n background-color: ".concat(i.overlayCSS.backgroundColor,";\n opacity: 0;\n transition: opacity ").concat(i.fadeIn,"ms ease-in-out;\n cursor: ").concat(i.overlayCSS.cursor,";\n "),i.message){var s=this.createMessageElement(i.message,i.css);s.style.cssText+="\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1001;\n ",c.appendChild(s)}return e.appendChild(c),this.activeBlocks.set(a,{element:e,overlay:c}),requestAnimationFrame(function(){c.style.opacity=i.overlayCSS.opacity}),i.timeout&&setTimeout(function(){return t.unblockElement(e)},i.timeout),a}}},{key:"unblockElement",value:function(e){var t=this;e&&e.querySelectorAll(".blockui-element-overlay").forEach(function(n){var o=n.dataset.blockuiId;n.style.opacity="0",setTimeout(function(){n.remove(),t.activeBlocks.delete(o),e.dataset.blockuiOriginalPosition&&(e.style.position=e.dataset.blockuiOriginalPosition,delete e.dataset.blockuiOriginalPosition)},t.defaultOptions.fadeOut)})}},{key:"createMessageElement",value:function(e,t){var n;return"string"==typeof e?(n=document.createElement("div")).innerHTML=e:e instanceof Element?(n=e.cloneNode(!0)).classList.remove("d-none"):e&&e.jquery&&(n=e[0].cloneNode(!0)).classList.remove("d-none"),n&&t&&"string"==typeof e&&Object.assign(n.style,t),n}},{key:"generateId",value:function(){return"blockui-".concat(Date.now(),"-").concat(Math.random().toString(36).substr(2,9))}}],t&&i(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t}());const s=c;window.blockUI=c,document.addEventListener("DOMContentLoaded",function(){var e=document.querySelector(".block-page-btn-example-1"),t=document.querySelector(".block-page-btn-example-2"),n=document.querySelector(".block-page-btn-example-3");e&&e.addEventListener("click",function(){var e=document.querySelector(".body-block-example-1");s.blockPage({message:e,timeout:2e3})}),t&&t.addEventListener("click",function(){var e=document.querySelector(".body-block-example-2");s.blockPage({message:e,timeout:2e3})}),n&&n.addEventListener("click",function(){var e=document.querySelector(".body-block-example-3");s.blockPage({message:e,timeout:2e3})});var o=document.querySelector(".block-element-btn-example-1"),i=document.querySelector(".block-element-btn-example-2"),a=document.querySelector(".block-element-btn-example-3"),c=document.querySelector(".element-block-example");o&&c&&o.addEventListener("click",function(){s.blockElement(c,{message:'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n ',timeout:2e3})}),i&&c&&i.addEventListener("click",function(){s.blockElement(c,{message:'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n ',timeout:2e3})}),a&&c&&a.addEventListener("click",function(){s.blockElement(c,{message:'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n ',timeout:2e3})})})})(); \ No newline at end of file diff --git a/public/architectui/assets/scripts/carousel_slider.98288b227c064e6a107f.js b/public/architectui/assets/scripts/carousel_slider.98288b227c064e6a107f.js new file mode 100644 index 0000000..31cfbdf --- /dev/null +++ b/public/architectui/assets/scripts/carousel_slider.98288b227c064e6a107f.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,i={7843:(e,i,s)=>{s(9599);var o=s(4692);o(document).ready(function(){setTimeout(function(){o(".slick-slider").slick({dots:!0,slidesToShow:1,slidesToScroll:1}),o(".slick-slider-3").slick({dots:!0,slidesToShow:1,slidesToScroll:1}),o(".slick-slider-2").slick({className:"center",centerMode:!0,infinite:!0,centerPadding:"60px",slidesToShow:3,speed:500,dots:!0}),o(".slick-slider-variable").slick({className:"slider variable-width",dots:!0,infinite:!0,centerMode:!0,slidesToShow:1,slidesToScroll:1,variableWidth:!0}),o(".slick-slider-responsive").slick({dots:!0,infinite:!1,speed:500,slidesToShow:4,slidesToScroll:4,initialSlide:0,responsive:[{breakpoint:1024,settings:{slidesToShow:3,slidesToScroll:3,infinite:!0,dots:!0}},{breakpoint:600,settings:{slidesToShow:2,slidesToScroll:2,initialSlide:2}},{breakpoint:480,settings:{slidesToShow:1,slidesToScroll:1}}]}),o(".slick-slider-inverted").slick({infinite:!0,slidesToShow:1,speed:500,dots:!0,adaptiveHeight:!0})},2e3)})}},s={};function o(e){var l=s[e];if(void 0!==l)return l.exports;var r=s[e]={id:e,loaded:!1,exports:{}};return i[e].call(r.exports,r,r.exports,o),r.loaded=!0,r.exports}o.m=i,e=[],o.O=(i,s,l,r)=>{if(!s){var t=1/0;for(c=0;c=r)&&Object.keys(o.O).every(e=>o.O[e](s[n]))?s.splice(n--,1):(d=!1,r0&&e[c-1][2]>r;c--)e[c]=e[c-1];e[c]=[s,l,r]},o.n=e=>{var i=e&&e.__esModule?()=>e.default:()=>e;return o.d(i,{a:i}),i},o.d=(e,i)=>{for(var s in i)o.o(i,s)&&!o.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:i[s]})},o.o=(e,i)=>Object.prototype.hasOwnProperty.call(e,i),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),o.j=3,(()=>{var e={3:0};o.O.j=i=>0===e[i];var i=(i,s)=>{var l,r,[t,d,n]=s,a=0;if(t.some(i=>0!==e[i])){for(l in d)o.o(d,l)&&(o.m[l]=d[l]);if(n)var c=n(o)}for(i&&i(s);ao(7843));l=o.O(l)})(); \ No newline at end of file diff --git a/public/architectui/assets/scripts/chart_js.98288b227c064e6a107f.js b/public/architectui/assets/scripts/chart_js.98288b227c064e6a107f.js new file mode 100644 index 0000000..1f63904 --- /dev/null +++ b/public/architectui/assets/scripts/chart_js.98288b227c064e6a107f.js @@ -0,0 +1 @@ +(()=>{"use strict";var t,e={2075:function(){var t,e,a,o,r,n,i,d,l,s;window.chartColors={red:"#dc3545",orange:"#fd7e14",yellow:"#ffc107",green:"#28a745",blue:"#007bff",purple:"#6f42c1",grey:"#6c757d"},i=["January","February","March","April","May","June","July","August","September","October","November","December"],d=["#4dc9f6","#f67019","#f53794","#537bc4","#acc236","#166a8f","#00a950","#58595b","#8549ba"],l=this.Samples||(this.Samples={}),s=this.Color,l.utils={srand:function(t){this._seed=t},rand:function(t,e){var a=this._seed;return t=void 0===t?0:t,e=void 0===e?1:e,this._seed=(9301*a+49297)%233280,t+this._seed/233280*(e-t)},numbers:function(t){var e,a,o=t||{},r=o.min||0,n=o.max||1,i=o.from||[],d=o.count||8,l=o.decimals||8,s=o.continuity||1,c=Math.pow(10,l)||0,u=[];for(e=0;e{var o=a(9364),r=a(6447),n=(a(2075),function(){return Math.round(100*Math.random())}),i={labels:["Red","Orange","Yellow","Green","Blue"],datasets:[{data:[n(),n(),n(),n(),n()],backgroundColor:[window.chartColors.red,window.chartColors.orange,window.chartColors.yellow,window.chartColors.green,window.chartColors.blue],label:"Dataset 1"}]},d=Object.assign({},i),l=Object.assign({},i),s=Object.assign({},i),c={labels:[["Eating","Dinner"],["Drinking","Water"],"Sleeping",["Designing","Graphics"],"Coding","Cycling","Running"],datasets:[{label:"My First dataset",backgroundColor:(0,r.Ay)(window.chartColors.red).alpha(.2).rgbString(),borderColor:window.chartColors.red,pointBackgroundColor:window.chartColors.red,data:[n(),n(),n(),n(),n(),n(),n()]},{label:"My Second dataset",backgroundColor:(0,r.Ay)(window.chartColors.blue).alpha(.2).rgbString(),borderColor:window.chartColors.blue,pointBackgroundColor:window.chartColors.blue,data:[n(),n(),n(),n(),n(),n(),n()]}]},u={labels:["Red","Green","Yellow","Grey","Blue"],datasets:[{data:[n(),n(),n(),n(),n()],backgroundColor:[window.chartColors.red,window.chartColors.green,window.chartColors.yellow,window.chartColors.grey,window.chartColors.blue],label:"Dataset 1"}]},h={labels:["January","February","March","April","May","June","July"],datasets:[{label:"Dataset 1",backgroundColor:window.chartColors.red,data:[n(),n(),n(),n(),n(),n(),n()]},{label:"Dataset 2",backgroundColor:window.chartColors.blue,data:[n(),n(),n(),n(),n(),n(),n()]},{label:"Dataset 3",backgroundColor:window.chartColors.green,data:[n(),n(),n(),n(),n(),n(),n()]}]},g={labels:["January","February","March","April","May","June","July"],datasets:[{label:"Dataset 1",backgroundColor:(0,r.Ay)(window.chartColors.red).alpha(.5).rgbString(),borderColor:window.chartColors.red,borderWidth:1,data:[n(),n(),n(),n(),n(),n(),n()]},{label:"Dataset 2",backgroundColor:(0,r.Ay)(window.chartColors.blue).alpha(.5).rgbString(),borderColor:window.chartColors.blue,data:[n(),n(),n(),n(),n(),n(),n()]}]},p=Object.assign({},h),y={labels:["January","February","March","April","May","June","July"],datasets:[{label:"Dataset 1",backgroundColor:(0,r.Ay)(window.chartColors.red).alpha(.5).rgbString(),borderColor:window.chartColors.red,borderWidth:1,data:[n(),n(),n(),n(),n(),n(),n()]},{label:"Dataset 2",backgroundColor:(0,r.Ay)(window.chartColors.blue).alpha(.5).rgbString(),borderColor:window.chartColors.blue,data:[n(),n(),n(),n(),n(),n(),n()]}]};window.onload=function(){if(setTimeout(function(){if(document.getElementById("pie-chart")){var t=document.getElementById("pie-chart").getContext("2d");window.myPie=new o.Ay(t,{type:"pie",data:i,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"top"},title:{display:!1,text:"Chart.js Pie Chart"}}}})}},500),document.getElementById("doughnut-chart")){var t=document.getElementById("doughnut-chart").getContext("2d");window.myDoughnut=new o.Ay(t,{type:"doughnut",data:d,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"top"},title:{display:!1,text:"Chart.js Doughnut Chart"}}}})}setTimeout(function(){if(document.getElementById("doughnut-chart-2")){var t=document.getElementById("doughnut-chart-2").getContext("2d");window.myDoughnut=new o.Ay(t,{type:"doughnut",data:l,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},title:{display:!1,text:"Chart.js Doughnut Chart 2"}}}})}},500),setTimeout(function(){if(document.getElementById("doughnut-chart-3")){var t=document.getElementById("doughnut-chart-3").getContext("2d");window.myDoughnut=new o.Ay(t,{type:"doughnut",data:s,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},title:{display:!1,text:"Chart.js Doughnut Chart 3"}}}})}},500),setTimeout(function(){if(document.getElementById("radar-chart")){var t=document.getElementById("radar-chart").getContext("2d");window.myRadar=new o.Ay(t,{type:"radar",data:c,options:{responsive:!0,maintainAspectRatio:!1,scale:{ticks:{beginAtZero:!0,max:5}},plugins:{legend:{position:"top"},title:{display:!1,text:"Chart.js Radar Chart"}}}})}},500),setTimeout(function(){if(document.getElementById("polar-chart")){var t=document.getElementById("polar-chart").getContext("2d");window.myPolarArea=new o.Ay(t,{type:"polarArea",data:u,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"top"},title:{display:!1,text:"Chart.js Polar Area Chart"}},scale:{ticks:{beginAtZero:!0},reverse:!1},animation:{animateRotate:!1,animateScale:!0}}})}},500),setTimeout(function(){if(document.getElementById("chart-vert-bar")){var t=document.getElementById("chart-vert-bar").getContext("2d");window.myVerticleBar=new o.Ay(t,{type:"bar",data:h,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"top"},title:{display:!1,text:"Chart.js Verticle Bar Chart"}}}})}},500),setTimeout(function(){if(document.getElementById("chart-horiz-bar")){var t=document.getElementById("chart-horiz-bar").getContext("2d");window.myHorizontalBar=new o.Ay(t,{type:"bar",data:g,options:{indexAxis:"y",elements:{bar:{borderWidth:2}},responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"right"},title:{display:!1,text:"Chart.js Horizontal Bar Chart"}}}})}},500),setTimeout(function(){if(document.getElementById("line-chart")){var t=document.getElementById("line-chart").getContext("2d");window.myLineChart=new o.Ay(t,{type:"line",data:y,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},title:{display:!1,text:"Chart.js Line Chart"}},scales:{x:{display:!1,grid:{display:!1}},y:{display:!1,grid:{display:!1}}},layout:{padding:{left:10,right:10,top:10,bottom:0}}}})}},500),setTimeout(function(){if(document.getElementById("stacked-bars-chart")){var t=document.getElementById("stacked-bars-chart").getContext("2d");window.myStackedBarChart=new o.Ay(t,{type:"bar",data:p,options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!0,text:"Chart.js Bar Chart - Stacked"}},interaction:{intersect:!1},scales:{x:{stacked:!0},y:{stacked:!0}}}})}},500)}}},a={};function o(t){var r=a[t];if(void 0!==r)return r.exports;var n=a[t]={id:t,loaded:!1,exports:{}};return e[t].call(n.exports,n,n.exports,o),n.loaded=!0,n.exports}o.m=e,t=[],o.O=(e,a,r,n)=>{if(!a){var i=1/0;for(c=0;c=n)&&Object.keys(o.O).every(t=>o.O[t](a[l]))?a.splice(l--,1):(d=!1,n0&&t[c-1][2]>n;c--)t[c]=t[c-1];t[c]=[a,r,n]},o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var a in e)o.o(e,a)&&!o.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:e[a]})},o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),o.j=729,(()=>{var t={729:0};o.O.j=e=>0===t[e];var e=(e,a)=>{var r,n,[i,d,l]=a,s=0;if(i.some(e=>0!==t[e])){for(r in d)o.o(d,r)&&(o.m[r]=d[r]);if(l)var c=l(o)}for(e&&e(a);so(7422));r=o.O(r)})(); \ No newline at end of file diff --git a/public/architectui/assets/scripts/chart_js.js b/public/architectui/assets/scripts/chart_js.js deleted file mode 100644 index 29164d6..0000000 --- a/public/architectui/assets/scripts/chart_js.js +++ /dev/null @@ -1,1179 +0,0 @@ -/* - * ATTENTION: An "eval-source-map" devtool has been used. - * This devtool is neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ 125: -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var chart_js_auto__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(126);\n/* harmony import */ var _kurkle_color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(130);\n/* harmony import */ var _chartsjs_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(131);\n/* harmony import */ var _chartsjs_utils__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_chartsjs_utils__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\nvar randomScalingFactor = function randomScalingFactor() {\n return Math.round(Math.random() * 100);\n};\n\n// Pie Chart Data\nvar pieChartData = {\n labels: [\"Red\", \"Orange\", \"Yellow\", \"Green\", \"Blue\"],\n datasets: [{\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],\n backgroundColor: [window.chartColors.red, window.chartColors.orange, window.chartColors.yellow, window.chartColors.green, window.chartColors.blue],\n label: \"Dataset 1\"\n }]\n};\n\n// Doughnut Chart Data\nvar doughnutChartData = Object.assign({}, pieChartData);\n\n// Doughnut Chart Data 2\nvar doughnutChartData2 = Object.assign({}, pieChartData);\n\n// Doughnut Chart Data 3\nvar doughnutChartData3 = Object.assign({}, pieChartData);\n\n// Radar Chart Data\nvar radarChartData = {\n labels: [[\"Eating\", \"Dinner\"], [\"Drinking\", \"Water\"], \"Sleeping\", [\"Designing\", \"Graphics\"], \"Coding\", \"Cycling\", \"Running\"],\n datasets: [{\n label: \"My First dataset\",\n backgroundColor: (0,_kurkle_color__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(window.chartColors.red).alpha(0.2).rgbString(),\n borderColor: window.chartColors.red,\n pointBackgroundColor: window.chartColors.red,\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]\n }, {\n label: \"My Second dataset\",\n backgroundColor: (0,_kurkle_color__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(window.chartColors.blue).alpha(0.2).rgbString(),\n borderColor: window.chartColors.blue,\n pointBackgroundColor: window.chartColors.blue,\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]\n }]\n};\n\n// Polar Area Chart Data\nvar polarAreaChartData = {\n labels: [\"Red\", \"Green\", \"Yellow\", \"Grey\", \"Blue\"],\n datasets: [{\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],\n backgroundColor: [window.chartColors.red, window.chartColors.green, window.chartColors.yellow, window.chartColors.grey, window.chartColors.blue],\n label: \"Dataset 1\"\n }]\n};\n\n// Verticle Bar Chart Data\nvar verticleBarChartData = {\n labels: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\"],\n datasets: [{\n label: \"Dataset 1\",\n backgroundColor: window.chartColors.red,\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]\n }, {\n label: \"Dataset 2\",\n backgroundColor: window.chartColors.blue,\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]\n }, {\n label: \"Dataset 3\",\n backgroundColor: window.chartColors.green,\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]\n }]\n};\n\n// Horizontal Bar Chart Data\nvar horizontalBarChartData = {\n labels: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\"],\n datasets: [{\n label: \"Dataset 1\",\n backgroundColor: (0,_kurkle_color__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(window.chartColors.red).alpha(0.5).rgbString(),\n borderColor: window.chartColors.red,\n borderWidth: 1,\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]\n }, {\n label: \"Dataset 2\",\n backgroundColor: (0,_kurkle_color__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(window.chartColors.blue).alpha(0.5).rgbString(),\n borderColor: window.chartColors.blue,\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]\n }]\n};\n\n// Stacked Bars Chart Data\nvar stackedBarsChartData = Object.assign({}, verticleBarChartData);\n\n// Line Chart Data\nvar lineChartData = {\n labels: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\"],\n datasets: [{\n label: \"Dataset 1\",\n backgroundColor: (0,_kurkle_color__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(window.chartColors.red).alpha(0.5).rgbString(),\n borderColor: window.chartColors.red,\n borderWidth: 1,\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]\n }, {\n label: \"Dataset 2\",\n backgroundColor: (0,_kurkle_color__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(window.chartColors.blue).alpha(0.5).rgbString(),\n borderColor: window.chartColors.blue,\n data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]\n }]\n};\nwindow.onload = function () {\n // Pie Chart\n setTimeout(function () {\n if (document.getElementById(\"pie-chart\")) {\n var ctx = document.getElementById(\"pie-chart\").getContext(\"2d\");\n window.myPie = new chart_js_auto__WEBPACK_IMPORTED_MODULE_0__[\"default\"](ctx, {\n type: \"pie\",\n data: pieChartData,\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n position: \"top\"\n },\n title: {\n display: false,\n text: \"Chart.js Pie Chart\"\n }\n }\n }\n });\n }\n }, 500);\n\n // Doughnut Chart\n if (document.getElementById(\"doughnut-chart\")) {\n var ctx = document.getElementById(\"doughnut-chart\").getContext(\"2d\");\n window.myDoughnut = new chart_js_auto__WEBPACK_IMPORTED_MODULE_0__[\"default\"](ctx, {\n type: \"doughnut\",\n data: doughnutChartData,\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n position: \"top\"\n },\n title: {\n display: false,\n text: \"Chart.js Doughnut Chart\"\n }\n }\n }\n });\n }\n\n // Doughnut Chart 2\n setTimeout(function () {\n if (document.getElementById(\"doughnut-chart-2\")) {\n var _ctx = document.getElementById(\"doughnut-chart-2\").getContext(\"2d\");\n window.myDoughnut = new chart_js_auto__WEBPACK_IMPORTED_MODULE_0__[\"default\"](_ctx, {\n type: \"doughnut\",\n data: doughnutChartData2,\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: false\n },\n title: {\n display: false,\n text: \"Chart.js Doughnut Chart 2\"\n }\n }\n }\n });\n }\n }, 500);\n\n // Doughnut Chart 3\n setTimeout(function () {\n if (document.getElementById(\"doughnut-chart-3\")) {\n var _ctx2 = document.getElementById(\"doughnut-chart-3\").getContext(\"2d\");\n window.myDoughnut = new chart_js_auto__WEBPACK_IMPORTED_MODULE_0__[\"default\"](_ctx2, {\n type: \"doughnut\",\n data: doughnutChartData3,\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: false\n },\n title: {\n display: false,\n text: \"Chart.js Doughnut Chart 3\"\n }\n }\n }\n });\n }\n }, 500);\n\n // Radar Chart\n setTimeout(function () {\n if (document.getElementById(\"radar-chart\")) {\n var _ctx3 = document.getElementById(\"radar-chart\").getContext(\"2d\");\n window.myRadar = new chart_js_auto__WEBPACK_IMPORTED_MODULE_0__[\"default\"](_ctx3, {\n type: \"radar\",\n data: radarChartData,\n options: {\n responsive: true,\n maintainAspectRatio: false,\n scale: {\n ticks: {\n beginAtZero: true,\n max: 5\n }\n },\n plugins: {\n legend: {\n position: \"top\"\n },\n title: {\n display: false,\n text: \"Chart.js Radar Chart\"\n }\n }\n }\n });\n }\n }, 500);\n\n // Polar Area Chart\n setTimeout(function () {\n if (document.getElementById(\"polar-chart\")) {\n var _ctx4 = document.getElementById(\"polar-chart\").getContext(\"2d\");\n window.myPolarArea = new chart_js_auto__WEBPACK_IMPORTED_MODULE_0__[\"default\"](_ctx4, {\n type: \"polarArea\",\n data: polarAreaChartData,\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n position: \"top\"\n },\n title: {\n display: false,\n text: \"Chart.js Polar Area Chart\"\n }\n },\n scale: {\n ticks: {\n beginAtZero: true\n },\n reverse: false\n },\n animation: {\n animateRotate: false,\n animateScale: true\n }\n }\n });\n }\n }, 500);\n\n // Verticle Bar Chart\n setTimeout(function () {\n if (document.getElementById(\"chart-vert-bar\")) {\n var _ctx5 = document.getElementById(\"chart-vert-bar\").getContext(\"2d\");\n window.myVerticleBar = new chart_js_auto__WEBPACK_IMPORTED_MODULE_0__[\"default\"](_ctx5, {\n type: \"bar\",\n data: verticleBarChartData,\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n position: \"top\"\n },\n title: {\n display: false,\n text: \"Chart.js Verticle Bar Chart\"\n }\n }\n }\n });\n }\n }, 500);\n\n // Horizontal Bar Chart\n setTimeout(function () {\n if (document.getElementById(\"chart-horiz-bar\")) {\n var _ctx6 = document.getElementById(\"chart-horiz-bar\").getContext(\"2d\");\n window.myHorizontalBar = new chart_js_auto__WEBPACK_IMPORTED_MODULE_0__[\"default\"](_ctx6, {\n type: \"bar\",\n data: horizontalBarChartData,\n options: {\n indexAxis: 'y',\n // Elements options apply to all of the options unless overridden in a dataset\n // In this case, we are setting the border of each horizontal bar to be 2px wide\n elements: {\n bar: {\n borderWidth: 2\n }\n },\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n position: \"right\"\n },\n title: {\n display: false,\n text: \"Chart.js Horizontal Bar Chart\"\n }\n }\n }\n });\n }\n }, 500);\n\n // Line Chart\n setTimeout(function () {\n if (document.getElementById(\"line-chart\")) {\n var _ctx7 = document.getElementById(\"line-chart\").getContext(\"2d\");\n window.myLineChart = new chart_js_auto__WEBPACK_IMPORTED_MODULE_0__[\"default\"](_ctx7, {\n type: \"line\",\n data: lineChartData,\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: false\n },\n title: {\n display: false,\n text: 'Chart.js Line Chart'\n }\n },\n scales: {\n x: {\n display: false,\n grid: {\n display: false\n }\n },\n y: {\n display: false,\n grid: {\n display: false\n }\n }\n },\n layout: {\n padding: {\n left: 10,\n right: 10,\n top: 10,\n bottom: 0\n }\n }\n }\n });\n }\n }, 500);\n\n // Stacked Bars Chart\n setTimeout(function () {\n if (document.getElementById(\"stacked-bars-chart\")) {\n var _ctx8 = document.getElementById(\"stacked-bars-chart\").getContext(\"2d\");\n window.myStackedBarChart = new chart_js_auto__WEBPACK_IMPORTED_MODULE_0__[\"default\"](_ctx8, {\n type: \"bar\",\n data: stackedBarsChartData,\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: true,\n text: \"Chart.js Bar Chart - Stacked\"\n }\n },\n interaction: {\n intersect: false\n },\n scales: {\n x: {\n stacked: true\n },\n y: {\n stacked: true\n }\n }\n }\n });\n }\n }, 500);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O1VBQ2hCQyxtQkFBbUIsRUFBRSxLQUFLO1VBQzFCQyxPQUFPLEVBQUU7WUFDUEcsS0FBSyxFQUFFO2NBQ0xDLE9BQU8sRUFBRSxJQUFJO2NBQ2JDLElBQUksRUFBRTtZQUNSO1VBQ0YsQ0FBQztVQUNENkIsV0FBVyxFQUFFO1lBQ1hDLFNBQVMsRUFBRTtVQUNiLENBQUM7VUFDRFosTUFBTSxFQUFFO1lBQ05DLENBQUMsRUFBRTtjQUNEWSxPQUFPLEVBQUU7WUFDWCxDQUFDO1lBQ0RWLENBQUMsRUFBRTtjQUNEVSxPQUFPLEVBQUU7WUFDWDtVQUNGO1FBQ0Y7TUFDRixDQUFDLENBQUM7SUFDSjtFQUNGLENBQUMsRUFBRSxHQUFHLENBQUM7QUFDVCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXJjaGl0ZWN0dWktaHRtbC1mcmVlLy4vc3JjL3NjcmlwdHMtaW5pdC9jaGFydHMvY2hhcnRqcy5qcz84MTY2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDaGFydCBmcm9tICdjaGFydC5qcy9hdXRvJztcbmltcG9ydCBjb2xvckxpYiBmcm9tICdAa3Vya2xlL2NvbG9yJztcbmltcG9ydCBcIi4vY2hhcnRzanMtdXRpbHNcIjtcblxuY29uc3QgcmFuZG9tU2NhbGluZ0ZhY3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDEwMCk7XG59O1xuXG4vLyBQaWUgQ2hhcnQgRGF0YVxuY29uc3QgcGllQ2hhcnREYXRhID0ge1xuICBsYWJlbHM6IFtcIlJlZFwiLCBcIk9yYW5nZVwiLCBcIlllbGxvd1wiLCBcIkdyZWVuXCIsIFwiQmx1ZVwiXSxcbiAgZGF0YXNldHM6IFtcbiAgICB7XG4gICAgICBkYXRhOiBbXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgXSxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogW1xuICAgICAgICB3aW5kb3cuY2hhcnRDb2xvcnMucmVkLFxuICAgICAgICB3aW5kb3cuY2hhcnRDb2xvcnMub3JhbmdlLFxuICAgICAgICB3aW5kb3cuY2hhcnRDb2xvcnMueWVsbG93LFxuICAgICAgICB3aW5kb3cuY2hhcnRDb2xvcnMuZ3JlZW4sXG4gICAgICAgIHdpbmRvdy5jaGFydENvbG9ycy5ibHVlLFxuICAgICAgXSxcbiAgICAgIGxhYmVsOiBcIkRhdGFzZXQgMVwiLFxuICAgIH0sXG4gIF0sXG59O1xuXG4vLyBEb3VnaG51dCBDaGFydCBEYXRhXG5jb25zdCBkb3VnaG51dENoYXJ0RGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHBpZUNoYXJ0RGF0YSk7XG5cbi8vIERvdWdobnV0IENoYXJ0IERhdGEgMlxuY29uc3QgZG91Z2hudXRDaGFydERhdGEyID0gT2JqZWN0LmFzc2lnbih7fSwgcGllQ2hhcnREYXRhKTtcblxuLy8gRG91Z2hudXQgQ2hhcnQgRGF0YSAzXG5jb25zdCBkb3VnaG51dENoYXJ0RGF0YTMgPSBPYmplY3QuYXNzaWduKHt9LCBwaWVDaGFydERhdGEpO1xuXG4vLyBSYWRhciBDaGFydCBEYXRhXG5jb25zdCByYWRhckNoYXJ0RGF0YSA9IHtcbiAgbGFiZWxzOiBbXG4gICAgW1wiRWF0aW5nXCIsIFwiRGlubmVyXCJdLFxuICAgIFtcIkRyaW5raW5nXCIsIFwiV2F0ZXJcIl0sXG4gICAgXCJTbGVlcGluZ1wiLFxuICAgIFtcIkRlc2lnbmluZ1wiLCBcIkdyYXBoaWNzXCJdLFxuICAgIFwiQ29kaW5nXCIsXG4gICAgXCJDeWNsaW5nXCIsXG4gICAgXCJSdW5uaW5nXCIsXG4gIF0sXG4gIGRhdGFzZXRzOiBbXG4gICAge1xuICAgICAgbGFiZWw6IFwiTXkgRmlyc3QgZGF0YXNldFwiLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBjb2xvckxpYih3aW5kb3cuY2hhcnRDb2xvcnMucmVkKS5hbHBoYSgwLjIpLnJnYlN0cmluZygpLFxuICAgICAgYm9yZGVyQ29sb3I6IHdpbmRvdy5jaGFydENvbG9ycy5yZWQsXG4gICAgICBwb2ludEJhY2tncm91bmRDb2xvcjogd2luZG93LmNoYXJ0Q29sb3JzLnJlZCxcbiAgICAgIGRhdGE6IFtcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBcIk15IFNlY29uZCBkYXRhc2V0XCIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yTGliKHdpbmRvdy5jaGFydENvbG9ycy5ibHVlKS5hbHBoYSgwLjIpLnJnYlN0cmluZygpLFxuICAgICAgYm9yZGVyQ29sb3I6IHdpbmRvdy5jaGFydENvbG9ycy5ibHVlLFxuICAgICAgcG9pbnRCYWNrZ3JvdW5kQ29sb3I6IHdpbmRvdy5jaGFydENvbG9ycy5ibHVlLFxuICAgICAgZGF0YTogW1xuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICBdLFxuICAgIH0sXG4gIF0sXG59O1xuXG4vLyBQb2xhciBBcmVhIENoYXJ0IERhdGFcbmNvbnN0IHBvbGFyQXJlYUNoYXJ0RGF0YSA9IHtcbiAgbGFiZWxzOiBbXCJSZWRcIiwgXCJHcmVlblwiLCBcIlllbGxvd1wiLCBcIkdyZXlcIiwgXCJCbHVlXCJdLFxuICBkYXRhc2V0czogW1xuICAgIHtcbiAgICAgIGRhdGE6IFtcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICBdLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBbXG4gICAgICAgIHdpbmRvdy5jaGFydENvbG9ycy5yZWQsXG4gICAgICAgIHdpbmRvdy5jaGFydENvbG9ycy5ncmVlbixcbiAgICAgICAgd2luZG93LmNoYXJ0Q29sb3JzLnllbGxvdyxcbiAgICAgICAgd2luZG93LmNoYXJ0Q29sb3JzLmdyZXksXG4gICAgICAgIHdpbmRvdy5jaGFydENvbG9ycy5ibHVlLFxuICAgICAgXSxcbiAgICAgIGxhYmVsOiBcIkRhdGFzZXQgMVwiLFxuICAgIH0sXG4gIF0sXG59O1xuXG4vLyBWZXJ0aWNsZSBCYXIgQ2hhcnQgRGF0YVxuY29uc3QgdmVydGljbGVCYXJDaGFydERhdGEgPSB7XG4gIGxhYmVsczogW1wiSmFudWFyeVwiLCBcIkZlYnJ1YXJ5XCIsIFwiTWFyY2hcIiwgXCJBcHJpbFwiLCBcIk1heVwiLCBcIkp1bmVcIiwgXCJKdWx5XCJdLFxuICBkYXRhc2V0czogW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIkRhdGFzZXQgMVwiLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB3aW5kb3cuY2hhcnRDb2xvcnMucmVkLFxuICAgICAgZGF0YTogW1xuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiRGF0YXNldCAyXCIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHdpbmRvdy5jaGFydENvbG9ycy5ibHVlLFxuICAgICAgZGF0YTogW1xuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiRGF0YXNldCAzXCIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHdpbmRvdy5jaGFydENvbG9ycy5ncmVlbixcbiAgICAgIGRhdGE6IFtcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgXSxcbiAgICB9LFxuICBdLFxufTtcblxuLy8gSG9yaXpvbnRhbCBCYXIgQ2hhcnQgRGF0YVxuY29uc3QgaG9yaXpvbnRhbEJhckNoYXJ0RGF0YSA9IHtcbiAgbGFiZWxzOiBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIl0sXG4gIGRhdGFzZXRzOiBbXG4gICAge1xuICAgICAgbGFiZWw6IFwiRGF0YXNldCAxXCIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yTGliKHdpbmRvdy5jaGFydENvbG9ycy5yZWQpLmFscGhhKDAuNSkucmdiU3RyaW5nKCksXG4gICAgICBib3JkZXJDb2xvcjogd2luZG93LmNoYXJ0Q29sb3JzLnJlZCxcbiAgICAgIGJvcmRlcldpZHRoOiAxLFxuICAgICAgZGF0YTogW1xuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiRGF0YXNldCAyXCIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yTGliKHdpbmRvdy5jaGFydENvbG9ycy5ibHVlKS5hbHBoYSgwLjUpLnJnYlN0cmluZygpLFxuICAgICAgYm9yZGVyQ29sb3I6IHdpbmRvdy5jaGFydENvbG9ycy5ibHVlLFxuICAgICAgZGF0YTogW1xuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICBdLFxuICAgIH0sXG4gIF0sXG59O1xuXG4vLyBTdGFja2VkIEJhcnMgQ2hhcnQgRGF0YVxuY29uc3Qgc3RhY2tlZEJhcnNDaGFydERhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB2ZXJ0aWNsZUJhckNoYXJ0RGF0YSk7XG5cbi8vIExpbmUgQ2hhcnQgRGF0YVxuY29uc3QgbGluZUNoYXJ0RGF0YSA9IHtcbiAgbGFiZWxzOiBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIl0sXG4gIGRhdGFzZXRzOiBbXG4gICAge1xuICAgICAgbGFiZWw6IFwiRGF0YXNldCAxXCIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yTGliKHdpbmRvdy5jaGFydENvbG9ycy5yZWQpLmFscGhhKDAuNSkucmdiU3RyaW5nKCksXG4gICAgICBib3JkZXJDb2xvcjogd2luZG93LmNoYXJ0Q29sb3JzLnJlZCxcbiAgICAgIGJvcmRlcldpZHRoOiAxLFxuICAgICAgZGF0YTogW1xuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiRGF0YXNldCAyXCIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yTGliKHdpbmRvdy5jaGFydENvbG9ycy5ibHVlKS5hbHBoYSgwLjUpLnJnYlN0cmluZygpLFxuICAgICAgYm9yZGVyQ29sb3I6IHdpbmRvdy5jaGFydENvbG9ycy5ibHVlLFxuICAgICAgZGF0YTogW1xuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICAgIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSxcbiAgICAgICAgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLFxuICAgICAgICByYW5kb21TY2FsaW5nRmFjdG9yKCksXG4gICAgICBdLFxuICAgIH0sXG4gIF0sXG59O1xuXG53aW5kb3cub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAvLyBQaWUgQ2hhcnRcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicGllLWNoYXJ0XCIpKSB7XG4gICAgICBjb25zdCBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBpZS1jaGFydFwiKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICB3aW5kb3cubXlQaWUgPSBuZXcgQ2hhcnQoY3R4LCB7XG4gICAgICAgIHR5cGU6IFwicGllXCIsXG4gICAgICAgIGRhdGE6IHBpZUNoYXJ0RGF0YSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICAgICAgcGx1Z2luczoge1xuICAgICAgICAgICAgbGVnZW5kOiB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBcInRvcFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgICAgICB0ZXh0OiBcIkNoYXJ0LmpzIFBpZSBDaGFydFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9LCA1MDApO1xuXG4gIC8vIERvdWdobnV0IENoYXJ0XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRvdWdobnV0LWNoYXJ0XCIpKSB7XG4gICAgY29uc3QgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkb3VnaG51dC1jaGFydFwiKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgd2luZG93Lm15RG91Z2hudXQgPSBuZXcgQ2hhcnQoY3R4LCB7XG4gICAgICB0eXBlOiBcImRvdWdobnV0XCIsXG4gICAgICBkYXRhOiBkb3VnaG51dENoYXJ0RGF0YSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcInRvcFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgICAgdGV4dDogXCJDaGFydC5qcyBEb3VnaG51dCBDaGFydFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gRG91Z2hudXQgQ2hhcnQgMlxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkb3VnaG51dC1jaGFydC0yXCIpKSB7XG4gICAgICBjb25zdCBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRvdWdobnV0LWNoYXJ0LTJcIikuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgd2luZG93Lm15RG91Z2hudXQgPSBuZXcgQ2hhcnQoY3R4LCB7XG4gICAgICAgIHR5cGU6IFwiZG91Z2hudXRcIixcbiAgICAgICAgZGF0YTogZG91Z2hudXRDaGFydERhdGEyLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiBmYWxzZSxcbiAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgIHRleHQ6IFwiQ2hhcnQuanMgRG91Z2hudXQgQ2hhcnQgMlwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9LCA1MDApO1xuXG4gIC8vIERvdWdobnV0IENoYXJ0IDNcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZG91Z2hudXQtY2hhcnQtM1wiKSkge1xuICAgICAgY29uc3QgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkb3VnaG51dC1jaGFydC0zXCIpLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIHdpbmRvdy5teURvdWdobnV0ID0gbmV3IENoYXJ0KGN0eCwge1xuICAgICAgICB0eXBlOiBcImRvdWdobnV0XCIsXG4gICAgICAgIGRhdGE6IGRvdWdobnV0Q2hhcnREYXRhMyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICAgICAgcGx1Z2luczoge1xuICAgICAgICAgICAgbGVnZW5kOiB7XG4gICAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgICAgICB0ZXh0OiBcIkNoYXJ0LmpzIERvdWdobnV0IENoYXJ0IDNcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgNTAwKTtcblxuICAvLyBSYWRhciBDaGFydFxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyYWRhci1jaGFydFwiKSkge1xuICAgICAgY29uc3QgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyYWRhci1jaGFydFwiKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICB3aW5kb3cubXlSYWRhciA9IG5ldyBDaGFydChjdHgsIHtcbiAgICAgICAgdHlwZTogXCJyYWRhclwiLFxuICAgICAgICBkYXRhOiByYWRhckNoYXJ0RGF0YSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICAgICAgc2NhbGU6IHtcbiAgICAgICAgICAgIHRpY2tzOiB7XG4gICAgICAgICAgICAgICAgYmVnaW5BdFplcm86IHRydWUsXG4gICAgICAgICAgICAgICAgbWF4OiA1XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IFwidG9wXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgIHRleHQ6IFwiQ2hhcnQuanMgUmFkYXIgQ2hhcnRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgNTAwKTtcblxuICAvLyBQb2xhciBBcmVhIENoYXJ0XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBvbGFyLWNoYXJ0XCIpKSB7XG4gICAgICBjb25zdCBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBvbGFyLWNoYXJ0XCIpLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIHdpbmRvdy5teVBvbGFyQXJlYSA9IG5ldyBDaGFydChjdHgsIHtcbiAgICAgICAgdHlwZTogXCJwb2xhckFyZWFcIixcbiAgICAgICAgZGF0YTogcG9sYXJBcmVhQ2hhcnREYXRhLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiBmYWxzZSxcbiAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IFwidG9wXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgIHRleHQ6IFwiQ2hhcnQuanMgUG9sYXIgQXJlYSBDaGFydFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNjYWxlOiB7XG4gICAgICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXZlcnNlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgYW5pbWF0ZVJvdGF0ZTogZmFsc2UsXG4gICAgICAgICAgICBhbmltYXRlU2NhbGU6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgNTAwKTtcblxuICAvLyBWZXJ0aWNsZSBCYXIgQ2hhcnRcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hhcnQtdmVydC1iYXJcIikpIHtcbiAgICAgIGNvbnN0IGN0eCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hhcnQtdmVydC1iYXJcIikuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgd2luZG93Lm15VmVydGljbGVCYXIgPSBuZXcgQ2hhcnQoY3R4LCB7XG4gICAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICAgIGRhdGE6IHZlcnRpY2xlQmFyQ2hhcnREYXRhLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiBmYWxzZSxcbiAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IFwidG9wXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgIHRleHQ6IFwiQ2hhcnQuanMgVmVydGljbGUgQmFyIENoYXJ0XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIDUwMCk7XG5cbiAgLy8gSG9yaXpvbnRhbCBCYXIgQ2hhcnRcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hhcnQtaG9yaXotYmFyXCIpKSB7XG4gICAgICBjb25zdCBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNoYXJ0LWhvcml6LWJhclwiKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICB3aW5kb3cubXlIb3Jpem9udGFsQmFyID0gbmV3IENoYXJ0KGN0eCwge1xuICAgICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgICBkYXRhOiBob3Jpem9udGFsQmFyQ2hhcnREYXRhLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgaW5kZXhBeGlzOiAneScsXG4gICAgICAgICAgLy8gRWxlbWVudHMgb3B0aW9ucyBhcHBseSB0byBhbGwgb2YgdGhlIG9wdGlvbnMgdW5sZXNzIG92ZXJyaWRkZW4gaW4gYSBkYXRhc2V0XG4gICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBhcmUgc2V0dGluZyB0aGUgYm9yZGVyIG9mIGVhY2ggaG9yaXpvbnRhbCBiYXIgdG8gYmUgMnB4IHdpZGVcbiAgICAgICAgICBlbGVtZW50czoge1xuICAgICAgICAgICAgYmFyOiB7XG4gICAgICAgICAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiBmYWxzZSxcbiAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IFwicmlnaHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICAgICAgdGV4dDogXCJDaGFydC5qcyBIb3Jpem9udGFsIEJhciBDaGFydFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9LCA1MDApO1xuXG4gIC8vIExpbmUgQ2hhcnRcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGluZS1jaGFydFwiKSkge1xuICAgICAgY29uc3QgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJsaW5lLWNoYXJ0XCIpLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIHdpbmRvdy5teUxpbmVDaGFydCA9IG5ldyBDaGFydChjdHgsIHtcbiAgICAgICAgdHlwZTogXCJsaW5lXCIsXG4gICAgICAgIGRhdGE6IGxpbmVDaGFydERhdGEsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgICAgIG1haW50YWluQXNwZWN0UmF0aW86IGZhbHNlLFxuICAgICAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgICAgIGxlZ2VuZDoge1xuICAgICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICAgICAgdGV4dDogJ0NoYXJ0LmpzIExpbmUgQ2hhcnQnXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzY2FsZXM6IHtcbiAgICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgICAgICBncmlkOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGF5b3V0OiB7XG4gICAgICAgICAgICBwYWRkaW5nOiB7XG4gICAgICAgICAgICAgIGxlZnQ6IDEwLFxuICAgICAgICAgICAgICByaWdodDogMTAsXG4gICAgICAgICAgICAgIHRvcDogMTAsXG4gICAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgNTAwKTtcblxuICAvLyBTdGFja2VkIEJhcnMgQ2hhcnRcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3RhY2tlZC1iYXJzLWNoYXJ0XCIpKSB7XG4gICAgICBjb25zdCBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN0YWNrZWQtYmFycy1jaGFydFwiKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICB3aW5kb3cubXlTdGFja2VkQmFyQ2hhcnQgPSBuZXcgQ2hhcnQoY3R4LCB7XG4gICAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICAgIGRhdGE6IHN0YWNrZWRCYXJzQ2hhcnREYXRhLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiBmYWxzZSxcbiAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgICB0ZXh0OiBcIkNoYXJ0LmpzIEJhciBDaGFydCAtIFN0YWNrZWRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbnRlcmFjdGlvbjoge1xuICAgICAgICAgICAgaW50ZXJzZWN0OiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNjYWxlczoge1xuICAgICAgICAgICAgeDoge1xuICAgICAgICAgICAgICBzdGFja2VkOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHk6IHtcbiAgICAgICAgICAgICAgc3RhY2tlZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgNTAwKTtcbn07XG4iXSwibmFtZXMiOlsiQ2hhcnQiLCJjb2xvckxpYiIsInJhbmRvbVNjYWxpbmdGYWN0b3IiLCJNYXRoIiwicm91bmQiLCJyYW5kb20iLCJwaWVDaGFydERhdGEiLCJsYWJlbHMiLCJkYXRhc2V0cyIsImRhdGEiLCJiYWNrZ3JvdW5kQ29sb3IiLCJ3aW5kb3ciLCJjaGFydENvbG9ycyIsInJlZCIsIm9yYW5nZSIsInllbGxvdyIsImdyZWVuIiwiYmx1ZSIsImxhYmVsIiwiZG91Z2hudXRDaGFydERhdGEiLCJPYmplY3QiLCJhc3NpZ24iLCJkb3VnaG51dENoYXJ0RGF0YTIiLCJkb3VnaG51dENoYXJ0RGF0YTMiLCJyYWRhckNoYXJ0RGF0YSIsImFscGhhIiwicmdiU3RyaW5nIiwiYm9yZGVyQ29sb3IiLCJwb2ludEJhY2tncm91bmRDb2xvciIsInBvbGFyQXJlYUNoYXJ0RGF0YSIsImdyZXkiLCJ2ZXJ0aWNsZUJhckNoYXJ0RGF0YSIsImhvcml6b250YWxCYXJDaGFydERhdGEiLCJib3JkZXJXaWR0aCIsInN0YWNrZWRCYXJzQ2hhcnREYXRhIiwibGluZUNoYXJ0RGF0YSIsIm9ubG9hZCIsInNldFRpbWVvdXQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiY3R4IiwiZ2V0Q29udGV4dCIsIm15UGllIiwidHlwZSIsIm9wdGlvbnMiLCJyZXNwb25zaXZlIiwibWFpbnRhaW5Bc3BlY3RSYXRpbyIsInBsdWdpbnMiLCJsZWdlbmQiLCJwb3NpdGlvbiIsInRpdGxlIiwiZGlzcGxheSIsInRleHQiLCJteURvdWdobnV0IiwibXlSYWRhciIsInNjYWxlIiwidGlja3MiLCJiZWdpbkF0WmVybyIsIm1heCIsIm15UG9sYXJBcmVhIiwicmV2ZXJzZSIsImFuaW1hdGlvbiIsImFuaW1hdGVSb3RhdGUiLCJhbmltYXRlU2NhbGUiLCJteVZlcnRpY2xlQmFyIiwibXlIb3Jpem9udGFsQmFyIiwiaW5kZXhBeGlzIiwiZWxlbWVudHMiLCJiYXIiLCJteUxpbmVDaGFydCIsInNjYWxlcyIsIngiLCJncmlkIiwieSIsImxheW91dCIsInBhZGRpbmciLCJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJib3R0b20iLCJteVN0YWNrZWRCYXJDaGFydCIsImludGVyYWN0aW9uIiwiaW50ZXJzZWN0Iiwic3RhY2tlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///125\n\n}"); - -/***/ }), - -/***/ 126: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Animation),\n/* harmony export */ Animations: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Animations),\n/* harmony export */ ArcElement: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.ArcElement),\n/* harmony export */ BarController: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.BarController),\n/* harmony export */ BarElement: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.BarElement),\n/* harmony export */ BasePlatform: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.BasePlatform),\n/* harmony export */ BasicPlatform: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.BasicPlatform),\n/* harmony export */ BubbleController: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.BubbleController),\n/* harmony export */ CategoryScale: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.CategoryScale),\n/* harmony export */ Chart: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Chart),\n/* harmony export */ Colors: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Colors),\n/* harmony export */ DatasetController: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.DatasetController),\n/* harmony export */ Decimation: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Decimation),\n/* harmony export */ DomPlatform: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.DomPlatform),\n/* harmony export */ DoughnutController: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.DoughnutController),\n/* harmony export */ Element: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Element),\n/* harmony export */ Filler: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Filler),\n/* harmony export */ Interaction: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Interaction),\n/* harmony export */ Legend: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Legend),\n/* harmony export */ LineController: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.LineController),\n/* harmony export */ LineElement: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.LineElement),\n/* harmony export */ LinearScale: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.LinearScale),\n/* harmony export */ LogarithmicScale: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.LogarithmicScale),\n/* harmony export */ PieController: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.PieController),\n/* harmony export */ PointElement: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.PointElement),\n/* harmony export */ PolarAreaController: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.PolarAreaController),\n/* harmony export */ RadarController: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.RadarController),\n/* harmony export */ RadialLinearScale: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.RadialLinearScale),\n/* harmony export */ Scale: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Scale),\n/* harmony export */ ScatterController: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.ScatterController),\n/* harmony export */ SubTitle: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.SubTitle),\n/* harmony export */ Ticks: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Ticks),\n/* harmony export */ TimeScale: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.TimeScale),\n/* harmony export */ TimeSeriesScale: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.TimeSeriesScale),\n/* harmony export */ Title: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Title),\n/* harmony export */ Tooltip: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Tooltip),\n/* harmony export */ _adapters: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__._adapters),\n/* harmony export */ _detectPlatform: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__._detectPlatform),\n/* harmony export */ animator: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.animator),\n/* harmony export */ controllers: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.controllers),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ defaults: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.defaults),\n/* harmony export */ elements: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.elements),\n/* harmony export */ layouts: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.layouts),\n/* harmony export */ plugins: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.plugins),\n/* harmony export */ registerables: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.registerables),\n/* harmony export */ registry: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.registry),\n/* harmony export */ scales: () => (/* reexport safe */ _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.scales)\n/* harmony export */ });\n/* harmony import */ var _dist_chart_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(127);\n\n\n_dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Chart.register(..._dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.registerables);\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_dist_chart_js__WEBPACK_IMPORTED_MODULE_0__.Chart);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI2LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBc0Q7O0FBRXRELGlEQUFLLGFBQWEseURBQWE7O0FBRUU7QUFDakMsaUVBQWUsaURBQUssRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FyY2hpdGVjdHVpLWh0bWwtZnJlZS8uL25vZGVfbW9kdWxlcy9jaGFydC5qcy9hdXRvL2F1dG8uanM/OTRhYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYXJ0LCByZWdpc3RlcmFibGVzfSBmcm9tICcuLi9kaXN0L2NoYXJ0LmpzJztcblxuQ2hhcnQucmVnaXN0ZXIoLi4ucmVnaXN0ZXJhYmxlcyk7XG5cbmV4cG9ydCAqIGZyb20gJy4uL2Rpc3QvY2hhcnQuanMnO1xuZXhwb3J0IGRlZmF1bHQgQ2hhcnQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///126\n\n}"); - -/***/ }), - -/***/ 127: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Animation: () => (/* binding */ Animation),\n/* harmony export */ Animations: () => (/* binding */ Animations),\n/* harmony export */ ArcElement: () => (/* binding */ ArcElement),\n/* harmony export */ BarController: () => (/* binding */ BarController),\n/* harmony export */ BarElement: () => (/* binding */ BarElement),\n/* harmony export */ BasePlatform: () => (/* binding */ BasePlatform),\n/* harmony export */ BasicPlatform: () => (/* binding */ BasicPlatform),\n/* harmony export */ BubbleController: () => (/* binding */ BubbleController),\n/* harmony export */ CategoryScale: () => (/* binding */ CategoryScale),\n/* harmony export */ Chart: () => (/* binding */ Chart),\n/* harmony export */ Colors: () => (/* binding */ plugin_colors),\n/* harmony export */ DatasetController: () => (/* binding */ DatasetController),\n/* harmony export */ Decimation: () => (/* binding */ plugin_decimation),\n/* harmony export */ DomPlatform: () => (/* binding */ DomPlatform),\n/* harmony export */ DoughnutController: () => (/* binding */ DoughnutController),\n/* harmony export */ Element: () => (/* binding */ Element),\n/* harmony export */ Filler: () => (/* binding */ index),\n/* harmony export */ Interaction: () => (/* binding */ Interaction),\n/* harmony export */ Legend: () => (/* binding */ plugin_legend),\n/* harmony export */ LineController: () => (/* binding */ LineController),\n/* harmony export */ LineElement: () => (/* binding */ LineElement),\n/* harmony export */ LinearScale: () => (/* binding */ LinearScale),\n/* harmony export */ LogarithmicScale: () => (/* binding */ LogarithmicScale),\n/* harmony export */ PieController: () => (/* binding */ PieController),\n/* harmony export */ PointElement: () => (/* binding */ PointElement),\n/* harmony export */ PolarAreaController: () => (/* binding */ PolarAreaController),\n/* harmony export */ RadarController: () => (/* binding */ RadarController),\n/* harmony export */ RadialLinearScale: () => (/* binding */ RadialLinearScale),\n/* harmony export */ Scale: () => (/* binding */ Scale),\n/* harmony export */ ScatterController: () => (/* binding */ ScatterController),\n/* harmony export */ SubTitle: () => (/* binding */ plugin_subtitle),\n/* harmony export */ Ticks: () => (/* reexport safe */ _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aM),\n/* harmony export */ TimeScale: () => (/* binding */ TimeScale),\n/* harmony export */ TimeSeriesScale: () => (/* binding */ TimeSeriesScale),\n/* harmony export */ Title: () => (/* binding */ plugin_title),\n/* harmony export */ Tooltip: () => (/* binding */ plugin_tooltip),\n/* harmony export */ _adapters: () => (/* binding */ adapters),\n/* harmony export */ _detectPlatform: () => (/* binding */ _detectPlatform),\n/* harmony export */ animator: () => (/* binding */ animator),\n/* harmony export */ controllers: () => (/* binding */ controllers),\n/* harmony export */ defaults: () => (/* reexport safe */ _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d),\n/* harmony export */ elements: () => (/* binding */ elements),\n/* harmony export */ layouts: () => (/* binding */ layouts),\n/* harmony export */ plugins: () => (/* binding */ plugins),\n/* harmony export */ registerables: () => (/* binding */ registerables),\n/* harmony export */ registry: () => (/* binding */ registry),\n/* harmony export */ scales: () => (/* binding */ scales)\n/* harmony export */ });\n/* harmony import */ var _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(128);\n/*!\n * Chart.js v4.5.1\n * https://www.chartjs.org\n * (c) 2025 Chart.js Contributors\n * Released under the MIT License\n */\n\n\n\nclass Animator {\n constructor(){\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach((fn)=>fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n this._request = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.r.call(window, ()=>{\n this._update();\n this._request = null;\n if (this._running) {\n this._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n let remaining = 0;\n this._charts.forEach((anims, chart)=>{\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for(; i >= 0; --i){\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n this._lastDate = date;\n if (remaining === 0) {\n this._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur)=>Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for(; i >= 0; --i){\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = /* #__PURE__ */ new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean (from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color (from, to, factor) {\n const c0 = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.c)(from || transparent);\n const c1 = c0.valid && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.c)(to || transparent);\n return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to;\n },\n number (from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to){\n const currentValue = target[prop];\n to = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a)([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n const from = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a)([\n cfg.from,\n currentValue,\n to\n ]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.e[cfg.easing] || _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.e.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a)([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n this._from = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a)([\n cfg.from,\n currentValue,\n to\n ]);\n }\n }\n cancel() {\n if (this._active) {\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n this._active = from !== to && (loop || elapsed < duration);\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n factor = elapsed / duration % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n this._target[prop] = this._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej)=>{\n promises.push({\n res,\n rej\n });\n });\n }\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for(let i = 0; i < promises.length; i++){\n promises[i][method]();\n }\n }\n}\n\nclass Animations {\n constructor(chart, config){\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(config)) {\n return;\n }\n const animationOptions = Object.keys(_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.animation);\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach((key)=>{\n const cfg = config[key];\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions){\n resolved[option] = cfg[option];\n }\n ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(cfg.properties) && cfg.properties || [\n key\n ]).forEach((prop)=>{\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(()=>{\n target.options = newOptions;\n }, ()=>{\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for(i = props.length - 1; i >= 0; --i){\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for(let i = 0; i < keys.length; i++){\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {\n $shared: false,\n $animations: {}\n });\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n let found = false;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(otherValue) && (singleMode || value === 0 || (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.s)(value) === (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.s)(otherValue))) {\n value += otherValue;\n }\n }\n if (!found && !options.all) {\n return 0;\n }\n return value;\n}\nfunction convertObjectDataToArray(data, meta) {\n const { iScale , vScale } = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || stacked === undefined && meta.stack !== undefined;\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const { min , max , minDefined , maxDefined } = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()){\n const value = stack[meta.index];\n if (positive && value > 0 || !positive && value < 0) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const { chart , _cachedMeta: meta } = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const { iScale , vScale , index: datasetIndex } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for(let i = 0; i < ilen; ++i){\n const item = parsed[i];\n const { [iAxis]: index , [vAxis]: value } = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter((key)=>scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.j)(parent, {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n });\n}\nfunction createDataContext(parent, index, element) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.j)(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\nfunction clearStacks(meta, items) {\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items){\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\nconst isDirectUpdateMode = (mode)=>mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared)=>shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart)=>canStack && !meta.hidden && meta._stacked && {\n keys: getSortedDatasetIndices(chart, true),\n values: null\n };\nclass DatasetController {\n static defaults = {};\n static datasetElementType = null;\n static dataElementType = null;\n constructor(chart, datasetIndex){\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n this.initialize();\n }\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n const chooseId = (axis, x, y, r)=>axis === 'x' ? x : axis === 'r' ? r : y;\n const xid = meta.xAxisID = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale ? meta.vScale : meta.iScale;\n }\n reset() {\n this._update('reset');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.u)(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.u)(_data, this);\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.l)(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n addElements() {\n const meta = this._cachedMeta;\n this._dataCheck();\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n this._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n this._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n parse(start, count) {\n const { _cachedMeta: meta , _data: data } = this;\n const { iScale , _stacked } = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = ()=>cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis];\n for(i = 0; i < count; ++i){\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.f)(item, xAxisKey), index),\n y: yScale.parse((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.f)(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {\n mode\n });\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n const { min: otherMin , max: otherMax } = getUserBounds(otherScale);\n let i, parsed;\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n for(i = 0; i < ilen; ++i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for(i = ilen - 1; i >= 0; --i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for(i = 0, ilen = parsed.length; i < ilen; ++i){\n value = parsed[i][scale.axis];\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || elements.length - start;\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for(i = start; i < start + count; ++i){\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for(i = 0; i < active.length; ++i){\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context || (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.h)(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [\n `${elementType}Hover`,\n 'hover',\n elementType,\n ''\n ] : [\n elementType,\n ''\n ];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.elements[elementType]);\n const context = ()=>this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions;\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {\n sharedOptions,\n includeOptions\n };\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: !active && this.getSharedOptions(options) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n for (const [method, arg1, arg2] of this._syncList){\n this[method](arg1, arg2);\n }\n this._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n this.parse(0, count);\n }\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr)=>{\n arr.length += count;\n for(i = arr.length - 1; i >= end; i--){\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for(i = start; i < end; ++i){\n data[i] = new this.dataElementType();\n }\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([\n this.index,\n ...args\n ]);\n }\n _onDataPush() {\n const count = arguments.length;\n this._sync([\n '_insertElements',\n this.getDataset().data.length - count,\n count\n ]);\n }\n _onDataPop() {\n this._sync([\n '_removeElements',\n this._cachedMeta.data.length - 1,\n 1\n ]);\n }\n _onDataShift() {\n this._sync([\n '_removeElements',\n 0,\n 1\n ]);\n }\n _onDataSplice(start, count) {\n if (count) {\n this._sync([\n '_removeElements',\n start,\n count\n ]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync([\n '_insertElements',\n start,\n newCount\n ]);\n }\n }\n _onDataUnshift() {\n this._sync([\n '_insertElements',\n 0,\n arguments.length\n ]);\n }\n}\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n for(let i = 0, ilen = visibleMetas.length; i < ilen; i++){\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__._)(values.sort((a, b)=>a - b));\n }\n return scale._cache.$bar;\n}\n function computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = ()=>{\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.h)(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for(i = 0, ilen = values.length; i < ilen; ++i){\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for(i = 0, ilen = scale.ticks.length; i < ilen; ++i){\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\n function computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - size / 2\n };\n}\n function computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for(i = start, ilen = start + count; i < ilen; ++i){\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.s)(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {\n start,\n end,\n reverse,\n top,\n bottom\n };\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n if (edge === true) {\n properties.borderSkipped = {\n top: true,\n right: true,\n bottom: true,\n left: true\n };\n return;\n }\n const { start , end , reverse , top , bottom } = borderProps(properties);\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, { inflateAmount }, ratio) {\n properties.inflateAmount = inflateAmount === 'auto' ? ratio === 1 ? 0.33 : 0 : inflateAmount;\n}\nclass BarController extends DatasetController {\n static id = 'bar';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true\n }\n }\n };\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for(i = start, ilen = start + count; i < ilen; ++i){\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.f)(obj, iAxisKey), i);\n parsed.push(parseValue((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.f)(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getMaxOverflow() {\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const { iScale , vScale } = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom) ? '[' + custom.start + ', ' + custom.end + ']' : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const { index , _cachedMeta: { vScale } } = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n for(let i = start; i < start + count; i++){\n const parsed = this.getParsed(i);\n const vpixels = reset || (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(parsed[vScale.axis]) ? {\n base,\n head: base\n } : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom,\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const { iScale } = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta)=>meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n const skipNull = (meta)=>{\n const parsed = meta._parsed.find((item)=>item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(val) || isNaN(val)) {\n return true;\n }\n };\n for (const meta of metasets){\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getAxisCount() {\n return this._getAxis().length;\n }\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter((key)=>scales[key].axis === indexScaleId).shift();\n }\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets){\n axis[(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId)] = true;\n }\n return Object.keys(axis);\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = name !== undefined ? stacks.indexOf(name) : -1;\n return index === -1 ? stacks.length - 1 : index;\n }\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for(i = 0, ilen = meta.data.length; i < ilen; ++i){\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const { _cachedMeta: { vScale , _stacked , index: datasetIndex } , options: { base: baseValue , minBarLength } } = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.s)(value) !== (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.s)(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n if (_stacked && !floating) {\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.s)(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount) : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + range.chunk * stackIndex + range.chunk / 2;\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n for(; i < ilen; ++i){\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n}\n\nclass BubbleController extends DatasetController {\n static id = 'bubble';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'borderWidth',\n 'radius'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n update(mode) {\n const points = this._cachedMeta.data;\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n this.updateElement(point, i, properties, mode);\n }\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {\n $shared: false\n });\n }\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(parsed && parsed._custom, radius);\n return values;\n }\n}\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b)=>(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.p)(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b)=>(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.p)(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H, startY, endY);\n const minX = calcMin(_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P, startX, endX);\n const minY = calcMin(_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P + _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {\n ratioX,\n ratioY,\n offsetX,\n offsetY\n };\n}\nclass DoughnutController extends DatasetController {\n static id = 'doughnut';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'circumference',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'startAngle',\n 'x',\n 'y',\n 'offset',\n 'borderWidth',\n 'spacing'\n ]\n }\n },\n cutout: '50%',\n rotation: 0,\n circumference: 360,\n radius: '100%',\n spacing: 0,\n indexAxis: 'r'\n };\n static descriptors = {\n _scriptable: (name)=>name !== 'spacing',\n _indexable: (name)=>name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash')\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n const { labels: { pointStyle , textAlign , color , useBorderRadius , borderRadius } } = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i)=>+data[i];\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(data[start])) {\n const { key ='value' } = this._parsing;\n getter = (i)=>+(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.f)(data[i], key);\n }\n let i, ilen;\n for(i = start, ilen = start + count; i < ilen; ++i){\n meta._parsed[i] = getter(i);\n }\n }\n }\n _getRotation() {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(this.options.rotation - 90);\n }\n _getCircumference() {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(this.options.circumference);\n }\n _getRotationExtents() {\n let min = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T;\n let max = -_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T;\n for(let i = 0; i < this.chart.data.datasets.length; ++i){\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min\n };\n }\n update(mode) {\n const chart = this.chart;\n const { chartArea } = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.m)(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n const { circumference , rotation } = this._getRotationExtents();\n const { ratioX , ratioY , offsetX , offsetY } = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.n)(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n meta.total = this.calculateTotal();\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T);\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n for(i = 0; i < start; ++i){\n startAngle += this._circumference(i, reset);\n }\n for(i = start; i < start + count; ++i){\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n this.updateElement(arc, i, properties, mode);\n }\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for(i = 0; i < metaData.length; i++){\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.o)(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for(i = 0, ilen = chart.data.datasets.length; i < ilen; ++i){\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for(i = 0, ilen = arcs.length; i < ilen; ++i){\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for(let i = 0, ilen = arcs.length; i < ilen; ++i){\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for(let i = 0; i < datasetIndex; ++i){\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n\nclass LineController extends DatasetController {\n static id = 'line';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n showLine: true,\n spanGaps: false\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category'\n },\n _value_: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { dataset: line , data: points = [] , _dataset } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.q)(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.w)(meta)) {\n start = 0;\n count = points.length;\n }\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n this.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.x)(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = 0; i < pointsCount; ++i){\n const point = points[i];\n const properties = directUpdate ? point : {};\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n const parsed = this.getParsed(i);\n const nullData = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n\nclass PolarAreaController extends DatasetController {\n static id = 'polarArea';\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ]\n }\n },\n indexAxis: 'r',\n startAngle: 0\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.o)(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n parseObjectData(meta, data, start, count) {\n return _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.y.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n meta.data.forEach((element, index)=>{\n const parsed = this.getParsed(index).r;\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n return range;\n }\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n this.outerRadius = outerRadius - radiusLength * this.index;\n this.innerRadius = this.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / this.countVisibleElements();\n for(i = 0; i < start; ++i){\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for(i = start; i < start + count; i++){\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n this.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index)=>{\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index) ? (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(this.resolveDataElementOptions(index, mode).angle || defaultAngle) : 0;\n }\n}\n\nclass PieController extends DoughnutController {\n static id = 'pie';\n static defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: '100%'\n };\n}\n\nclass RadarController extends DatasetController {\n static id = 'radar';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n }\n };\n static overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: 'radialLinear'\n }\n }\n };\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n parseObjectData(meta, data, start, count) {\n return _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.y.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n this.updateElement(line, undefined, properties, mode);\n }\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n\nclass ScatterController extends DatasetController {\n static id = 'scatter';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n static overrides = {\n interaction: {\n mode: 'point'\n },\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { data: points = [] } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.q)(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.w)(meta)) {\n start = 0;\n count = points.length;\n }\n if (this.options.showLine) {\n if (!this.datasetElementType) {\n this.addElements();\n }\n const { dataset: line , _dataset } = meta;\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n delete meta.dataset;\n this.datasetElementType = false;\n }\n this.updateElements(points, start, count, mode);\n }\n addElements() {\n const { showLine } = this.options;\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n super.addElements();\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.x)(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = start; i < start + count; ++i){\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n if (!this.options.showLine) {\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPieController: PieController,\nPolarAreaController: PolarAreaController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\n/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */ function abstract() {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */ class DateAdapterBase {\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */ static override(members) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n options;\n constructor(options){\n this.options = options || {};\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n formats() {\n return abstract();\n }\n parse() {\n return abstract();\n }\n format() {\n return abstract();\n }\n add() {\n return abstract();\n }\n diff() {\n return abstract();\n }\n startOf() {\n return abstract();\n }\n endOf() {\n return abstract();\n }\n}\nvar adapters = {\n _date: DateAdapterBase\n};\n\nfunction binarySearch(metaset, axis, value, intersect) {\n const { controller , data , _sorted } = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.A : _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.B;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const { vScale } = controller._cachedMeta;\n const { _parsed } = metaset;\n const distanceToDefinedLo = _parsed.slice(0, result.lo + 1).reverse().findIndex((point)=>!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(point[vScale.axis]));\n result.lo -= Math.max(0, distanceToDefinedLo);\n const distanceToDefinedHi = _parsed.slice(result.hi).findIndex((point)=>!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(point[vScale.axis]));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {\n lo: start.lo,\n hi: end.hi\n };\n }\n }\n }\n return {\n lo: 0,\n hi: data.length - 1\n };\n}\n function evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for(let i = 0, ilen = metasets.length; i < ilen; ++i){\n const { index , data } = metasets[i];\n const { lo , hi } = binarySearch(metasets[i], axis, value, intersect);\n for(let j = lo; j <= hi; ++j){\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n function getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.C)(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n };\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n function getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n function evaluationFunc(element, datasetIndex, index) {\n const { startAngle , endAngle } = element.getProps([\n 'startAngle',\n 'endAngle'\n ], useFinalPosition);\n const { angle } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.D)(element, {\n x: position.x,\n y: position.y\n });\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.p)(angle, startAngle, endAngle)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [\n {\n element,\n datasetIndex,\n index\n }\n ];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n return axis === 'r' && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n function getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index)=>{\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n var Interaction = {\n evaluateInteractionItems,\n modes: {\n index (chart, e, options, useFinalPosition) {\n const position = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.z)(e, chart);\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta)=>{\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({\n element,\n datasetIndex: meta.index,\n index\n });\n }\n });\n return elements;\n },\n dataset (chart, e, options, useFinalPosition) {\n const position = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.z)(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for(let i = 0; i < data.length; ++i){\n items.push({\n element: data[i],\n datasetIndex,\n index: i\n });\n }\n }\n return items;\n },\n point (chart, e, options, useFinalPosition) {\n const position = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.z)(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n nearest (chart, e, options, useFinalPosition) {\n const position = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.z)(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n x (chart, e, options, useFinalPosition) {\n const position = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.z)(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n y (chart, e, options, useFinalPosition) {\n const position = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.z)(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n\nconst STATIC_POSITIONS = [\n 'left',\n 'top',\n 'right',\n 'bottom'\n];\nfunction filterByPosition(array, position) {\n return array.filter((v)=>v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter((v)=>STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b)=>{\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n for(i = 0, ilen = (boxes || []).length; i < ilen; ++i){\n box = boxes[i];\n ({ position: pos , options: { stack , stackWeight =1 } } = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && pos + stack,\n stackWeight\n });\n }\n return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts){\n const { stack , pos , stackWeight } = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {\n count: 0,\n placed: 0,\n weight: 0,\n size: 0\n });\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n function setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const { vBoxMaxWidth , hBoxMaxHeight } = params;\n let i, ilen, layout;\n for(i = 0, ilen = layouts.length; i < ilen; ++i){\n layout = layouts[i];\n const { fullSize } = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter((wrap)=>wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n const { pos , box } = layout;\n const maxPadding = chartArea.maxPadding;\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(pos)) {\n if (layout.size) {\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {\n size: 0,\n count: 1\n };\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal ? {\n same: widthChanged,\n other: heightChanged\n } : {\n same: heightChanged,\n other: widthChanged\n };\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n };\n positions.forEach((pos)=>{\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal ? marginForPositions([\n 'left',\n 'right'\n ]) : marginForPositions([\n 'top',\n 'bottom'\n ]);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for(i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i){\n layout = boxes[i];\n box = layout.box;\n box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));\n const { same , other } = updateDims(chartArea, params, layout, stacks);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let { x , y } = chartArea;\n for (const layout of boxes){\n const box = layout.box;\n const stack = stacks[layout.stack] || {\n count: 1,\n placed: 0,\n weight: 1\n };\n const weight = layout.stackWeight / stack.weight || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.h)(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.h)(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\nvar layouts = {\n addBox (chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [\n {\n z: 0,\n draw (chartArea) {\n item.draw(chartArea);\n }\n }\n ];\n };\n chart.boxes.push(item);\n },\n removeBox (chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure (chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update (chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(chart.boxes, (box)=>{\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap)=>wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w\n };\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(boxes.chartArea, (layout)=>{\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n });\n });\n }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n updateConfig(config) {\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n\nconst EXPANDO_KEY = '$chartjs';\n const EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\nconst isNullOrEmpty = (value)=>value === null || value === '';\n function initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || 'block';\n style.boxSizing = style.boxSizing || 'border-box';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.J)(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.J)(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.K ? {\n passive: true\n} : false;\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const { x , y } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.z)(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null\n };\n}\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList){\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart)=>{\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.I)(canvas);\n if (!container) {\n return;\n }\n const resize = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.L)((width, height)=>{\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver((entries)=>{\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.L)((event)=>{\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n addListener(canvas, type, proxy);\n return proxy;\n}\n class DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n [\n 'height',\n 'width'\n ].forEach((prop)=>{\n const value = initial[prop];\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key)=>{\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.G)(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = canvas && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.I)(canvas);\n return !!(container && container.isConnected);\n }\n}\n\nfunction _detectPlatform(canvas) {\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.M)() || typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nclass Element {\n static defaults = {};\n static defaultRoutes = undefined;\n x;\n y;\n active = false;\n options;\n $animations;\n tooltipPosition(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n hasValue() {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.x)(this.x) && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.x)(this.y);\n }\n getProps(props, final) {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this;\n }\n const ret = {};\n props.forEach((prop)=>{\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n });\n return ret;\n }\n}\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for(i = 0, ilen = numMajorIndices - 1; i < ilen; i++){\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n function calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.N)(evenMajorSpacing);\n for(let i = 0, ilen = factors.length - 1; i < ilen; i++){\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n function getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n function skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for(i = 0; i < ticks.length; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n function skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(majorStart, 0);\n const end = Math.min((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while(next < 0){\n count++;\n next = Math.round(start + count * spacing);\n }\n for(i = Math.max(start, 0); i < end; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n function getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for(diff = arr[0], i = 1; i < len; ++i){\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align)=>align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset)=>edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit)=>Math.min(maxTicksLimit || ticksLength, ticksLength);\n function sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for(; i < len; i += increment){\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n function getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n function garbageCollect(caches, length) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(caches, (cache)=>{\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for(i = 0; i < gcLen; ++i){\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n function getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n function getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(options.font, fallback);\n const padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(options.padding);\n const lines = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(options.text) ? options.text.length : 1;\n return lines * font.lineHeight + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.j)(parent, {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.j)(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a1)(align);\n if (reverse && position !== 'right' || !reverse && position === 'right') {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const { top , left , bottom , right , chart } = scale;\n const { chartArea , scales } = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n if (scale.isHorizontal()) {\n titleX = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, left, right);\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, bottom, top);\n rotation = position === 'left' ? -_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H : _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n}\nclass Scale extends Element {\n constructor(cfg){\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n this.options = options.setContext(this.getContext());\n this.axis = options.axis;\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let { _userMin , _userMax , _suggestedMin , _suggestedMax } = this;\n _userMin = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(_userMin, Number.POSITIVE_INFINITY);\n _userMax = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(_userMin, _suggestedMin),\n max: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(_userMax, _suggestedMax),\n minDefined: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(_userMin),\n maxDefined: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(_userMax)\n };\n }\n getMinMax(canStack) {\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {\n min,\n max\n };\n }\n const metas = this.getMatchingVisibleMetas();\n for(let i = 0, ilen = metas.length; i < ilen; ++i){\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n return {\n min: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(min, (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(max, min)),\n max: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(max, (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(min, max))\n };\n }\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.beforeUpdate, [\n this\n ]);\n }\n update(maxWidth, maxHeight, margins) {\n const { beginAtZero , grace , ticks: tickOpts } = this.options;\n const sampleSize = tickOpts.sampleSize;\n this.beforeUpdate();\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom;\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.R)(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n this.beforeBuildTicks();\n this.ticks = this.buildTicks() || [];\n this.afterBuildTicks();\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n this.configure();\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation();\n this.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n if (samplingEnabled) {\n this._convertTicksToLabels(this.ticks);\n }\n this.beforeFit();\n this.fit();\n this.afterFit();\n this.afterUpdate();\n }\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n afterUpdate() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.afterUpdate, [\n this\n ]);\n }\n beforeSetDimensions() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.beforeSetDimensions, [\n this\n ]);\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = 0;\n this.bottom = this.height;\n }\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.afterSetDimensions, [\n this\n ]);\n }\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options[name], [\n this\n ]);\n }\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n beforeTickToLabelConversion() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.beforeTickToLabelConversion, [\n this\n ]);\n }\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n tick = ticks[i];\n tick.label = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(tickOpts.callback, [\n tick.value,\n i,\n ticks\n ], this);\n }\n }\n afterTickToLabelConversion() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.afterTickToLabelConversion, [\n this\n ]);\n }\n beforeCalculateLabelRotation() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.beforeCalculateLabelRotation, [\n this\n ]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.U)(Math.min(Math.asin((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(maxLabelHeight / maxLabelDiagonal, -1, 1))));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.afterCalculateLabelRotation, [\n this\n ]);\n }\n afterAutoSkip() {}\n beforeFit() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.beforeFit, [\n this\n ]);\n }\n fit() {\n const minSize = {\n width: 0,\n height: 0\n };\n const { chart , options: { ticks: tickOpts , title: titleOpts , grid: gridOpts } } = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && this.ticks.length) {\n const { first , last , widest , highest } = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n this._handleMargins();\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const { ticks: { align , padding } , position } = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n afterFit() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.afterFit, [\n this\n ]);\n }\n isHorizontal() {\n const { axis , position } = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n this.generateTickLabels(ticks);\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n this.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const { ctx , _longestTextCache: caches } = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for(i = 0; i < length; i += increment){\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {\n data: {},\n gc: []\n };\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(label) && !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(label)) {\n width = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.V)(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(label)) {\n for(j = 0, jlen = label.length; j < jlen; ++j){\n nestedLabel = label[j];\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(nestedLabel) && !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(nestedLabel)) {\n width = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.V)(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx)=>({\n width: widths[idx] || 0,\n height: heights[idx] || 0\n });\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = this._startPixel + decimal * this._length;\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.W)(this._alignToPixels ? (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.X)(this.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const { min , max } = this;\n return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n }\n getContext(index) {\n const ticks = this.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this));\n }\n _tickSize() {\n const optionTicks = this.options.ticks;\n const rot = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return this.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== 'auto') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const { grid , position , border } = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.X)(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n const limit = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for(i = 0; i < ticksLength; i += step){\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(this, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.X)(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset\n });\n }\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const { position , ticks: optionTicks } = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const { align , crossAlign , padding , mirror } = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding;\n } else if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = (chartArea.left + chartArea.right) / 2 - tickAndPadding;\n } else if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n const labelSizes = this._getLabelSizes();\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n if (isHorizontal) {\n x = pixel;\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += lineHeight / 2 * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n switch(textBaseline){\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n }\n switch(textAlign){\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor\n };\n }\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [\n x,\n y\n ],\n backdrop\n }\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const { position , ticks } = this.options;\n const rotation = -(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(this.labelRotation);\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n let align = 'center';\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const { position , ticks: { crossAlign , mirror , padding } } = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {\n textAlign,\n x\n };\n }\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n const chart = this.chart;\n const position = this.options.position;\n if (position === 'left' || position === 'right') {\n return {\n top: 0,\n left: this.left,\n bottom: chart.height,\n right: this.right\n };\n }\n if (position === 'top' || position === 'bottom') {\n return {\n top: this.top,\n left: 0,\n bottom: this.bottom,\n right: chart.width\n };\n }\n }\n drawBackground() {\n const { ctx , options: { backgroundColor } , left , top , width , height } = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex((t)=>t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style)=>{\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for(i = 0, ilen = items.length; i < ilen; ++i){\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine({\n x: item.x1,\n y: item.y1\n }, {\n x: item.x2,\n y: item.y2\n }, item);\n }\n if (grid.drawTicks) {\n drawLine({\n x: item.tx1,\n y: item.ty1\n }, {\n x: item.tx2,\n y: item.ty2\n }, {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n });\n }\n }\n }\n }\n drawBorder() {\n const { chart , ctx , options: { border , grid } } = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n if (this.isHorizontal()) {\n x1 = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.X)(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.X)(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.X)(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.X)(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = this.ctx;\n const area = this._computeLabelArea();\n if (area) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Y)(ctx, area);\n }\n const items = this.getLabelItems(chartArea);\n for (const item of items){\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Z)(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n if (area) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.$)(ctx);\n }\n }\n drawTitle() {\n const { ctx , options: { position , title , reverse } } = this;\n if (!title.display) {\n return;\n }\n const font = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(title.font);\n const padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === 'bottom' || position === 'center' || (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(position)) {\n offset += padding.bottom;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const { titleX , titleY , maxWidth , rotation } = titleArgs(this, offset, position, align);\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Z)(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(opts.grid && opts.grid.z, -1);\n const bz = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(opts.border && opts.border.z, 0);\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n return [\n {\n z: tz,\n draw: (chartArea)=>{\n this.draw(chartArea);\n }\n }\n ];\n }\n return [\n {\n z: gz,\n draw: (chartArea)=>{\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n },\n {\n z: bz,\n draw: ()=>{\n this.drawBorder();\n }\n },\n {\n z: tz,\n draw: (chartArea)=>{\n this.drawLabels(chartArea);\n }\n }\n ];\n }\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(opts.font);\n }\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n\nclass TypedRegistry {\n constructor(type, scope, override){\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = this.register(proto);\n }\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d[scope]) {\n delete _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d[scope][id];\n if (this.override) {\n delete _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a3[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a4)(Object.create(null), [\n parentScope ? _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.get(parentScope) : {},\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.get(scope),\n item.defaults\n ]);\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach((property)=>{\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [\n scope\n ].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n constructor(){\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n this._typedRegistries = [\n this.controllers,\n this.scales,\n this.elements\n ];\n }\n add(...args) {\n this._each('register', args);\n }\n remove(...args) {\n this._each('unregister', args);\n }\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n [\n ...args\n ].forEach((arg)=>{\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) {\n this._exec(method, reg, arg);\n } else {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(arg, (item)=>{\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a5)(method);\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(component['before' + camelMethod], [], component);\n registry[method](component);\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(component['after' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for(let i = 0; i < this._typedRegistries.length; i++){\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n}\nvar registry = /* #__PURE__ */ new Registry();\n\nclass PluginService {\n constructor(){\n this._init = undefined;\n }\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n if (this._init === undefined) {\n return;\n }\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined;\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors){\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [\n chart,\n args,\n descriptor.options\n ];\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n function allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for(let i = 0; i < keys.length; i++){\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for(let i = 0; i < local.length; i++){\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n return {\n plugins,\n localIds\n };\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, { plugins , localIds }, options, all) {\n const result = [];\n const context = chart.getContext();\n for (const plugin of plugins){\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {\n plugin,\n local: localIds[id]\n }, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, { plugin , local }, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [\n ''\n ], {\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\nfunction determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions){\n const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {\n axis\n };\n }\n}\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d)=>d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a3[config.type] || {\n scales: {}\n };\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n Object.keys(configScales).forEach((id)=>{\n const scaleConf = configScales[id];\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ab)(Object.create(null), [\n {\n axis\n },\n scaleConf,\n defaultScaleOptions[axis],\n defaultScaleOptions[defaultId]\n ]);\n });\n config.data.datasets.forEach((dataset)=>{\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a3[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach((defaultID)=>{\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ab)(scales[id], [\n {\n axis\n },\n configScales[id],\n defaultScaleOptions[defaultID]\n ]);\n });\n });\n Object.keys(scales).forEach((key)=>{\n const scale = scales[key];\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ab)(scale, [\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.scales[scale.type],\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.scale\n ]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key)=>{\n const opts = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.f)(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config){\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get platform() {\n return this._config.platform;\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType, ()=>[\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`, ()=>[\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`\n ],\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`, ()=>[\n [\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]\n ]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`, ()=>[\n [\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || []\n ]\n ]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const { options , type } = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach((keys)=>{\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach((key)=>addIfFound(scopes, mainScope, key));\n }\n keys.forEach((key)=>addIfFound(scopes, options, key));\n keys.forEach((key)=>addIfFound(scopes, _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a3[type] || {}, key));\n keys.forEach((key)=>addIfFound(scopes, _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d, key));\n keys.forEach((key)=>addIfFound(scopes, _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a6, key));\n });\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const { options , type } = this;\n return [\n options,\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a3[type] || {},\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.datasets[type] || {},\n {\n type\n },\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d,\n _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a6\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = [\n ''\n ]) {\n const result = {\n $shared: true\n };\n const { resolver , subPrefixes } = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a7)(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a8)(resolver, context, subResolver);\n }\n for (const prop of names){\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [\n ''\n ], descriptorDefaults) {\n const { resolver } = getResolver(this._resolverCache, scopes, prefixes);\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(context) ? (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a8)(resolver, context, undefined, descriptorDefaults) : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a9)(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter((p)=>!p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nconst hasFunction = (value)=>(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(value) && Object.getOwnPropertyNames(value).some((key)=>(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a7)(value[key]));\nfunction needContext(proxy, names) {\n const { isScriptable , isIndexable } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aa)(proxy);\n for (const prop of names){\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if (scriptable && ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a7)(value) || hasFunction(value)) || indexable && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(value)) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"4.5.1\";\n\nconst KNOWN_POSITIONS = [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'chartArea'\n];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x';\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins('afterRender');\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(animationOptions && animationOptions.onComplete, [\n context\n ], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(animationOptions && animationOptions.onProgress, [\n context\n ], chart);\n}\n function getCanvas(item) {\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.M)() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key)=>{\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c)=>c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys){\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n function determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\nclass Chart {\n static defaults = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d;\n static instances = instances;\n static overrides = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a3;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n constructor(item, userConfig){\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error('Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' + ' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.');\n }\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ac)();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ad)((mode)=>this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n instances[this.id] = this;\n if (!context || !canvas) {\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n get aspectRatio() {\n const { options: { aspectRatio , maintainAspectRatio } , width , height , _aspectRatio } = this;\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n get registry() {\n return registry;\n }\n _initialize() {\n this.notifyPlugins('beforeInit');\n if (this.options.responsive) {\n this.resize();\n } else {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ae)(this, this.options.devicePixelRatio);\n }\n this.bindEvents();\n this.notifyPlugins('afterInit');\n return this;\n }\n clear() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.af)(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {\n width,\n height\n };\n }\n }\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ae)(this, newRatio, true)) {\n return;\n }\n this.notifyPlugins('resize', {\n size: newSize\n });\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(options.onResize, [\n this,\n newSize\n ], this);\n if (this.attached) {\n if (this._doResize(mode)) {\n this.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(scalesOptions, (axisOptions, axisID)=>{\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id)=>{\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(Object.keys(scaleOpts).map((id)=>{\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n }));\n }\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(items, (item)=>{\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(updated, (hasUpdated, id)=>{\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(scales, (scale)=>{\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b)=>a.index - b.index);\n if (numMeta > numData) {\n for(let i = numData; i < numMeta; ++i){\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const { _metasets: metasets , data: { datasets } } = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index)=>{\n if (datasets.filter((x)=>x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n this._removeUnreferencedMetasets();\n for(i = 0, ilen = datasets.length; i < ilen; i++){\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const { datasetElementType , dataElementType } = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n this._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(this.data.datasets, (dataset, datasetIndex)=>{\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const config = this.config;\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n this._plugins.invalidate();\n if (this.notifyPlugins('beforeUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n const newControllers = this.buildOrUpdateControllers();\n this.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; i++){\n const { controller } = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n if (!animsDisabled) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(newControllers, (controller)=>{\n controller.reset();\n });\n }\n this._updateDatasets(mode);\n this.notifyPlugins('afterUpdate', {\n mode\n });\n this._layers.sort(compare2Level('z', '_idx'));\n const { _active , _lastEvent } = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n this.render();\n }\n _updateScales() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(this.scales, (scale)=>{\n layouts.removeBox(this, scale);\n });\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ag)(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n this.unbindEvents();\n this.bindEvents();\n }\n }\n _updateHiddenIndices() {\n const { _hiddenIndices } = this;\n const changes = this._getUniformDataChanges() || [];\n for (const { method , start , count } of changes){\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx)=>new Set(_dataChanges.filter((c)=>c[0] === idx).map((c, i)=>i + ',' + c.splice(1).join(',')));\n const changeSet = makeSet(0);\n for(let i = 1; i < datasetCount; i++){\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ag)(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet).map((c)=>c.split(',')).map((a)=>({\n method: a[1],\n start: +a[2],\n count: +a[3]\n }));\n }\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {\n cancelable: true\n }) === false) {\n return;\n }\n layouts.update(this, this.width, this.height, minPadding);\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n this._layers = [];\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(this.boxes, (box)=>{\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n this._layers.forEach((item, index)=>{\n item._idx = index;\n });\n this.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this.getDatasetMeta(i).controller.configure();\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._updateDataset(i, (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a7)(mode) ? mode({\n datasetIndex: i\n }) : mode);\n }\n this.notifyPlugins('afterDatasetsUpdate', {\n mode\n });\n }\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {\n meta,\n index,\n mode,\n cancelable: true\n };\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n if (this.notifyPlugins('beforeRender', {\n cancelable: true\n }) === false) {\n return;\n }\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({\n chart: this\n });\n }\n }\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const { width , height } = this._resizeBeforeDraw;\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n if (this.notifyPlugins('beforeDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const layers = this._layers;\n for(i = 0; i < layers.length && layers[i].z <= 0; ++i){\n layers[i].draw(this.chartArea);\n }\n this._drawDatasets();\n for(; i < layers.length; ++i){\n layers[i].draw(this.chartArea);\n }\n this.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const metasets = this.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n this._drawDataset(metasets[i]);\n }\n this.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n const clip = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ah)(this, meta);\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n if (clip) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Y)(ctx, clip);\n }\n meta.controller.draw();\n if (clip) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.$)(ctx);\n }\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n isPointInArea(point) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.C)(point, this.chartArea, this._minPadding);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter((x)=>x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.j)(null, {\n chart: this,\n type: 'chart'\n }));\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.h)(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {\n visible\n });\n this.update((ctx)=>ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n for(i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._destroyDatasetMeta(i);\n }\n }\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const { canvas , ctx } = this;\n this._stop();\n this.config.clearCache();\n if (canvas) {\n this.unbindEvents();\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.af)(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n delete instances[this.id];\n this.notifyPlugins('afterDestroy');\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const listener = (e, x, y)=>{\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(this.options.events, (type)=>_add(type, listener));\n }\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener)=>{\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height)=>{\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n let detached;\n const attached = ()=>{\n _remove('attach', attached);\n this.attached = true;\n this.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = ()=>{\n this.attached = false;\n _remove('resize', listener);\n this._stop();\n this._resize(0, 0);\n _add('attach', attached);\n };\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(this._listeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(this._responsiveListeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ai)(active, lastActive);\n if (changed) {\n this._active = active;\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter((p)=>p.plugin.id === pluginId).length === 1;\n }\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin)=>(plugin.options.events || this.options.events).includes(e.native.type);\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = this._handleEvent(e, replay, args.inChartArea);\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n this.render();\n }\n return this;\n }\n _handleEvent(e, replay, inChartArea) {\n const { _active: lastActive = [] , options } = this;\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aj)(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n if (inChartArea) {\n this._lastEvent = null;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(options.onHover, [\n e,\n active,\n this\n ], this);\n if (isClick) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(options.onClick, [\n e,\n active,\n this\n ], this);\n }\n }\n const changed = !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ai)(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n this._lastEvent = lastEvent;\n return changed;\n }\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive;\n }\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\nfunction invalidatePlugins() {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(Chart.instances, (chart)=>chart._plugins.invalidate());\n}\n\nfunction clipSelf(ctx, element, endAngle) {\n const { startAngle , x , y , outerRadius , innerRadius , options } = element;\n const { borderWidth , borderJoinStyle } = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.al)(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.al)(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.al)(startAngle - endAngle));\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P / 2, startAngle + _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P / 2) + x;\n const endY = -r * Math.sin(endAngle + _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P / 2) + y;\n const startX = r * Math.cos(startAngle + _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P / 2) + x;\n const startY = r * Math.sin(startAngle + _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n ctx.clip('evenodd');\n}\nfunction clipArc(ctx, element, endAngle) {\n const { startAngle , pixelMargin , x , y , outerRadius , innerRadius } = element;\n let angleMargin = pixelMargin / outerRadius;\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H, startAngle - _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.am)(value, [\n 'outerStart',\n 'outerEnd',\n 'innerStart',\n 'innerEnd'\n ]);\n}\n/**\n * Parse border radius from the provided options\n */ function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val)=>{\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(o.innerStart, 0, innerLimit),\n innerEnd: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(o.innerEnd, 0, innerLimit)\n };\n}\n/**\n * Convert (r, 𝜃) to (x, y)\n */ function rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta)\n };\n}\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */ function pathArc(ctx, element, offset, spacing, end, circular) {\n const { x , y , startAngle: start , pixelMargin , innerRadius: innerR } = element;\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n let spacingOffset = 0;\n const alpha = end - start;\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n const beta = Math.max(0.001, alpha * outerRadius - offset / _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const { outerStart , outerEnd , innerStart , innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H);\n }\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H, innerEndAdjustedAngle + Math.PI);\n }\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;\n ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H);\n }\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference } = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T || _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\nfunction drawBorder(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference , options } = element;\n const { borderWidth , borderJoinStyle , borderDash , borderDashOffset , borderRadius } = options;\n const inner = options.borderAlign === 'inner';\n if (!borderWidth) {\n return;\n }\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T || _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T);\n }\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n if (options.selfJoin && endAngle - startAngle >= _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\nclass ArcElement extends Element {\n static id = 'arc';\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash'\n };\n circumference;\n endAngle;\n fullCircles;\n innerRadius;\n outerRadius;\n pixelMargin;\n startAngle;\n constructor(cfg){\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n const { angle , distance } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.D)(point, {\n x: chartX,\n y: chartY\n });\n const { startAngle , endAngle , innerRadius , outerRadius , circumference } = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(circumference, endAngle - startAngle);\n const nonZeroBetween = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.p)(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T || nonZeroBetween;\n const withinRadius = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ak)(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n return betweenAngles && withinRadius;\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , startAngle , endAngle , innerRadius , outerRadius } = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const { offset , spacing } = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const { options , circumference } = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = options.borderAlign === 'inner' ? 0.33 : 0;\n this.fullCircles = circumference > _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T ? Math.floor(circumference / _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T) : 0;\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n ctx.save();\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P, circumference || 0));\n const radiusOffset = offset * fix;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n ctx.restore();\n }\n}\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(style.borderDash, options.borderDash));\n ctx.lineDashOffset = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n function getLineMethod(options) {\n if (options.stepped) {\n return _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.at;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.au;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const { start: paramsStart = 0 , end: paramsEnd = count - 1 } = params;\n const { start: segmentStart , end: segmentEnd } = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n function pathSegment(ctx, line, segment, params) {\n const { points , options } = line;\n const { count , start , loop , ilen } = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let { move =true , reverse } = params || {};\n let i, point, prev;\n for(i = 0; i <= ilen; ++i){\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\n function fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const { count , start , ilen } = pathVars(points, segment, params);\n const { move =true , reverse } = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index)=>(start + (reverse ? ilen - index : index)) % count;\n const drawX = ()=>{\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for(i = 0; i <= ilen; ++i){\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\n function _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n function _getInterpolationMethod(options) {\n if (options.stepped) {\n return _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aq;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ar;\n }\n return _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.as;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const { segments , options } = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments){\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {\n start,\n end: start + count - 1\n })) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends Element {\n static id = 'line';\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash' && name !== 'fill'\n };\n constructor(cfg){\n super();\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.an)(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ao)(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ap)(this, {\n property,\n start: value,\n end: value\n });\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for(i = 0, ilen = segments.length; i < ilen; ++i){\n const { start , end } = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n start = start || 0;\n count = count || this.points.length - start;\n for (const segment of segments){\n loop &= segmentMethod(ctx, this, segment, {\n start,\n end: start + count - 1\n });\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n if (points.length && options.borderWidth) {\n ctx.save();\n draw(ctx, this, start, count);\n ctx.restore();\n }\n if (this.animated) {\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const { [axis]: value } = el.getProps([\n axis\n ], useFinalPosition);\n return Math.abs(pos - value) < options.radius + options.hitRadius;\n}\nclass PointElement extends Element {\n static id = 'point';\n parsed;\n skip;\n stop;\n /**\n * @type {any}\n */ static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n /**\n * @type {any}\n */ static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2) < Math.pow(options.hitRadius + options.radius, 2);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, 'x', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, 'y', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx, area) {\n const options = this.options;\n if (this.skip || options.radius < 0.1 || !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.C)(this, area, this.size(options) / 2)) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.av)(ctx, options, this.x, this.y);\n }\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n\nfunction getBarBounds(bar, useFinalPosition) {\n const { x , y , base , width , height } = bar.getProps([\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {\n left,\n top,\n right,\n bottom\n };\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ax)(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const { enableBorderRadius } = bar.getProps([\n 'enableBorderRadius'\n ]);\n const value = bar.options.borderRadius;\n const o = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ay)(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n const enableBorder = enableBorderRadius || (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r))\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds && (skipX || (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ak)(x, bounds.left, bounds.right)) && (skipY || (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ak)(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n function addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\nclass BarElement extends Element {\n static id = 'bar';\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const { inflateAmount , options: { borderColor , backgroundColor } } = this;\n const { inner , outer } = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aw : addNormalRectPath;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , base , horizontal } = this.getProps([\n 'x',\n 'y',\n 'base',\n 'horizontal'\n ], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nBarElement: BarElement,\nLineElement: LineElement,\nPointElement: PointElement\n});\n\nconst BORDER_COLORS = [\n 'rgb(54, 162, 235)',\n 'rgb(255, 99, 132)',\n 'rgb(255, 159, 64)',\n 'rgb(255, 205, 86)',\n 'rgb(75, 192, 192)',\n 'rgb(153, 102, 255)',\n 'rgb(201, 203, 207)' // grey\n];\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map((color)=>color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\nfunction getBorderColor(i) {\n return BORDER_COLORS[i % BORDER_COLORS.length];\n}\nfunction getBackgroundColor(i) {\n return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\nfunction colorizeDefaultDataset(dataset, i) {\n dataset.borderColor = getBorderColor(i);\n dataset.backgroundColor = getBackgroundColor(i);\n return ++i;\n}\nfunction colorizeDoughnutDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBorderColor(i++));\n return i;\n}\nfunction colorizePolarAreaDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBackgroundColor(i++));\n return i;\n}\nfunction getColorizer(chart) {\n let i = 0;\n return (dataset, datasetIndex)=>{\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n if (controller instanceof DoughnutController) {\n i = colorizeDoughnutDataset(dataset, i);\n } else if (controller instanceof PolarAreaController) {\n i = colorizePolarAreaDataset(dataset, i);\n } else if (controller) {\n i = colorizeDefaultDataset(dataset, i);\n }\n };\n}\nfunction containsColorsDefinitions(descriptors) {\n let k;\n for(k in descriptors){\n if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n return true;\n }\n }\n return false;\n}\nfunction containsColorsDefinition(descriptor) {\n return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\nfunction containsDefaultColorsDefenitions() {\n return _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.borderColor !== 'rgba(0,0,0,0.1)' || _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.backgroundColor !== 'rgba(0,0,0,0.1)';\n}\nvar plugin_colors = {\n id: 'colors',\n defaults: {\n enabled: true,\n forceOverride: false\n },\n beforeLayout (chart, _args, options) {\n if (!options.enabled) {\n return;\n }\n const { data: { datasets } , options: chartOptions } = chart.config;\n const { elements } = chartOptions;\n const containsColorDefenition = containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements) || containsDefaultColorsDefenitions();\n if (!options.forceOverride && containsColorDefenition) {\n return;\n }\n const colorizer = getColorizer(chart);\n datasets.forEach(colorizer);\n }\n};\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for(i = 0; i < samples - 2; i++){\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for(j = avgRangeStart; j < avgRangeEnd; j++){\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const { x: pointAx , y: pointAy } = data[a];\n maxArea = area = -1;\n for(j = rangeOffs; j < rangeTo; j++){\n area = 0.5 * Math.abs((pointAx - avgX) * (data[j].y - pointAy) - (pointAx - data[j].x) * (avgY - pointAy));\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for(i = start; i < start + count; ++i){\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(minIndex) && !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data\n });\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset)=>{\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const { iScale } = meta;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.B)(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.B)(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {\n start,\n count\n };\n}\nvar plugin_decimation = {\n id: 'decimation',\n defaults: {\n algorithm: 'min-max',\n enabled: false\n },\n beforeElementsUpdate: (chart, args, options)=>{\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex)=>{\n const { _data , indexAxis } = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a)([\n indexAxis,\n chart.options.indexAxis\n ]) === 'y') {\n return;\n }\n if (!meta.controller.supportsDecimation) {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let { start , count } = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch(options.algorithm){\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy (chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments){\n let { start , end } = segment;\n end = _findSegmentEnd(start, end, points);\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n const targetSegments = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ap)(target, bounds);\n for (const tgt of targetSegments){\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.az)(segment, points, subBounds);\n for (const fillSource of fillSources){\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === 'angle') {\n start = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.al)(start);\n end = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.al)(end);\n }\n return {\n property,\n start,\n end\n };\n}\nfunction _pointsFromSegments(boundary, line) {\n const { x =null , y =null } = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({ start , end })=>{\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({\n x: first.x,\n y\n });\n points.push({\n x: last.x,\n y\n });\n } else if (x !== null) {\n points.push({\n x,\n y: first.y\n });\n points.push({\n x,\n y: last.y\n });\n }\n });\n return points;\n}\nfunction _findSegmentEnd(start, end, points) {\n for(; end > start; end--){\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n\nfunction _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {\n tension: 0\n },\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n\nfunction _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [\n index\n ];\n let target;\n if (!propagate) {\n return fill;\n }\n while(fill !== false && visited.indexOf(fill) === -1){\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\n function _decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n return [\n 'origin',\n 'start',\n 'end',\n 'stack',\n 'shape'\n ].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n}\n function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(fill)) {\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n function _getTargetValue(fill, scale, startValue) {\n let value;\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n function parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n\nfunction _buildStackLine(source) {\n const { scale , index , line } = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({\n x: null,\n y: scale.bottom\n }, line));\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n for(let j = segment.start; j <= segment.end; j++){\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({\n points,\n options: {}\n });\n}\n function getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n for(let i = 0; i < metas.length; i++){\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n function addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for(let j = 0; j < linesBelow.length; j++){\n const line = linesBelow[j];\n const { first , last , point } = findPoint(line, sourcePoint, 'x');\n if (!point || first && last) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\n function findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ak)(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {\n first,\n last,\n point\n };\n}\n\nclass simpleArc {\n constructor(opts){\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const { x , y , radius } = this;\n bounds = bounds || {\n start: 0,\n end: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T\n };\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const { x , y , radius } = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n\nfunction _getTarget(source) {\n const { chart , fill , line } = source;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n if (fill === 'shape') {\n return true;\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return _createBoundaryLine(boundary, line);\n}\n function getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n const { scale ={} , fill } = source;\n const pixel = _getTargetPixel(fill, scale);\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(pixel)) {\n const horizontal = scale.isHorizontal();\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n return null;\n}\nfunction computeCircularBoundary(source) {\n const { scale , fill } = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for(let i = 0; i < length; ++i){\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\nfunction _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const { chart , index , line , scale , axis } = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const { above =color , below =color } = fillOption || {};\n const meta = chart.getDatasetMeta(index);\n const clip = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ah)(chart, meta);\n if (target && line.points.length) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Y)(ctx, area);\n doFill(ctx, {\n line,\n target,\n above,\n below,\n area,\n scale,\n axis,\n clip\n });\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.$)(ctx);\n }\n}\nfunction doFill(ctx, cfg) {\n const { line , target , above , below , area , scale , clip } = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n ctx.save();\n let fillColor = below;\n if (below !== above) {\n if (property === 'x') {\n clipVertical(ctx, target, area.top);\n fill(ctx, {\n line,\n target,\n color: above,\n scale,\n property,\n clip\n });\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n } else if (property === 'y') {\n clipHorizontal(ctx, target, area.left);\n fill(ctx, {\n line,\n target,\n color: below,\n scale,\n property,\n clip\n });\n ctx.restore();\n ctx.save();\n clipHorizontal(ctx, target, area.right);\n fillColor = above;\n }\n }\n fill(ctx, {\n line,\n target,\n color: fillColor,\n scale,\n property,\n clip\n });\n ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n const { segments , points } = target;\n let first = true;\n let lineLoop = false;\n ctx.beginPath();\n for (const segment of segments){\n const { start , end } = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {\n move: lineLoop\n });\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction clipHorizontal(ctx, target, clipX) {\n const { segments , points } = target;\n let first = true;\n let lineLoop = false;\n ctx.beginPath();\n for (const segment of segments){\n const { start , end } = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(clipX, firstPoint.y);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {\n move: lineLoop\n });\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(clipX, lastPoint.y);\n }\n }\n ctx.lineTo(clipX, target.first().y);\n ctx.closePath();\n ctx.clip();\n}\nfunction fill(ctx, cfg) {\n const { line , target , property , color , scale , clip } = cfg;\n const segments = _segments(line, target, property);\n for (const { source: src , target: tgt , start , end } of segments){\n const { style: { backgroundColor =color } = {} } = src;\n const notShape = target !== true;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {\n move: lineLoop,\n reverse: true\n });\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n ctx.restore();\n }\n}\nfunction clipBounds(ctx, scale, clip, bounds) {\n const chartArea = scale.chart.chartArea;\n const { property , start , end } = bounds || {};\n if (property === 'x' || property === 'y') {\n let left, top, right, bottom;\n if (property === 'x') {\n left = start;\n top = chartArea.top;\n right = end;\n bottom = chartArea.bottom;\n } else {\n left = chartArea.left;\n top = start;\n right = chartArea.right;\n bottom = end;\n }\n ctx.beginPath();\n if (clip) {\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\nvar index = {\n id: 'filler',\n afterDatasetsUpdate (chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for(i = 0; i < count; ++i){\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for(i = 0; i < count; ++i){\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw (chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw (chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw (chart, args, options) {\n const source = args.meta.$filler;\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize)=>{\n let { boxHeight =fontSize , boxWidth =fontSize } = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b)=>a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config){\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(labelOpts.generateLabels, [\n this.chart\n ], this) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item)=>labelOpts.filter(item, this.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b)=>labelOpts.sort(a, b, this.chart.data));\n }\n if (this.options.reverse) {\n legendItems.reverse();\n }\n this.legendItems = legendItems;\n }\n fit() {\n const { options , ctx } = this;\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const { boxWidth , itemHeight } = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (this.isHorizontal()) {\n width = this.maxWidth;\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight;\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const { ctx , maxWidth , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const lineWidths = this.lineWidths = [\n 0\n ];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i)=>{\n const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {\n left: 0,\n top,\n row,\n width: itemWidth,\n height: itemHeight\n };\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const { ctx , maxHeight , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let col = 0;\n this.legendItems.forEach((legendItem, i)=>{\n const { itemWidth , itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n hitboxes[i] = {\n left,\n top: currentColHeight,\n col,\n width: itemWidth,\n height: itemHeight\n };\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n return totalWidth;\n }\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const { legendHitBoxes: hitboxes , options: { align , labels: { padding } , rtl } } = this;\n const rtlHelper = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aA)(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes){\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes){\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Y)(ctx, this);\n this._draw();\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.$)(ctx);\n }\n }\n _draw() {\n const { options: opts , columnSizes , lineWidths , ctx } = this;\n const { align , labels: labelOpts } = opts;\n const defaultColor = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.color;\n const rtlHelper = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aA)(opts.rtl, this.left, this.width);\n const labelFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(labelOpts.font);\n const { padding } = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n this.drawTitle();\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const { boxWidth , boxHeight , itemHeight } = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(legendItem.lineWidth, 1);\n ctx.fillStyle = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(legendItem.fillStyle, defaultColor);\n ctx.lineCap = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(legendItem.lineDashOffset, 0);\n ctx.lineJoin = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aE)(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ay)(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aw)(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Z)(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aB)(this.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i)=>{\n ctx.strokeStyle = legendItem.fontColor;\n ctx.fillStyle = legendItem.fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(this.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aC)(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aD)(this.ctx, opts.textDirection);\n }\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(titleOpts.font);\n const titlePadding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aA)(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = this.left;\n let maxWidth = this.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(opts.align, left, this.right - maxWidth);\n } else {\n const maxHeight = this.columnSizes.reduce((acc, size)=>Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n const x = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a1)(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Z)(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(titleOpts.font);\n const titlePadding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ak)(x, this.left, this.right) && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ak)(y, this.top, this.bottom)) {\n lh = this.legendHitBoxes;\n for(i = 0; i < lh.length; ++i){\n hitBox = lh[i];\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ak)(x, hitBox.left, hitBox.left + hitBox.width) && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ak)(y, hitBox.top, hitBox.top + hitBox.height)) {\n return this.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(opts.onLeave, [\n e,\n previous,\n this\n ], this);\n }\n this._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(opts.onHover, [\n e,\n hoveredItem,\n this\n ], this);\n }\n } else if (hoveredItem) {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(opts.onClick, [\n e,\n hoveredItem,\n this\n ], this);\n }\n }\n}\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {\n itemWidth,\n itemHeight\n };\n}\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b)=>a.length > b.length ? a : b);\n }\n return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width;\n}\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: 'legend',\n _element: Legend,\n start (chart, _args, options) {\n const legend = chart.legend = new Legend({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop (chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate (chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate (chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent (chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick (e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx)=>ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels (chart) {\n const datasets = chart.data.datasets;\n const { labels: { usePointStyle , pointStyle , textAlign , color , useBorderRadius , borderRadius } } = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta)=>{\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx)=>ctx.chart.options.color,\n display: false,\n position: 'center',\n text: ''\n }\n },\n descriptors: {\n _scriptable: (name)=>!name.startsWith('on'),\n labels: {\n _scriptable: (name)=>![\n 'generateLabels',\n 'filter',\n 'sort'\n ].includes(name)\n }\n }\n};\n\nclass Title extends Element {\n constructor(config){\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const opts = this.options;\n this.left = 0;\n this.top = 0;\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n const lineCount = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(opts.text) ? opts.text.length : 1;\n this._padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(opts.padding);\n const textSize = lineCount * (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(opts.font).lineHeight + this._padding.height;\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n _drawArgs(offset) {\n const { top , left , bottom , right , options } = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, bottom, top);\n rotation = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P * -0.5;\n } else {\n titleX = right - offset;\n titleY = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a2)(align, top, bottom);\n rotation = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n }\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const { titleX , titleY , maxWidth , rotation } = this._drawArgs(offset);\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Z)(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a1)(opts.align),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: 'title',\n _element: Title,\n start (chart, _args, options) {\n createTitle(chart, options);\n },\n stop (chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate (chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold'\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n id: 'subtitle',\n start (chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n stop (chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n beforeUpdate (chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal'\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst positioners = {\n average (items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n const xAverage = [\n ...xSet\n ].reduce((a, b)=>a + b) / xSet.size;\n return {\n x: xAverage,\n y: y / count\n };\n },\n nearest (items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aF)(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\n function splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n function createTooltipItem(chart, item) {\n const { element , datasetIndex , index } = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const { label , value } = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n function getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const { body , footer , title } = tooltip;\n const { boxWidth , boxHeight } = options;\n const bodyFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(options.bodyFont);\n const titleFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(options.titleFont);\n const footerFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem)=>count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(body, (bodyItem)=>{\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(bodyItem.before, maxLineWidth);\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(bodyItem.lines, maxLineWidth);\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {\n width,\n height\n };\n}\nfunction determineYAlign(chart, size) {\n const { y , height } = size;\n if (y < height / 2) {\n return 'top';\n } else if (y > chart.height - height / 2) {\n return 'bottom';\n }\n return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const { x , width } = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const { x , width } = size;\n const { width: chartWidth , chartArea: { left , right } } = chart;\n let xAlign = 'center';\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n return xAlign;\n}\n function determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let { x , width } = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= width / 2;\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let { y , height } = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= height / 2;\n }\n return y;\n}\n function getBackgroundPoint(options, size, alignment, chart) {\n const { caretSize , caretPadding , cornerRadius } = options;\n const { xAlign , yAlign } = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const { topLeft , topRight , bottomLeft , bottomRight } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ay)(cornerRadius);\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n return {\n x: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(x, 0, chart.width - size.width),\n y: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(options.padding);\n return align === 'center' ? tooltip.x + tooltip.width / 2 : align === 'right' ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left;\n}\n function getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.j)(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nconst defaultCallbacks = {\n beforeTitle: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aG,\n title (tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return '';\n },\n afterTitle: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aG,\n beforeBody: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aG,\n beforeLabel: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aG,\n label (tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || '';\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(value)) {\n label += value;\n }\n return label;\n },\n labelColor (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0\n };\n },\n labelTextColor () {\n return this.options.bodyColor;\n },\n labelPointStyle (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation\n };\n },\n afterLabel: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aG,\n afterBody: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aG,\n beforeFooter: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aG,\n footer: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aG,\n afterFooter: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aG\n};\n function invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n return result;\n}\nclass Tooltip extends Element {\n static positioners = positioners;\n constructor(config){\n super();\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n getTitle(context, options) {\n const { callbacks } = options;\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems));\n }\n getBody(tooltipItems, options) {\n const { callbacks } = options;\n const bodyItems = [];\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(tooltipItems, (context)=>{\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems));\n }\n getFooter(tooltipItems, options) {\n const { callbacks } = options;\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for(i = 0, len = active.length; i < len; ++i){\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array)=>options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b)=>options.itemSort(a, b, data));\n }\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(tooltipItems, (context)=>{\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n if (changed && options.external) {\n options.external.call(this, {\n chart: this.chart,\n tooltip: this,\n replay\n });\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const { xAlign , yAlign } = this;\n const { caretSize , cornerRadius } = options;\n const { topLeft , topRight , bottomLeft , bottomRight } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ay)(cornerRadius);\n const { x: ptX , y: ptY } = tooltipPoint;\n const { width , height } = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === 'center') {\n y2 = ptY + height / 2;\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {\n x1,\n x2,\n x3,\n y1,\n y2,\n y3\n };\n }\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aA)(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n titleFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const { boxHeight , boxWidth } = options;\n const bodyFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.av)(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.av)(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.i)(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1;\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ay)(labelColor.borderRadius);\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aw)(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aw)(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = this.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const { body } = this;\n const { bodySpacing , bodyAlign , displayColors , boxHeight , boxWidth , boxPadding } = options;\n const bodyFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aA)(options.rtl, this.x, this.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(this.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0;\n for(i = 0, ilen = body.length; i < ilen; ++i){\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n ctx.fillStyle = textColor;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for(j = 0, jlen = lines.length; j < jlen; ++j){\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.F)(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aA)(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n footerFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const { xAlign , yAlign } = this;\n const { x , y } = pt;\n const { width , height } = tooltipSize;\n const { topLeft , topRight , bottomLeft , bottomRight } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ay)(options.cornerRadius);\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n _willRender() {\n return !!this.opacity;\n }\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n if (!opacity) {\n return;\n }\n this._updateAnimationTarget(options);\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(options.padding);\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n this.drawBackground(pt, ctx, tooltipSize, options);\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aB)(ctx, options.textDirection);\n pt.y += padding.top;\n this.drawTitle(pt, ctx, options);\n this.drawBody(pt, ctx, options);\n this.drawFooter(pt, ctx, options);\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aD)(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ai)(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n const positionChanged = this._positionChanged(active, e);\n const changed = replay || !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ai)(active, lastActive) || positionChanged;\n if (changed) {\n this._active = active;\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n this.update(true, replay);\n }\n }\n return changed;\n }\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive.filter((i)=>this.chart.data.datasets[i.datasetIndex] && this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined);\n }\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n return active;\n }\n _positionChanged(active, e) {\n const { caretX , caretY , options } = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nvar plugin_tooltip = {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n afterInit (chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({\n chart,\n options\n });\n }\n },\n beforeUpdate (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw (chart) {\n const tooltip = chart.tooltip;\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', {\n ...args,\n cancelable: true\n }) === false) {\n return;\n }\n tooltip.draw(chart.ctx);\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n afterEvent (chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold'\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {},\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold'\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts)=>opts.bodyFont.size,\n boxWidth: (ctx, opts)=>opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart'\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'width',\n 'height',\n 'caretX',\n 'caretY'\n ]\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n descriptors: {\n _scriptable: (name)=>name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n additionalOptionScopes: [\n 'interaction'\n ]\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nColors: plugin_colors,\nDecimation: plugin_decimation,\nFiller: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels)=>{\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({\n index,\n label: raw\n });\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max)=>index === null ? null : (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(Math.round(index), 0, max);\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\nclass CategoryScale extends Scale {\n static id = 'category';\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n constructor(cfg){\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const { index , label } of added){\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n parse(raw, index) {\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this.getMinMax(true);\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1);\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n for(let value = min; value <= max; value++){\n ticks.push({\n value\n });\n }\n return ticks;\n }\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n configure() {\n super.configure();\n if (!this.isHorizontal()) {\n this._reversePixels = !this._reversePixels;\n }\n }\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const { bounds , step , min , max , precision , count , maxTicks , maxDigits , includeBounds } = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const { min: rmin , max: rmax } = dataRange;\n const minDefined = !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(min);\n const maxDefined = !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(max);\n const countDefined = !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aI)((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [\n {\n value: rmin\n },\n {\n value: rmax\n }\n ];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aI)(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aJ)((max - min) / step, spacing / 1000)) {\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aK)(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aL)(spacing), (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aL)(niceMin));\n factor = Math.pow(10, (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({\n value: min\n });\n if (niceMin < min) {\n j++;\n }\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aK)(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for(; j < numSpaces; ++j){\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({\n value: tickValue\n });\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (ticks.length && (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aK)(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({\n value: max\n });\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({\n value: niceMax\n });\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, { horizontal , minRotation }) {\n const rad = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const { beginAtZero } = this.options;\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (beginAtZero) {\n const minSign = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.s)(min);\n const maxSign = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.s)(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n setMax(max + offset);\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n getTickLimit() {\n const tickOpts = this.options.ticks;\n let { maxTicksLimit , stepSize } = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aH)(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n super.configure();\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n getLabelForValue(value) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.o)(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n static id = 'linear';\n static defaults = {\n ticks: {\n callback: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aM.formatters.numeric\n }\n };\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(min) ? min : 0;\n this.max = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(max) ? max : 1;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n\nconst log10Floor = (v)=>Math.floor((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aN)(v));\nconst changeExponent = (v, m)=>Math.pow(10, log10Floor(v) + m);\nfunction isMajor(tickVal) {\n const remain = tickVal / Math.pow(10, log10Floor(tickVal));\n return remain === 1;\n}\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while(steps(min, max, rangeExp) > 10){\n rangeExp++;\n }\n while(steps(min, max, rangeExp) < 10){\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n function generateTicks(generationOptions, { min , max }) {\n min = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while(value < max){\n ticks.push({\n value,\n major: isMajor(value),\n significand\n });\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.O)(generationOptions.max, value);\n ticks.push({\n value: lastTick,\n major: isMajor(lastTick),\n significand\n });\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n static id = 'logarithmic';\n static defaults = {\n ticks: {\n callback: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aM.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [\n raw,\n index\n ]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(min) ? Math.max(0, min) : null;\n this.max = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(max) ? Math.max(0, max) : null;\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n if (this._zero && this.min !== this._suggestedMin && !(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n this.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n setMax(changeExponent(min, +1));\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const opts = this.options;\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n if (opts.bounds === 'ticks') {\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aH)(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? '0' : (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.o)(value, this.chart.options.locale, this.options.ticks.format);\n }\n configure() {\n const start = this.min;\n super.configure();\n this._startValue = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aN)(start);\n this._valueRange = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aN)(this.max) - (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aN)(start);\n }\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min ? 0 : ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aN)(value) - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(tickOpts.backdropPadding);\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(tickOpts.font && tickOpts.font.size, _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.d.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n label = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.b)(label) ? label : [\n label\n ];\n return {\n w: (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aO)(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - size / 2,\n end: pos + size / 2\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\n function fitWithPointLabels(scale) {\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P / valueCount : 0;\n for(let i = 0; i < valueCount; i++){\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.al)(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.U)(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b);\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const { extra , additionalAngle , padding , size } = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.U)((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.al)(pointLabelPosition.angle + _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n visible: true,\n x: pointLabelPosition.x,\n y,\n textAlign,\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const { left , top , right , bottom } = item;\n const apexesInArea = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.C)({\n x: left,\n y: top\n }, area) || (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.C)({\n x: left,\n y: bottom\n }, area) || (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.C)({\n x: right,\n y: top\n }, area) || (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.C)({\n x: right,\n y: bottom\n }, area);\n return !apexesInArea;\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const { centerPointLabels , display } = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.P / valueCount : 0\n };\n let area;\n for(let i = 0; i < valueCount; i++){\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= w / 2;\n }\n return x;\n}\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= h / 2;\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\nfunction drawPointLabelBox(ctx, opts, item) {\n const { left , top , right , bottom } = item;\n const { backdropColor } = opts;\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(backdropColor)) {\n const borderRadius = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ay)(opts.borderRadius);\n const padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aw)(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\nfunction drawPointLabels(scale, labelCount) {\n const { ctx , options: { pointLabels } } = scale;\n for(let i = labelCount - 1; i >= 0; i--){\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(optsAtIndex.font);\n const { x , y , textAlign } = item;\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Z)(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n });\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const { ctx } = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for(let i = 1; i < labelCount; i++){\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const { color , lineWidth } = gridLineOpts;\n if (!circular && !labelCount || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.j)(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\nclass RadialLinearScale extends LinearScaleBase {\n static id = 'radialLinear';\n static defaults = {\n display: true,\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aM.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback (label) {\n return label;\n },\n padding: 5,\n centerPointLabels: false\n }\n };\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n constructor(cfg){\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const padding = this._padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(false);\n this.min = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(min) && !isNaN(min) ? min : 0;\n this.max = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(max) && !isNaN(max) ? max : 0;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n this._pointLabels = this.getLabels().map((value, index)=>{\n const label = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(this.options.pointLabels.callback, [\n value,\n index\n ], this);\n return label || label === 0 ? label : '';\n }).filter((v, i)=>this.chart.getDataVisibility(i));\n }\n fit() {\n const opts = this.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n getIndexAngle(index) {\n const angleMultiplier = _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.T / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.al)(index * angleMultiplier + (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(value)) {\n return NaN;\n }\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(distance)) {\n return NaN;\n }\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - _chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.H + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const { left , top , right , bottom } = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom\n };\n }\n drawBackground() {\n const { backgroundColor , grid: { circular } } = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const { angleLines , grid , border } = opts;\n const labelCount = this._pointLabels.length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n if (grid.display) {\n this.ticks.forEach((tick, index)=>{\n if (index !== 0 || index === 0 && this.min < 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for(i = labelCount - 1; i >= 0; i--){\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const { color , lineWidth } = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n this.ticks.forEach((tick, index)=>{\n if (index === 0 && this.min >= 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.a0)(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.E)(optsAtIndex.backdropPadding);\n ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height);\n }\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Z)(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\n\nconst INTERVALS = {\n millisecond: {\n common: true,\n size: 1,\n steps: 1000\n },\n second: {\n common: true,\n size: 1000,\n steps: 60\n },\n minute: {\n common: true,\n size: 60000,\n steps: 60\n },\n hour: {\n common: true,\n size: 3600000,\n steps: 24\n },\n day: {\n common: true,\n size: 86400000,\n steps: 30\n },\n week: {\n common: false,\n size: 604800000,\n steps: 4\n },\n month: {\n common: true,\n size: 2.628e9,\n steps: 12\n },\n quarter: {\n common: false,\n size: 7.884e9,\n steps: 4\n },\n year: {\n common: true,\n size: 3.154e10\n }\n};\n const UNITS = /* #__PURE__ */ Object.keys(INTERVALS);\n function sorter(a, b) {\n return a - b;\n}\n function parse(scale, input) {\n if ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.k)(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const { parser , round , isoWeekday } = scale._parseOpts;\n let value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n if (!(0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(value)) {\n value = typeof parser === 'string' ? adapter.parse(value, parser) : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === 'week' && ((0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.x)(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, 'isoWeek', isoWeekday) : adapter.startOf(value, round);\n }\n return +value;\n}\n function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for(let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i){\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\n function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for(let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--){\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n function determineMajorUnit(unit) {\n for(let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i){\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n function addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const { lo , hi } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aQ)(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n function setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for(major = first; major <= last; major = +adapter.add(major, 1, majorUnit)){\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n function ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for(i = 0; i < ilen; ++i){\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n static id = 'time';\n static defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n source: 'auto',\n callback: false,\n major: {\n enabled: false\n }\n }\n };\n constructor(props){\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = 'day';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n adapter.init(opts);\n (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.ab)(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(this._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n min = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.g)(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {\n min,\n max\n };\n }\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n const min = this.min;\n const max = this.max;\n const ticks = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.aP)(timestamps, min, max);\n this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n afterAutoSkip() {\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map((tick)=>+tick.value));\n }\n }\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(start, 0, limit);\n end = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.S)(end, 0, limit);\n this._offsets = {\n start,\n end,\n factor: 1 / (start + 1 + end)\n };\n }\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.v)(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.x)(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for(time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++){\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort(sorter).map((x)=>+x);\n }\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n if (formatter) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.Q)(formatter, [\n time,\n index,\n ticks\n ], this);\n }\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.t)(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n return {\n w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,\n h: tickLabelWidth * sinRotation + tickFontSize * cosRotation\n };\n }\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [\n exampleTime\n ], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = this.getMatchingVisibleMetas();\n if (this._normalized && metas.length) {\n return this._cache.data = metas[0].controller.getAllParsedValues(this);\n }\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n return this._cache.data = this.normalize(timestamps);\n }\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = this.getLabels();\n for(i = 0, ilen = labels.length; i < ilen; ++i){\n timestamps.push(parse(this, labels[i]));\n }\n return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps);\n }\n normalize(values) {\n return (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__._)(values.sort(sorter));\n }\n}\n\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({ lo , hi } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.B)(table, 'pos', val));\n }\n ({ pos: prevSource , time: prevTarget } = table[lo]);\n ({ pos: nextSource , time: nextTarget } = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({ lo , hi } = (0,_chunks_helpers_dataset_js__WEBPACK_IMPORTED_MODULE_0__.B)(table, 'time', val));\n }\n ({ time: prevSource , pos: prevTarget } = table[lo]);\n ({ time: nextSource , pos: nextTarget } = table[hi]);\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n static id = 'timeseries';\n static defaults = TimeScale.defaults;\n constructor(props){\n super(props);\n this._table = [];\n this._minPos = undefined;\n this._tableRange = undefined;\n }\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const { min , max } = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n for(i = 0, ilen = timestamps.length; i < ilen; ++i){\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n if (items.length < 2) {\n return [\n {\n time: min,\n pos: 0\n },\n {\n time: max,\n pos: 1\n }\n ];\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({\n time: curr,\n pos: i / (ilen - 1)\n });\n }\n }\n return table;\n }\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b)=>a - b);\n }\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n return timestamps;\n }\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n controllers,\n elements,\n plugins,\n scales\n];\n\n\n//# sourceMappingURL=chart.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxVQUFVO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFVBQVU7QUFDN0Q7QUFDQTtBQUNBLDRCQUE0Qiw2REFBWTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNB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LG1CQUFtQixXQUFXO0FBQzlCO0FBQ0E7QUFDQSx1QkFBdUIsbUJBQW1CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EscURBQXFELDZEQUFTO0FBQzlEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUseURBQTJCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixtQkFBbUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixtQkFBbUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxn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Q0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsNkRBQVk7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Ysa0NBQWtDLDZEQUFZO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHlEQUE0QjtBQUN6RDtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFNBQVMsRUFBRSw2REFBbUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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YztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsVUFBVSxhQUFhO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsNkRBQU87QUFDZjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLDZEQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw2REFBUTtBQUNoQjtBQUNBO0FBQ0E7QUFDQSxRQUFRLDZEQUFjO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNLFNBQVMsNkRBQVE7QUFDdkI7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU0sU0FBUyw2REFBUTtBQUN2QjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNkRBQWM7QUFDN0I7QUFDQTtB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QWtCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsU0FBUztBQUNoRDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsOERBQXFCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw2REFBTztBQUNuQjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGtDQUFrQztBQUM5QztBQUNBLFlBQVksaUJBQWlCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHlCQUF5QjtBQUNyQyxZQUFZLHdCQUF3QjtBQUNwQyxxQkFBcUIsOERBQU07QUFDM0Isc0JBQXNCLDhEQUFNO0FBQzVCLHVCQUF1Qiw4REFBTTtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsNkRBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksNkRBQUk7QUFDUjtBQUNBLElBQUksNkRBQUk7QUFDUjtBQUNBLElBQUksNkRBQUk7QUFDUixRQUFRLDZEQUFJO0FBQ1osUUFBUSw2REFBSTtBQUNaLFFBQVEsNkRBQUk7QUFDWixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksNkRBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxjQUFjO0FBQzFCO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGFBQWE7QUFDekIsWUFBWSxpQ0FBaUMsbUJBQW1CO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGFBQWE7QUFDdkI7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxjQUFjO0FBQ3hCO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksMkNBQTJDO0FBQ3ZELFlBQVksbUJBQW1CO0FBQy9CO0FBQ0EsWUFBWSxpREFBaUQsRUFBRSw4REFBYTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsV0FBVyw2REFBVztBQUN0QixXQUFXLDZEQUFXO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw2REFBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDZEQUFhO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMERBQUk7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsZ0JBQWdCLDBEQUFJO0FBQ3BCLGdCQUFnQiwwREFBSTtBQUNwQixpQkFBaUIsMERBQUk7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSw2REFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGdCQUFnQiwwREFBSTtBQUNwQixlQUFlLDBEQUFJO0FBQ25CLGtCQUFrQiwwREFBSTtBQUN0QixZQUFZLDBEQUFJO0FBQ2hCLGlCQUFpQiwwREFBSTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsYUFBYTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixhQUFhO0FBQzdCO0FBQ0EsUUFBUSw2REFBSTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixhQUFhO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw2REFBSTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG1CQUFtQjtBQUNuQyxnQkFBZ0IsNEJBQTRCO0FBQzVDLGdCQUFnQixpREFBaUQsRUFBRSw4REFBYTtBQUNoRixnQkFBZ0IsbUJBQW1CO0FBQ25DLGdCQUFnQixrQkFBa0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsOERBQWE7QUFDM0M7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDhEQUFNO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixZQUFZO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isd0JBQXdCO0FBQ3hDLHlCQUF5Qiw4REFBTTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDhEQUFTO0FBQ3JCO0FBQ0E7QUFDQSxZQUFZLDhEQUFTO0FBQ3JCLFVBQVU7QUFDViw0QkFBNEIsNkRBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw4REFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsOERBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsOERBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QixnQkFBZ0IsK0VBQStFO0FBQy9GLHlCQUF5Qiw4REFBTTtBQUMvQjtBQUNBO0FBQ0EsMEJBQTBCLDhEQUFhO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLDZEQUFJO0FBQ1o7QUFDQSx1Q0FBdUMsVUFBVTtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZEQUFJO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsVUFBVTtBQUN0RDtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZEQUFJO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLFFBQVEsNkRBQUk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qiw4REFBYTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw4REFBTTtBQUMvQjtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG1CQUFtQjtBQUNuQyxnQkFBZ0IsU0FBUztBQUN6QixnQkFBZ0Isa0JBQWtCO0FBQ2xDLGdCQUFnQixpREFBaUQsRUFBRSw4REFBYTtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw2REFBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw4REFBcUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDhEQUFvQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHVCQUF1QjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QseUJBQXlCLDhEQUFjO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsOERBQWM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDZCQUE2QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELDZEQUFXO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixpQkFBaUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw2REFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSwrRkFBK0YsNkRBQWM7QUFDN0c7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDJCQUEyQjtBQUMzQyxjQUFjLGFBQWE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixjQUFjO0FBQzNDO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHdGQUF3RjtBQUNwRztBQUNBO0FBQ0EsWUFBWSx5QkFBeUI7QUFDckMsd0JBQXdCLDZEQUFhO0FBQ3JDLHdCQUF3Qiw2REFBYTtBQUNyQywwQkFBMEIsNkRBQWE7QUFDdkM7QUFDQSxrQkFBa0IsOERBQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw4REFBTztBQUN6QjtBQUNBLFNBQVMsNkRBQWE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDRDQUE0Qyw4REFBVztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLFlBQVksOERBQVk7QUFDeEI7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDhEQUFjLFdBQVcsOERBQWM7QUFDMUUsMEJBQTBCLDZEQUFhO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw4REFBWTtBQUM1QjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZUFBZTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLDRCQUE0Qiw4REFBWTtBQUN4QztBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELDJCQUEyQjtBQUMzRSxnQkFBZ0IsNkRBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNkRBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixlQUFlO0FBQy9CLGdCQUFnQiwyQkFBMkI7QUFDM0MsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qiw2REFBSTtBQUNoQyw0QkFBNEIsNkRBQUk7QUFDaEM7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLDRCQUE0QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxRQUFRLG1CQUFtQixVQUFVLGdDQUFnQyxVQUFVO0FBQ3RIO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksOERBQWtCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNkRBQVk7QUFDM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwwREFBSztBQUMzQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsYUFBYTtBQUM3QixtQkFBbUIsNkRBQWM7QUFDakMsbUJBQW1CLDZEQUFjO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsNkRBQVM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsOERBQUs7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsWUFBWTtBQUN6RCxVQUFVLDZEQUFlO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw2REFBZTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDZEQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwwREFBSztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDZEQUFjO0FBQzdCO0FBQ0E7QUFDQSxnQkFBZ0IsYUFBYTtBQUM3QixtQkFBbUIsNkRBQWM7QUFDakMsbUJBQW1CLDZEQUFjO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCw2REFBYztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDJCQUEyQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksOERBQWtCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLDZEQUFZO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDhEQUFLO0FBQ2hDLDJCQUEyQiw4REFBSyxhQUFhLDhEQUFLO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUUsOERBQUs7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw2REFBUztBQUNqQyxlQUFlLDZEQUFjLHNDQUFzQyx5REFBUTtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNkRBQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0EsV0FBVyw4REFBWTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCx5REFBRTtBQUNqRSxtQkFBbUIsZ0JBQWdCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qiw4REFBTTtBQUM3QjtBQUNBO0FBQ0EsNkJBQTZCLDhEQUFlO0FBQzVDLGlDQUFpQyw2REFBUztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNENBQTRDO0FBQ3hEO0FBQ0EsNkJBQTZCLDZEQUFTLENBQUMsOERBQWUsNEJBQTRCLHlEQUFPO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksK0JBQStCO0FBQzNDLHlCQUF5Qiw2REFBYztBQUN2QztBQUNBO0FBQ0EsS0FBSyxXQUFXLDZEQUFjO0FBQzlCO0FBQ0E7QUFDQSxLQUFLLFdBQVcsNkRBQWM7QUFDOUI7QUFDQTtBQUNBLEtBQUssV0FBVyw2REFBYztBQUM5QjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksK0JBQStCO0FBQzNDO0FBQ0E7QUFDQSw2Q0FBNkMseURBQUU7QUFDL0M7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksK0JBQStCO0FBQzNDLFlBQVksaUJBQWlCO0FBQzdCLFNBQVMsNkRBQWE7QUFDdEIsNkJBQTZCLDhEQUFhO0FBQzFDLHdCQUF3Qiw2REFBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksOERBQWtCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksaUJBQWlCLGtCQUFrQjtBQUMvQyxnQ0FBZ0MsUUFBUTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsOERBQU07QUFDN0IsZ0JBQWdCLHFCQUFxQjtBQUNyQyxRQUFRLDZEQUFVO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQSx5REFBeUQseURBQUc7QUFDNUQsTUFBTTtBQUNOO0FBQ0E7QUFDQSx1QkFBdUIsZ0JBQWdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFCQUFxQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDZEQUFhO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMERBQUs7QUFDM0IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsNkRBQVM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsYUFBYTtBQUM3QixtQkFBbUIsNkRBQWM7QUFDakMsbUJBQW1CLDZEQUFjO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsNkRBQVE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MseURBQUc7QUFDbkM7QUFDQSxlQUFlLDhEQUFlLDJCQUEyQiw2REFBUztBQUNsRTtBQUNBO0FBQ0EsWUFBWSw2REFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZEQUFhO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELHlEQUFPO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLCtCQUErQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDBCQUEwQixlQUFlO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsOEJBQThCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFFBQVE7QUFDNUM7QUFDQSx3QkFBd0IscUJBQXFCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDhEQUFNO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsNkRBQVM7QUFDekM7QUFDQTtBQUNBLFlBQVksNkRBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw2REFBYTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxZQUFZLCtCQUErQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsNkRBQWM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDZEQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsY0FBYztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsNkJBQTZCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsVUFBVTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGdCQUFnQixXQUFXLEVBQUUsOERBQU87QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGVBQWU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ0EsUUFBUSw4REFBTztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHVDQUF1QztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyw2REFBYztBQUM1QixjQUFjLDZEQUFjO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw4REFBYztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw2REFBVztBQUMzQixjQUFjLDZEQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDZEQUFjO0FBQ3ZDO0FBQ0EsMkJBQTJCLDZEQUFRO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsWUFBWTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDZEQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFVBQVU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw2REFBUztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFVBQVU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxVQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDZEQUFZO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxXQUFXLEVBQUUsNkRBQVk7QUFDeEM7QUFDQSxXQUFXLHNDQUFzQztBQUNqRCxXQUFXLHNDQUFzQztBQUNqRCxNQUFNO0FBQ047QUFDQSxlQUFlLFdBQVcsRUFBRSw2REFBWTtBQUN4QztBQUNBLFdBQVcsc0NBQXNDO0FBQ2pELFdBQVcsc0NBQXNDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixhQUFhO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxVQUFVO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxVQUFVO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUUrdEI7QUFDL3RCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXJjaGl0ZWN0dWktaHRtbC1mcmVlLy4vbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL2Rpc3QvY2hhcnQuanM/M2I1MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENoYXJ0LmpzIHY0LjUuMVxuICogaHR0cHM6Ly93d3cuY2hhcnRqcy5vcmdcbiAqIChjKSAyMDI1IENoYXJ0LmpzIENvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlXG4gKi9cbmltcG9ydCB7IHIgYXMgcmVxdWVzdEFuaW1GcmFtZSwgYSBhcyByZXNvbHZlLCBlIGFzIGVmZmVjdHMsIGMgYXMgY29sb3IsIGkgYXMgaXNPYmplY3QsIGQgYXMgZGVmYXVsdHMsIGIgYXMgaXNBcnJheSwgdiBhcyB2YWx1ZU9yRGVmYXVsdCwgdSBhcyB1bmxpc3RlbkFycmF5RXZlbnRzLCBsIGFzIGxpc3RlbkFycmF5RXZlbnRzLCBmIGFzIHJlc29sdmVPYmplY3RLZXksIGcgYXMgaXNOdW1iZXJGaW5pdGUsIGggYXMgZGVmaW5lZCwgcyBhcyBzaWduLCBqIGFzIGNyZWF0ZUNvbnRleHQsIGsgYXMgaXNOdWxsT3JVbmRlZiwgXyBhcyBfYXJyYXlVbmlxdWUsIHQgYXMgdG9SYWRpYW5zLCBtIGFzIHRvUGVyY2VudGFnZSwgbiBhcyB0b0RpbWVuc2lvbiwgVCBhcyBUQVUsIG8gYXMgZm9ybWF0TnVtYmVyLCBwIGFzIF9hbmdsZUJldHdlZW4sIEggYXMgSEFMRl9QSSwgUCBhcyBQSSwgcSBhcyBfZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50cywgdyBhcyBfc2NhbGVSYW5nZXNDaGFuZ2VkLCB4IGFzIGlzTnVtYmVyLCB5IGFzIF9wYXJzZU9iamVjdERhdGFSYWRpYWxTY2FsZSwgeiBhcyBnZXRSZWxhdGl2ZVBvc2l0aW9uLCBBIGFzIF9ybG9va3VwQnlLZXksIEIgYXMgX2xvb2t1cEJ5S2V5LCBDIGFzIF9pc1BvaW50SW5BcmVhLCBEIGFzIGdldEFuZ2xlRnJvbVBvaW50LCBFIGFzIHRvUGFkZGluZywgRiBhcyBlYWNoLCBHIGFzIGdldE1heGltdW1TaXplLCBJIGFzIF9nZXRQYXJlbnROb2RlLCBKIGFzIHJlYWRVc2VkU2l6ZSwgSyBhcyBzdXBwb3J0c0V2ZW50TGlzdGVuZXJPcHRpb25zLCBMIGFzIHRocm90dGxlZCwgTSBhcyBfaXNEb21TdXBwb3J0ZWQsIE4gYXMgX2ZhY3Rvcml6ZSwgTyBhcyBmaW5pdGVPckRlZmF1bHQsIFEgYXMgY2FsbGJhY2ssIFIgYXMgX2FkZEdyYWNlLCBTIGFzIF9saW1pdFZhbHVlLCBVIGFzIHRvRGVncmVlcywgViBhcyBfbWVhc3VyZVRleHQsIFcgYXMgX2ludDE2UmFuZ2UsIFggYXMgX2FsaWduUGl4ZWwsIFkgYXMgY2xpcEFyZWEsIFogYXMgcmVuZGVyVGV4dCwgJCBhcyB1bmNsaXBBcmVhLCBhMCBhcyB0b0ZvbnQsIGExIGFzIF90b0xlZnRSaWdodENlbnRlciwgYTIgYXMgX2FsaWduU3RhcnRFbmQsIGEzIGFzIG92ZXJyaWRlcywgYTQgYXMgbWVyZ2UsIGE1IGFzIF9jYXBpdGFsaXplLCBhNiBhcyBkZXNjcmlwdG9ycywgYTcgYXMgaXNGdW5jdGlvbiwgYTggYXMgX2F0dGFjaENvbnRleHQsIGE5IGFzIF9jcmVhdGVSZXNvbHZlciwgYWEgYXMgX2Rlc2NyaXB0b3JzLCBhYiBhcyBtZXJnZUlmLCBhYyBhcyB1aWQsIGFkIGFzIGRlYm91bmNlLCBhZSBhcyByZXRpbmFTY2FsZSwgYWYgYXMgY2xlYXJDYW52YXMsIGFnIGFzIHNldHNFcXVhbCwgYWggYXMgZ2V0RGF0YXNldENsaXBBcmVhLCBhaSBhcyBfZWxlbWVudHNFcXVhbCwgYWogYXMgX2lzQ2xpY2tFdmVudCwgYWsgYXMgX2lzQmV0d2VlbiwgYWwgYXMgX25vcm1hbGl6ZUFuZ2xlLCBhbSBhcyBfcmVhZFZhbHVlVG9Qcm9wcywgYW4gYXMgX3VwZGF0ZUJlemllckNvbnRyb2xQb2ludHMsIGFvIGFzIF9jb21wdXRlU2VnbWVudHMsIGFwIGFzIF9ib3VuZFNlZ21lbnRzLCBhcSBhcyBfc3RlcHBlZEludGVycG9sYXRpb24sIGFyIGFzIF9iZXppZXJJbnRlcnBvbGF0aW9uLCBhcyBhcyBfcG9pbnRJbkxpbmUsIGF0IGFzIF9zdGVwcGVkTGluZVRvLCBhdSBhcyBfYmV6aWVyQ3VydmVUbywgYXYgYXMgZHJhd1BvaW50LCBhdyBhcyBhZGRSb3VuZGVkUmVjdFBhdGgsIGF4IGFzIHRvVFJCTCwgYXkgYXMgdG9UUkJMQ29ybmVycywgYXogYXMgX2JvdW5kU2VnbWVudCwgYUEgYXMgZ2V0UnRsQWRhcHRlciwgYUIgYXMgb3ZlcnJpZGVUZXh0RGlyZWN0aW9uLCBhQyBhcyBfdGV4dFgsIGFEIGFzIHJlc3RvcmVUZXh0RGlyZWN0aW9uLCBhRSBhcyBkcmF3UG9pbnRMZWdlbmQsIGFGIGFzIGRpc3RhbmNlQmV0d2VlblBvaW50cywgYUcgYXMgbm9vcCwgYUggYXMgX3NldE1pbkFuZE1heEJ5S2V5LCBhSSBhcyBuaWNlTnVtLCBhSiBhcyBhbG1vc3RXaG9sZSwgYUsgYXMgYWxtb3N0RXF1YWxzLCBhTCBhcyBfZGVjaW1hbFBsYWNlcywgYU0gYXMgVGlja3MsIGFOIGFzIGxvZzEwLCBhTyBhcyBfbG9uZ2VzdFRleHQsIGFQIGFzIF9maWx0ZXJCZXR3ZWVuLCBhUSBhcyBfbG9va3VwIH0gZnJvbSAnLi9jaHVua3MvaGVscGVycy5kYXRhc2V0LmpzJztcbmltcG9ydCAnQGt1cmtsZS9jb2xvcic7XG5cbmNsYXNzIEFuaW1hdG9yIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY2hhcnRzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2xhc3REYXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiBfbm90aWZ5KGNoYXJ0LCBhbmltcywgZGF0ZSwgdHlwZSkge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSBhbmltcy5saXN0ZW5lcnNbdHlwZV07XG4gICAgICAgIGNvbnN0IG51bVN0ZXBzID0gYW5pbXMuZHVyYXRpb247XG4gICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKChmbik9PmZuKHtcbiAgICAgICAgICAgICAgICBjaGFydCxcbiAgICAgICAgICAgICAgICBpbml0aWFsOiBhbmltcy5pbml0aWFsLFxuICAgICAgICAgICAgICAgIG51bVN0ZXBzLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTdGVwOiBNYXRoLm1pbihkYXRlIC0gYW5pbXMuc3RhcnQsIG51bVN0ZXBzKVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiBfcmVmcmVzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcmVxdWVzdCA9IHJlcXVlc3RBbmltRnJhbWUuY2FsbCh3aW5kb3csICgpPT57XG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3J1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiBfdXBkYXRlKGRhdGUgPSBEYXRlLm5vdygpKSB7XG4gICAgICAgIGxldCByZW1haW5pbmcgPSAwO1xuICAgICAgICB0aGlzLl9jaGFydHMuZm9yRWFjaCgoYW5pbXMsIGNoYXJ0KT0+e1xuICAgICAgICAgICAgaWYgKCFhbmltcy5ydW5uaW5nIHx8ICFhbmltcy5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IGFuaW1zLml0ZW1zO1xuICAgICAgICAgICAgbGV0IGkgPSBpdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgbGV0IGRyYXcgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBpdGVtO1xuICAgICAgICAgICAgZm9yKDsgaSA+PSAwOyAtLWkpe1xuICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5fYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLl90b3RhbCA+IGFuaW1zLmR1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltcy5kdXJhdGlvbiA9IGl0ZW0uX3RvdGFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0udGljayhkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgZHJhdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV0gPSBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRyYXcpIHtcbiAgICAgICAgICAgICAgICBjaGFydC5kcmF3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGNoYXJ0LCBhbmltcywgZGF0ZSwgJ3Byb2dyZXNzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGFuaW1zLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZnkoY2hhcnQsIGFuaW1zLCBkYXRlLCAnY29tcGxldGUnKTtcbiAgICAgICAgICAgICAgICBhbmltcy5pbml0aWFsID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZW1haW5pbmcgKz0gaXRlbXMubGVuZ3RoO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbGFzdERhdGUgPSBkYXRlO1xuICAgICAgICBpZiAocmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gX2dldEFuaW1zKGNoYXJ0KSB7XG4gICAgICAgIGNvbnN0IGNoYXJ0cyA9IHRoaXMuX2NoYXJ0cztcbiAgICAgICAgbGV0IGFuaW1zID0gY2hhcnRzLmdldChjaGFydCk7XG4gICAgICAgIGlmICghYW5pbXMpIHtcbiAgICAgICAgICAgIGFuaW1zID0ge1xuICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGluaXRpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgICAgIGxpc3RlbmVyczoge1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogW10sXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjaGFydHMuc2V0KGNoYXJ0LCBhbmltcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFuaW1zO1xuICAgIH1cbiBsaXN0ZW4oY2hhcnQsIGV2ZW50LCBjYikge1xuICAgICAgICB0aGlzLl9nZXRBbmltcyhjaGFydCkubGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNiKTtcbiAgICB9XG4gYWRkKGNoYXJ0LCBpdGVtcykge1xuICAgICAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9nZXRBbmltcyhjaGFydCkuaXRlbXMucHVzaCguLi5pdGVtcyk7XG4gICAgfVxuIGhhcyhjaGFydCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QW5pbXMoY2hhcnQpLml0ZW1zLmxlbmd0aCA+IDA7XG4gICAgfVxuIHN0YXJ0KGNoYXJ0KSB7XG4gICAgICAgIGNvbnN0IGFuaW1zID0gdGhpcy5fY2hhcnRzLmdldChjaGFydCk7XG4gICAgICAgIGlmICghYW5pbXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhbmltcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgYW5pbXMuc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBhbmltcy5kdXJhdGlvbiA9IGFuaW1zLml0ZW1zLnJlZHVjZSgoYWNjLCBjdXIpPT5NYXRoLm1heChhY2MsIGN1ci5fZHVyYXRpb24pLCAwKTtcbiAgICAgICAgdGhpcy5fcmVmcmVzaCgpO1xuICAgIH1cbiAgICBydW5uaW5nKGNoYXJ0KSB7XG4gICAgICAgIGlmICghdGhpcy5fcnVubmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFuaW1zID0gdGhpcy5fY2hhcnRzLmdldChjaGFydCk7XG4gICAgICAgIGlmICghYW5pbXMgfHwgIWFuaW1zLnJ1bm5pbmcgfHwgIWFuaW1zLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiBzdG9wKGNoYXJ0KSB7XG4gICAgICAgIGNvbnN0IGFuaW1zID0gdGhpcy5fY2hhcnRzLmdldChjaGFydCk7XG4gICAgICAgIGlmICghYW5pbXMgfHwgIWFuaW1zLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gYW5pbXMuaXRlbXM7XG4gICAgICAgIGxldCBpID0gaXRlbXMubGVuZ3RoIC0gMTtcbiAgICAgICAgZm9yKDsgaSA+PSAwOyAtLWkpe1xuICAgICAgICAgICAgaXRlbXNbaV0uY2FuY2VsKCk7XG4gICAgICAgIH1cbiAgICAgICAgYW5pbXMuaXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5fbm90aWZ5KGNoYXJ0LCBhbmltcywgRGF0ZS5ub3coKSwgJ2NvbXBsZXRlJyk7XG4gICAgfVxuIHJlbW92ZShjaGFydCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hhcnRzLmRlbGV0ZShjaGFydCk7XG4gICAgfVxufVxudmFyIGFuaW1hdG9yID0gLyogI19fUFVSRV9fICovIG5ldyBBbmltYXRvcigpO1xuXG5jb25zdCB0cmFuc3BhcmVudCA9ICd0cmFuc3BhcmVudCc7XG5jb25zdCBpbnRlcnBvbGF0b3JzID0ge1xuICAgIGJvb2xlYW4gKGZyb20sIHRvLCBmYWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZhY3RvciA+IDAuNSA/IHRvIDogZnJvbTtcbiAgICB9LFxuIGNvbG9yIChmcm9tLCB0bywgZmFjdG9yKSB7XG4gICAgICAgIGNvbnN0IGMwID0gY29sb3IoZnJvbSB8fCB0cmFuc3BhcmVudCk7XG4gICAgICAgIGNvbnN0IGMxID0gYzAudmFsaWQgJiYgY29sb3IodG8gfHwgdHJhbnNwYXJlbnQpO1xuICAgICAgICByZXR1cm4gYzEgJiYgYzEudmFsaWQgPyBjMS5taXgoYzAsIGZhY3RvcikuaGV4U3RyaW5nKCkgOiB0bztcbiAgICB9LFxuICAgIG51bWJlciAoZnJvbSwgdG8sIGZhY3Rvcikge1xuICAgICAgICByZXR1cm4gZnJvbSArICh0byAtIGZyb20pICogZmFjdG9yO1xuICAgIH1cbn07XG5jbGFzcyBBbmltYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKGNmZywgdGFyZ2V0LCBwcm9wLCB0byl7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wXTtcbiAgICAgICAgdG8gPSByZXNvbHZlKFtcbiAgICAgICAgICAgIGNmZy50byxcbiAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgY2ZnLmZyb21cbiAgICAgICAgXSk7XG4gICAgICAgIGNvbnN0IGZyb20gPSByZXNvbHZlKFtcbiAgICAgICAgICAgIGNmZy5mcm9tLFxuICAgICAgICAgICAgY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgdG9cbiAgICAgICAgXSk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX2ZuID0gY2ZnLmZuIHx8IGludGVycG9sYXRvcnNbY2ZnLnR5cGUgfHwgdHlwZW9mIGZyb21dO1xuICAgICAgICB0aGlzLl9lYXNpbmcgPSBlZmZlY3RzW2NmZy5lYXNpbmddIHx8IGVmZmVjdHMubGluZWFyO1xuICAgICAgICB0aGlzLl9zdGFydCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSArIChjZmcuZGVsYXkgfHwgMCkpO1xuICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IHRoaXMuX3RvdGFsID0gTWF0aC5mbG9vcihjZmcuZHVyYXRpb24pO1xuICAgICAgICB0aGlzLl9sb29wID0gISFjZmcubG9vcDtcbiAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLl9wcm9wID0gcHJvcDtcbiAgICAgICAgdGhpcy5fZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMuX3RvID0gdG87XG4gICAgICAgIHRoaXMuX3Byb21pc2VzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBhY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfVxuICAgIHVwZGF0ZShjZmcsIHRvLCBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeShmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLl90YXJnZXRbdGhpcy5fcHJvcF07XG4gICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gZGF0ZSAtIHRoaXMuX3N0YXJ0O1xuICAgICAgICAgICAgY29uc3QgcmVtYWluID0gdGhpcy5fZHVyYXRpb24gLSBlbGFwc2VkO1xuICAgICAgICAgICAgdGhpcy5fc3RhcnQgPSBkYXRlO1xuICAgICAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBNYXRoLmZsb29yKE1hdGgubWF4KHJlbWFpbiwgY2ZnLmR1cmF0aW9uKSk7XG4gICAgICAgICAgICB0aGlzLl90b3RhbCArPSBlbGFwc2VkO1xuICAgICAgICAgICAgdGhpcy5fbG9vcCA9ICEhY2ZnLmxvb3A7XG4gICAgICAgICAgICB0aGlzLl90byA9IHJlc29sdmUoW1xuICAgICAgICAgICAgICAgIGNmZy50byxcbiAgICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUsXG4gICAgICAgICAgICAgICAgY2ZnLmZyb21cbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgdGhpcy5fZnJvbSA9IHJlc29sdmUoW1xuICAgICAgICAgICAgICAgIGNmZy5mcm9tLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICB0b1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2FuY2VsKCkge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLnRpY2soRGF0ZS5ub3coKSk7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeShmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGljayhkYXRlKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWQgPSBkYXRlIC0gdGhpcy5fc3RhcnQ7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5fZHVyYXRpb247XG4gICAgICAgIGNvbnN0IHByb3AgPSB0aGlzLl9wcm9wO1xuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5fZnJvbTtcbiAgICAgICAgY29uc3QgbG9vcCA9IHRoaXMuX2xvb3A7XG4gICAgICAgIGNvbnN0IHRvID0gdGhpcy5fdG87XG4gICAgICAgIGxldCBmYWN0b3I7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZyb20gIT09IHRvICYmIChsb29wIHx8IGVsYXBzZWQgPCBkdXJhdGlvbik7XG4gICAgICAgIGlmICghdGhpcy5fYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLl90YXJnZXRbcHJvcF0gPSB0bztcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxhcHNlZCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3RhcmdldFtwcm9wXSA9IGZyb207XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmFjdG9yID0gZWxhcHNlZCAvIGR1cmF0aW9uICUgMjtcbiAgICAgICAgZmFjdG9yID0gbG9vcCAmJiBmYWN0b3IgPiAxID8gMiAtIGZhY3RvciA6IGZhY3RvcjtcbiAgICAgICAgZmFjdG9yID0gdGhpcy5fZWFzaW5nKE1hdGgubWluKDEsIE1hdGgubWF4KDAsIGZhY3RvcikpKTtcbiAgICAgICAgdGhpcy5fdGFyZ2V0W3Byb3BdID0gdGhpcy5fZm4oZnJvbSwgdG8sIGZhY3Rvcik7XG4gICAgfVxuICAgIHdhaXQoKSB7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5fcHJvbWlzZXMgfHwgKHRoaXMuX3Byb21pc2VzID0gW10pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKT0+e1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgICAgIHJlalxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfbm90aWZ5KHJlc29sdmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHJlc29sdmVkID8gJ3JlcycgOiAncmVqJztcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSB0aGlzLl9wcm9taXNlcyB8fCBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHByb21pc2VzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHByb21pc2VzW2ldW21ldGhvZF0oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQW5pbWF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoY2hhcnQsIGNvbmZpZyl7XG4gICAgICAgIHRoaXMuX2NoYXJ0ID0gY2hhcnQ7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlKGNvbmZpZyk7XG4gICAgfVxuICAgIGNvbmZpZ3VyZShjb25maWcpIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChjb25maWcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW5pbWF0aW9uT3B0aW9ucyA9IE9iamVjdC5rZXlzKGRlZmF1bHRzLmFuaW1hdGlvbik7XG4gICAgICAgIGNvbnN0IGFuaW1hdGVkUHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjb25maWcpLmZvckVhY2goKGtleSk9PntcbiAgICAgICAgICAgIGNvbnN0IGNmZyA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgaWYgKCFpc09iamVjdChjZmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGFuaW1hdGlvbk9wdGlvbnMpe1xuICAgICAgICAgICAgICAgIHJlc29sdmVkW29wdGlvbl0gPSBjZmdbb3B0aW9uXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChpc0FycmF5KGNmZy5wcm9wZXJ0aWVzKSAmJiBjZmcucHJvcGVydGllcyB8fCBbXG4gICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICBdKS5mb3JFYWNoKChwcm9wKT0+e1xuICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBrZXkgfHwgIWFuaW1hdGVkUHJvcHMuaGFzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkUHJvcHMuc2V0KHByb3AsIHJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuIF9hbmltYXRlT3B0aW9ucyh0YXJnZXQsIHZhbHVlcykge1xuICAgICAgICBjb25zdCBuZXdPcHRpb25zID0gdmFsdWVzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlVGFyZ2V0T3B0aW9ucyh0YXJnZXQsIG5ld09wdGlvbnMpO1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbmltYXRpb25zID0gdGhpcy5fY3JlYXRlQW5pbWF0aW9ucyhvcHRpb25zLCBuZXdPcHRpb25zKTtcbiAgICAgICAgaWYgKG5ld09wdGlvbnMuJHNoYXJlZCkge1xuICAgICAgICAgICAgYXdhaXRBbGwodGFyZ2V0Lm9wdGlvbnMuJGFuaW1hdGlvbnMsIG5ld09wdGlvbnMpLnRoZW4oKCk9PntcbiAgICAgICAgICAgICAgICB0YXJnZXQub3B0aW9ucyA9IG5ld09wdGlvbnM7XG4gICAgICAgICAgICB9LCAoKT0+e1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gICAgfVxuIF9jcmVhdGVBbmltYXRpb25zKHRhcmdldCwgdmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IGFuaW1hdGVkUHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCBhbmltYXRpb25zID0gW107XG4gICAgICAgIGNvbnN0IHJ1bm5pbmcgPSB0YXJnZXQuJGFuaW1hdGlvbnMgfHwgKHRhcmdldC4kYW5pbWF0aW9ucyA9IHt9KTtcbiAgICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3Qua2V5cyh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvcihpID0gcHJvcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpe1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgICAgICAgaWYgKHByb3AuY2hhckF0KDApID09PSAnJCcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnb3B0aW9ucycpIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zLnB1c2goLi4udGhpcy5fYW5pbWF0ZU9wdGlvbnModGFyZ2V0LCB2YWx1ZXMpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW3Byb3BdO1xuICAgICAgICAgICAgbGV0IGFuaW1hdGlvbiA9IHJ1bm5pbmdbcHJvcF07XG4gICAgICAgICAgICBjb25zdCBjZmcgPSBhbmltYXRlZFByb3BzLmdldChwcm9wKTtcbiAgICAgICAgICAgIGlmIChhbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoY2ZnICYmIGFuaW1hdGlvbi5hY3RpdmUoKSkge1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24udXBkYXRlKGNmZywgdmFsdWUsIGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24uY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjZmcgfHwgIWNmZy5kdXJhdGlvbikge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVubmluZ1twcm9wXSA9IGFuaW1hdGlvbiA9IG5ldyBBbmltYXRpb24oY2ZnLCB0YXJnZXQsIHByb3AsIHZhbHVlKTtcbiAgICAgICAgICAgIGFuaW1hdGlvbnMucHVzaChhbmltYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbmltYXRpb25zO1xuICAgIH1cbiB1cGRhdGUodGFyZ2V0LCB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Byb3BlcnRpZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHZhbHVlcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW5pbWF0aW9ucyA9IHRoaXMuX2NyZWF0ZUFuaW1hdGlvbnModGFyZ2V0LCB2YWx1ZXMpO1xuICAgICAgICBpZiAoYW5pbWF0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFuaW1hdG9yLmFkZCh0aGlzLl9jaGFydCwgYW5pbWF0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGF3YWl0QWxsKGFuaW1hdGlvbnMsIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBydW5uaW5nID0gW107XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY29uc3QgYW5pbSA9IGFuaW1hdGlvbnNba2V5c1tpXV07XG4gICAgICAgIGlmIChhbmltICYmIGFuaW0uYWN0aXZlKCkpIHtcbiAgICAgICAgICAgIHJ1bm5pbmcucHVzaChhbmltLndhaXQoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHJ1bm5pbmcpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRhcmdldE9wdGlvbnModGFyZ2V0LCBuZXdPcHRpb25zKSB7XG4gICAgaWYgKCFuZXdPcHRpb25zKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG9wdGlvbnMgPSB0YXJnZXQub3B0aW9ucztcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGFyZ2V0Lm9wdGlvbnMgPSBuZXdPcHRpb25zO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLiRzaGFyZWQpIHtcbiAgICAgICAgdGFyZ2V0Lm9wdGlvbnMgPSBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgJHNoYXJlZDogZmFsc2UsXG4gICAgICAgICAgICAkYW5pbWF0aW9uczoge31cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zO1xufVxuXG5mdW5jdGlvbiBzY2FsZUNsaXAoc2NhbGUsIGFsbG93ZWRPdmVyZmxvdykge1xuICAgIGNvbnN0IG9wdHMgPSBzY2FsZSAmJiBzY2FsZS5vcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJldmVyc2UgPSBvcHRzLnJldmVyc2U7XG4gICAgY29uc3QgbWluID0gb3B0cy5taW4gPT09IHVuZGVmaW5lZCA/IGFsbG93ZWRPdmVyZmxvdyA6IDA7XG4gICAgY29uc3QgbWF4ID0gb3B0cy5tYXggPT09IHVuZGVmaW5lZCA/IGFsbG93ZWRPdmVyZmxvdyA6IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IHJldmVyc2UgPyBtYXggOiBtaW4sXG4gICAgICAgIGVuZDogcmV2ZXJzZSA/IG1pbiA6IG1heFxuICAgIH07XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xpcCh4U2NhbGUsIHlTY2FsZSwgYWxsb3dlZE92ZXJmbG93KSB7XG4gICAgaWYgKGFsbG93ZWRPdmVyZmxvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB4ID0gc2NhbGVDbGlwKHhTY2FsZSwgYWxsb3dlZE92ZXJmbG93KTtcbiAgICBjb25zdCB5ID0gc2NhbGVDbGlwKHlTY2FsZSwgYWxsb3dlZE92ZXJmbG93KTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0b3A6IHkuZW5kLFxuICAgICAgICByaWdodDogeC5lbmQsXG4gICAgICAgIGJvdHRvbTogeS5zdGFydCxcbiAgICAgICAgbGVmdDogeC5zdGFydFxuICAgIH07XG59XG5mdW5jdGlvbiB0b0NsaXAodmFsdWUpIHtcbiAgICBsZXQgdCwgciwgYiwgbDtcbiAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHQgPSB2YWx1ZS50b3A7XG4gICAgICAgIHIgPSB2YWx1ZS5yaWdodDtcbiAgICAgICAgYiA9IHZhbHVlLmJvdHRvbTtcbiAgICAgICAgbCA9IHZhbHVlLmxlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdCA9IHIgPSBiID0gbCA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0b3A6IHQsXG4gICAgICAgIHJpZ2h0OiByLFxuICAgICAgICBib3R0b206IGIsXG4gICAgICAgIGxlZnQ6IGwsXG4gICAgICAgIGRpc2FibGVkOiB2YWx1ZSA9PT0gZmFsc2VcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0U29ydGVkRGF0YXNldEluZGljZXMoY2hhcnQsIGZpbHRlclZpc2libGUpIHtcbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgY29uc3QgbWV0YXNldHMgPSBjaGFydC5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKGZpbHRlclZpc2libGUpO1xuICAgIGxldCBpLCBpbGVuO1xuICAgIGZvcihpID0gMCwgaWxlbiA9IG1ldGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGtleXMucHVzaChtZXRhc2V0c1tpXS5pbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xufVxuZnVuY3Rpb24gYXBwbHlTdGFjayhzdGFjaywgdmFsdWUsIGRzSW5kZXgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGtleXMgPSBzdGFjay5rZXlzO1xuICAgIGNvbnN0IHNpbmdsZU1vZGUgPSBvcHRpb25zLm1vZGUgPT09ICdzaW5nbGUnO1xuICAgIGxldCBpLCBpbGVuLCBkYXRhc2V0SW5kZXgsIG90aGVyVmFsdWU7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgZm9yKGkgPSAwLCBpbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICBkYXRhc2V0SW5kZXggPSAra2V5c1tpXTtcbiAgICAgICAgaWYgKGRhdGFzZXRJbmRleCA9PT0gZHNJbmRleCkge1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBvdGhlclZhbHVlID0gc3RhY2sudmFsdWVzW2RhdGFzZXRJbmRleF07XG4gICAgICAgIGlmIChpc051bWJlckZpbml0ZShvdGhlclZhbHVlKSAmJiAoc2luZ2xlTW9kZSB8fCB2YWx1ZSA9PT0gMCB8fCBzaWduKHZhbHVlKSA9PT0gc2lnbihvdGhlclZhbHVlKSkpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IG90aGVyVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb3VuZCAmJiAhb3B0aW9ucy5hbGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRPYmplY3REYXRhVG9BcnJheShkYXRhLCBtZXRhKSB7XG4gICAgY29uc3QgeyBpU2NhbGUgLCB2U2NhbGUgIH0gPSBtZXRhO1xuICAgIGNvbnN0IGlBeGlzS2V5ID0gaVNjYWxlLmF4aXMgPT09ICd4JyA/ICd4JyA6ICd5JztcbiAgICBjb25zdCB2QXhpc0tleSA9IHZTY2FsZS5heGlzID09PSAneCcgPyAneCcgOiAneSc7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgIGNvbnN0IGFkYXRhID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgICBsZXQgaSwgaWxlbiwga2V5O1xuICAgIGZvcihpID0gMCwgaWxlbiA9IGtleXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgYWRhdGFbaV0gPSB7XG4gICAgICAgICAgICBbaUF4aXNLZXldOiBrZXksXG4gICAgICAgICAgICBbdkF4aXNLZXldOiBkYXRhW2tleV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGFkYXRhO1xufVxuZnVuY3Rpb24gaXNTdGFja2VkKHNjYWxlLCBtZXRhKSB7XG4gICAgY29uc3Qgc3RhY2tlZCA9IHNjYWxlICYmIHNjYWxlLm9wdGlvbnMuc3RhY2tlZDtcbiAgICByZXR1cm4gc3RhY2tlZCB8fCBzdGFja2VkID09PSB1bmRlZmluZWQgJiYgbWV0YS5zdGFjayAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZ2V0U3RhY2tLZXkoaW5kZXhTY2FsZSwgdmFsdWVTY2FsZSwgbWV0YSkge1xuICAgIHJldHVybiBgJHtpbmRleFNjYWxlLmlkfS4ke3ZhbHVlU2NhbGUuaWR9LiR7bWV0YS5zdGFjayB8fCBtZXRhLnR5cGV9YDtcbn1cbmZ1bmN0aW9uIGdldFVzZXJCb3VuZHMoc2NhbGUpIHtcbiAgICBjb25zdCB7IG1pbiAsIG1heCAsIG1pbkRlZmluZWQgLCBtYXhEZWZpbmVkICB9ID0gc2NhbGUuZ2V0VXNlckJvdW5kcygpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG1pbjogbWluRGVmaW5lZCA/IG1pbiA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxcbiAgICAgICAgbWF4OiBtYXhEZWZpbmVkID8gbWF4IDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlU3RhY2soc3RhY2tzLCBzdGFja0tleSwgaW5kZXhWYWx1ZSkge1xuICAgIGNvbnN0IHN1YlN0YWNrID0gc3RhY2tzW3N0YWNrS2V5XSB8fCAoc3RhY2tzW3N0YWNrS2V5XSA9IHt9KTtcbiAgICByZXR1cm4gc3ViU3RhY2tbaW5kZXhWYWx1ZV0gfHwgKHN1YlN0YWNrW2luZGV4VmFsdWVdID0ge30pO1xufVxuZnVuY3Rpb24gZ2V0TGFzdEluZGV4SW5TdGFjayhzdGFjaywgdlNjYWxlLCBwb3NpdGl2ZSwgdHlwZSkge1xuICAgIGZvciAoY29uc3QgbWV0YSBvZiB2U2NhbGUuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXModHlwZSkucmV2ZXJzZSgpKXtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdGFja1ttZXRhLmluZGV4XTtcbiAgICAgICAgaWYgKHBvc2l0aXZlICYmIHZhbHVlID4gMCB8fCAhcG9zaXRpdmUgJiYgdmFsdWUgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0YS5pbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVN0YWNrcyhjb250cm9sbGVyLCBwYXJzZWQpIHtcbiAgICBjb25zdCB7IGNoYXJ0ICwgX2NhY2hlZE1ldGE6IG1ldGEgIH0gPSBjb250cm9sbGVyO1xuICAgIGNvbnN0IHN0YWNrcyA9IGNoYXJ0Ll9zdGFja3MgfHwgKGNoYXJ0Ll9zdGFja3MgPSB7fSk7XG4gICAgY29uc3QgeyBpU2NhbGUgLCB2U2NhbGUgLCBpbmRleDogZGF0YXNldEluZGV4ICB9ID0gbWV0YTtcbiAgICBjb25zdCBpQXhpcyA9IGlTY2FsZS5heGlzO1xuICAgIGNvbnN0IHZBeGlzID0gdlNjYWxlLmF4aXM7XG4gICAgY29uc3Qga2V5ID0gZ2V0U3RhY2tLZXkoaVNjYWxlLCB2U2NhbGUsIG1ldGEpO1xuICAgIGNvbnN0IGlsZW4gPSBwYXJzZWQubGVuZ3RoO1xuICAgIGxldCBzdGFjaztcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgY29uc3QgaXRlbSA9IHBhcnNlZFtpXTtcbiAgICAgICAgY29uc3QgeyBbaUF4aXNdOiBpbmRleCAsIFt2QXhpc106IHZhbHVlICB9ID0gaXRlbTtcbiAgICAgICAgY29uc3QgaXRlbVN0YWNrcyA9IGl0ZW0uX3N0YWNrcyB8fCAoaXRlbS5fc3RhY2tzID0ge30pO1xuICAgICAgICBzdGFjayA9IGl0ZW1TdGFja3NbdkF4aXNdID0gZ2V0T3JDcmVhdGVTdGFjayhzdGFja3MsIGtleSwgaW5kZXgpO1xuICAgICAgICBzdGFja1tkYXRhc2V0SW5kZXhdID0gdmFsdWU7XG4gICAgICAgIHN0YWNrLl90b3AgPSBnZXRMYXN0SW5kZXhJblN0YWNrKHN0YWNrLCB2U2NhbGUsIHRydWUsIG1ldGEudHlwZSk7XG4gICAgICAgIHN0YWNrLl9ib3R0b20gPSBnZXRMYXN0SW5kZXhJblN0YWNrKHN0YWNrLCB2U2NhbGUsIGZhbHNlLCBtZXRhLnR5cGUpO1xuICAgICAgICBjb25zdCB2aXN1YWxWYWx1ZXMgPSBzdGFjay5fdmlzdWFsVmFsdWVzIHx8IChzdGFjay5fdmlzdWFsVmFsdWVzID0ge30pO1xuICAgICAgICB2aXN1YWxWYWx1ZXNbZGF0YXNldEluZGV4XSA9IHZhbHVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEZpcnN0U2NhbGVJZChjaGFydCwgYXhpcykge1xuICAgIGNvbnN0IHNjYWxlcyA9IGNoYXJ0LnNjYWxlcztcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NhbGVzKS5maWx0ZXIoKGtleSk9PnNjYWxlc1trZXldLmF4aXMgPT09IGF4aXMpLnNoaWZ0KCk7XG59XG5mdW5jdGlvbiBjcmVhdGVEYXRhc2V0Q29udGV4dChwYXJlbnQsIGluZGV4KSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LCB7XG4gICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgIGRhdGFzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YXNldEluZGV4OiBpbmRleCxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIG1vZGU6ICdkZWZhdWx0JyxcbiAgICAgICAgdHlwZTogJ2RhdGFzZXQnXG4gICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVEYXRhQ29udGV4dChwYXJlbnQsIGluZGV4LCBlbGVtZW50KSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LCB7XG4gICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgIGRhdGFJbmRleDogaW5kZXgsXG4gICAgICAgIHBhcnNlZDogdW5kZWZpbmVkLFxuICAgICAgICByYXc6IHVuZGVmaW5lZCxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIG1vZGU6ICdkZWZhdWx0JyxcbiAgICAgICAgdHlwZTogJ2RhdGEnXG4gICAgfSk7XG59XG5mdW5jdGlvbiBjbGVhclN0YWNrcyhtZXRhLCBpdGVtcykge1xuICAgIGNvbnN0IGRhdGFzZXRJbmRleCA9IG1ldGEuY29udHJvbGxlci5pbmRleDtcbiAgICBjb25zdCBheGlzID0gbWV0YS52U2NhbGUgJiYgbWV0YS52U2NhbGUuYXhpcztcbiAgICBpZiAoIWF4aXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtcyA9IGl0ZW1zIHx8IG1ldGEuX3BhcnNlZDtcbiAgICBmb3IgKGNvbnN0IHBhcnNlZCBvZiBpdGVtcyl7XG4gICAgICAgIGNvbnN0IHN0YWNrcyA9IHBhcnNlZC5fc3RhY2tzO1xuICAgICAgICBpZiAoIXN0YWNrcyB8fCBzdGFja3NbYXhpc10gPT09IHVuZGVmaW5lZCB8fCBzdGFja3NbYXhpc11bZGF0YXNldEluZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHN0YWNrc1theGlzXVtkYXRhc2V0SW5kZXhdO1xuICAgICAgICBpZiAoc3RhY2tzW2F4aXNdLl92aXN1YWxWYWx1ZXMgIT09IHVuZGVmaW5lZCAmJiBzdGFja3NbYXhpc10uX3Zpc3VhbFZhbHVlc1tkYXRhc2V0SW5kZXhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzdGFja3NbYXhpc10uX3Zpc3VhbFZhbHVlc1tkYXRhc2V0SW5kZXhdO1xuICAgICAgICB9XG4gICAgfVxufVxuY29uc3QgaXNEaXJlY3RVcGRhdGVNb2RlID0gKG1vZGUpPT5tb2RlID09PSAncmVzZXQnIHx8IG1vZGUgPT09ICdub25lJztcbmNvbnN0IGNsb25lSWZOb3RTaGFyZWQgPSAoY2FjaGVkLCBzaGFyZWQpPT5zaGFyZWQgPyBjYWNoZWQgOiBPYmplY3QuYXNzaWduKHt9LCBjYWNoZWQpO1xuY29uc3QgY3JlYXRlU3RhY2sgPSAoY2FuU3RhY2ssIG1ldGEsIGNoYXJ0KT0+Y2FuU3RhY2sgJiYgIW1ldGEuaGlkZGVuICYmIG1ldGEuX3N0YWNrZWQgJiYge1xuICAgICAgICBrZXlzOiBnZXRTb3J0ZWREYXRhc2V0SW5kaWNlcyhjaGFydCwgdHJ1ZSksXG4gICAgICAgIHZhbHVlczogbnVsbFxuICAgIH07XG5jbGFzcyBEYXRhc2V0Q29udHJvbGxlciB7XG4gc3RhdGljIGRlZmF1bHRzID0ge307XG4gc3RhdGljIGRhdGFzZXRFbGVtZW50VHlwZSA9IG51bGw7XG4gc3RhdGljIGRhdGFFbGVtZW50VHlwZSA9IG51bGw7XG4gY29uc3RydWN0b3IoY2hhcnQsIGRhdGFzZXRJbmRleCl7XG4gICAgICAgIHRoaXMuY2hhcnQgPSBjaGFydDtcbiAgICAgICAgdGhpcy5fY3R4ID0gY2hhcnQuY3R4O1xuICAgICAgICB0aGlzLmluZGV4ID0gZGF0YXNldEluZGV4O1xuICAgICAgICB0aGlzLl9jYWNoZWREYXRhT3B0cyA9IHt9O1xuICAgICAgICB0aGlzLl9jYWNoZWRNZXRhID0gdGhpcy5nZXRNZXRhKCk7XG4gICAgICAgIHRoaXMuX3R5cGUgPSB0aGlzLl9jYWNoZWRNZXRhLnR5cGU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuX3BhcnNpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fb2JqZWN0RGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2hhcmVkT3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fZHJhd1N0YXJ0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9kcmF3Q291bnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1cHBvcnRzRGVjaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLiRjb250ZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zeW5jTGlzdCA9IFtdO1xuICAgICAgICB0aGlzLmRhdGFzZXRFbGVtZW50VHlwZSA9IG5ldy50YXJnZXQuZGF0YXNldEVsZW1lbnRUeXBlO1xuICAgICAgICB0aGlzLmRhdGFFbGVtZW50VHlwZSA9IG5ldy50YXJnZXQuZGF0YUVsZW1lbnRUeXBlO1xuICAgICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIHRoaXMuY29uZmlndXJlKCk7XG4gICAgICAgIHRoaXMubGlua1NjYWxlcygpO1xuICAgICAgICBtZXRhLl9zdGFja2VkID0gaXNTdGFja2VkKG1ldGEudlNjYWxlLCBtZXRhKTtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50cygpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZpbGwgJiYgIXRoaXMuY2hhcnQuaXNQbHVnaW5FbmFibGVkKCdmaWxsZXInKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVHJpZWQgdG8gdXNlIHRoZSAnZmlsbCcgb3B0aW9uIHdpdGhvdXQgdGhlICdGaWxsZXInIHBsdWdpbiBlbmFibGVkLiBQbGVhc2UgaW1wb3J0IGFuZCByZWdpc3RlciB0aGUgJ0ZpbGxlcicgcGx1Z2luIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGRpc2FibGVkIGluIHRoZSBvcHRpb25zXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUluZGV4KGRhdGFzZXRJbmRleCkge1xuICAgICAgICBpZiAodGhpcy5pbmRleCAhPT0gZGF0YXNldEluZGV4KSB7XG4gICAgICAgICAgICBjbGVhclN0YWNrcyh0aGlzLl9jYWNoZWRNZXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ID0gZGF0YXNldEluZGV4O1xuICAgIH1cbiAgICBsaW5rU2NhbGVzKCkge1xuICAgICAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG4gICAgICAgIGNvbnN0IGNob29zZUlkID0gKGF4aXMsIHgsIHksIHIpPT5heGlzID09PSAneCcgPyB4IDogYXhpcyA9PT0gJ3InID8gciA6IHk7XG4gICAgICAgIGNvbnN0IHhpZCA9IG1ldGEueEF4aXNJRCA9IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQueEF4aXNJRCwgZ2V0Rmlyc3RTY2FsZUlkKGNoYXJ0LCAneCcpKTtcbiAgICAgICAgY29uc3QgeWlkID0gbWV0YS55QXhpc0lEID0gdmFsdWVPckRlZmF1bHQoZGF0YXNldC55QXhpc0lELCBnZXRGaXJzdFNjYWxlSWQoY2hhcnQsICd5JykpO1xuICAgICAgICBjb25zdCByaWQgPSBtZXRhLnJBeGlzSUQgPSB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LnJBeGlzSUQsIGdldEZpcnN0U2NhbGVJZChjaGFydCwgJ3InKSk7XG4gICAgICAgIGNvbnN0IGluZGV4QXhpcyA9IG1ldGEuaW5kZXhBeGlzO1xuICAgICAgICBjb25zdCBpaWQgPSBtZXRhLmlBeGlzSUQgPSBjaG9vc2VJZChpbmRleEF4aXMsIHhpZCwgeWlkLCByaWQpO1xuICAgICAgICBjb25zdCB2aWQgPSBtZXRhLnZBeGlzSUQgPSBjaG9vc2VJZChpbmRleEF4aXMsIHlpZCwgeGlkLCByaWQpO1xuICAgICAgICBtZXRhLnhTY2FsZSA9IHRoaXMuZ2V0U2NhbGVGb3JJZCh4aWQpO1xuICAgICAgICBtZXRhLnlTY2FsZSA9IHRoaXMuZ2V0U2NhbGVGb3JJZCh5aWQpO1xuICAgICAgICBtZXRhLnJTY2FsZSA9IHRoaXMuZ2V0U2NhbGVGb3JJZChyaWQpO1xuICAgICAgICBtZXRhLmlTY2FsZSA9IHRoaXMuZ2V0U2NhbGVGb3JJZChpaWQpO1xuICAgICAgICBtZXRhLnZTY2FsZSA9IHRoaXMuZ2V0U2NhbGVGb3JJZCh2aWQpO1xuICAgIH1cbiAgICBnZXREYXRhc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW3RoaXMuaW5kZXhdO1xuICAgIH1cbiAgICBnZXRNZXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YSh0aGlzLmluZGV4KTtcbiAgICB9XG4gZ2V0U2NhbGVGb3JJZChzY2FsZUlEKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXJ0LnNjYWxlc1tzY2FsZUlEXTtcbiAgICB9XG4gX2dldE90aGVyU2NhbGUoc2NhbGUpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIHJldHVybiBzY2FsZSA9PT0gbWV0YS5pU2NhbGUgPyBtZXRhLnZTY2FsZSA6IG1ldGEuaVNjYWxlO1xuICAgIH1cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCdyZXNldCcpO1xuICAgIH1cbiBfZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICAgICAgICB1bmxpc3RlbkFycmF5RXZlbnRzKHRoaXMuX2RhdGEsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhLl9zdGFja2VkKSB7XG4gICAgICAgICAgICBjbGVhclN0YWNrcyhtZXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiBfZGF0YUNoZWNrKCkge1xuICAgICAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhc2V0LmRhdGEgfHwgKGRhdGFzZXQuZGF0YSA9IFtdKTtcbiAgICAgICAgY29uc3QgX2RhdGEgPSB0aGlzLl9kYXRhO1xuICAgICAgICBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICAgICAgdGhpcy5fZGF0YSA9IGNvbnZlcnRPYmplY3REYXRhVG9BcnJheShkYXRhLCBtZXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChfZGF0YSAhPT0gZGF0YSkge1xuICAgICAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgdW5saXN0ZW5BcnJheUV2ZW50cyhfZGF0YSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgICAgICAgICAgY2xlYXJTdGFja3MobWV0YSk7XG4gICAgICAgICAgICAgICAgbWV0YS5fcGFyc2VkID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBPYmplY3QuaXNFeHRlbnNpYmxlKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuQXJyYXlFdmVudHMoZGF0YSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zeW5jTGlzdCA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRWxlbWVudHMoKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICB0aGlzLl9kYXRhQ2hlY2soKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICBtZXRhLmRhdGFzZXQgPSBuZXcgdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBidWlsZE9yVXBkYXRlRWxlbWVudHMocmVzZXROZXdFbGVtZW50cykge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xuICAgICAgICBsZXQgc3RhY2tDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RhdGFDaGVjaygpO1xuICAgICAgICBjb25zdCBvbGRTdGFja2VkID0gbWV0YS5fc3RhY2tlZDtcbiAgICAgICAgbWV0YS5fc3RhY2tlZCA9IGlzU3RhY2tlZChtZXRhLnZTY2FsZSwgbWV0YSk7XG4gICAgICAgIGlmIChtZXRhLnN0YWNrICE9PSBkYXRhc2V0LnN0YWNrKSB7XG4gICAgICAgICAgICBzdGFja0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2xlYXJTdGFja3MobWV0YSk7XG4gICAgICAgICAgICBtZXRhLnN0YWNrID0gZGF0YXNldC5zdGFjaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXN5bmNFbGVtZW50cyhyZXNldE5ld0VsZW1lbnRzKTtcbiAgICAgICAgaWYgKHN0YWNrQ2hhbmdlZCB8fCBvbGRTdGFja2VkICE9PSBtZXRhLl9zdGFja2VkKSB7XG4gICAgICAgICAgICB1cGRhdGVTdGFja3ModGhpcywgbWV0YS5fcGFyc2VkKTtcbiAgICAgICAgICAgIG1ldGEuX3N0YWNrZWQgPSBpc1N0YWNrZWQobWV0YS52U2NhbGUsIG1ldGEpO1xuICAgICAgICB9XG4gICAgfVxuIGNvbmZpZ3VyZSgpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jaGFydC5jb25maWc7XG4gICAgICAgIGNvbnN0IHNjb3BlS2V5cyA9IGNvbmZpZy5kYXRhc2V0U2NvcGVLZXlzKHRoaXMuX3R5cGUpO1xuICAgICAgICBjb25zdCBzY29wZXMgPSBjb25maWcuZ2V0T3B0aW9uU2NvcGVzKHRoaXMuZ2V0RGF0YXNldCgpLCBzY29wZUtleXMsIHRydWUpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoc2NvcGVzLCB0aGlzLmdldENvbnRleHQoKSk7XG4gICAgICAgIHRoaXMuX3BhcnNpbmcgPSB0aGlzLm9wdGlvbnMucGFyc2luZztcbiAgICAgICAgdGhpcy5fY2FjaGVkRGF0YU9wdHMgPSB7fTtcbiAgICB9XG4gcGFyc2Uoc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHsgX2NhY2hlZE1ldGE6IG1ldGEgLCBfZGF0YTogZGF0YSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgaVNjYWxlICwgX3N0YWNrZWQgIH0gPSBtZXRhO1xuICAgICAgICBjb25zdCBpQXhpcyA9IGlTY2FsZS5heGlzO1xuICAgICAgICBsZXQgc29ydGVkID0gc3RhcnQgPT09IDAgJiYgY291bnQgPT09IGRhdGEubGVuZ3RoID8gdHJ1ZSA6IG1ldGEuX3NvcnRlZDtcbiAgICAgICAgbGV0IHByZXYgPSBzdGFydCA+IDAgJiYgbWV0YS5fcGFyc2VkW3N0YXJ0IC0gMV07XG4gICAgICAgIGxldCBpLCBjdXIsIHBhcnNlZDtcbiAgICAgICAgaWYgKHRoaXMuX3BhcnNpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBtZXRhLl9wYXJzZWQgPSBkYXRhO1xuICAgICAgICAgICAgbWV0YS5fc29ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhcnNlZCA9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNBcnJheShkYXRhW3N0YXJ0XSkpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWQgPSB0aGlzLnBhcnNlQXJyYXlEYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGRhdGFbc3RhcnRdKSkge1xuICAgICAgICAgICAgICAgIHBhcnNlZCA9IHRoaXMucGFyc2VPYmplY3REYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcnNlZCA9IHRoaXMucGFyc2VQcmltaXRpdmVEYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc05vdEluT3JkZXJDb21wYXJlZFRvUHJldiA9ICgpPT5jdXJbaUF4aXNdID09PSBudWxsIHx8IHByZXYgJiYgY3VyW2lBeGlzXSA8IHByZXZbaUF4aXNdO1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgY291bnQ7ICsraSl7XG4gICAgICAgICAgICAgICAgbWV0YS5fcGFyc2VkW2kgKyBzdGFydF0gPSBjdXIgPSBwYXJzZWRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHNvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOb3RJbk9yZGVyQ29tcGFyZWRUb1ByZXYoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IGN1cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZXRhLl9zb3J0ZWQgPSBzb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9zdGFja2VkKSB7XG4gICAgICAgICAgICB1cGRhdGVTdGFja3ModGhpcywgcGFyc2VkKTtcbiAgICAgICAgfVxuICAgIH1cbiBwYXJzZVByaW1pdGl2ZURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHsgaVNjYWxlICwgdlNjYWxlICB9ID0gbWV0YTtcbiAgICAgICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgdkF4aXMgPSB2U2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgbGFiZWxzID0gaVNjYWxlLmdldExhYmVscygpO1xuICAgICAgICBjb25zdCBzaW5nbGVTY2FsZSA9IGlTY2FsZSA9PT0gdlNjYWxlO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgQXJyYXkoY291bnQpO1xuICAgICAgICBsZXQgaSwgaWxlbiwgaW5kZXg7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGNvdW50OyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGluZGV4ID0gaSArIHN0YXJ0O1xuICAgICAgICAgICAgcGFyc2VkW2ldID0ge1xuICAgICAgICAgICAgICAgIFtpQXhpc106IHNpbmdsZVNjYWxlIHx8IGlTY2FsZS5wYXJzZShsYWJlbHNbaW5kZXhdLCBpbmRleCksXG4gICAgICAgICAgICAgICAgW3ZBeGlzXTogdlNjYWxlLnBhcnNlKGRhdGFbaW5kZXhdLCBpbmRleClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gcGFyc2VBcnJheURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHsgeFNjYWxlICwgeVNjYWxlICB9ID0gbWV0YTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICAgICAgbGV0IGksIGlsZW4sIGluZGV4LCBpdGVtO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBjb3VudDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBpbmRleCA9IGkgKyBzdGFydDtcbiAgICAgICAgICAgIGl0ZW0gPSBkYXRhW2luZGV4XTtcbiAgICAgICAgICAgIHBhcnNlZFtpXSA9IHtcbiAgICAgICAgICAgICAgICB4OiB4U2NhbGUucGFyc2UoaXRlbVswXSwgaW5kZXgpLFxuICAgICAgICAgICAgICAgIHk6IHlTY2FsZS5wYXJzZShpdGVtWzFdLCBpbmRleClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gcGFyc2VPYmplY3REYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCkge1xuICAgICAgICBjb25zdCB7IHhTY2FsZSAsIHlTY2FsZSAgfSA9IG1ldGE7XG4gICAgICAgIGNvbnN0IHsgeEF4aXNLZXkgPSd4JyAsIHlBeGlzS2V5ID0neScgIH0gPSB0aGlzLl9wYXJzaW5nO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgQXJyYXkoY291bnQpO1xuICAgICAgICBsZXQgaSwgaWxlbiwgaW5kZXgsIGl0ZW07XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGNvdW50OyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGluZGV4ID0gaSArIHN0YXJ0O1xuICAgICAgICAgICAgaXRlbSA9IGRhdGFbaW5kZXhdO1xuICAgICAgICAgICAgcGFyc2VkW2ldID0ge1xuICAgICAgICAgICAgICAgIHg6IHhTY2FsZS5wYXJzZShyZXNvbHZlT2JqZWN0S2V5KGl0ZW0sIHhBeGlzS2V5KSwgaW5kZXgpLFxuICAgICAgICAgICAgICAgIHk6IHlTY2FsZS5wYXJzZShyZXNvbHZlT2JqZWN0S2V5KGl0ZW0sIHlBeGlzS2V5KSwgaW5kZXgpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuIGdldFBhcnNlZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkTWV0YS5fcGFyc2VkW2luZGV4XTtcbiAgICB9XG4gZ2V0RGF0YUVsZW1lbnQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZE1ldGEuZGF0YVtpbmRleF07XG4gICAgfVxuIGFwcGx5U3RhY2soc2NhbGUsIHBhcnNlZCwgbW9kZSkge1xuICAgICAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcnNlZFtzY2FsZS5heGlzXTtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSB7XG4gICAgICAgICAgICBrZXlzOiBnZXRTb3J0ZWREYXRhc2V0SW5kaWNlcyhjaGFydCwgdHJ1ZSksXG4gICAgICAgICAgICB2YWx1ZXM6IHBhcnNlZC5fc3RhY2tzW3NjYWxlLmF4aXNdLl92aXN1YWxWYWx1ZXNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGFwcGx5U3RhY2soc3RhY2ssIHZhbHVlLCBtZXRhLmluZGV4LCB7XG4gICAgICAgICAgICBtb2RlXG4gICAgICAgIH0pO1xuICAgIH1cbiB1cGRhdGVSYW5nZUZyb21QYXJzZWQocmFuZ2UsIHNjYWxlLCBwYXJzZWQsIHN0YWNrKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gcGFyc2VkW3NjYWxlLmF4aXNdO1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZWRWYWx1ZSA9PT0gbnVsbCA/IE5hTiA6IHBhcnNlZFZhbHVlO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBzdGFjayAmJiBwYXJzZWQuX3N0YWNrc1tzY2FsZS5heGlzXTtcbiAgICAgICAgaWYgKHN0YWNrICYmIHZhbHVlcykge1xuICAgICAgICAgICAgc3RhY2sudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICAgICAgdmFsdWUgPSBhcHBseVN0YWNrKHN0YWNrLCBwYXJzZWRWYWx1ZSwgdGhpcy5fY2FjaGVkTWV0YS5pbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmFuZ2UubWluID0gTWF0aC5taW4ocmFuZ2UubWluLCB2YWx1ZSk7XG4gICAgICAgIHJhbmdlLm1heCA9IE1hdGgubWF4KHJhbmdlLm1heCwgdmFsdWUpO1xuICAgIH1cbiBnZXRNaW5NYXgoc2NhbGUsIGNhblN0YWNrKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBfcGFyc2VkID0gbWV0YS5fcGFyc2VkO1xuICAgICAgICBjb25zdCBzb3J0ZWQgPSBtZXRhLl9zb3J0ZWQgJiYgc2NhbGUgPT09IG1ldGEuaVNjYWxlO1xuICAgICAgICBjb25zdCBpbGVuID0gX3BhcnNlZC5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG90aGVyU2NhbGUgPSB0aGlzLl9nZXRPdGhlclNjYWxlKHNjYWxlKTtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBjcmVhdGVTdGFjayhjYW5TdGFjaywgbWV0YSwgdGhpcy5jaGFydCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0ge1xuICAgICAgICAgICAgbWluOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICAgICAgICBtYXg6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IG1pbjogb3RoZXJNaW4gLCBtYXg6IG90aGVyTWF4ICB9ID0gZ2V0VXNlckJvdW5kcyhvdGhlclNjYWxlKTtcbiAgICAgICAgbGV0IGksIHBhcnNlZDtcbiAgICAgICAgZnVuY3Rpb24gX3NraXAoKSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBfcGFyc2VkW2ldO1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJWYWx1ZSA9IHBhcnNlZFtvdGhlclNjYWxlLmF4aXNdO1xuICAgICAgICAgICAgcmV0dXJuICFpc051bWJlckZpbml0ZShwYXJzZWRbc2NhbGUuYXhpc10pIHx8IG90aGVyTWluID4gb3RoZXJWYWx1ZSB8fCBvdGhlck1heCA8IG90aGVyVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGlmIChfc2tpcCgpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJhbmdlRnJvbVBhcnNlZChyYW5nZSwgc2NhbGUsIHBhcnNlZCwgc3RhY2spO1xuICAgICAgICAgICAgaWYgKHNvcnRlZCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0ZWQpIHtcbiAgICAgICAgICAgIGZvcihpID0gaWxlbiAtIDE7IGkgPj0gMDsgLS1pKXtcbiAgICAgICAgICAgICAgICBpZiAoX3NraXAoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSYW5nZUZyb21QYXJzZWQocmFuZ2UsIHNjYWxlLCBwYXJzZWQsIHN0YWNrKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfVxuICAgIGdldEFsbFBhcnNlZFZhbHVlcyhzY2FsZSkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLl9jYWNoZWRNZXRhLl9wYXJzZWQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgaSwgaWxlbiwgdmFsdWU7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IHBhcnNlZC5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZWRbaV1bc2NhbGUuYXhpc107XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXJGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuIGdldE1heE92ZXJmbG93KCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuIGdldExhYmVsQW5kVmFsdWUoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IGlTY2FsZSA9IG1ldGEuaVNjYWxlO1xuICAgICAgICBjb25zdCB2U2NhbGUgPSBtZXRhLnZTY2FsZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaW5kZXgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IGlTY2FsZSA/ICcnICsgaVNjYWxlLmdldExhYmVsRm9yVmFsdWUocGFyc2VkW2lTY2FsZS5heGlzXSkgOiAnJyxcbiAgICAgICAgICAgIHZhbHVlOiB2U2NhbGUgPyAnJyArIHZTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFt2U2NhbGUuYXhpc10pIDogJydcbiAgICAgICAgfTtcbiAgICB9XG4gX3VwZGF0ZShtb2RlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICB0aGlzLnVwZGF0ZShtb2RlIHx8ICdkZWZhdWx0Jyk7XG4gICAgICAgIG1ldGEuX2NsaXAgPSB0b0NsaXAodmFsdWVPckRlZmF1bHQodGhpcy5vcHRpb25zLmNsaXAsIGRlZmF1bHRDbGlwKG1ldGEueFNjYWxlLCBtZXRhLnlTY2FsZSwgdGhpcy5nZXRNYXhPdmVyZmxvdygpKSkpO1xuICAgIH1cbiB1cGRhdGUobW9kZSkge31cbiAgICBkcmF3KCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9jdHg7XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuICAgICAgICBjb25zdCBhcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBbXTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9kcmF3U3RhcnQgfHwgMDtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLl9kcmF3Q291bnQgfHwgZWxlbWVudHMubGVuZ3RoIC0gc3RhcnQ7XG4gICAgICAgIGNvbnN0IGRyYXdBY3RpdmVFbGVtZW50c09uVG9wID0gdGhpcy5vcHRpb25zLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgaWYgKG1ldGEuZGF0YXNldCkge1xuICAgICAgICAgICAgbWV0YS5kYXRhc2V0LmRyYXcoY3R4LCBhcmVhLCBzdGFydCwgY291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGZvcihpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyArK2kpe1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5hY3RpdmUgJiYgZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3ApIHtcbiAgICAgICAgICAgICAgICBhY3RpdmUucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5kcmF3KGN0eCwgYXJlYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgKytpKXtcbiAgICAgICAgICAgIGFjdGl2ZVtpXS5kcmF3KGN0eCwgYXJlYSk7XG4gICAgICAgIH1cbiAgICB9XG4gZ2V0U3R5bGUoaW5kZXgsIGFjdGl2ZSkge1xuICAgICAgICBjb25zdCBtb2RlID0gYWN0aXZlID8gJ2FjdGl2ZScgOiAnZGVmYXVsdCc7XG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX2NhY2hlZE1ldGEuZGF0YXNldCA/IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKSA6IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpbmRleCB8fCAwLCBtb2RlKTtcbiAgICB9XG4gZ2V0Q29udGV4dChpbmRleCwgYWN0aXZlLCBtb2RlKSB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoKTtcbiAgICAgICAgbGV0IGNvbnRleHQ7XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5fY2FjaGVkTWV0YS5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NhY2hlZE1ldGEuZGF0YVtpbmRleF07XG4gICAgICAgICAgICBjb250ZXh0ID0gZWxlbWVudC4kY29udGV4dCB8fCAoZWxlbWVudC4kY29udGV4dCA9IGNyZWF0ZURhdGFDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpLCBpbmRleCwgZWxlbWVudCkpO1xuICAgICAgICAgICAgY29udGV4dC5wYXJzZWQgPSB0aGlzLmdldFBhcnNlZChpbmRleCk7XG4gICAgICAgICAgICBjb250ZXh0LnJhdyA9IGRhdGFzZXQuZGF0YVtpbmRleF07XG4gICAgICAgICAgICBjb250ZXh0LmluZGV4ID0gY29udGV4dC5kYXRhSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzLiRjb250ZXh0IHx8ICh0aGlzLiRjb250ZXh0ID0gY3JlYXRlRGF0YXNldENvbnRleHQodGhpcy5jaGFydC5nZXRDb250ZXh0KCksIHRoaXMuaW5kZXgpKTtcbiAgICAgICAgICAgIGNvbnRleHQuZGF0YXNldCA9IGRhdGFzZXQ7XG4gICAgICAgICAgICBjb250ZXh0LmluZGV4ID0gY29udGV4dC5kYXRhc2V0SW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuYWN0aXZlID0gISFhY3RpdmU7XG4gICAgICAgIGNvbnRleHQubW9kZSA9IG1vZGU7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiByZXNvbHZlRGF0YXNldEVsZW1lbnRPcHRpb25zKG1vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFzZXRFbGVtZW50VHlwZS5pZCwgbW9kZSk7XG4gICAgfVxuIHJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaW5kZXgsIG1vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFFbGVtZW50VHlwZS5pZCwgbW9kZSwgaW5kZXgpO1xuICAgIH1cbiBfcmVzb2x2ZUVsZW1lbnRPcHRpb25zKGVsZW1lbnRUeXBlLCBtb2RlID0gJ2RlZmF1bHQnLCBpbmRleCkge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBtb2RlID09PSAnYWN0aXZlJztcbiAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLl9jYWNoZWREYXRhT3B0cztcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBlbGVtZW50VHlwZSArICctJyArIG1vZGU7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgY29uc3Qgc2hhcmluZyA9IHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyAmJiBkZWZpbmVkKGluZGV4KTtcbiAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsb25lSWZOb3RTaGFyZWQoY2FjaGVkLCBzaGFyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNoYXJ0LmNvbmZpZztcbiAgICAgICAgY29uc3Qgc2NvcGVLZXlzID0gY29uZmlnLmRhdGFzZXRFbGVtZW50U2NvcGVLZXlzKHRoaXMuX3R5cGUsIGVsZW1lbnRUeXBlKTtcbiAgICAgICAgY29uc3QgcHJlZml4ZXMgPSBhY3RpdmUgPyBbXG4gICAgICAgICAgICBgJHtlbGVtZW50VHlwZX1Ib3ZlcmAsXG4gICAgICAgICAgICAnaG92ZXInLFxuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAnJ1xuICAgICAgICBdIDogW1xuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAnJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBzY29wZXMgPSBjb25maWcuZ2V0T3B0aW9uU2NvcGVzKHRoaXMuZ2V0RGF0YXNldCgpLCBzY29wZUtleXMpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKGRlZmF1bHRzLmVsZW1lbnRzW2VsZW1lbnRUeXBlXSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSAoKT0+dGhpcy5nZXRDb250ZXh0KGluZGV4LCBhY3RpdmUsIG1vZGUpO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBjb25maWcucmVzb2x2ZU5hbWVkT3B0aW9ucyhzY29wZXMsIG5hbWVzLCBjb250ZXh0LCBwcmVmaXhlcyk7XG4gICAgICAgIGlmICh2YWx1ZXMuJHNoYXJlZCkge1xuICAgICAgICAgICAgdmFsdWVzLiRzaGFyZWQgPSBzaGFyaW5nO1xuICAgICAgICAgICAgY2FjaGVbY2FjaGVLZXldID0gT2JqZWN0LmZyZWV6ZShjbG9uZUlmTm90U2hhcmVkKHZhbHVlcywgc2hhcmluZykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuIF9yZXNvbHZlQW5pbWF0aW9ucyhpbmRleCwgdHJhbnNpdGlvbiwgYWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLl9jYWNoZWREYXRhT3B0cztcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgYW5pbWF0aW9uLSR7dHJhbnNpdGlvbn1gO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSBjYWNoZVtjYWNoZUtleV07XG4gICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wdGlvbnM7XG4gICAgICAgIGlmIChjaGFydC5vcHRpb25zLmFuaW1hdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY2hhcnQuY29uZmlnO1xuICAgICAgICAgICAgY29uc3Qgc2NvcGVLZXlzID0gY29uZmlnLmRhdGFzZXRBbmltYXRpb25TY29wZUtleXModGhpcy5fdHlwZSwgdHJhbnNpdGlvbik7XG4gICAgICAgICAgICBjb25zdCBzY29wZXMgPSBjb25maWcuZ2V0T3B0aW9uU2NvcGVzKHRoaXMuZ2V0RGF0YXNldCgpLCBzY29wZUtleXMpO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGNvbmZpZy5jcmVhdGVSZXNvbHZlcihzY29wZXMsIHRoaXMuZ2V0Q29udGV4dChpbmRleCwgYWN0aXZlLCB0cmFuc2l0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW5pbWF0aW9ucyA9IG5ldyBBbmltYXRpb25zKGNoYXJ0LCBvcHRpb25zICYmIG9wdGlvbnMuYW5pbWF0aW9ucyk7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuX2NhY2hlYWJsZSkge1xuICAgICAgICAgICAgY2FjaGVbY2FjaGVLZXldID0gT2JqZWN0LmZyZWV6ZShhbmltYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYW5pbWF0aW9ucztcbiAgICB9XG4gZ2V0U2hhcmVkT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy4kc2hhcmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NoYXJlZE9wdGlvbnMgfHwgKHRoaXMuX3NoYXJlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSk7XG4gICAgfVxuIGluY2x1ZGVPcHRpb25zKG1vZGUsIHNoYXJlZE9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuICFzaGFyZWRPcHRpb25zIHx8IGlzRGlyZWN0VXBkYXRlTW9kZShtb2RlKSB8fCB0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQ7XG4gICAgfVxuIF9nZXRTaGFyZWRPcHRpb25zKHN0YXJ0LCBtb2RlKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0T3B0cyA9IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzbHlTaGFyZWRPcHRpb25zID0gdGhpcy5fc2hhcmVkT3B0aW9ucztcbiAgICAgICAgY29uc3Qgc2hhcmVkT3B0aW9ucyA9IHRoaXMuZ2V0U2hhcmVkT3B0aW9ucyhmaXJzdE9wdHMpO1xuICAgICAgICBjb25zdCBpbmNsdWRlT3B0aW9ucyA9IHRoaXMuaW5jbHVkZU9wdGlvbnMobW9kZSwgc2hhcmVkT3B0aW9ucykgfHwgc2hhcmVkT3B0aW9ucyAhPT0gcHJldmlvdXNseVNoYXJlZE9wdGlvbnM7XG4gICAgICAgIHRoaXMudXBkYXRlU2hhcmVkT3B0aW9ucyhzaGFyZWRPcHRpb25zLCBtb2RlLCBmaXJzdE9wdHMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2hhcmVkT3B0aW9ucyxcbiAgICAgICAgICAgIGluY2x1ZGVPcHRpb25zXG4gICAgICAgIH07XG4gICAgfVxuIHVwZGF0ZUVsZW1lbnQoZWxlbWVudCwgaW5kZXgsIHByb3BlcnRpZXMsIG1vZGUpIHtcbiAgICAgICAgaWYgKGlzRGlyZWN0VXBkYXRlTW9kZShtb2RlKSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVBbmltYXRpb25zKGluZGV4LCBtb2RlKS51cGRhdGUoZWxlbWVudCwgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9XG4gdXBkYXRlU2hhcmVkT3B0aW9ucyhzaGFyZWRPcHRpb25zLCBtb2RlLCBuZXdPcHRpb25zKSB7XG4gICAgICAgIGlmIChzaGFyZWRPcHRpb25zICYmICFpc0RpcmVjdFVwZGF0ZU1vZGUobW9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVBbmltYXRpb25zKHVuZGVmaW5lZCwgbW9kZSkudXBkYXRlKHNoYXJlZE9wdGlvbnMsIG5ld09wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuIF9zZXRTdHlsZShlbGVtZW50LCBpbmRleCwgbW9kZSwgYWN0aXZlKSB7XG4gICAgICAgIGVsZW1lbnQuYWN0aXZlID0gYWN0aXZlO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRTdHlsZShpbmRleCwgYWN0aXZlKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoaW5kZXgsIG1vZGUsIGFjdGl2ZSkudXBkYXRlKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIG9wdGlvbnM6ICFhY3RpdmUgJiYgdGhpcy5nZXRTaGFyZWRPcHRpb25zKG9wdGlvbnMpIHx8IG9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZUhvdmVyU3R5bGUoZWxlbWVudCwgZGF0YXNldEluZGV4LCBpbmRleCkge1xuICAgICAgICB0aGlzLl9zZXRTdHlsZShlbGVtZW50LCBpbmRleCwgJ2FjdGl2ZScsIGZhbHNlKTtcbiAgICB9XG4gICAgc2V0SG92ZXJTdHlsZShlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4KSB7XG4gICAgICAgIHRoaXMuX3NldFN0eWxlKGVsZW1lbnQsIGluZGV4LCAnYWN0aXZlJywgdHJ1ZSk7XG4gICAgfVxuIF9yZW1vdmVEYXRhc2V0SG92ZXJTdHlsZSgpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NhY2hlZE1ldGEuZGF0YXNldDtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFN0eWxlKGVsZW1lbnQsIHVuZGVmaW5lZCwgJ2FjdGl2ZScsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiBfc2V0RGF0YXNldEhvdmVyU3R5bGUoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGFzZXQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRTdHlsZShlbGVtZW50LCB1bmRlZmluZWQsICdhY3RpdmUnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiBfcmVzeW5jRWxlbWVudHMocmVzZXROZXdFbGVtZW50cykge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fZGF0YTtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGE7XG4gICAgICAgIGZvciAoY29uc3QgW21ldGhvZCwgYXJnMSwgYXJnMl0gb2YgdGhpcy5fc3luY0xpc3Qpe1xuICAgICAgICAgICAgdGhpc1ttZXRob2RdKGFyZzEsIGFyZzIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N5bmNMaXN0ID0gW107XG4gICAgICAgIGNvbnN0IG51bU1ldGEgPSBlbGVtZW50cy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG51bURhdGEgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY291bnQgPSBNYXRoLm1pbihudW1EYXRhLCBudW1NZXRhKTtcbiAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlKDAsIGNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtRGF0YSA+IG51bU1ldGEpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc2VydEVsZW1lbnRzKG51bU1ldGEsIG51bURhdGEgLSBudW1NZXRhLCByZXNldE5ld0VsZW1lbnRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChudW1EYXRhIDwgbnVtTWV0YSkge1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlRWxlbWVudHMobnVtRGF0YSwgbnVtTWV0YSAtIG51bURhdGEpO1xuICAgICAgICB9XG4gICAgfVxuIF9pbnNlcnRFbGVtZW50cyhzdGFydCwgY291bnQsIHJlc2V0TmV3RWxlbWVudHMgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBkYXRhID0gbWV0YS5kYXRhO1xuICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIGNvdW50O1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgY29uc3QgbW92ZSA9IChhcnIpPT57XG4gICAgICAgICAgICBhcnIubGVuZ3RoICs9IGNvdW50O1xuICAgICAgICAgICAgZm9yKGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+PSBlbmQ7IGktLSl7XG4gICAgICAgICAgICAgICAgYXJyW2ldID0gYXJyW2kgLSBjb3VudF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIG1vdmUoZGF0YSk7XG4gICAgICAgIGZvcihpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSl7XG4gICAgICAgICAgICBkYXRhW2ldID0gbmV3IHRoaXMuZGF0YUVsZW1lbnRUeXBlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BhcnNpbmcpIHtcbiAgICAgICAgICAgIG1vdmUobWV0YS5fcGFyc2VkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnNlKHN0YXJ0LCBjb3VudCk7XG4gICAgICAgIGlmIChyZXNldE5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKGRhdGEsIHN0YXJ0LCBjb3VudCwgJ3Jlc2V0Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlRWxlbWVudHMoZWxlbWVudCwgc3RhcnQsIGNvdW50LCBtb2RlKSB7fVxuIF9yZW1vdmVFbGVtZW50cyhzdGFydCwgY291bnQpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGlmICh0aGlzLl9wYXJzaW5nKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkID0gbWV0YS5fcGFyc2VkLnNwbGljZShzdGFydCwgY291bnQpO1xuICAgICAgICAgICAgaWYgKG1ldGEuX3N0YWNrZWQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclN0YWNrcyhtZXRhLCByZW1vdmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtZXRhLmRhdGEuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG4gICAgfVxuIF9zeW5jKGFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhcnNpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX3N5bmNMaXN0LnB1c2goYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBbbWV0aG9kLCBhcmcxLCBhcmcyXSA9IGFyZ3M7XG4gICAgICAgICAgICB0aGlzW21ldGhvZF0oYXJnMSwgYXJnMik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFydC5fZGF0YUNoYW5nZXMucHVzaChbXG4gICAgICAgICAgICB0aGlzLmluZGV4LFxuICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICBdKTtcbiAgICB9XG4gICAgX29uRGF0YVB1c2goKSB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fc3luYyhbXG4gICAgICAgICAgICAnX2luc2VydEVsZW1lbnRzJyxcbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YXNldCgpLmRhdGEubGVuZ3RoIC0gY291bnQsXG4gICAgICAgICAgICBjb3VudFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgX29uRGF0YVBvcCgpIHtcbiAgICAgICAgdGhpcy5fc3luYyhbXG4gICAgICAgICAgICAnX3JlbW92ZUVsZW1lbnRzJyxcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlZE1ldGEuZGF0YS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgMVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgX29uRGF0YVNoaWZ0KCkge1xuICAgICAgICB0aGlzLl9zeW5jKFtcbiAgICAgICAgICAgICdfcmVtb3ZlRWxlbWVudHMnLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDFcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIF9vbkRhdGFTcGxpY2Uoc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgdGhpcy5fc3luYyhbXG4gICAgICAgICAgICAgICAgJ19yZW1vdmVFbGVtZW50cycsXG4gICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgY291bnRcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG4gICAgICAgIGlmIChuZXdDb3VudCkge1xuICAgICAgICAgICAgdGhpcy5fc3luYyhbXG4gICAgICAgICAgICAgICAgJ19pbnNlcnRFbGVtZW50cycsXG4gICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgbmV3Q291bnRcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9vbkRhdGFVbnNoaWZ0KCkge1xuICAgICAgICB0aGlzLl9zeW5jKFtcbiAgICAgICAgICAgICdfaW5zZXJ0RWxlbWVudHMnLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRBbGxTY2FsZVZhbHVlcyhzY2FsZSwgdHlwZSkge1xuICAgIGlmICghc2NhbGUuX2NhY2hlLiRiYXIpIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZU1ldGFzID0gc2NhbGUuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXModHlwZSk7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMCwgaWxlbiA9IHZpc2libGVNZXRhcy5sZW5ndGg7IGkgPCBpbGVuOyBpKyspe1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh2aXNpYmxlTWV0YXNbaV0uY29udHJvbGxlci5nZXRBbGxQYXJzZWRWYWx1ZXMoc2NhbGUpKTtcbiAgICAgICAgfVxuICAgICAgICBzY2FsZS5fY2FjaGUuJGJhciA9IF9hcnJheVVuaXF1ZSh2YWx1ZXMuc29ydCgoYSwgYik9PmEgLSBiKSk7XG4gICAgfVxuICAgIHJldHVybiBzY2FsZS5fY2FjaGUuJGJhcjtcbn1cbiBmdW5jdGlvbiBjb21wdXRlTWluU2FtcGxlU2l6ZShtZXRhKSB7XG4gICAgY29uc3Qgc2NhbGUgPSBtZXRhLmlTY2FsZTtcbiAgICBjb25zdCB2YWx1ZXMgPSBnZXRBbGxTY2FsZVZhbHVlcyhzY2FsZSwgbWV0YS50eXBlKTtcbiAgICBsZXQgbWluID0gc2NhbGUuX2xlbmd0aDtcbiAgICBsZXQgaSwgaWxlbiwgY3VyciwgcHJldjtcbiAgICBjb25zdCB1cGRhdGVNaW5BbmRQcmV2ID0gKCk9PntcbiAgICAgICAgaWYgKGN1cnIgPT09IDMyNzY3IHx8IGN1cnIgPT09IC0zMjc2OCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZpbmVkKHByZXYpKSB7XG4gICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIE1hdGguYWJzKGN1cnIgLSBwcmV2KSB8fCBtaW4pO1xuICAgICAgICB9XG4gICAgICAgIHByZXYgPSBjdXJyO1xuICAgIH07XG4gICAgZm9yKGkgPSAwLCBpbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGN1cnIgPSBzY2FsZS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlc1tpXSk7XG4gICAgICAgIHVwZGF0ZU1pbkFuZFByZXYoKTtcbiAgICB9XG4gICAgcHJldiA9IHVuZGVmaW5lZDtcbiAgICBmb3IoaSA9IDAsIGlsZW4gPSBzY2FsZS50aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICBjdXJyID0gc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKGkpO1xuICAgICAgICB1cGRhdGVNaW5BbmRQcmV2KCk7XG4gICAgfVxuICAgIHJldHVybiBtaW47XG59XG4gZnVuY3Rpb24gY29tcHV0ZUZpdENhdGVnb3J5VHJhaXRzKGluZGV4LCBydWxlciwgb3B0aW9ucywgc3RhY2tDb3VudCkge1xuICAgIGNvbnN0IHRoaWNrbmVzcyA9IG9wdGlvbnMuYmFyVGhpY2tuZXNzO1xuICAgIGxldCBzaXplLCByYXRpbztcbiAgICBpZiAoaXNOdWxsT3JVbmRlZih0aGlja25lc3MpKSB7XG4gICAgICAgIHNpemUgPSBydWxlci5taW4gKiBvcHRpb25zLmNhdGVnb3J5UGVyY2VudGFnZTtcbiAgICAgICAgcmF0aW8gPSBvcHRpb25zLmJhclBlcmNlbnRhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2l6ZSA9IHRoaWNrbmVzcyAqIHN0YWNrQ291bnQ7XG4gICAgICAgIHJhdGlvID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2h1bms6IHNpemUgLyBzdGFja0NvdW50LFxuICAgICAgICByYXRpbyxcbiAgICAgICAgc3RhcnQ6IHJ1bGVyLnBpeGVsc1tpbmRleF0gLSBzaXplIC8gMlxuICAgIH07XG59XG4gZnVuY3Rpb24gY29tcHV0ZUZsZXhDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMsIHN0YWNrQ291bnQpIHtcbiAgICBjb25zdCBwaXhlbHMgPSBydWxlci5waXhlbHM7XG4gICAgY29uc3QgY3VyciA9IHBpeGVsc1tpbmRleF07XG4gICAgbGV0IHByZXYgPSBpbmRleCA+IDAgPyBwaXhlbHNbaW5kZXggLSAxXSA6IG51bGw7XG4gICAgbGV0IG5leHQgPSBpbmRleCA8IHBpeGVscy5sZW5ndGggLSAxID8gcGl4ZWxzW2luZGV4ICsgMV0gOiBudWxsO1xuICAgIGNvbnN0IHBlcmNlbnQgPSBvcHRpb25zLmNhdGVnb3J5UGVyY2VudGFnZTtcbiAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgICBwcmV2ID0gY3VyciAtIChuZXh0ID09PSBudWxsID8gcnVsZXIuZW5kIC0gcnVsZXIuc3RhcnQgOiBuZXh0IC0gY3Vycik7XG4gICAgfVxuICAgIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgICAgIG5leHQgPSBjdXJyICsgY3VyciAtIHByZXY7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gY3VyciAtIChjdXJyIC0gTWF0aC5taW4ocHJldiwgbmV4dCkpIC8gMiAqIHBlcmNlbnQ7XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGguYWJzKG5leHQgLSBwcmV2KSAvIDIgKiBwZXJjZW50O1xuICAgIHJldHVybiB7XG4gICAgICAgIGNodW5rOiBzaXplIC8gc3RhY2tDb3VudCxcbiAgICAgICAgcmF0aW86IG9wdGlvbnMuYmFyUGVyY2VudGFnZSxcbiAgICAgICAgc3RhcnRcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VGbG9hdEJhcihlbnRyeSwgaXRlbSwgdlNjYWxlLCBpKSB7XG4gICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZTY2FsZS5wYXJzZShlbnRyeVswXSwgaSk7XG4gICAgY29uc3QgZW5kVmFsdWUgPSB2U2NhbGUucGFyc2UoZW50cnlbMV0sIGkpO1xuICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHN0YXJ0VmFsdWUsIGVuZFZhbHVlKTtcbiAgICBjb25zdCBtYXggPSBNYXRoLm1heChzdGFydFZhbHVlLCBlbmRWYWx1ZSk7XG4gICAgbGV0IGJhclN0YXJ0ID0gbWluO1xuICAgIGxldCBiYXJFbmQgPSBtYXg7XG4gICAgaWYgKE1hdGguYWJzKG1pbikgPiBNYXRoLmFicyhtYXgpKSB7XG4gICAgICAgIGJhclN0YXJ0ID0gbWF4O1xuICAgICAgICBiYXJFbmQgPSBtaW47XG4gICAgfVxuICAgIGl0ZW1bdlNjYWxlLmF4aXNdID0gYmFyRW5kO1xuICAgIGl0ZW0uX2N1c3RvbSA9IHtcbiAgICAgICAgYmFyU3RhcnQsXG4gICAgICAgIGJhckVuZCxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0VmFsdWUsXG4gICAgICAgIGVuZDogZW5kVmFsdWUsXG4gICAgICAgIG1pbixcbiAgICAgICAgbWF4XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoZW50cnksIGl0ZW0sIHZTY2FsZSwgaSkge1xuICAgIGlmIChpc0FycmF5KGVudHJ5KSkge1xuICAgICAgICBwYXJzZUZsb2F0QmFyKGVudHJ5LCBpdGVtLCB2U2NhbGUsIGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1bdlNjYWxlLmF4aXNdID0gdlNjYWxlLnBhcnNlKGVudHJ5LCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG59XG5mdW5jdGlvbiBwYXJzZUFycmF5T3JQcmltaXRpdmUobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3QgaVNjYWxlID0gbWV0YS5pU2NhbGU7XG4gICAgY29uc3QgdlNjYWxlID0gbWV0YS52U2NhbGU7XG4gICAgY29uc3QgbGFiZWxzID0gaVNjYWxlLmdldExhYmVscygpO1xuICAgIGNvbnN0IHNpbmdsZVNjYWxlID0gaVNjYWxlID09PSB2U2NhbGU7XG4gICAgY29uc3QgcGFyc2VkID0gW107XG4gICAgbGV0IGksIGlsZW4sIGl0ZW0sIGVudHJ5O1xuICAgIGZvcihpID0gc3RhcnQsIGlsZW4gPSBzdGFydCArIGNvdW50OyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgZW50cnkgPSBkYXRhW2ldO1xuICAgICAgICBpdGVtID0ge307XG4gICAgICAgIGl0ZW1baVNjYWxlLmF4aXNdID0gc2luZ2xlU2NhbGUgfHwgaVNjYWxlLnBhcnNlKGxhYmVsc1tpXSwgaSk7XG4gICAgICAgIHBhcnNlZC5wdXNoKHBhcnNlVmFsdWUoZW50cnksIGl0ZW0sIHZTY2FsZSwgaSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xufVxuZnVuY3Rpb24gaXNGbG9hdEJhcihjdXN0b20pIHtcbiAgICByZXR1cm4gY3VzdG9tICYmIGN1c3RvbS5iYXJTdGFydCAhPT0gdW5kZWZpbmVkICYmIGN1c3RvbS5iYXJFbmQgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGJhclNpZ24oc2l6ZSwgdlNjYWxlLCBhY3R1YWxCYXNlKSB7XG4gICAgaWYgKHNpemUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIHNpZ24oc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiAodlNjYWxlLmlzSG9yaXpvbnRhbCgpID8gMSA6IC0xKSAqICh2U2NhbGUubWluID49IGFjdHVhbEJhc2UgPyAxIDogLTEpO1xufVxuZnVuY3Rpb24gYm9yZGVyUHJvcHMocHJvcGVydGllcykge1xuICAgIGxldCByZXZlcnNlLCBzdGFydCwgZW5kLCB0b3AsIGJvdHRvbTtcbiAgICBpZiAocHJvcGVydGllcy5ob3Jpem9udGFsKSB7XG4gICAgICAgIHJldmVyc2UgPSBwcm9wZXJ0aWVzLmJhc2UgPiBwcm9wZXJ0aWVzLng7XG4gICAgICAgIHN0YXJ0ID0gJ2xlZnQnO1xuICAgICAgICBlbmQgPSAncmlnaHQnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldmVyc2UgPSBwcm9wZXJ0aWVzLmJhc2UgPCBwcm9wZXJ0aWVzLnk7XG4gICAgICAgIHN0YXJ0ID0gJ2JvdHRvbSc7XG4gICAgICAgIGVuZCA9ICd0b3AnO1xuICAgIH1cbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICB0b3AgPSAnZW5kJztcbiAgICAgICAgYm90dG9tID0gJ3N0YXJ0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICB0b3AgPSAnc3RhcnQnO1xuICAgICAgICBib3R0b20gPSAnZW5kJztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGVuZCxcbiAgICAgICAgcmV2ZXJzZSxcbiAgICAgICAgdG9wLFxuICAgICAgICBib3R0b21cbiAgICB9O1xufVxuZnVuY3Rpb24gc2V0Qm9yZGVyU2tpcHBlZChwcm9wZXJ0aWVzLCBvcHRpb25zLCBzdGFjaywgaW5kZXgpIHtcbiAgICBsZXQgZWRnZSA9IG9wdGlvbnMuYm9yZGVyU2tpcHBlZDtcbiAgICBjb25zdCByZXMgPSB7fTtcbiAgICBpZiAoIWVkZ2UpIHtcbiAgICAgICAgcHJvcGVydGllcy5ib3JkZXJTa2lwcGVkID0gcmVzO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlZGdlID09PSB0cnVlKSB7XG4gICAgICAgIHByb3BlcnRpZXMuYm9yZGVyU2tpcHBlZCA9IHtcbiAgICAgICAgICAgIHRvcDogdHJ1ZSxcbiAgICAgICAgICAgIHJpZ2h0OiB0cnVlLFxuICAgICAgICAgICAgYm90dG9tOiB0cnVlLFxuICAgICAgICAgICAgbGVmdDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgc3RhcnQgLCBlbmQgLCByZXZlcnNlICwgdG9wICwgYm90dG9tICB9ID0gYm9yZGVyUHJvcHMocHJvcGVydGllcyk7XG4gICAgaWYgKGVkZ2UgPT09ICdtaWRkbGUnICYmIHN0YWNrKSB7XG4gICAgICAgIHByb3BlcnRpZXMuZW5hYmxlQm9yZGVyUmFkaXVzID0gdHJ1ZTtcbiAgICAgICAgaWYgKChzdGFjay5fdG9wIHx8IDApID09PSBpbmRleCkge1xuICAgICAgICAgICAgZWRnZSA9IHRvcDtcbiAgICAgICAgfSBlbHNlIGlmICgoc3RhY2suX2JvdHRvbSB8fCAwKSA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgIGVkZ2UgPSBib3R0b207XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNbcGFyc2VFZGdlKGJvdHRvbSwgc3RhcnQsIGVuZCwgcmV2ZXJzZSldID0gdHJ1ZTtcbiAgICAgICAgICAgIGVkZ2UgPSB0b3A7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVzW3BhcnNlRWRnZShlZGdlLCBzdGFydCwgZW5kLCByZXZlcnNlKV0gPSB0cnVlO1xuICAgIHByb3BlcnRpZXMuYm9yZGVyU2tpcHBlZCA9IHJlcztcbn1cbmZ1bmN0aW9uIHBhcnNlRWRnZShlZGdlLCBhLCBiLCByZXZlcnNlKSB7XG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgZWRnZSA9IHN3YXAoZWRnZSwgYSwgYik7XG4gICAgICAgIGVkZ2UgPSBzdGFydEVuZChlZGdlLCBiLCBhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBlZGdlID0gc3RhcnRFbmQoZWRnZSwgYSwgYik7XG4gICAgfVxuICAgIHJldHVybiBlZGdlO1xufVxuZnVuY3Rpb24gc3dhcChvcmlnLCB2MSwgdjIpIHtcbiAgICByZXR1cm4gb3JpZyA9PT0gdjEgPyB2MiA6IG9yaWcgPT09IHYyID8gdjEgOiBvcmlnO1xufVxuZnVuY3Rpb24gc3RhcnRFbmQodiwgc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiB2ID09PSAnc3RhcnQnID8gc3RhcnQgOiB2ID09PSAnZW5kJyA/IGVuZCA6IHY7XG59XG5mdW5jdGlvbiBzZXRJbmZsYXRlQW1vdW50KHByb3BlcnRpZXMsIHsgaW5mbGF0ZUFtb3VudCAgfSwgcmF0aW8pIHtcbiAgICBwcm9wZXJ0aWVzLmluZmxhdGVBbW91bnQgPSBpbmZsYXRlQW1vdW50ID09PSAnYXV0bycgPyByYXRpbyA9PT0gMSA/IDAuMzMgOiAwIDogaW5mbGF0ZUFtb3VudDtcbn1cbmNsYXNzIEJhckNvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG4gICAgc3RhdGljIGlkID0gJ2Jhcic7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBkYXRhc2V0RWxlbWVudFR5cGU6IGZhbHNlLFxuICAgICAgICBkYXRhRWxlbWVudFR5cGU6ICdiYXInLFxuICAgICAgICBjYXRlZ29yeVBlcmNlbnRhZ2U6IDAuOCxcbiAgICAgICAgYmFyUGVyY2VudGFnZTogMC45LFxuICAgICAgICBncm91cGVkOiB0cnVlLFxuICAgICAgICBhbmltYXRpb25zOiB7XG4gICAgICAgICAgICBudW1iZXJzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogW1xuICAgICAgICAgICAgICAgICAgICAneCcsXG4gICAgICAgICAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICAgICAgICAgJ2Jhc2UnLFxuICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0J1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gc3RhdGljIG92ZXJyaWRlcyA9IHtcbiAgICAgICAgc2NhbGVzOiB7XG4gICAgICAgICAgICBfaW5kZXhfOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NhdGVnb3J5JyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZ3JpZDoge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX3ZhbHVlXzoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5lYXInLFxuICAgICAgICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuIHBhcnNlUHJpbWl0aXZlRGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlQXJyYXlPclByaW1pdGl2ZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgIH1cbiBwYXJzZUFycmF5RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlQXJyYXlPclByaW1pdGl2ZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgIH1cbiBwYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHsgaVNjYWxlICwgdlNjYWxlICB9ID0gbWV0YTtcbiAgICAgICAgY29uc3QgeyB4QXhpc0tleSA9J3gnICwgeUF4aXNLZXkgPSd5JyAgfSA9IHRoaXMuX3BhcnNpbmc7XG4gICAgICAgIGNvbnN0IGlBeGlzS2V5ID0gaVNjYWxlLmF4aXMgPT09ICd4JyA/IHhBeGlzS2V5IDogeUF4aXNLZXk7XG4gICAgICAgIGNvbnN0IHZBeGlzS2V5ID0gdlNjYWxlLmF4aXMgPT09ICd4JyA/IHhBeGlzS2V5IDogeUF4aXNLZXk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xuICAgICAgICBsZXQgaSwgaWxlbiwgaXRlbSwgb2JqO1xuICAgICAgICBmb3IoaSA9IHN0YXJ0LCBpbGVuID0gc3RhcnQgKyBjb3VudDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBvYmogPSBkYXRhW2ldO1xuICAgICAgICAgICAgaXRlbSA9IHt9O1xuICAgICAgICAgICAgaXRlbVtpU2NhbGUuYXhpc10gPSBpU2NhbGUucGFyc2UocmVzb2x2ZU9iamVjdEtleShvYmosIGlBeGlzS2V5KSwgaSk7XG4gICAgICAgICAgICBwYXJzZWQucHVzaChwYXJzZVZhbHVlKHJlc29sdmVPYmplY3RLZXkob2JqLCB2QXhpc0tleSksIGl0ZW0sIHZTY2FsZSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuIHVwZGF0ZVJhbmdlRnJvbVBhcnNlZChyYW5nZSwgc2NhbGUsIHBhcnNlZCwgc3RhY2spIHtcbiAgICAgICAgc3VwZXIudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKHJhbmdlLCBzY2FsZSwgcGFyc2VkLCBzdGFjayk7XG4gICAgICAgIGNvbnN0IGN1c3RvbSA9IHBhcnNlZC5fY3VzdG9tO1xuICAgICAgICBpZiAoY3VzdG9tICYmIHNjYWxlID09PSB0aGlzLl9jYWNoZWRNZXRhLnZTY2FsZSkge1xuICAgICAgICAgICAgcmFuZ2UubWluID0gTWF0aC5taW4ocmFuZ2UubWluLCBjdXN0b20ubWluKTtcbiAgICAgICAgICAgIHJhbmdlLm1heCA9IE1hdGgubWF4KHJhbmdlLm1heCwgY3VzdG9tLm1heCk7XG4gICAgICAgIH1cbiAgICB9XG4gZ2V0TWF4T3ZlcmZsb3coKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiBnZXRMYWJlbEFuZFZhbHVlKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCB7IGlTY2FsZSAsIHZTY2FsZSAgfSA9IG1ldGE7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICAgICAgY29uc3QgY3VzdG9tID0gcGFyc2VkLl9jdXN0b207XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXNGbG9hdEJhcihjdXN0b20pID8gJ1snICsgY3VzdG9tLnN0YXJ0ICsgJywgJyArIGN1c3RvbS5lbmQgKyAnXScgOiAnJyArIHZTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFt2U2NhbGUuYXhpc10pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6ICcnICsgaVNjYWxlLmdldExhYmVsRm9yVmFsdWUocGFyc2VkW2lTY2FsZS5heGlzXSksXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICB0aGlzLmVuYWJsZU9wdGlvblNoYXJpbmcgPSB0cnVlO1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBtZXRhLnN0YWNrID0gdGhpcy5nZXREYXRhc2V0KCkuc3RhY2s7XG4gICAgfVxuICAgIHVwZGF0ZShtb2RlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKG1ldGEuZGF0YSwgMCwgbWV0YS5kYXRhLmxlbmd0aCwgbW9kZSk7XG4gICAgfVxuICAgIHVwZGF0ZUVsZW1lbnRzKGJhcnMsIHN0YXJ0LCBjb3VudCwgbW9kZSkge1xuICAgICAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgICAgIGNvbnN0IHsgaW5kZXggLCBfY2FjaGVkTWV0YTogeyB2U2NhbGUgIH0gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBiYXNlID0gdlNjYWxlLmdldEJhc2VQaXhlbCgpO1xuICAgICAgICBjb25zdCBob3Jpem9udGFsID0gdlNjYWxlLmlzSG9yaXpvbnRhbCgpO1xuICAgICAgICBjb25zdCBydWxlciA9IHRoaXMuX2dldFJ1bGVyKCk7XG4gICAgICAgIGNvbnN0IHsgc2hhcmVkT3B0aW9ucyAsIGluY2x1ZGVPcHRpb25zICB9ID0gdGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgICAgIGZvcihsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGkpO1xuICAgICAgICAgICAgY29uc3QgdnBpeGVscyA9IHJlc2V0IHx8IGlzTnVsbE9yVW5kZWYocGFyc2VkW3ZTY2FsZS5heGlzXSkgPyB7XG4gICAgICAgICAgICAgICAgYmFzZSxcbiAgICAgICAgICAgICAgICBoZWFkOiBiYXNlXG4gICAgICAgICAgICB9IDogdGhpcy5fY2FsY3VsYXRlQmFyVmFsdWVQaXhlbHMoaSk7XG4gICAgICAgICAgICBjb25zdCBpcGl4ZWxzID0gdGhpcy5fY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMoaSwgcnVsZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSAocGFyc2VkLl9zdGFja3MgfHwge30pW3ZTY2FsZS5heGlzXTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbCxcbiAgICAgICAgICAgICAgICBiYXNlOiB2cGl4ZWxzLmJhc2UsXG4gICAgICAgICAgICAgICAgZW5hYmxlQm9yZGVyUmFkaXVzOiAhc3RhY2sgfHwgaXNGbG9hdEJhcihwYXJzZWQuX2N1c3RvbSkgfHwgaW5kZXggPT09IHN0YWNrLl90b3AgfHwgaW5kZXggPT09IHN0YWNrLl9ib3R0b20sXG4gICAgICAgICAgICAgICAgeDogaG9yaXpvbnRhbCA/IHZwaXhlbHMuaGVhZCA6IGlwaXhlbHMuY2VudGVyLFxuICAgICAgICAgICAgICAgIHk6IGhvcml6b250YWwgPyBpcGl4ZWxzLmNlbnRlciA6IHZwaXhlbHMuaGVhZCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhvcml6b250YWwgPyBpcGl4ZWxzLnNpemUgOiBNYXRoLmFicyh2cGl4ZWxzLnNpemUpLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBob3Jpem9udGFsID8gTWF0aC5hYnModnBpeGVscy5zaXplKSA6IGlwaXhlbHMuc2l6ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChpbmNsdWRlT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHNoYXJlZE9wdGlvbnMgfHwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIGJhcnNbaV0uYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9wZXJ0aWVzLm9wdGlvbnMgfHwgYmFyc1tpXS5vcHRpb25zO1xuICAgICAgICAgICAgc2V0Qm9yZGVyU2tpcHBlZChwcm9wZXJ0aWVzLCBvcHRpb25zLCBzdGFjaywgaW5kZXgpO1xuICAgICAgICAgICAgc2V0SW5mbGF0ZUFtb3VudChwcm9wZXJ0aWVzLCBvcHRpb25zLCBydWxlci5yYXRpbyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoYmFyc1tpXSwgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gX2dldFN0YWNrcyhsYXN0LCBkYXRhSW5kZXgpIHtcbiAgICAgICAgY29uc3QgeyBpU2NhbGUgIH0gPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBtZXRhc2V0cyA9IGlTY2FsZS5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcyh0aGlzLl90eXBlKS5maWx0ZXIoKG1ldGEpPT5tZXRhLmNvbnRyb2xsZXIub3B0aW9ucy5ncm91cGVkKTtcbiAgICAgICAgY29uc3Qgc3RhY2tlZCA9IGlTY2FsZS5vcHRpb25zLnN0YWNrZWQ7XG4gICAgICAgIGNvbnN0IHN0YWNrcyA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyZW50UGFyc2VkID0gdGhpcy5fY2FjaGVkTWV0YS5jb250cm9sbGVyLmdldFBhcnNlZChkYXRhSW5kZXgpO1xuICAgICAgICBjb25zdCBpU2NhbGVWYWx1ZSA9IGN1cnJlbnRQYXJzZWQgJiYgY3VycmVudFBhcnNlZFtpU2NhbGUuYXhpc107XG4gICAgICAgIGNvbnN0IHNraXBOdWxsID0gKG1ldGEpPT57XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBtZXRhLl9wYXJzZWQuZmluZCgoaXRlbSk9Pml0ZW1baVNjYWxlLmF4aXNdID09PSBpU2NhbGVWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSBwYXJzZWQgJiYgcGFyc2VkW21ldGEudlNjYWxlLmF4aXNdO1xuICAgICAgICAgICAgaWYgKGlzTnVsbE9yVW5kZWYodmFsKSB8fCBpc05hTih2YWwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgbWV0YSBvZiBtZXRhc2V0cyl7XG4gICAgICAgICAgICBpZiAoZGF0YUluZGV4ICE9PSB1bmRlZmluZWQgJiYgc2tpcE51bGwobWV0YSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGFja2VkID09PSBmYWxzZSB8fCBzdGFja3MuaW5kZXhPZihtZXRhLnN0YWNrKSA9PT0gLTEgfHwgc3RhY2tlZCA9PT0gdW5kZWZpbmVkICYmIG1ldGEuc3RhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN0YWNrcy5wdXNoKG1ldGEuc3RhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGEuaW5kZXggPT09IGxhc3QpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN0YWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0YWNrcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YWNrcztcbiAgICB9XG4gX2dldFN0YWNrQ291bnQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFN0YWNrcyh1bmRlZmluZWQsIGluZGV4KS5sZW5ndGg7XG4gICAgfVxuICAgIF9nZXRBeGlzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBeGlzKCkubGVuZ3RoO1xuICAgIH1cbiAgICBnZXRGaXJzdFNjYWxlSWRGb3JJbmRleEF4aXMoKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlcyA9IHRoaXMuY2hhcnQuc2NhbGVzO1xuICAgICAgICBjb25zdCBpbmRleFNjYWxlSWQgPSB0aGlzLmNoYXJ0Lm9wdGlvbnMuaW5kZXhBeGlzO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NhbGVzKS5maWx0ZXIoKGtleSk9PnNjYWxlc1trZXldLmF4aXMgPT09IGluZGV4U2NhbGVJZCkuc2hpZnQoKTtcbiAgICB9XG4gICAgX2dldEF4aXMoKSB7XG4gICAgICAgIGNvbnN0IGF4aXMgPSB7fTtcbiAgICAgICAgY29uc3QgZmlyc3RTY2FsZUF4aXNJZCA9IHRoaXMuZ2V0Rmlyc3RTY2FsZUlkRm9ySW5kZXhBeGlzKCk7XG4gICAgICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMpe1xuICAgICAgICAgICAgYXhpc1t2YWx1ZU9yRGVmYXVsdCh0aGlzLmNoYXJ0Lm9wdGlvbnMuaW5kZXhBeGlzID09PSAneCcgPyBkYXRhc2V0LnhBeGlzSUQgOiBkYXRhc2V0LnlBeGlzSUQsIGZpcnN0U2NhbGVBeGlzSWQpXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGF4aXMpO1xuICAgIH1cbiBfZ2V0U3RhY2tJbmRleChkYXRhc2V0SW5kZXgsIG5hbWUsIGRhdGFJbmRleCkge1xuICAgICAgICBjb25zdCBzdGFja3MgPSB0aGlzLl9nZXRTdGFja3MoZGF0YXNldEluZGV4LCBkYXRhSW5kZXgpO1xuICAgICAgICBjb25zdCBpbmRleCA9IG5hbWUgIT09IHVuZGVmaW5lZCA/IHN0YWNrcy5pbmRleE9mKG5hbWUpIDogLTE7XG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gLTEgPyBzdGFja3MubGVuZ3RoIC0gMSA6IGluZGV4O1xuICAgIH1cbiBfZ2V0UnVsZXIoKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBpU2NhbGUgPSBtZXRhLmlTY2FsZTtcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gW107XG4gICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBtZXRhLmRhdGEubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIHBpeGVscy5wdXNoKGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0UGFyc2VkKGkpW2lTY2FsZS5heGlzXSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhclRoaWNrbmVzcyA9IG9wdHMuYmFyVGhpY2tuZXNzO1xuICAgICAgICBjb25zdCBtaW4gPSBiYXJUaGlja25lc3MgfHwgY29tcHV0ZU1pblNhbXBsZVNpemUobWV0YSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICBwaXhlbHMsXG4gICAgICAgICAgICBzdGFydDogaVNjYWxlLl9zdGFydFBpeGVsLFxuICAgICAgICAgICAgZW5kOiBpU2NhbGUuX2VuZFBpeGVsLFxuICAgICAgICAgICAgc3RhY2tDb3VudDogdGhpcy5fZ2V0U3RhY2tDb3VudCgpLFxuICAgICAgICAgICAgc2NhbGU6IGlTY2FsZSxcbiAgICAgICAgICAgIGdyb3VwZWQ6IG9wdHMuZ3JvdXBlZCxcbiAgICAgICAgICAgIHJhdGlvOiBiYXJUaGlja25lc3MgPyAxIDogb3B0cy5jYXRlZ29yeVBlcmNlbnRhZ2UgKiBvcHRzLmJhclBlcmNlbnRhZ2VcbiAgICAgICAgfTtcbiAgICB9XG4gX2NhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IHsgX2NhY2hlZE1ldGE6IHsgdlNjYWxlICwgX3N0YWNrZWQgLCBpbmRleDogZGF0YXNldEluZGV4ICB9ICwgb3B0aW9uczogeyBiYXNlOiBiYXNlVmFsdWUgLCBtaW5CYXJMZW5ndGggIH0gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBhY3R1YWxCYXNlID0gYmFzZVZhbHVlIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICAgICAgY29uc3QgY3VzdG9tID0gcGFyc2VkLl9jdXN0b207XG4gICAgICAgIGNvbnN0IGZsb2F0aW5nID0gaXNGbG9hdEJhcihjdXN0b20pO1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZWRbdlNjYWxlLmF4aXNdO1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgbGVuZ3RoID0gX3N0YWNrZWQgPyB0aGlzLmFwcGx5U3RhY2sodlNjYWxlLCBwYXJzZWQsIF9zdGFja2VkKSA6IHZhbHVlO1xuICAgICAgICBsZXQgaGVhZCwgc2l6ZTtcbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gbGVuZ3RoIC0gdmFsdWU7XG4gICAgICAgICAgICBsZW5ndGggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY3VzdG9tLmJhclN0YXJ0O1xuICAgICAgICAgICAgbGVuZ3RoID0gY3VzdG9tLmJhckVuZCAtIGN1c3RvbS5iYXJTdGFydDtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gMCAmJiBzaWduKHZhbHVlKSAhPT0gc2lnbihjdXN0b20uYmFyRW5kKSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXJ0ICs9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSAhaXNOdWxsT3JVbmRlZihiYXNlVmFsdWUpICYmICFmbG9hdGluZyA/IGJhc2VWYWx1ZSA6IHN0YXJ0O1xuICAgICAgICBsZXQgYmFzZSA9IHZTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHN0YXJ0VmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eShpbmRleCkpIHtcbiAgICAgICAgICAgIGhlYWQgPSB2U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdGFydCArIGxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWFkID0gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICBzaXplID0gaGVhZCAtIGJhc2U7XG4gICAgICAgIGlmIChNYXRoLmFicyhzaXplKSA8IG1pbkJhckxlbmd0aCkge1xuICAgICAgICAgICAgc2l6ZSA9IGJhclNpZ24oc2l6ZSwgdlNjYWxlLCBhY3R1YWxCYXNlKSAqIG1pbkJhckxlbmd0aDtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gYWN0dWFsQmFzZSkge1xuICAgICAgICAgICAgICAgIGJhc2UgLT0gc2l6ZSAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdGFydFBpeGVsID0gdlNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgwKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBpeGVsID0gdlNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgxKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHN0YXJ0UGl4ZWwsIGVuZFBpeGVsKTtcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHN0YXJ0UGl4ZWwsIGVuZFBpeGVsKTtcbiAgICAgICAgICAgIGJhc2UgPSBNYXRoLm1heChNYXRoLm1pbihiYXNlLCBtYXgpLCBtaW4pO1xuICAgICAgICAgICAgaGVhZCA9IGJhc2UgKyBzaXplO1xuICAgICAgICAgICAgaWYgKF9zdGFja2VkICYmICFmbG9hdGluZykge1xuICAgICAgICAgICAgICAgIHBhcnNlZC5fc3RhY2tzW3ZTY2FsZS5heGlzXS5fdmlzdWFsVmFsdWVzW2RhdGFzZXRJbmRleF0gPSB2U2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChoZWFkKSAtIHZTY2FsZS5nZXRWYWx1ZUZvclBpeGVsKGJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlID09PSB2U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShhY3R1YWxCYXNlKSkge1xuICAgICAgICAgICAgY29uc3QgaGFsZkdyaWQgPSBzaWduKHNpemUpICogdlNjYWxlLmdldExpbmVXaWR0aEZvclZhbHVlKGFjdHVhbEJhc2UpIC8gMjtcbiAgICAgICAgICAgIGJhc2UgKz0gaGFsZkdyaWQ7XG4gICAgICAgICAgICBzaXplIC09IGhhbGZHcmlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzaXplLFxuICAgICAgICAgICAgYmFzZSxcbiAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICBjZW50ZXI6IGhlYWQgKyBzaXplIC8gMlxuICAgICAgICB9O1xuICAgIH1cbiBfY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMoaW5kZXgsIHJ1bGVyKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gcnVsZXIuc2NhbGU7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHNraXBOdWxsID0gb3B0aW9ucy5za2lwTnVsbDtcbiAgICAgICAgY29uc3QgbWF4QmFyVGhpY2tuZXNzID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy5tYXhCYXJUaGlja25lc3MsIEluZmluaXR5KTtcbiAgICAgICAgbGV0IGNlbnRlciwgc2l6ZTtcbiAgICAgICAgY29uc3QgYXhpc0NvdW50ID0gdGhpcy5fZ2V0QXhpc0NvdW50KCk7XG4gICAgICAgIGlmIChydWxlci5ncm91cGVkKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFja0NvdW50ID0gc2tpcE51bGwgPyB0aGlzLl9nZXRTdGFja0NvdW50KGluZGV4KSA6IHJ1bGVyLnN0YWNrQ291bnQ7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IG9wdGlvbnMuYmFyVGhpY2tuZXNzID09PSAnZmxleCcgPyBjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzKGluZGV4LCBydWxlciwgb3B0aW9ucywgc3RhY2tDb3VudCAqIGF4aXNDb3VudCkgOiBjb21wdXRlRml0Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zLCBzdGFja0NvdW50ICogYXhpc0NvdW50KTtcbiAgICAgICAgICAgIGNvbnN0IGF4aXNJRCA9IHRoaXMuY2hhcnQub3B0aW9ucy5pbmRleEF4aXMgPT09ICd4JyA/IHRoaXMuZ2V0RGF0YXNldCgpLnhBeGlzSUQgOiB0aGlzLmdldERhdGFzZXQoKS55QXhpc0lEO1xuICAgICAgICAgICAgY29uc3QgYXhpc051bWJlciA9IHRoaXMuX2dldEF4aXMoKS5pbmRleE9mKHZhbHVlT3JEZWZhdWx0KGF4aXNJRCwgdGhpcy5nZXRGaXJzdFNjYWxlSWRGb3JJbmRleEF4aXMoKSkpO1xuICAgICAgICAgICAgY29uc3Qgc3RhY2tJbmRleCA9IHRoaXMuX2dldFN0YWNrSW5kZXgodGhpcy5pbmRleCwgdGhpcy5fY2FjaGVkTWV0YS5zdGFjaywgc2tpcE51bGwgPyBpbmRleCA6IHVuZGVmaW5lZCkgKyBheGlzTnVtYmVyO1xuICAgICAgICAgICAgY2VudGVyID0gcmFuZ2Uuc3RhcnQgKyByYW5nZS5jaHVuayAqIHN0YWNrSW5kZXggKyByYW5nZS5jaHVuayAvIDI7XG4gICAgICAgICAgICBzaXplID0gTWF0aC5taW4obWF4QmFyVGhpY2tuZXNzLCByYW5nZS5jaHVuayAqIHJhbmdlLnJhdGlvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNlbnRlciA9IHNjYWxlLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRQYXJzZWQoaW5kZXgpW3NjYWxlLmF4aXNdLCBpbmRleCk7XG4gICAgICAgICAgICBzaXplID0gTWF0aC5taW4obWF4QmFyVGhpY2tuZXNzLCBydWxlci5taW4gKiBydWxlci5yYXRpbyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJhc2U6IGNlbnRlciAtIHNpemUgLyAyLFxuICAgICAgICAgICAgaGVhZDogY2VudGVyICsgc2l6ZSAvIDIsXG4gICAgICAgICAgICBjZW50ZXIsXG4gICAgICAgICAgICBzaXplXG4gICAgICAgIH07XG4gICAgfVxuICAgIGRyYXcoKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCB2U2NhbGUgPSBtZXRhLnZTY2FsZTtcbiAgICAgICAgY29uc3QgcmVjdHMgPSBtZXRhLmRhdGE7XG4gICAgICAgIGNvbnN0IGlsZW4gPSByZWN0cy5sZW5ndGg7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yKDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBpZiAodGhpcy5nZXRQYXJzZWQoaSlbdlNjYWxlLmF4aXNdICE9PSBudWxsICYmICFyZWN0c1tpXS5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICByZWN0c1tpXS5kcmF3KHRoaXMuX2N0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIEJ1YmJsZUNvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG4gICAgc3RhdGljIGlkID0gJ2J1YmJsZSc7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBkYXRhc2V0RWxlbWVudFR5cGU6IGZhbHNlLFxuICAgICAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG4gICAgICAgIGFuaW1hdGlvbnM6IHtcbiAgICAgICAgICAgIG51bWJlcnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgICAgICAgICAnYm9yZGVyV2lkdGgnLFxuICAgICAgICAgICAgICAgICAgICAncmFkaXVzJ1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gc3RhdGljIG92ZXJyaWRlcyA9IHtcbiAgICAgICAgc2NhbGVzOiB7XG4gICAgICAgICAgICB4OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmVhcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmVhcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nID0gdHJ1ZTtcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiBwYXJzZVByaW1pdGl2ZURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHN1cGVyLnBhcnNlUHJpbWl0aXZlRGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgcGFyc2VkLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHBhcnNlZFtpXS5fY3VzdG9tID0gdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkgKyBzdGFydCkucmFkaXVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuIHBhcnNlQXJyYXlEYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBzdXBlci5wYXJzZUFycmF5RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgcGFyc2VkLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW3N0YXJ0ICsgaV07XG4gICAgICAgICAgICBwYXJzZWRbaV0uX2N1c3RvbSA9IHZhbHVlT3JEZWZhdWx0KGl0ZW1bMl0sIHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpICsgc3RhcnQpLnJhZGl1cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gcGFyc2VPYmplY3REYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBzdXBlci5wYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHBhcnNlZC5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gZGF0YVtzdGFydCArIGldO1xuICAgICAgICAgICAgcGFyc2VkW2ldLl9jdXN0b20gPSB2YWx1ZU9yRGVmYXVsdChpdGVtICYmIGl0ZW0uciAmJiAraXRlbS5yLCB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSArIHN0YXJ0KS5yYWRpdXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuIGdldE1heE92ZXJmbG93KCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fY2FjaGVkTWV0YS5kYXRhO1xuICAgICAgICBsZXQgbWF4ID0gMDtcbiAgICAgICAgZm9yKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IC0taSl7XG4gICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIGRhdGFbaV0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSkpIC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heCA+IDAgJiYgbWF4O1xuICAgIH1cbiBnZXRMYWJlbEFuZFZhbHVlKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmNoYXJ0LmRhdGEubGFiZWxzIHx8IFtdO1xuICAgICAgICBjb25zdCB7IHhTY2FsZSAsIHlTY2FsZSAgfSA9IG1ldGE7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICAgICAgY29uc3QgeCA9IHhTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZC54KTtcbiAgICAgICAgY29uc3QgeSA9IHlTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZC55KTtcbiAgICAgICAgY29uc3QgciA9IHBhcnNlZC5fY3VzdG9tO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IGxhYmVsc1tpbmRleF0gfHwgJycsXG4gICAgICAgICAgICB2YWx1ZTogJygnICsgeCArICcsICcgKyB5ICsgKHIgPyAnLCAnICsgciA6ICcnKSArICcpJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICB1cGRhdGUobW9kZSkge1xuICAgICAgICBjb25zdCBwb2ludHMgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGE7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudHMocG9pbnRzLCAwLCBwb2ludHMubGVuZ3RoLCBtb2RlKTtcbiAgICB9XG4gICAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICAgICAgY29uc3QgcmVzZXQgPSBtb2RlID09PSAncmVzZXQnO1xuICAgICAgICBjb25zdCB7IGlTY2FsZSAsIHZTY2FsZSAgfSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IHsgc2hhcmVkT3B0aW9ucyAsIGluY2x1ZGVPcHRpb25zICB9ID0gdGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgICAgIGNvbnN0IGlBeGlzID0gaVNjYWxlLmF4aXM7XG4gICAgICAgIGNvbnN0IHZBeGlzID0gdlNjYWxlLmF4aXM7XG4gICAgICAgIGZvcihsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gIXJlc2V0ICYmIHRoaXMuZ2V0UGFyc2VkKGkpO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgaVBpeGVsID0gcHJvcGVydGllc1tpQXhpc10gPSByZXNldCA/IGlTY2FsZS5nZXRQaXhlbEZvckRlY2ltYWwoMC41KSA6IGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHBhcnNlZFtpQXhpc10pO1xuICAgICAgICAgICAgY29uc3QgdlBpeGVsID0gcHJvcGVydGllc1t2QXhpc10gPSByZXNldCA/IHZTY2FsZS5nZXRCYXNlUGl4ZWwoKSA6IHZTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHBhcnNlZFt2QXhpc10pO1xuICAgICAgICAgICAgcHJvcGVydGllcy5za2lwID0gaXNOYU4oaVBpeGVsKSB8fCBpc05hTih2UGl4ZWwpO1xuICAgICAgICAgICAgaWYgKGluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5vcHRpb25zID0gc2hhcmVkT3B0aW9ucyB8fCB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSwgcG9pbnQuYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5vcHRpb25zLnJhZGl1cyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHBvaW50LCBpLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiByZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGluZGV4LCBtb2RlKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICAgICAgbGV0IHZhbHVlcyA9IHN1cGVyLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaW5kZXgsIG1vZGUpO1xuICAgICAgICBpZiAodmFsdWVzLiRzaGFyZWQpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IE9iamVjdC5hc3NpZ24oe30sIHZhbHVlcywge1xuICAgICAgICAgICAgICAgICRzaGFyZWQ6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYWRpdXMgPSB2YWx1ZXMucmFkaXVzO1xuICAgICAgICBpZiAobW9kZSAhPT0gJ2FjdGl2ZScpIHtcbiAgICAgICAgICAgIHZhbHVlcy5yYWRpdXMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlcy5yYWRpdXMgKz0gdmFsdWVPckRlZmF1bHQocGFyc2VkICYmIHBhcnNlZC5fY3VzdG9tLCByYWRpdXMpO1xuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmF0aW9BbmRPZmZzZXQocm90YXRpb24sIGNpcmN1bWZlcmVuY2UsIGN1dG91dCkge1xuICAgIGxldCByYXRpb1ggPSAxO1xuICAgIGxldCByYXRpb1kgPSAxO1xuICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICBsZXQgb2Zmc2V0WSA9IDA7XG4gICAgaWYgKGNpcmN1bWZlcmVuY2UgPCBUQVUpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRBbmdsZSA9IHJvdGF0aW9uO1xuICAgICAgICBjb25zdCBlbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyBjaXJjdW1mZXJlbmNlO1xuICAgICAgICBjb25zdCBzdGFydFggPSBNYXRoLmNvcyhzdGFydEFuZ2xlKTtcbiAgICAgICAgY29uc3Qgc3RhcnRZID0gTWF0aC5zaW4oc3RhcnRBbmdsZSk7XG4gICAgICAgIGNvbnN0IGVuZFggPSBNYXRoLmNvcyhlbmRBbmdsZSk7XG4gICAgICAgIGNvbnN0IGVuZFkgPSBNYXRoLnNpbihlbmRBbmdsZSk7XG4gICAgICAgIGNvbnN0IGNhbGNNYXggPSAoYW5nbGUsIGEsIGIpPT5fYW5nbGVCZXR3ZWVuKGFuZ2xlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgdHJ1ZSkgPyAxIDogTWF0aC5tYXgoYSwgYSAqIGN1dG91dCwgYiwgYiAqIGN1dG91dCk7XG4gICAgICAgIGNvbnN0IGNhbGNNaW4gPSAoYW5nbGUsIGEsIGIpPT5fYW5nbGVCZXR3ZWVuKGFuZ2xlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgdHJ1ZSkgPyAtMSA6IE1hdGgubWluKGEsIGEgKiBjdXRvdXQsIGIsIGIgKiBjdXRvdXQpO1xuICAgICAgICBjb25zdCBtYXhYID0gY2FsY01heCgwLCBzdGFydFgsIGVuZFgpO1xuICAgICAgICBjb25zdCBtYXhZID0gY2FsY01heChIQUxGX1BJLCBzdGFydFksIGVuZFkpO1xuICAgICAgICBjb25zdCBtaW5YID0gY2FsY01pbihQSSwgc3RhcnRYLCBlbmRYKTtcbiAgICAgICAgY29uc3QgbWluWSA9IGNhbGNNaW4oUEkgKyBIQUxGX1BJLCBzdGFydFksIGVuZFkpO1xuICAgICAgICByYXRpb1ggPSAobWF4WCAtIG1pblgpIC8gMjtcbiAgICAgICAgcmF0aW9ZID0gKG1heFkgLSBtaW5ZKSAvIDI7XG4gICAgICAgIG9mZnNldFggPSAtKG1heFggKyBtaW5YKSAvIDI7XG4gICAgICAgIG9mZnNldFkgPSAtKG1heFkgKyBtaW5ZKSAvIDI7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJhdGlvWCxcbiAgICAgICAgcmF0aW9ZLFxuICAgICAgICBvZmZzZXRYLFxuICAgICAgICBvZmZzZXRZXG4gICAgfTtcbn1cbmNsYXNzIERvdWdobnV0Q29udHJvbGxlciBleHRlbmRzIERhdGFzZXRDb250cm9sbGVyIHtcbiAgICBzdGF0aWMgaWQgPSAnZG91Z2hudXQnO1xuIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAgICAgZGF0YXNldEVsZW1lbnRUeXBlOiBmYWxzZSxcbiAgICAgICAgZGF0YUVsZW1lbnRUeXBlOiAnYXJjJyxcbiAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICBhbmltYXRlUm90YXRlOiB0cnVlLFxuICAgICAgICAgICAgYW5pbWF0ZVNjYWxlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBhbmltYXRpb25zOiB7XG4gICAgICAgICAgICBudW1iZXJzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogW1xuICAgICAgICAgICAgICAgICAgICAnY2lyY3VtZmVyZW5jZScsXG4gICAgICAgICAgICAgICAgICAgICdlbmRBbmdsZScsXG4gICAgICAgICAgICAgICAgICAgICdpbm5lclJhZGl1cycsXG4gICAgICAgICAgICAgICAgICAgICdvdXRlclJhZGl1cycsXG4gICAgICAgICAgICAgICAgICAgICdzdGFydEFuZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgICAgICAgICAneScsXG4gICAgICAgICAgICAgICAgICAgICdvZmZzZXQnLFxuICAgICAgICAgICAgICAgICAgICAnYm9yZGVyV2lkdGgnLFxuICAgICAgICAgICAgICAgICAgICAnc3BhY2luZydcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGN1dG91dDogJzUwJScsXG4gICAgICAgIHJvdGF0aW9uOiAwLFxuICAgICAgICBjaXJjdW1mZXJlbmNlOiAzNjAsXG4gICAgICAgIHJhZGl1czogJzEwMCUnLFxuICAgICAgICBzcGFjaW5nOiAwLFxuICAgICAgICBpbmRleEF4aXM6ICdyJ1xuICAgIH07XG4gICAgc3RhdGljIGRlc2NyaXB0b3JzID0ge1xuICAgICAgICBfc2NyaXB0YWJsZTogKG5hbWUpPT5uYW1lICE9PSAnc3BhY2luZycsXG4gICAgICAgIF9pbmRleGFibGU6IChuYW1lKT0+bmFtZSAhPT0gJ3NwYWNpbmcnICYmICFuYW1lLnN0YXJ0c1dpdGgoJ2JvcmRlckRhc2gnKSAmJiAhbmFtZS5zdGFydHNXaXRoKCdob3ZlckJvcmRlckRhc2gnKVxuICAgIH07XG4gc3RhdGljIG92ZXJyaWRlcyA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IDEsXG4gICAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgICAgIGxlZ2VuZDoge1xuICAgICAgICAgICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUxhYmVscyAoY2hhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjaGFydC5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsYWJlbHM6IHsgcG9pbnRTdHlsZSAsIHRleHRBbGlnbiAsIGNvbG9yICwgdXNlQm9yZGVyUmFkaXVzICwgYm9yZGVyUmFkaXVzICB9ICB9ID0gY2hhcnQubGVnZW5kLm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sYWJlbHMubGVuZ3RoICYmIGRhdGEuZGF0YXNldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEubGFiZWxzLm1hcCgobGFiZWwsIGkpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBtZXRhLmNvbnRyb2xsZXIuZ2V0U3R5bGUoaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogc3R5bGUuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udENvbG9yOiBjb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbjogIWNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZURhc2g6IHN0eWxlLmJvcmRlckRhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lRGFzaE9mZnNldDogc3R5bGUuYm9yZGVyRGFzaE9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVKb2luOiBzdHlsZS5ib3JkZXJKb2luU3R5bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGg6IHN0eWxlLmJvcmRlcldpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlU3R5bGU6IHN0eWxlLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiB0ZXh0QWxpZ24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludFN0eWxlOiBwb2ludFN0eWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiB1c2VCb3JkZXJSYWRpdXMgJiYgKGJvcmRlclJhZGl1cyB8fCBzdHlsZS5ib3JkZXJSYWRpdXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25DbGljayAoZSwgbGVnZW5kSXRlbSwgbGVnZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5jaGFydC50b2dnbGVEYXRhVmlzaWJpbGl0eShsZWdlbmRJdGVtLmluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmNoYXJ0LnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3RydWN0b3IoY2hhcnQsIGRhdGFzZXRJbmRleCl7XG4gICAgICAgIHN1cGVyKGNoYXJ0LCBkYXRhc2V0SW5kZXgpO1xuICAgICAgICB0aGlzLmVuYWJsZU9wdGlvblNoYXJpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmlubmVyUmFkaXVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm91dGVyUmFkaXVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm9mZnNldFggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMub2Zmc2V0WSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGlua1NjYWxlcygpIHt9XG4gcGFyc2Uoc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFzZXQoKS5kYXRhO1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgaWYgKHRoaXMuX3BhcnNpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBtZXRhLl9wYXJzZWQgPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGdldHRlciA9IChpKT0+K2RhdGFbaV07XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoZGF0YVtzdGFydF0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBrZXkgPSd2YWx1ZScgIH0gPSB0aGlzLl9wYXJzaW5nO1xuICAgICAgICAgICAgICAgIGdldHRlciA9IChpKT0+K3Jlc29sdmVPYmplY3RLZXkoZGF0YVtpXSwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICAgICAgZm9yKGkgPSBzdGFydCwgaWxlbiA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgICAgIG1ldGEuX3BhcnNlZFtpXSA9IGdldHRlcihpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiBfZ2V0Um90YXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0b1JhZGlhbnModGhpcy5vcHRpb25zLnJvdGF0aW9uIC0gOTApO1xuICAgIH1cbiBfZ2V0Q2lyY3VtZmVyZW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY2lyY3VtZmVyZW5jZSk7XG4gICAgfVxuIF9nZXRSb3RhdGlvbkV4dGVudHMoKSB7XG4gICAgICAgIGxldCBtaW4gPSBUQVU7XG4gICAgICAgIGxldCBtYXggPSAtVEFVO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgKytpKXtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkgJiYgdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YShpKS50eXBlID09PSB0aGlzLl90eXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSkuY29udHJvbGxlcjtcbiAgICAgICAgICAgICAgICBjb25zdCByb3RhdGlvbiA9IGNvbnRyb2xsZXIuX2dldFJvdGF0aW9uKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IGNvbnRyb2xsZXIuX2dldENpcmN1bWZlcmVuY2UoKTtcbiAgICAgICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHJvdGF0aW9uKTtcbiAgICAgICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHJvdGF0aW9uICsgY2lyY3VtZmVyZW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJvdGF0aW9uOiBtaW4sXG4gICAgICAgICAgICBjaXJjdW1mZXJlbmNlOiBtYXggLSBtaW5cbiAgICAgICAgfTtcbiAgICB9XG4gdXBkYXRlKG1vZGUpIHtcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCB7IGNoYXJ0QXJlYSAgfSA9IGNoYXJ0O1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgYXJjcyA9IG1ldGEuZGF0YTtcbiAgICAgICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuZ2V0TWF4Qm9yZGVyV2lkdGgoKSArIHRoaXMuZ2V0TWF4T2Zmc2V0KGFyY3MpICsgdGhpcy5vcHRpb25zLnNwYWNpbmc7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSBNYXRoLm1heCgoTWF0aC5taW4oY2hhcnRBcmVhLndpZHRoLCBjaGFydEFyZWEuaGVpZ2h0KSAtIHNwYWNpbmcpIC8gMiwgMCk7XG4gICAgICAgIGNvbnN0IGN1dG91dCA9IE1hdGgubWluKHRvUGVyY2VudGFnZSh0aGlzLm9wdGlvbnMuY3V0b3V0LCBtYXhTaXplKSwgMSk7XG4gICAgICAgIGNvbnN0IGNoYXJ0V2VpZ2h0ID0gdGhpcy5fZ2V0UmluZ1dlaWdodCh0aGlzLmluZGV4KTtcbiAgICAgICAgY29uc3QgeyBjaXJjdW1mZXJlbmNlICwgcm90YXRpb24gIH0gPSB0aGlzLl9nZXRSb3RhdGlvbkV4dGVudHMoKTtcbiAgICAgICAgY29uc3QgeyByYXRpb1ggLCByYXRpb1kgLCBvZmZzZXRYICwgb2Zmc2V0WSAgfSA9IGdldFJhdGlvQW5kT2Zmc2V0KHJvdGF0aW9uLCBjaXJjdW1mZXJlbmNlLCBjdXRvdXQpO1xuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IChjaGFydEFyZWEud2lkdGggLSBzcGFjaW5nKSAvIHJhdGlvWDtcbiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKGNoYXJ0QXJlYS5oZWlnaHQgLSBzcGFjaW5nKSAvIHJhdGlvWTtcbiAgICAgICAgY29uc3QgbWF4UmFkaXVzID0gTWF0aC5tYXgoTWF0aC5taW4obWF4V2lkdGgsIG1heEhlaWdodCkgLyAyLCAwKTtcbiAgICAgICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSB0b0RpbWVuc2lvbih0aGlzLm9wdGlvbnMucmFkaXVzLCBtYXhSYWRpdXMpO1xuICAgICAgICBjb25zdCBpbm5lclJhZGl1cyA9IE1hdGgubWF4KG91dGVyUmFkaXVzICogY3V0b3V0LCAwKTtcbiAgICAgICAgY29uc3QgcmFkaXVzTGVuZ3RoID0gKG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMpIC8gdGhpcy5fZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCgpO1xuICAgICAgICB0aGlzLm9mZnNldFggPSBvZmZzZXRYICogb3V0ZXJSYWRpdXM7XG4gICAgICAgIHRoaXMub2Zmc2V0WSA9IG9mZnNldFkgKiBvdXRlclJhZGl1cztcbiAgICAgICAgbWV0YS50b3RhbCA9IHRoaXMuY2FsY3VsYXRlVG90YWwoKTtcbiAgICAgICAgdGhpcy5vdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzIC0gcmFkaXVzTGVuZ3RoICogdGhpcy5fZ2V0UmluZ1dlaWdodE9mZnNldCh0aGlzLmluZGV4KTtcbiAgICAgICAgdGhpcy5pbm5lclJhZGl1cyA9IE1hdGgubWF4KHRoaXMub3V0ZXJSYWRpdXMgLSByYWRpdXNMZW5ndGggKiBjaGFydFdlaWdodCwgMCk7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudHMoYXJjcywgMCwgYXJjcy5sZW5ndGgsIG1vZGUpO1xuICAgIH1cbiBfY2lyY3VtZmVyZW5jZShpLCByZXNldCkge1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IHRoaXMuX2dldENpcmN1bWZlcmVuY2UoKTtcbiAgICAgICAgaWYgKHJlc2V0ICYmIG9wdHMuYW5pbWF0aW9uLmFuaW1hdGVSb3RhdGUgfHwgIXRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaSkgfHwgbWV0YS5fcGFyc2VkW2ldID09PSBudWxsIHx8IG1ldGEuZGF0YVtpXS5oaWRkZW4pIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUNpcmN1bWZlcmVuY2UobWV0YS5fcGFyc2VkW2ldICogY2lyY3VtZmVyZW5jZSAvIFRBVSk7XG4gICAgfVxuICAgIHVwZGF0ZUVsZW1lbnRzKGFyY3MsIHN0YXJ0LCBjb3VudCwgbW9kZSkge1xuICAgICAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3QgY2hhcnRBcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuICAgICAgICBjb25zdCBvcHRzID0gY2hhcnQub3B0aW9ucztcbiAgICAgICAgY29uc3QgYW5pbWF0aW9uT3B0cyA9IG9wdHMuYW5pbWF0aW9uO1xuICAgICAgICBjb25zdCBjZW50ZXJYID0gKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDI7XG4gICAgICAgIGNvbnN0IGNlbnRlclkgPSAoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMjtcbiAgICAgICAgY29uc3QgYW5pbWF0ZVNjYWxlID0gcmVzZXQgJiYgYW5pbWF0aW9uT3B0cy5hbmltYXRlU2NhbGU7XG4gICAgICAgIGNvbnN0IGlubmVyUmFkaXVzID0gYW5pbWF0ZVNjYWxlID8gMCA6IHRoaXMuaW5uZXJSYWRpdXM7XG4gICAgICAgIGNvbnN0IG91dGVyUmFkaXVzID0gYW5pbWF0ZVNjYWxlID8gMCA6IHRoaXMub3V0ZXJSYWRpdXM7XG4gICAgICAgIGNvbnN0IHsgc2hhcmVkT3B0aW9ucyAsIGluY2x1ZGVPcHRpb25zICB9ID0gdGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgICAgIGxldCBzdGFydEFuZ2xlID0gdGhpcy5fZ2V0Um90YXRpb24oKTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IHN0YXJ0OyArK2kpe1xuICAgICAgICAgICAgc3RhcnRBbmdsZSArPSB0aGlzLl9jaXJjdW1mZXJlbmNlKGksIHJlc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKXtcbiAgICAgICAgICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSB0aGlzLl9jaXJjdW1mZXJlbmNlKGksIHJlc2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGFyYyA9IGFyY3NbaV07XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgIHg6IGNlbnRlclggKyB0aGlzLm9mZnNldFgsXG4gICAgICAgICAgICAgICAgeTogY2VudGVyWSArIHRoaXMub2Zmc2V0WSxcbiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlLFxuICAgICAgICAgICAgICAgIGVuZEFuZ2xlOiBzdGFydEFuZ2xlICsgY2lyY3VtZmVyZW5jZSxcbiAgICAgICAgICAgICAgICBjaXJjdW1mZXJlbmNlLFxuICAgICAgICAgICAgICAgIG91dGVyUmFkaXVzLFxuICAgICAgICAgICAgICAgIGlubmVyUmFkaXVzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5vcHRpb25zID0gc2hhcmVkT3B0aW9ucyB8fCB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSwgYXJjLmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydEFuZ2xlICs9IGNpcmN1bWZlcmVuY2U7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoYXJjLCBpLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYWxjdWxhdGVUb3RhbCgpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IG1ldGFEYXRhID0gbWV0YS5kYXRhO1xuICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgbWV0YURhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtZXRhLl9wYXJzZWRbaV07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgIWlzTmFOKHZhbHVlKSAmJiB0aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpICYmICFtZXRhRGF0YVtpXS5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICB0b3RhbCArPSBNYXRoLmFicyh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH1cbiAgICBjYWxjdWxhdGVDaXJjdW1mZXJlbmNlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy5fY2FjaGVkTWV0YS50b3RhbDtcbiAgICAgICAgaWYgKHRvdGFsID4gMCAmJiAhaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVEFVICogKE1hdGguYWJzKHZhbHVlKSAvIHRvdGFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCBsYWJlbHMgPSBjaGFydC5kYXRhLmxhYmVscyB8fCBbXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtYXROdW1iZXIobWV0YS5fcGFyc2VkW2luZGV4XSwgY2hhcnQub3B0aW9ucy5sb2NhbGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IGxhYmVsc1tpbmRleF0gfHwgJycsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRNYXhCb3JkZXJXaWR0aChhcmNzKSB7XG4gICAgICAgIGxldCBtYXggPSAwO1xuICAgICAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgICAgIGxldCBpLCBpbGVuLCBtZXRhLCBjb250cm9sbGVyLCBvcHRpb25zO1xuICAgICAgICBpZiAoIWFyY3MpIHtcbiAgICAgICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgICAgICBpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuICAgICAgICAgICAgICAgICAgICBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG4gICAgICAgICAgICAgICAgICAgIGFyY3MgPSBtZXRhLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBtZXRhLmNvbnRyb2xsZXI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyY3MpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGFyY3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBjb250cm9sbGVyLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5ib3JkZXJBbGlnbiAhPT0gJ2lubmVyJykge1xuICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgb3B0aW9ucy5ib3JkZXJXaWR0aCB8fCAwLCBvcHRpb25zLmhvdmVyQm9yZGVyV2lkdGggfHwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG4gICAgZ2V0TWF4T2Zmc2V0KGFyY3MpIHtcbiAgICAgICAgbGV0IG1heCA9IDA7XG4gICAgICAgIGZvcihsZXQgaSA9IDAsIGlsZW4gPSBhcmNzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkpO1xuICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBvcHRpb25zLm9mZnNldCB8fCAwLCBvcHRpb25zLmhvdmVyT2Zmc2V0IHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxuIF9nZXRSaW5nV2VpZ2h0T2Zmc2V0KGRhdGFzZXRJbmRleCkge1xuICAgICAgICBsZXQgcmluZ1dlaWdodE9mZnNldCA9IDA7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkYXRhc2V0SW5kZXg7ICsraSl7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG4gICAgICAgICAgICAgICAgcmluZ1dlaWdodE9mZnNldCArPSB0aGlzLl9nZXRSaW5nV2VpZ2h0KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByaW5nV2VpZ2h0T2Zmc2V0O1xuICAgIH1cbiBfZ2V0UmluZ1dlaWdodChkYXRhc2V0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHZhbHVlT3JEZWZhdWx0KHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLndlaWdodCwgMSksIDApO1xuICAgIH1cbiBfZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFJpbmdXZWlnaHRPZmZzZXQodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aCkgfHwgMTtcbiAgICB9XG59XG5cbmNsYXNzIExpbmVDb250cm9sbGVyIGV4dGVuZHMgRGF0YXNldENvbnRyb2xsZXIge1xuICAgIHN0YXRpYyBpZCA9ICdsaW5lJztcbiBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIGRhdGFzZXRFbGVtZW50VHlwZTogJ2xpbmUnLFxuICAgICAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG4gICAgICAgIHNob3dMaW5lOiB0cnVlLFxuICAgICAgICBzcGFuR2FwczogZmFsc2VcbiAgICB9O1xuIHN0YXRpYyBvdmVycmlkZXMgPSB7XG4gICAgICAgIHNjYWxlczoge1xuICAgICAgICAgICAgX2luZGV4Xzoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjYXRlZ29yeSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfdmFsdWVfOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmVhcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0RlY2ltYXRpb24gPSB0cnVlO1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgfVxuICAgIHVwZGF0ZShtb2RlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCB7IGRhdGFzZXQ6IGxpbmUgLCBkYXRhOiBwb2ludHMgPSBbXSAsIF9kYXRhc2V0ICB9ID0gbWV0YTtcbiAgICAgICAgY29uc3QgYW5pbWF0aW9uc0Rpc2FibGVkID0gdGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkO1xuICAgICAgICBsZXQgeyBzdGFydCAsIGNvdW50ICB9ID0gX2dldFN0YXJ0QW5kQ291bnRPZlZpc2libGVQb2ludHMobWV0YSwgcG9pbnRzLCBhbmltYXRpb25zRGlzYWJsZWQpO1xuICAgICAgICB0aGlzLl9kcmF3U3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5fZHJhd0NvdW50ID0gY291bnQ7XG4gICAgICAgIGlmIChfc2NhbGVSYW5nZXNDaGFuZ2VkKG1ldGEpKSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgICAgICBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbGluZS5fY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBsaW5lLl9kYXRhc2V0SW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICBsaW5lLl9kZWNpbWF0ZWQgPSAhIV9kYXRhc2V0Ll9kZWNpbWF0ZWQ7XG4gICAgICAgIGxpbmUucG9pbnRzID0gcG9pbnRzO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlRGF0YXNldEVsZW1lbnRPcHRpb25zKG1vZGUpO1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaG93TGluZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5zZWdtZW50ID0gdGhpcy5vcHRpb25zLnNlZ21lbnQ7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudChsaW5lLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGFuaW1hdGVkOiAhYW5pbWF0aW9uc0Rpc2FibGVkLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICB9LCBtb2RlKTtcbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50cyhwb2ludHMsIHN0YXJ0LCBjb3VudCwgbW9kZSk7XG4gICAgfVxuICAgIHVwZGF0ZUVsZW1lbnRzKHBvaW50cywgc3RhcnQsIGNvdW50LCBtb2RlKSB7XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gbW9kZSA9PT0gJ3Jlc2V0JztcbiAgICAgICAgY29uc3QgeyBpU2NhbGUgLCB2U2NhbGUgLCBfc3RhY2tlZCAsIF9kYXRhc2V0ICB9ID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgeyBzaGFyZWRPcHRpb25zICwgaW5jbHVkZU9wdGlvbnMgIH0gPSB0aGlzLl9nZXRTaGFyZWRPcHRpb25zKHN0YXJ0LCBtb2RlKTtcbiAgICAgICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgdkF4aXMgPSB2U2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgeyBzcGFuR2FwcyAsIHNlZ21lbnQgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG1heEdhcExlbmd0aCA9IGlzTnVtYmVyKHNwYW5HYXBzKSA/IHNwYW5HYXBzIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBjb25zdCBkaXJlY3RVcGRhdGUgPSB0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQgfHwgcmVzZXQgfHwgbW9kZSA9PT0gJ25vbmUnO1xuICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIGNvdW50O1xuICAgICAgICBjb25zdCBwb2ludHNDb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gICAgICAgIGxldCBwcmV2UGFyc2VkID0gc3RhcnQgPiAwICYmIHRoaXMuZ2V0UGFyc2VkKHN0YXJ0IC0gMSk7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBwb2ludHNDb3VudDsgKytpKXtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGRpcmVjdFVwZGF0ZSA/IHBvaW50IDoge307XG4gICAgICAgICAgICBpZiAoaSA8IHN0YXJ0IHx8IGkgPj0gZW5kKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5za2lwID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGkpO1xuICAgICAgICAgICAgY29uc3QgbnVsbERhdGEgPSBpc051bGxPclVuZGVmKHBhcnNlZFt2QXhpc10pO1xuICAgICAgICAgICAgY29uc3QgaVBpeGVsID0gcHJvcGVydGllc1tpQXhpc10gPSBpU2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShwYXJzZWRbaUF4aXNdLCBpKTtcbiAgICAgICAgICAgIGNvbnN0IHZQaXhlbCA9IHByb3BlcnRpZXNbdkF4aXNdID0gcmVzZXQgfHwgbnVsbERhdGEgPyB2U2NhbGUuZ2V0QmFzZVBpeGVsKCkgOiB2U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShfc3RhY2tlZCA/IHRoaXMuYXBwbHlTdGFjayh2U2NhbGUsIHBhcnNlZCwgX3N0YWNrZWQpIDogcGFyc2VkW3ZBeGlzXSwgaSk7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnNraXAgPSBpc05hTihpUGl4ZWwpIHx8IGlzTmFOKHZQaXhlbCkgfHwgbnVsbERhdGE7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3AgPSBpID4gMCAmJiBNYXRoLmFicyhwYXJzZWRbaUF4aXNdIC0gcHJldlBhcnNlZFtpQXhpc10pID4gbWF4R2FwTGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnBhcnNlZCA9IHBhcnNlZDtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnJhdyA9IF9kYXRhc2V0LmRhdGFbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5jbHVkZU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLm9wdGlvbnMgPSBzaGFyZWRPcHRpb25zIHx8IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpLCBwb2ludC5hY3RpdmUgPyAnYWN0aXZlJyA6IG1vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkaXJlY3RVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQocG9pbnQsIGksIHByb3BlcnRpZXMsIG1vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldlBhcnNlZCA9IHBhcnNlZDtcbiAgICAgICAgfVxuICAgIH1cbiBnZXRNYXhPdmVyZmxvdygpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSBtZXRhLmRhdGFzZXQ7XG4gICAgICAgIGNvbnN0IGJvcmRlciA9IGRhdGFzZXQub3B0aW9ucyAmJiBkYXRhc2V0Lm9wdGlvbnMuYm9yZGVyV2lkdGggfHwgMDtcbiAgICAgICAgY29uc3QgZGF0YSA9IG1ldGEuZGF0YSB8fCBbXTtcbiAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGJvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdFBvaW50ID0gZGF0YVswXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucygwKSk7XG4gICAgICAgIGNvbnN0IGxhc3RQb2ludCA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhkYXRhLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGJvcmRlciwgZmlyc3RQb2ludCwgbGFzdFBvaW50KSAvIDI7XG4gICAgfVxuICAgIGRyYXcoKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBtZXRhLmRhdGFzZXQudXBkYXRlQ29udHJvbFBvaW50cyh0aGlzLmNoYXJ0LmNoYXJ0QXJlYSwgbWV0YS5pU2NhbGUuYXhpcyk7XG4gICAgICAgIHN1cGVyLmRyYXcoKTtcbiAgICB9XG59XG5cbmNsYXNzIFBvbGFyQXJlYUNvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG4gICAgc3RhdGljIGlkID0gJ3BvbGFyQXJlYSc7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBkYXRhRWxlbWVudFR5cGU6ICdhcmMnLFxuICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgIGFuaW1hdGVSb3RhdGU6IHRydWUsXG4gICAgICAgICAgICBhbmltYXRlU2NhbGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgYW5pbWF0aW9uczoge1xuICAgICAgICAgICAgbnVtYmVyczoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgICAgICAgICAneScsXG4gICAgICAgICAgICAgICAgICAgICdzdGFydEFuZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VuZEFuZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2lubmVyUmFkaXVzJyxcbiAgICAgICAgICAgICAgICAgICAgJ291dGVyUmFkaXVzJ1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5kZXhBeGlzOiAncicsXG4gICAgICAgIHN0YXJ0QW5nbGU6IDBcbiAgICB9O1xuIHN0YXRpYyBvdmVycmlkZXMgPSB7XG4gICAgICAgIGFzcGVjdFJhdGlvOiAxLFxuICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVMYWJlbHMgKGNoYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gY2hhcnQuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxhYmVscy5sZW5ndGggJiYgZGF0YS5kYXRhc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxhYmVsczogeyBwb2ludFN0eWxlICwgY29sb3IgIH0gIH0gPSBjaGFydC5sZWdlbmQub3B0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5sYWJlbHMubWFwKChsYWJlbCwgaSk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IG1ldGEuY29udHJvbGxlci5nZXRTdHlsZShpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFN0eWxlOiBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VTdHlsZTogc3R5bGUuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250Q29sb3I6IGNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdpZHRoOiBzdHlsZS5ib3JkZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50U3R5bGU6IHBvaW50U3R5bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW46ICFjaGFydC5nZXREYXRhVmlzaWJpbGl0eShpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uQ2xpY2sgKGUsIGxlZ2VuZEl0ZW0sIGxlZ2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBsZWdlbmQuY2hhcnQudG9nZ2xlRGF0YVZpc2liaWxpdHkobGVnZW5kSXRlbS5pbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5jaGFydC51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlczoge1xuICAgICAgICAgICAgcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdyYWRpYWxMaW5lYXInLFxuICAgICAgICAgICAgICAgIGFuZ2xlTGluZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY2lyY3VsYXI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvaW50TGFiZWxzOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0cnVjdG9yKGNoYXJ0LCBkYXRhc2V0SW5kZXgpe1xuICAgICAgICBzdXBlcihjaGFydCwgZGF0YXNldEluZGV4KTtcbiAgICAgICAgdGhpcy5pbm5lclJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5vdXRlclJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCBsYWJlbHMgPSBjaGFydC5kYXRhLmxhYmVscyB8fCBbXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtYXROdW1iZXIobWV0YS5fcGFyc2VkW2luZGV4XS5yLCBjaGFydC5vcHRpb25zLmxvY2FsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSB8fCAnJyxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHBhcnNlT2JqZWN0RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIF9wYXJzZU9iamVjdERhdGFSYWRpYWxTY2FsZS5iaW5kKHRoaXMpKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gICAgfVxuICAgIHVwZGF0ZShtb2RlKSB7XG4gICAgICAgIGNvbnN0IGFyY3MgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGE7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVJhZGl1cygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKGFyY3MsIDAsIGFyY3MubGVuZ3RoLCBtb2RlKTtcbiAgICB9XG4gZ2V0TWluTWF4KCkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICAgICAgICBtaW46IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgICAgIG1heDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgICAgIH07XG4gICAgICAgIG1ldGEuZGF0YS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCk9PntcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KS5yO1xuICAgICAgICAgICAgaWYgKCFpc05hTihwYXJzZWQpICYmIHRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZCA8IHJhbmdlLm1pbikge1xuICAgICAgICAgICAgICAgICAgICByYW5nZS5taW4gPSBwYXJzZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZWQgPiByYW5nZS5tYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UubWF4ID0gcGFyc2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByYW5nZTtcbiAgICB9XG4gX3VwZGF0ZVJhZGl1cygpIHtcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCBjaGFydEFyZWEgPSBjaGFydC5jaGFydEFyZWE7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBjaGFydC5vcHRpb25zO1xuICAgICAgICBjb25zdCBtaW5TaXplID0gTWF0aC5taW4oY2hhcnRBcmVhLnJpZ2h0IC0gY2hhcnRBcmVhLmxlZnQsIGNoYXJ0QXJlYS5ib3R0b20gLSBjaGFydEFyZWEudG9wKTtcbiAgICAgICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSBNYXRoLm1heChtaW5TaXplIC8gMiwgMCk7XG4gICAgICAgIGNvbnN0IGlubmVyUmFkaXVzID0gTWF0aC5tYXgob3B0cy5jdXRvdXRQZXJjZW50YWdlID8gb3V0ZXJSYWRpdXMgLyAxMDAgKiBvcHRzLmN1dG91dFBlcmNlbnRhZ2UgOiAxLCAwKTtcbiAgICAgICAgY29uc3QgcmFkaXVzTGVuZ3RoID0gKG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMpIC8gY2hhcnQuZ2V0VmlzaWJsZURhdGFzZXRDb3VudCgpO1xuICAgICAgICB0aGlzLm91dGVyUmFkaXVzID0gb3V0ZXJSYWRpdXMgLSByYWRpdXNMZW5ndGggKiB0aGlzLmluZGV4O1xuICAgICAgICB0aGlzLmlubmVyUmFkaXVzID0gdGhpcy5vdXRlclJhZGl1cyAtIHJhZGl1c0xlbmd0aDtcbiAgICB9XG4gICAgdXBkYXRlRWxlbWVudHMoYXJjcywgc3RhcnQsIGNvdW50LCBtb2RlKSB7XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gbW9kZSA9PT0gJ3Jlc2V0JztcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCBvcHRzID0gY2hhcnQub3B0aW9ucztcbiAgICAgICAgY29uc3QgYW5pbWF0aW9uT3B0cyA9IG9wdHMuYW5pbWF0aW9uO1xuICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX2NhY2hlZE1ldGEuclNjYWxlO1xuICAgICAgICBjb25zdCBjZW50ZXJYID0gc2NhbGUueENlbnRlcjtcbiAgICAgICAgY29uc3QgY2VudGVyWSA9IHNjYWxlLnlDZW50ZXI7XG4gICAgICAgIGNvbnN0IGRhdGFzZXRTdGFydEFuZ2xlID0gc2NhbGUuZ2V0SW5kZXhBbmdsZSgwKSAtIDAuNSAqIFBJO1xuICAgICAgICBsZXQgYW5nbGUgPSBkYXRhc2V0U3RhcnRBbmdsZTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRBbmdsZSA9IDM2MCAvIHRoaXMuY291bnRWaXNpYmxlRWxlbWVudHMoKTtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgc3RhcnQ7ICsraSl7XG4gICAgICAgICAgICBhbmdsZSArPSB0aGlzLl9jb21wdXRlQW5nbGUoaSwgbW9kZSwgZGVmYXVsdEFuZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGFyYyA9IGFyY3NbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnRBbmdsZSA9IGFuZ2xlO1xuICAgICAgICAgICAgbGV0IGVuZEFuZ2xlID0gYW5nbGUgKyB0aGlzLl9jb21wdXRlQW5nbGUoaSwgbW9kZSwgZGVmYXVsdEFuZ2xlKTtcbiAgICAgICAgICAgIGxldCBvdXRlclJhZGl1cyA9IGNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpID8gc2NhbGUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy5nZXRQYXJzZWQoaSkucikgOiAwO1xuICAgICAgICAgICAgYW5nbGUgPSBlbmRBbmdsZTtcbiAgICAgICAgICAgIGlmIChyZXNldCkge1xuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25PcHRzLmFuaW1hdGVTY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICBvdXRlclJhZGl1cyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25PcHRzLmFuaW1hdGVSb3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZSA9IGVuZEFuZ2xlID0gZGF0YXNldFN0YXJ0QW5nbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgICAgICB4OiBjZW50ZXJYLFxuICAgICAgICAgICAgICAgIHk6IGNlbnRlclksXG4gICAgICAgICAgICAgICAgaW5uZXJSYWRpdXM6IDAsXG4gICAgICAgICAgICAgICAgb3V0ZXJSYWRpdXMsXG4gICAgICAgICAgICAgICAgc3RhcnRBbmdsZSxcbiAgICAgICAgICAgICAgICBlbmRBbmdsZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSwgYXJjLmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoYXJjLCBpLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3VudFZpc2libGVFbGVtZW50cygpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIG1ldGEuZGF0YS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCk9PntcbiAgICAgICAgICAgIGlmICghaXNOYU4odGhpcy5nZXRQYXJzZWQoaW5kZXgpLnIpICYmIHRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG4gX2NvbXB1dGVBbmdsZShpbmRleCwgbW9kZSwgZGVmYXVsdEFuZ2xlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGluZGV4KSA/IHRvUmFkaWFucyh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaW5kZXgsIG1vZGUpLmFuZ2xlIHx8IGRlZmF1bHRBbmdsZSkgOiAwO1xuICAgIH1cbn1cblxuY2xhc3MgUGllQ29udHJvbGxlciBleHRlbmRzIERvdWdobnV0Q29udHJvbGxlciB7XG4gICAgc3RhdGljIGlkID0gJ3BpZSc7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBjdXRvdXQ6IDAsXG4gICAgICAgIHJvdGF0aW9uOiAwLFxuICAgICAgICBjaXJjdW1mZXJlbmNlOiAzNjAsXG4gICAgICAgIHJhZGl1czogJzEwMCUnXG4gICAgfTtcbn1cblxuY2xhc3MgUmFkYXJDb250cm9sbGVyIGV4dGVuZHMgRGF0YXNldENvbnRyb2xsZXIge1xuICAgIHN0YXRpYyBpZCA9ICdyYWRhcic7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBkYXRhc2V0RWxlbWVudFR5cGU6ICdsaW5lJyxcbiAgICAgICAgZGF0YUVsZW1lbnRUeXBlOiAncG9pbnQnLFxuICAgICAgICBpbmRleEF4aXM6ICdyJyxcbiAgICAgICAgc2hvd0xpbmU6IHRydWUsXG4gICAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgICAgICBsaW5lOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogJ3N0YXJ0J1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuICAgICAgICBhc3BlY3RSYXRpbzogMSxcbiAgICAgICAgc2NhbGVzOiB7XG4gICAgICAgICAgICByOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3JhZGlhbExpbmVhcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgICAgICBjb25zdCB2U2NhbGUgPSB0aGlzLl9jYWNoZWRNZXRhLnZTY2FsZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaW5kZXgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IHZTY2FsZS5nZXRMYWJlbHMoKVtpbmRleF0sXG4gICAgICAgICAgICB2YWx1ZTogJycgKyB2U2NhbGUuZ2V0TGFiZWxGb3JWYWx1ZShwYXJzZWRbdlNjYWxlLmF4aXNdKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBwYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIHJldHVybiBfcGFyc2VPYmplY3REYXRhUmFkaWFsU2NhbGUuYmluZCh0aGlzKShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgIH1cbiAgICB1cGRhdGUobW9kZSkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgbGluZSA9IG1ldGEuZGF0YXNldDtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuICAgICAgICBjb25zdCBsYWJlbHMgPSBtZXRhLmlTY2FsZS5nZXRMYWJlbHMoKTtcbiAgICAgICAgbGluZS5wb2ludHMgPSBwb2ludHM7XG4gICAgICAgIGlmIChtb2RlICE9PSAncmVzaXplJykge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgIF9sb29wOiB0cnVlLFxuICAgICAgICAgICAgICAgIF9mdWxsTG9vcDogbGFiZWxzLmxlbmd0aCA9PT0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50KGxpbmUsIHVuZGVmaW5lZCwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50cyhwb2ludHMsIDAsIHBvaW50cy5sZW5ndGgsIG1vZGUpO1xuICAgIH1cbiAgICB1cGRhdGVFbGVtZW50cyhwb2ludHMsIHN0YXJ0LCBjb3VudCwgbW9kZSkge1xuICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX2NhY2hlZE1ldGEuclNjYWxlO1xuICAgICAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgICAgIGZvcihsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpLCBwb2ludC5hY3RpdmUgPyAnYWN0aXZlJyA6IG1vZGUpO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShpLCB0aGlzLmdldFBhcnNlZChpKS5yKTtcbiAgICAgICAgICAgIGNvbnN0IHggPSByZXNldCA/IHNjYWxlLnhDZW50ZXIgOiBwb2ludFBvc2l0aW9uLng7XG4gICAgICAgICAgICBjb25zdCB5ID0gcmVzZXQgPyBzY2FsZS55Q2VudGVyIDogcG9pbnRQb3NpdGlvbi55O1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgYW5nbGU6IHBvaW50UG9zaXRpb24uYW5nbGUsXG4gICAgICAgICAgICAgICAgc2tpcDogaXNOYU4oeCkgfHwgaXNOYU4oeSksXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudChwb2ludCwgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFNjYXR0ZXJDb250cm9sbGVyIGV4dGVuZHMgRGF0YXNldENvbnRyb2xsZXIge1xuICAgIHN0YXRpYyBpZCA9ICdzY2F0dGVyJztcbiBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIGRhdGFzZXRFbGVtZW50VHlwZTogZmFsc2UsXG4gICAgICAgIGRhdGFFbGVtZW50VHlwZTogJ3BvaW50JyxcbiAgICAgICAgc2hvd0xpbmU6IGZhbHNlLFxuICAgICAgICBmaWxsOiBmYWxzZVxuICAgIH07XG4gc3RhdGljIG92ZXJyaWRlcyA9IHtcbiAgICAgICAgaW50ZXJhY3Rpb246IHtcbiAgICAgICAgICAgIG1vZGU6ICdwb2ludCdcbiAgICAgICAgfSxcbiAgICAgICAgc2NhbGVzOiB7XG4gICAgICAgICAgICB4OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmVhcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmVhcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5jaGFydC5kYXRhLmxhYmVscyB8fCBbXTtcbiAgICAgICAgY29uc3QgeyB4U2NhbGUgLCB5U2NhbGUgIH0gPSBtZXRhO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLmdldFBhcnNlZChpbmRleCk7XG4gICAgICAgIGNvbnN0IHggPSB4U2NhbGUuZ2V0TGFiZWxGb3JWYWx1ZShwYXJzZWQueCk7XG4gICAgICAgIGNvbnN0IHkgPSB5U2NhbGUuZ2V0TGFiZWxGb3JWYWx1ZShwYXJzZWQueSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSB8fCAnJyxcbiAgICAgICAgICAgIHZhbHVlOiAnKCcgKyB4ICsgJywgJyArIHkgKyAnKSdcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlKG1vZGUpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IHsgZGF0YTogcG9pbnRzID0gW10gIH0gPSBtZXRhO1xuICAgICAgICBjb25zdCBhbmltYXRpb25zRGlzYWJsZWQgPSB0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQ7XG4gICAgICAgIGxldCB7IHN0YXJ0ICwgY291bnQgIH0gPSBfZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50cyhtZXRhLCBwb2ludHMsIGFuaW1hdGlvbnNEaXNhYmxlZCk7XG4gICAgICAgIHRoaXMuX2RyYXdTdGFydCA9IHN0YXJ0O1xuICAgICAgICB0aGlzLl9kcmF3Q291bnQgPSBjb3VudDtcbiAgICAgICAgaWYgKF9zY2FsZVJhbmdlc0NoYW5nZWQobWV0YSkpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YXNldEVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhc2V0OiBsaW5lICwgX2RhdGFzZXQgIH0gPSBtZXRhO1xuICAgICAgICAgICAgbGluZS5fY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICAgICAgbGluZS5fZGF0YXNldEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgICAgIGxpbmUuX2RlY2ltYXRlZCA9ICEhX2RhdGFzZXQuX2RlY2ltYXRlZDtcbiAgICAgICAgICAgIGxpbmUucG9pbnRzID0gcG9pbnRzO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKTtcbiAgICAgICAgICAgIG9wdGlvbnMuc2VnbWVudCA9IHRoaXMub3B0aW9ucy5zZWdtZW50O1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50KGxpbmUsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgIGFuaW1hdGVkOiAhYW5pbWF0aW9uc0Rpc2FibGVkLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgIH0sIG1vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICBkZWxldGUgbWV0YS5kYXRhc2V0O1xuICAgICAgICAgICAgdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKHBvaW50cywgc3RhcnQsIGNvdW50LCBtb2RlKTtcbiAgICB9XG4gICAgYWRkRWxlbWVudHMoKSB7XG4gICAgICAgIGNvbnN0IHsgc2hvd0xpbmUgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmICghdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUgJiYgc2hvd0xpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlID0gdGhpcy5jaGFydC5yZWdpc3RyeS5nZXRFbGVtZW50KCdsaW5lJyk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuYWRkRWxlbWVudHMoKTtcbiAgICB9XG4gICAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICAgICAgY29uc3QgcmVzZXQgPSBtb2RlID09PSAncmVzZXQnO1xuICAgICAgICBjb25zdCB7IGlTY2FsZSAsIHZTY2FsZSAsIF9zdGFja2VkICwgX2RhdGFzZXQgIH0gPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBmaXJzdE9wdHMgPSB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoc3RhcnQsIG1vZGUpO1xuICAgICAgICBjb25zdCBzaGFyZWRPcHRpb25zID0gdGhpcy5nZXRTaGFyZWRPcHRpb25zKGZpcnN0T3B0cyk7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVPcHRpb25zID0gdGhpcy5pbmNsdWRlT3B0aW9ucyhtb2RlLCBzaGFyZWRPcHRpb25zKTtcbiAgICAgICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgdkF4aXMgPSB2U2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgeyBzcGFuR2FwcyAsIHNlZ21lbnQgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG1heEdhcExlbmd0aCA9IGlzTnVtYmVyKHNwYW5HYXBzKSA/IHNwYW5HYXBzIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBjb25zdCBkaXJlY3RVcGRhdGUgPSB0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQgfHwgcmVzZXQgfHwgbW9kZSA9PT0gJ25vbmUnO1xuICAgICAgICBsZXQgcHJldlBhcnNlZCA9IHN0YXJ0ID4gMCAmJiB0aGlzLmdldFBhcnNlZChzdGFydCAtIDEpO1xuICAgICAgICBmb3IobGV0IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7ICsraSl7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGkpO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGRpcmVjdFVwZGF0ZSA/IHBvaW50IDoge307XG4gICAgICAgICAgICBjb25zdCBudWxsRGF0YSA9IGlzTnVsbE9yVW5kZWYocGFyc2VkW3ZBeGlzXSk7XG4gICAgICAgICAgICBjb25zdCBpUGl4ZWwgPSBwcm9wZXJ0aWVzW2lBeGlzXSA9IGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHBhcnNlZFtpQXhpc10sIGkpO1xuICAgICAgICAgICAgY29uc3QgdlBpeGVsID0gcHJvcGVydGllc1t2QXhpc10gPSByZXNldCB8fCBudWxsRGF0YSA/IHZTY2FsZS5nZXRCYXNlUGl4ZWwoKSA6IHZTY2FsZS5nZXRQaXhlbEZvclZhbHVlKF9zdGFja2VkID8gdGhpcy5hcHBseVN0YWNrKHZTY2FsZSwgcGFyc2VkLCBfc3RhY2tlZCkgOiBwYXJzZWRbdkF4aXNdLCBpKTtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuc2tpcCA9IGlzTmFOKGlQaXhlbCkgfHwgaXNOYU4odlBpeGVsKSB8fCBudWxsRGF0YTtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuc3RvcCA9IGkgPiAwICYmIE1hdGguYWJzKHBhcnNlZFtpQXhpc10gLSBwcmV2UGFyc2VkW2lBeGlzXSkgPiBtYXhHYXBMZW5ndGg7XG4gICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucGFyc2VkID0gcGFyc2VkO1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucmF3ID0gX2RhdGFzZXQuZGF0YVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmNsdWRlT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHNoYXJlZE9wdGlvbnMgfHwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIHBvaW50LmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRpcmVjdFVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudChwb2ludCwgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2UGFyc2VkID0gcGFyc2VkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU2hhcmVkT3B0aW9ucyhzaGFyZWRPcHRpb25zLCBtb2RlLCBmaXJzdE9wdHMpO1xuICAgIH1cbiBnZXRNYXhPdmVyZmxvdygpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBtZXRhLmRhdGEgfHwgW107XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG4gICAgICAgICAgICBsZXQgbWF4ID0gMDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpe1xuICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgZGF0YVtpXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpKSkgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXggPiAwICYmIG1heDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhc2V0ID0gbWV0YS5kYXRhc2V0O1xuICAgICAgICBjb25zdCBib3JkZXIgPSBkYXRhc2V0Lm9wdGlvbnMgJiYgZGF0YXNldC5vcHRpb25zLmJvcmRlcldpZHRoIHx8IDA7XG4gICAgICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBib3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RQb2ludCA9IGRhdGFbMF0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoMCkpO1xuICAgICAgICBjb25zdCBsYXN0UG9pbnQgPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoZGF0YS5sZW5ndGggLSAxKSk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChib3JkZXIsIGZpcnN0UG9pbnQsIGxhc3RQb2ludCkgLyAyO1xuICAgIH1cbn1cblxudmFyIGNvbnRyb2xsZXJzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuX19wcm90b19fOiBudWxsLFxuQmFyQ29udHJvbGxlcjogQmFyQ29udHJvbGxlcixcbkJ1YmJsZUNvbnRyb2xsZXI6IEJ1YmJsZUNvbnRyb2xsZXIsXG5Eb3VnaG51dENvbnRyb2xsZXI6IERvdWdobnV0Q29udHJvbGxlcixcbkxpbmVDb250cm9sbGVyOiBMaW5lQ29udHJvbGxlcixcblBpZUNvbnRyb2xsZXI6IFBpZUNvbnRyb2xsZXIsXG5Qb2xhckFyZWFDb250cm9sbGVyOiBQb2xhckFyZWFDb250cm9sbGVyLFxuUmFkYXJDb250cm9sbGVyOiBSYWRhckNvbnRyb2xsZXIsXG5TY2F0dGVyQ29udHJvbGxlcjogU2NhdHRlckNvbnRyb2xsZXJcbn0pO1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuX2FkYXB0ZXJzXG4gKiBAc2luY2UgMi44LjBcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gYWJzdHJhY3QoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQ6IENoZWNrIHRoYXQgYSBjb21wbGV0ZSBkYXRlIGFkYXB0ZXIgaXMgcHJvdmlkZWQuJyk7XG59XG4vKipcbiAqIERhdGUgYWRhcHRlciAoY3VycmVudCB1c2VkIGJ5IHRoZSB0aW1lIHNjYWxlKVxuICogQG5hbWVzcGFjZSBDaGFydC5fYWRhcHRlcnMuX2RhdGVcbiAqIEBtZW1iZXJvZiBDaGFydC5fYWRhcHRlcnNcbiAqIEBwcml2YXRlXG4gKi8gY2xhc3MgRGF0ZUFkYXB0ZXJCYXNlIHtcbiAgICAvKipcbiAgICogT3ZlcnJpZGUgZGVmYXVsdCBkYXRlIGFkYXB0ZXIgbWV0aG9kcy5cbiAgICogQWNjZXB0cyB0eXBlIHBhcmFtZXRlciB0byBkZWZpbmUgb3B0aW9ucyB0eXBlLlxuICAgKiBAZXhhbXBsZVxuICAgKiBDaGFydC5fYWRhcHRlcnMuX2RhdGUub3ZlcnJpZGU8e215QWRhcHRlck9wdGlvbjogc3RyaW5nfT4oe1xuICAgKiAgIGluaXQoKSB7XG4gICAqICAgICBjb25zb2xlLmxvZyh0aGlzLm9wdGlvbnMubXlBZGFwdGVyT3B0aW9uKTtcbiAgICogICB9XG4gICAqIH0pXG4gICAqLyBzdGF0aWMgb3ZlcnJpZGUobWVtYmVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKERhdGVBZGFwdGVyQmFzZS5wcm90b3R5cGUsIG1lbWJlcnMpO1xuICAgIH1cbiAgICBvcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpe1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgaW5pdCgpIHt9XG4gICAgZm9ybWF0cygpIHtcbiAgICAgICAgcmV0dXJuIGFic3RyYWN0KCk7XG4gICAgfVxuICAgIHBhcnNlKCkge1xuICAgICAgICByZXR1cm4gYWJzdHJhY3QoKTtcbiAgICB9XG4gICAgZm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gYWJzdHJhY3QoKTtcbiAgICB9XG4gICAgYWRkKCkge1xuICAgICAgICByZXR1cm4gYWJzdHJhY3QoKTtcbiAgICB9XG4gICAgZGlmZigpIHtcbiAgICAgICAgcmV0dXJuIGFic3RyYWN0KCk7XG4gICAgfVxuICAgIHN0YXJ0T2YoKSB7XG4gICAgICAgIHJldHVybiBhYnN0cmFjdCgpO1xuICAgIH1cbiAgICBlbmRPZigpIHtcbiAgICAgICAgcmV0dXJuIGFic3RyYWN0KCk7XG4gICAgfVxufVxudmFyIGFkYXB0ZXJzID0ge1xuICAgIF9kYXRlOiBEYXRlQWRhcHRlckJhc2Vcbn07XG5cbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaChtZXRhc2V0LCBheGlzLCB2YWx1ZSwgaW50ZXJzZWN0KSB7XG4gICAgY29uc3QgeyBjb250cm9sbGVyICwgZGF0YSAsIF9zb3J0ZWQgIH0gPSBtZXRhc2V0O1xuICAgIGNvbnN0IGlTY2FsZSA9IGNvbnRyb2xsZXIuX2NhY2hlZE1ldGEuaVNjYWxlO1xuICAgIGNvbnN0IHNwYW5HYXBzID0gbWV0YXNldC5kYXRhc2V0ID8gbWV0YXNldC5kYXRhc2V0Lm9wdGlvbnMgPyBtZXRhc2V0LmRhdGFzZXQub3B0aW9ucy5zcGFuR2FwcyA6IG51bGwgOiBudWxsO1xuICAgIGlmIChpU2NhbGUgJiYgYXhpcyA9PT0gaVNjYWxlLmF4aXMgJiYgYXhpcyAhPT0gJ3InICYmIF9zb3J0ZWQgJiYgZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbG9va3VwTWV0aG9kID0gaVNjYWxlLl9yZXZlcnNlUGl4ZWxzID8gX3Jsb29rdXBCeUtleSA6IF9sb29rdXBCeUtleTtcbiAgICAgICAgaWYgKCFpbnRlcnNlY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGxvb2t1cE1ldGhvZChkYXRhLCBheGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoc3BhbkdhcHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHZTY2FsZSAgfSA9IGNvbnRyb2xsZXIuX2NhY2hlZE1ldGE7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBfcGFyc2VkICB9ID0gbWV0YXNldDtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0YW5jZVRvRGVmaW5lZExvID0gX3BhcnNlZC5zbGljZSgwLCByZXN1bHQubG8gKyAxKS5yZXZlcnNlKCkuZmluZEluZGV4KChwb2ludCk9PiFpc051bGxPclVuZGVmKHBvaW50W3ZTY2FsZS5heGlzXSkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5sbyAtPSBNYXRoLm1heCgwLCBkaXN0YW5jZVRvRGVmaW5lZExvKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0YW5jZVRvRGVmaW5lZEhpID0gX3BhcnNlZC5zbGljZShyZXN1bHQuaGkpLmZpbmRJbmRleCgocG9pbnQpPT4haXNOdWxsT3JVbmRlZihwb2ludFt2U2NhbGUuYXhpc10pKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuaGkgKz0gTWF0aC5tYXgoMCwgZGlzdGFuY2VUb0RlZmluZWRIaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZXIuX3NoYXJlZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZGF0YVswXTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdHlwZW9mIGVsLmdldFJhbmdlID09PSAnZnVuY3Rpb24nICYmIGVsLmdldFJhbmdlKGF4aXMpO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBsb29rdXBNZXRob2QoZGF0YSwgYXhpcywgdmFsdWUgLSByYW5nZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gbG9va3VwTWV0aG9kKGRhdGEsIGF4aXMsIHZhbHVlICsgcmFuZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxvOiBzdGFydC5sbyxcbiAgICAgICAgICAgICAgICAgICAgaGk6IGVuZC5oaVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG86IDAsXG4gICAgICAgIGhpOiBkYXRhLmxlbmd0aCAtIDFcbiAgICB9O1xufVxuIGZ1bmN0aW9uIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyhjaGFydCwgYXhpcywgcG9zaXRpb24sIGhhbmRsZXIsIGludGVyc2VjdCkge1xuICAgIGNvbnN0IG1ldGFzZXRzID0gY2hhcnQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpO1xuICAgIGNvbnN0IHZhbHVlID0gcG9zaXRpb25bYXhpc107XG4gICAgZm9yKGxldCBpID0gMCwgaWxlbiA9IG1ldGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGNvbnN0IHsgaW5kZXggLCBkYXRhICB9ID0gbWV0YXNldHNbaV07XG4gICAgICAgIGNvbnN0IHsgbG8gLCBoaSAgfSA9IGJpbmFyeVNlYXJjaChtZXRhc2V0c1tpXSwgYXhpcywgdmFsdWUsIGludGVyc2VjdCk7XG4gICAgICAgIGZvcihsZXQgaiA9IGxvOyBqIDw9IGhpOyArK2ope1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRhdGFbal07XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQuc2tpcCkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZWxlbWVudCwgaW5kZXgsIGopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIGZ1bmN0aW9uIGdldERpc3RhbmNlTWV0cmljRm9yQXhpcyhheGlzKSB7XG4gICAgY29uc3QgdXNlWCA9IGF4aXMuaW5kZXhPZigneCcpICE9PSAtMTtcbiAgICBjb25zdCB1c2VZID0gYXhpcy5pbmRleE9mKCd5JykgIT09IC0xO1xuICAgIHJldHVybiBmdW5jdGlvbihwdDEsIHB0Mikge1xuICAgICAgICBjb25zdCBkZWx0YVggPSB1c2VYID8gTWF0aC5hYnMocHQxLnggLSBwdDIueCkgOiAwO1xuICAgICAgICBjb25zdCBkZWx0YVkgPSB1c2VZID8gTWF0aC5hYnMocHQxLnkgLSBwdDIueSkgOiAwO1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGRlbHRhWCwgMikgKyBNYXRoLnBvdyhkZWx0YVksIDIpKTtcbiAgICB9O1xufVxuIGZ1bmN0aW9uIGdldEludGVyc2VjdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSkge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgaWYgKCFpbmNsdWRlSW52aXNpYmxlICYmICFjaGFydC5pc1BvaW50SW5BcmVhKHBvc2l0aW9uKSkge1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIGNvbnN0IGV2YWx1YXRpb25GdW5jID0gZnVuY3Rpb24oZWxlbWVudCwgZGF0YXNldEluZGV4LCBpbmRleCkge1xuICAgICAgICBpZiAoIWluY2x1ZGVJbnZpc2libGUgJiYgIV9pc1BvaW50SW5BcmVhKGVsZW1lbnQsIGNoYXJ0LmNoYXJ0QXJlYSwgMCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC5pblJhbmdlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHVzZUZpbmFsUG9zaXRpb24pKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICBpbmRleFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyhjaGFydCwgYXhpcywgcG9zaXRpb24sIGV2YWx1YXRpb25GdW5jLCB0cnVlKTtcbiAgICByZXR1cm4gaXRlbXM7XG59XG4gZnVuY3Rpb24gZ2V0TmVhcmVzdFJhZGlhbEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgIGxldCBpdGVtcyA9IFtdO1xuICAgIGZ1bmN0aW9uIGV2YWx1YXRpb25GdW5jKGVsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXgpIHtcbiAgICAgICAgY29uc3QgeyBzdGFydEFuZ2xlICwgZW5kQW5nbGUgIH0gPSBlbGVtZW50LmdldFByb3BzKFtcbiAgICAgICAgICAgICdzdGFydEFuZ2xlJyxcbiAgICAgICAgICAgICdlbmRBbmdsZSdcbiAgICAgICAgXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHsgYW5nbGUgIH0gPSBnZXRBbmdsZUZyb21Qb2ludChlbGVtZW50LCB7XG4gICAgICAgICAgICB4OiBwb3NpdGlvbi54LFxuICAgICAgICAgICAgeTogcG9zaXRpb24ueVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKF9hbmdsZUJldHdlZW4oYW5nbGUsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKSkge1xuICAgICAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5kZXgsXG4gICAgICAgICAgICAgICAgaW5kZXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyhjaGFydCwgYXhpcywgcG9zaXRpb24sIGV2YWx1YXRpb25GdW5jKTtcbiAgICByZXR1cm4gaXRlbXM7XG59XG4gZnVuY3Rpb24gZ2V0TmVhcmVzdENhcnRlc2lhbkl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgaW50ZXJzZWN0LCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKSB7XG4gICAgbGV0IGl0ZW1zID0gW107XG4gICAgY29uc3QgZGlzdGFuY2VNZXRyaWMgPSBnZXREaXN0YW5jZU1ldHJpY0ZvckF4aXMoYXhpcyk7XG4gICAgbGV0IG1pbkRpc3RhbmNlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGZ1bmN0aW9uIGV2YWx1YXRpb25GdW5jKGVsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXgpIHtcbiAgICAgICAgY29uc3QgaW5SYW5nZSA9IGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGludGVyc2VjdCAmJiAhaW5SYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IGVsZW1lbnQuZ2V0Q2VudGVyUG9pbnQodXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHBvaW50SW5BcmVhID0gISFpbmNsdWRlSW52aXNpYmxlIHx8IGNoYXJ0LmlzUG9pbnRJbkFyZWEoY2VudGVyKTtcbiAgICAgICAgaWYgKCFwb2ludEluQXJlYSAmJiAhaW5SYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VNZXRyaWMocG9zaXRpb24sIGNlbnRlcik7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7XG4gICAgICAgICAgICBpdGVtcyA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gbWluRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgZGF0YXNldEluZGV4LFxuICAgICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBldmFsdWF0ZUludGVyYWN0aW9uSXRlbXMoY2hhcnQsIGF4aXMsIHBvc2l0aW9uLCBldmFsdWF0aW9uRnVuYyk7XG4gICAgcmV0dXJuIGl0ZW1zO1xufVxuIGZ1bmN0aW9uIGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSkge1xuICAgIGlmICghaW5jbHVkZUludmlzaWJsZSAmJiAhY2hhcnQuaXNQb2ludEluQXJlYShwb3NpdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gYXhpcyA9PT0gJ3InICYmICFpbnRlcnNlY3QgPyBnZXROZWFyZXN0UmFkaWFsSXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uKSA6IGdldE5lYXJlc3RDYXJ0ZXNpYW5JdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSk7XG59XG4gZnVuY3Rpb24gZ2V0QXhpc0l0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgaW50ZXJzZWN0LCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICBjb25zdCByYW5nZU1ldGhvZCA9IGF4aXMgPT09ICd4JyA/ICdpblhSYW5nZScgOiAnaW5ZUmFuZ2UnO1xuICAgIGxldCBpbnRlcnNlY3RzSXRlbSA9IGZhbHNlO1xuICAgIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyhjaGFydCwgYXhpcywgcG9zaXRpb24sIChlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4KT0+e1xuICAgICAgICBpZiAoZWxlbWVudFtyYW5nZU1ldGhvZF0gJiYgZWxlbWVudFtyYW5nZU1ldGhvZF0ocG9zaXRpb25bYXhpc10sIHVzZUZpbmFsUG9zaXRpb24pKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICBpbmRleFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnRlcnNlY3RzSXRlbSA9IGludGVyc2VjdHNJdGVtIHx8IGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpbnRlcnNlY3QgJiYgIWludGVyc2VjdHNJdGVtKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xufVxuIHZhciBJbnRlcmFjdGlvbiA9IHtcbiAgICBldmFsdWF0ZUludGVyYWN0aW9uSXRlbXMsXG4gICAgbW9kZXM6IHtcbiBpbmRleCAoY2hhcnQsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG4gICAgICAgICAgICBjb25zdCBheGlzID0gb3B0aW9ucy5heGlzIHx8ICd4JztcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVJbnZpc2libGUgPSBvcHRpb25zLmluY2x1ZGVJbnZpc2libGUgfHwgZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IG9wdGlvbnMuaW50ZXJzZWN0ID8gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKSA6IGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGZhbHNlLCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gW107XG4gICAgICAgICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoYXJ0LmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKS5mb3JFYWNoKChtZXRhKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXNbMF0uaW5kZXg7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG1ldGEuZGF0YVtpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgJiYgIWVsZW1lbnQuc2tpcCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0SW5kZXg6IG1ldGEuaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICAgICAgfSxcbiBkYXRhc2V0IChjaGFydCwgZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbiAgICAgICAgICAgIGNvbnN0IGF4aXMgPSBvcHRpb25zLmF4aXMgfHwgJ3h5JztcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVJbnZpc2libGUgPSBvcHRpb25zLmluY2x1ZGVJbnZpc2libGUgfHwgZmFsc2U7XG4gICAgICAgICAgICBsZXQgaXRlbXMgPSBvcHRpb25zLmludGVyc2VjdCA/IGdldEludGVyc2VjdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSkgOiBnZXROZWFyZXN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCBmYWxzZSwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSk7XG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFzZXRJbmRleCA9IGl0ZW1zWzBdLmRhdGFzZXRJbmRleDtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KS5kYXRhO1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpe1xuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGRhdGFbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgICAgIH0sXG4gcG9pbnQgKGNoYXJ0LCBlLCBvcHRpb25zLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuICAgICAgICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneHknO1xuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUludmlzaWJsZSA9IG9wdGlvbnMuaW5jbHVkZUludmlzaWJsZSB8fCBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBnZXRJbnRlcnNlY3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIHVzZUZpbmFsUG9zaXRpb24sIGluY2x1ZGVJbnZpc2libGUpO1xuICAgICAgICB9LFxuIG5lYXJlc3QgKGNoYXJ0LCBlLCBvcHRpb25zLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuICAgICAgICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneHknO1xuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUludmlzaWJsZSA9IG9wdGlvbnMuaW5jbHVkZUludmlzaWJsZSB8fCBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBnZXROZWFyZXN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCBvcHRpb25zLmludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSk7XG4gICAgICAgIH0sXG4geCAoY2hhcnQsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QXhpc0l0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgJ3gnLCBvcHRpb25zLmludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIH0sXG4geSAoY2hhcnQsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QXhpc0l0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgJ3knLCBvcHRpb25zLmludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCBTVEFUSUNfUE9TSVRJT05TID0gW1xuICAgICdsZWZ0JyxcbiAgICAndG9wJyxcbiAgICAncmlnaHQnLFxuICAgICdib3R0b20nXG5dO1xuZnVuY3Rpb24gZmlsdGVyQnlQb3NpdGlvbihhcnJheSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKCh2KT0+di5wb3MgPT09IHBvc2l0aW9uKTtcbn1cbmZ1bmN0aW9uIGZpbHRlckR5bmFtaWNQb3NpdGlvbkJ5QXhpcyhhcnJheSwgYXhpcykge1xuICAgIHJldHVybiBhcnJheS5maWx0ZXIoKHYpPT5TVEFUSUNfUE9TSVRJT05TLmluZGV4T2Yodi5wb3MpID09PSAtMSAmJiB2LmJveC5heGlzID09PSBheGlzKTtcbn1cbmZ1bmN0aW9uIHNvcnRCeVdlaWdodChhcnJheSwgcmV2ZXJzZSkge1xuICAgIHJldHVybiBhcnJheS5zb3J0KChhLCBiKT0+e1xuICAgICAgICBjb25zdCB2MCA9IHJldmVyc2UgPyBiIDogYTtcbiAgICAgICAgY29uc3QgdjEgPSByZXZlcnNlID8gYSA6IGI7XG4gICAgICAgIHJldHVybiB2MC53ZWlnaHQgPT09IHYxLndlaWdodCA/IHYwLmluZGV4IC0gdjEuaW5kZXggOiB2MC53ZWlnaHQgLSB2MS53ZWlnaHQ7XG4gICAgfSk7XG59XG5mdW5jdGlvbiB3cmFwQm94ZXMoYm94ZXMpIHtcbiAgICBjb25zdCBsYXlvdXRCb3hlcyA9IFtdO1xuICAgIGxldCBpLCBpbGVuLCBib3gsIHBvcywgc3RhY2ssIHN0YWNrV2VpZ2h0O1xuICAgIGZvcihpID0gMCwgaWxlbiA9IChib3hlcyB8fCBbXSkubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgYm94ID0gYm94ZXNbaV07XG4gICAgICAgICh7IHBvc2l0aW9uOiBwb3MgLCBvcHRpb25zOiB7IHN0YWNrICwgc3RhY2tXZWlnaHQgPTEgIH0gIH0gPSBib3gpO1xuICAgICAgICBsYXlvdXRCb3hlcy5wdXNoKHtcbiAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgYm94LFxuICAgICAgICAgICAgcG9zLFxuICAgICAgICAgICAgaG9yaXpvbnRhbDogYm94LmlzSG9yaXpvbnRhbCgpLFxuICAgICAgICAgICAgd2VpZ2h0OiBib3gud2VpZ2h0LFxuICAgICAgICAgICAgc3RhY2s6IHN0YWNrICYmIHBvcyArIHN0YWNrLFxuICAgICAgICAgICAgc3RhY2tXZWlnaHRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsYXlvdXRCb3hlcztcbn1cbmZ1bmN0aW9uIGJ1aWxkU3RhY2tzKGxheW91dHMpIHtcbiAgICBjb25zdCBzdGFja3MgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHdyYXAgb2YgbGF5b3V0cyl7XG4gICAgICAgIGNvbnN0IHsgc3RhY2sgLCBwb3MgLCBzdGFja1dlaWdodCAgfSA9IHdyYXA7XG4gICAgICAgIGlmICghc3RhY2sgfHwgIVNUQVRJQ19QT1NJVElPTlMuaW5jbHVkZXMocG9zKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX3N0YWNrID0gc3RhY2tzW3N0YWNrXSB8fCAoc3RhY2tzW3N0YWNrXSA9IHtcbiAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgcGxhY2VkOiAwLFxuICAgICAgICAgICAgd2VpZ2h0OiAwLFxuICAgICAgICAgICAgc2l6ZTogMFxuICAgICAgICB9KTtcbiAgICAgICAgX3N0YWNrLmNvdW50Kys7XG4gICAgICAgIF9zdGFjay53ZWlnaHQgKz0gc3RhY2tXZWlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBzdGFja3M7XG59XG4gZnVuY3Rpb24gc2V0TGF5b3V0RGltcyhsYXlvdXRzLCBwYXJhbXMpIHtcbiAgICBjb25zdCBzdGFja3MgPSBidWlsZFN0YWNrcyhsYXlvdXRzKTtcbiAgICBjb25zdCB7IHZCb3hNYXhXaWR0aCAsIGhCb3hNYXhIZWlnaHQgIH0gPSBwYXJhbXM7XG4gICAgbGV0IGksIGlsZW4sIGxheW91dDtcbiAgICBmb3IoaSA9IDAsIGlsZW4gPSBsYXlvdXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGxheW91dCA9IGxheW91dHNbaV07XG4gICAgICAgIGNvbnN0IHsgZnVsbFNpemUgIH0gPSBsYXlvdXQuYm94O1xuICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrc1tsYXlvdXQuc3RhY2tdO1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBzdGFjayAmJiBsYXlvdXQuc3RhY2tXZWlnaHQgLyBzdGFjay53ZWlnaHQ7XG4gICAgICAgIGlmIChsYXlvdXQuaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgbGF5b3V0LndpZHRoID0gZmFjdG9yID8gZmFjdG9yICogdkJveE1heFdpZHRoIDogZnVsbFNpemUgJiYgcGFyYW1zLmF2YWlsYWJsZVdpZHRoO1xuICAgICAgICAgICAgbGF5b3V0LmhlaWdodCA9IGhCb3hNYXhIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXlvdXQud2lkdGggPSB2Qm94TWF4V2lkdGg7XG4gICAgICAgICAgICBsYXlvdXQuaGVpZ2h0ID0gZmFjdG9yID8gZmFjdG9yICogaEJveE1heEhlaWdodCA6IGZ1bGxTaXplICYmIHBhcmFtcy5hdmFpbGFibGVIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrcztcbn1cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0Qm94ZXMoYm94ZXMpIHtcbiAgICBjb25zdCBsYXlvdXRCb3hlcyA9IHdyYXBCb3hlcyhib3hlcyk7XG4gICAgY29uc3QgZnVsbFNpemUgPSBzb3J0QnlXZWlnaHQobGF5b3V0Qm94ZXMuZmlsdGVyKCh3cmFwKT0+d3JhcC5ib3guZnVsbFNpemUpLCB0cnVlKTtcbiAgICBjb25zdCBsZWZ0ID0gc29ydEJ5V2VpZ2h0KGZpbHRlckJ5UG9zaXRpb24obGF5b3V0Qm94ZXMsICdsZWZ0JyksIHRydWUpO1xuICAgIGNvbnN0IHJpZ2h0ID0gc29ydEJ5V2VpZ2h0KGZpbHRlckJ5UG9zaXRpb24obGF5b3V0Qm94ZXMsICdyaWdodCcpKTtcbiAgICBjb25zdCB0b3AgPSBzb3J0QnlXZWlnaHQoZmlsdGVyQnlQb3NpdGlvbihsYXlvdXRCb3hlcywgJ3RvcCcpLCB0cnVlKTtcbiAgICBjb25zdCBib3R0b20gPSBzb3J0QnlXZWlnaHQoZmlsdGVyQnlQb3NpdGlvbihsYXlvdXRCb3hlcywgJ2JvdHRvbScpKTtcbiAgICBjb25zdCBjZW50ZXJIb3Jpem9udGFsID0gZmlsdGVyRHluYW1pY1Bvc2l0aW9uQnlBeGlzKGxheW91dEJveGVzLCAneCcpO1xuICAgIGNvbnN0IGNlbnRlclZlcnRpY2FsID0gZmlsdGVyRHluYW1pY1Bvc2l0aW9uQnlBeGlzKGxheW91dEJveGVzLCAneScpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGZ1bGxTaXplLFxuICAgICAgICBsZWZ0QW5kVG9wOiBsZWZ0LmNvbmNhdCh0b3ApLFxuICAgICAgICByaWdodEFuZEJvdHRvbTogcmlnaHQuY29uY2F0KGNlbnRlclZlcnRpY2FsKS5jb25jYXQoYm90dG9tKS5jb25jYXQoY2VudGVySG9yaXpvbnRhbCksXG4gICAgICAgIGNoYXJ0QXJlYTogZmlsdGVyQnlQb3NpdGlvbihsYXlvdXRCb3hlcywgJ2NoYXJ0QXJlYScpLFxuICAgICAgICB2ZXJ0aWNhbDogbGVmdC5jb25jYXQocmlnaHQpLmNvbmNhdChjZW50ZXJWZXJ0aWNhbCksXG4gICAgICAgIGhvcml6b250YWw6IHRvcC5jb25jYXQoYm90dG9tKS5jb25jYXQoY2VudGVySG9yaXpvbnRhbClcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0Q29tYmluZWRNYXgobWF4UGFkZGluZywgY2hhcnRBcmVhLCBhLCBiKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1heFBhZGRpbmdbYV0sIGNoYXJ0QXJlYVthXSkgKyBNYXRoLm1heChtYXhQYWRkaW5nW2JdLCBjaGFydEFyZWFbYl0pO1xufVxuZnVuY3Rpb24gdXBkYXRlTWF4UGFkZGluZyhtYXhQYWRkaW5nLCBib3hQYWRkaW5nKSB7XG4gICAgbWF4UGFkZGluZy50b3AgPSBNYXRoLm1heChtYXhQYWRkaW5nLnRvcCwgYm94UGFkZGluZy50b3ApO1xuICAgIG1heFBhZGRpbmcubGVmdCA9IE1hdGgubWF4KG1heFBhZGRpbmcubGVmdCwgYm94UGFkZGluZy5sZWZ0KTtcbiAgICBtYXhQYWRkaW5nLmJvdHRvbSA9IE1hdGgubWF4KG1heFBhZGRpbmcuYm90dG9tLCBib3hQYWRkaW5nLmJvdHRvbSk7XG4gICAgbWF4UGFkZGluZy5yaWdodCA9IE1hdGgubWF4KG1heFBhZGRpbmcucmlnaHQsIGJveFBhZGRpbmcucmlnaHQpO1xufVxuZnVuY3Rpb24gdXBkYXRlRGltcyhjaGFydEFyZWEsIHBhcmFtcywgbGF5b3V0LCBzdGFja3MpIHtcbiAgICBjb25zdCB7IHBvcyAsIGJveCAgfSA9IGxheW91dDtcbiAgICBjb25zdCBtYXhQYWRkaW5nID0gY2hhcnRBcmVhLm1heFBhZGRpbmc7XG4gICAgaWYgKCFpc09iamVjdChwb3MpKSB7XG4gICAgICAgIGlmIChsYXlvdXQuc2l6ZSkge1xuICAgICAgICAgICAgY2hhcnRBcmVhW3Bvc10gLT0gbGF5b3V0LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3NbbGF5b3V0LnN0YWNrXSB8fCB7XG4gICAgICAgICAgICBzaXplOiAwLFxuICAgICAgICAgICAgY291bnQ6IDFcbiAgICAgICAgfTtcbiAgICAgICAgc3RhY2suc2l6ZSA9IE1hdGgubWF4KHN0YWNrLnNpemUsIGxheW91dC5ob3Jpem9udGFsID8gYm94LmhlaWdodCA6IGJveC53aWR0aCk7XG4gICAgICAgIGxheW91dC5zaXplID0gc3RhY2suc2l6ZSAvIHN0YWNrLmNvdW50O1xuICAgICAgICBjaGFydEFyZWFbcG9zXSArPSBsYXlvdXQuc2l6ZTtcbiAgICB9XG4gICAgaWYgKGJveC5nZXRQYWRkaW5nKSB7XG4gICAgICAgIHVwZGF0ZU1heFBhZGRpbmcobWF4UGFkZGluZywgYm94LmdldFBhZGRpbmcoKSk7XG4gICAgfVxuICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5tYXgoMCwgcGFyYW1zLm91dGVyV2lkdGggLSBnZXRDb21iaW5lZE1heChtYXhQYWRkaW5nLCBjaGFydEFyZWEsICdsZWZ0JywgJ3JpZ2h0JykpO1xuICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KDAsIHBhcmFtcy5vdXRlckhlaWdodCAtIGdldENvbWJpbmVkTWF4KG1heFBhZGRpbmcsIGNoYXJ0QXJlYSwgJ3RvcCcsICdib3R0b20nKSk7XG4gICAgY29uc3Qgd2lkdGhDaGFuZ2VkID0gbmV3V2lkdGggIT09IGNoYXJ0QXJlYS53O1xuICAgIGNvbnN0IGhlaWdodENoYW5nZWQgPSBuZXdIZWlnaHQgIT09IGNoYXJ0QXJlYS5oO1xuICAgIGNoYXJ0QXJlYS53ID0gbmV3V2lkdGg7XG4gICAgY2hhcnRBcmVhLmggPSBuZXdIZWlnaHQ7XG4gICAgcmV0dXJuIGxheW91dC5ob3Jpem9udGFsID8ge1xuICAgICAgICBzYW1lOiB3aWR0aENoYW5nZWQsXG4gICAgICAgIG90aGVyOiBoZWlnaHRDaGFuZ2VkXG4gICAgfSA6IHtcbiAgICAgICAgc2FtZTogaGVpZ2h0Q2hhbmdlZCxcbiAgICAgICAgb3RoZXI6IHdpZHRoQ2hhbmdlZFxuICAgIH07XG59XG5mdW5jdGlvbiBoYW5kbGVNYXhQYWRkaW5nKGNoYXJ0QXJlYSkge1xuICAgIGNvbnN0IG1heFBhZGRpbmcgPSBjaGFydEFyZWEubWF4UGFkZGluZztcbiAgICBmdW5jdGlvbiB1cGRhdGVQb3MocG9zKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZSA9IE1hdGgubWF4KG1heFBhZGRpbmdbcG9zXSAtIGNoYXJ0QXJlYVtwb3NdLCAwKTtcbiAgICAgICAgY2hhcnRBcmVhW3Bvc10gKz0gY2hhbmdlO1xuICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgIH1cbiAgICBjaGFydEFyZWEueSArPSB1cGRhdGVQb3MoJ3RvcCcpO1xuICAgIGNoYXJ0QXJlYS54ICs9IHVwZGF0ZVBvcygnbGVmdCcpO1xuICAgIHVwZGF0ZVBvcygncmlnaHQnKTtcbiAgICB1cGRhdGVQb3MoJ2JvdHRvbScpO1xufVxuZnVuY3Rpb24gZ2V0TWFyZ2lucyhob3Jpem9udGFsLCBjaGFydEFyZWEpIHtcbiAgICBjb25zdCBtYXhQYWRkaW5nID0gY2hhcnRBcmVhLm1heFBhZGRpbmc7XG4gICAgZnVuY3Rpb24gbWFyZ2luRm9yUG9zaXRpb25zKHBvc2l0aW9ucykge1xuICAgICAgICBjb25zdCBtYXJnaW4gPSB7XG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICBib3R0b206IDBcbiAgICAgICAgfTtcbiAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKHBvcyk9PntcbiAgICAgICAgICAgIG1hcmdpbltwb3NdID0gTWF0aC5tYXgoY2hhcnRBcmVhW3Bvc10sIG1heFBhZGRpbmdbcG9zXSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWFyZ2luO1xuICAgIH1cbiAgICByZXR1cm4gaG9yaXpvbnRhbCA/IG1hcmdpbkZvclBvc2l0aW9ucyhbXG4gICAgICAgICdsZWZ0JyxcbiAgICAgICAgJ3JpZ2h0J1xuICAgIF0pIDogbWFyZ2luRm9yUG9zaXRpb25zKFtcbiAgICAgICAgJ3RvcCcsXG4gICAgICAgICdib3R0b20nXG4gICAgXSk7XG59XG5mdW5jdGlvbiBmaXRCb3hlcyhib3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcykge1xuICAgIGNvbnN0IHJlZml0Qm94ZXMgPSBbXTtcbiAgICBsZXQgaSwgaWxlbiwgbGF5b3V0LCBib3gsIHJlZml0LCBjaGFuZ2VkO1xuICAgIGZvcihpID0gMCwgaWxlbiA9IGJveGVzLmxlbmd0aCwgcmVmaXQgPSAwOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgbGF5b3V0ID0gYm94ZXNbaV07XG4gICAgICAgIGJveCA9IGxheW91dC5ib3g7XG4gICAgICAgIGJveC51cGRhdGUobGF5b3V0LndpZHRoIHx8IGNoYXJ0QXJlYS53LCBsYXlvdXQuaGVpZ2h0IHx8IGNoYXJ0QXJlYS5oLCBnZXRNYXJnaW5zKGxheW91dC5ob3Jpem9udGFsLCBjaGFydEFyZWEpKTtcbiAgICAgICAgY29uc3QgeyBzYW1lICwgb3RoZXIgIH0gPSB1cGRhdGVEaW1zKGNoYXJ0QXJlYSwgcGFyYW1zLCBsYXlvdXQsIHN0YWNrcyk7XG4gICAgICAgIHJlZml0IHw9IHNhbWUgJiYgcmVmaXRCb3hlcy5sZW5ndGg7XG4gICAgICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHx8IG90aGVyO1xuICAgICAgICBpZiAoIWJveC5mdWxsU2l6ZSkge1xuICAgICAgICAgICAgcmVmaXRCb3hlcy5wdXNoKGxheW91dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlZml0ICYmIGZpdEJveGVzKHJlZml0Qm94ZXMsIGNoYXJ0QXJlYSwgcGFyYW1zLCBzdGFja3MpIHx8IGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBzZXRCb3hEaW1zKGJveCwgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgYm94LnRvcCA9IHRvcDtcbiAgICBib3gubGVmdCA9IGxlZnQ7XG4gICAgYm94LnJpZ2h0ID0gbGVmdCArIHdpZHRoO1xuICAgIGJveC5ib3R0b20gPSB0b3AgKyBoZWlnaHQ7XG4gICAgYm94LndpZHRoID0gd2lkdGg7XG4gICAgYm94LmhlaWdodCA9IGhlaWdodDtcbn1cbmZ1bmN0aW9uIHBsYWNlQm94ZXMoYm94ZXMsIGNoYXJ0QXJlYSwgcGFyYW1zLCBzdGFja3MpIHtcbiAgICBjb25zdCB1c2VyUGFkZGluZyA9IHBhcmFtcy5wYWRkaW5nO1xuICAgIGxldCB7IHggLCB5ICB9ID0gY2hhcnRBcmVhO1xuICAgIGZvciAoY29uc3QgbGF5b3V0IG9mIGJveGVzKXtcbiAgICAgICAgY29uc3QgYm94ID0gbGF5b3V0LmJveDtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3NbbGF5b3V0LnN0YWNrXSB8fCB7XG4gICAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICAgIHBsYWNlZDogMCxcbiAgICAgICAgICAgIHdlaWdodDogMVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB3ZWlnaHQgPSBsYXlvdXQuc3RhY2tXZWlnaHQgLyBzdGFjay53ZWlnaHQgfHwgMTtcbiAgICAgICAgaWYgKGxheW91dC5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNoYXJ0QXJlYS53ICogd2VpZ2h0O1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gc3RhY2suc2l6ZSB8fCBib3guaGVpZ2h0O1xuICAgICAgICAgICAgaWYgKGRlZmluZWQoc3RhY2suc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgeSA9IHN0YWNrLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJveC5mdWxsU2l6ZSkge1xuICAgICAgICAgICAgICAgIHNldEJveERpbXMoYm94LCB1c2VyUGFkZGluZy5sZWZ0LCB5LCBwYXJhbXMub3V0ZXJXaWR0aCAtIHVzZXJQYWRkaW5nLnJpZ2h0IC0gdXNlclBhZGRpbmcubGVmdCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0Qm94RGltcyhib3gsIGNoYXJ0QXJlYS5sZWZ0ICsgc3RhY2sucGxhY2VkLCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YWNrLnN0YXJ0ID0geTtcbiAgICAgICAgICAgIHN0YWNrLnBsYWNlZCArPSB3aWR0aDtcbiAgICAgICAgICAgIHkgPSBib3guYm90dG9tO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY2hhcnRBcmVhLmggKiB3ZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHN0YWNrLnNpemUgfHwgYm94LndpZHRoO1xuICAgICAgICAgICAgaWYgKGRlZmluZWQoc3RhY2suc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgeCA9IHN0YWNrLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJveC5mdWxsU2l6ZSkge1xuICAgICAgICAgICAgICAgIHNldEJveERpbXMoYm94LCB4LCB1c2VyUGFkZGluZy50b3AsIHdpZHRoLCBwYXJhbXMub3V0ZXJIZWlnaHQgLSB1c2VyUGFkZGluZy5ib3R0b20gLSB1c2VyUGFkZGluZy50b3ApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRCb3hEaW1zKGJveCwgeCwgY2hhcnRBcmVhLnRvcCArIHN0YWNrLnBsYWNlZCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFjay5zdGFydCA9IHg7XG4gICAgICAgICAgICBzdGFjay5wbGFjZWQgKz0gaGVpZ2h0O1xuICAgICAgICAgICAgeCA9IGJveC5yaWdodDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGFydEFyZWEueCA9IHg7XG4gICAgY2hhcnRBcmVhLnkgPSB5O1xufVxudmFyIGxheW91dHMgPSB7XG4gYWRkQm94IChjaGFydCwgaXRlbSkge1xuICAgICAgICBpZiAoIWNoYXJ0LmJveGVzKSB7XG4gICAgICAgICAgICBjaGFydC5ib3hlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW0uZnVsbFNpemUgPSBpdGVtLmZ1bGxTaXplIHx8IGZhbHNlO1xuICAgICAgICBpdGVtLnBvc2l0aW9uID0gaXRlbS5wb3NpdGlvbiB8fCAndG9wJztcbiAgICAgICAgaXRlbS53ZWlnaHQgPSBpdGVtLndlaWdodCB8fCAwO1xuICAgICAgICBpdGVtLl9sYXllcnMgPSBpdGVtLl9sYXllcnMgfHwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgejogMCxcbiAgICAgICAgICAgICAgICAgICAgZHJhdyAoY2hhcnRBcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRyYXcoY2hhcnRBcmVhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH07XG4gICAgICAgIGNoYXJ0LmJveGVzLnB1c2goaXRlbSk7XG4gICAgfSxcbiByZW1vdmVCb3ggKGNoYXJ0LCBsYXlvdXRJdGVtKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2hhcnQuYm94ZXMgPyBjaGFydC5ib3hlcy5pbmRleE9mKGxheW91dEl0ZW0pIDogLTE7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNoYXJ0LmJveGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9LFxuIGNvbmZpZ3VyZSAoY2hhcnQsIGl0ZW0sIG9wdGlvbnMpIHtcbiAgICAgICAgaXRlbS5mdWxsU2l6ZSA9IG9wdGlvbnMuZnVsbFNpemU7XG4gICAgICAgIGl0ZW0ucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICBpdGVtLndlaWdodCA9IG9wdGlvbnMud2VpZ2h0O1xuICAgIH0sXG4gdXBkYXRlIChjaGFydCwgd2lkdGgsIGhlaWdodCwgbWluUGFkZGluZykge1xuICAgICAgICBpZiAoIWNoYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhjaGFydC5vcHRpb25zLmxheW91dC5wYWRkaW5nKTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCh3aWR0aCAtIHBhZGRpbmcud2lkdGgsIDApO1xuICAgICAgICBjb25zdCBhdmFpbGFibGVIZWlnaHQgPSBNYXRoLm1heChoZWlnaHQgLSBwYWRkaW5nLmhlaWdodCwgMCk7XG4gICAgICAgIGNvbnN0IGJveGVzID0gYnVpbGRMYXlvdXRCb3hlcyhjaGFydC5ib3hlcyk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsQm94ZXMgPSBib3hlcy52ZXJ0aWNhbDtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbEJveGVzID0gYm94ZXMuaG9yaXpvbnRhbDtcbiAgICAgICAgZWFjaChjaGFydC5ib3hlcywgKGJveCk9PntcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYm94LmJlZm9yZUxheW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGJveC5iZWZvcmVMYXlvdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZpc2libGVWZXJ0aWNhbEJveENvdW50ID0gdmVydGljYWxCb3hlcy5yZWR1Y2UoKHRvdGFsLCB3cmFwKT0+d3JhcC5ib3gub3B0aW9ucyAmJiB3cmFwLmJveC5vcHRpb25zLmRpc3BsYXkgPT09IGZhbHNlID8gdG90YWwgOiB0b3RhbCArIDEsIDApIHx8IDE7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgb3V0ZXJXaWR0aDogd2lkdGgsXG4gICAgICAgICAgICBvdXRlckhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgcGFkZGluZyxcbiAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoLFxuICAgICAgICAgICAgYXZhaWxhYmxlSGVpZ2h0LFxuICAgICAgICAgICAgdkJveE1heFdpZHRoOiBhdmFpbGFibGVXaWR0aCAvIDIgLyB2aXNpYmxlVmVydGljYWxCb3hDb3VudCxcbiAgICAgICAgICAgIGhCb3hNYXhIZWlnaHQ6IGF2YWlsYWJsZUhlaWdodCAvIDJcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG1heFBhZGRpbmcgPSBPYmplY3QuYXNzaWduKHt9LCBwYWRkaW5nKTtcbiAgICAgICAgdXBkYXRlTWF4UGFkZGluZyhtYXhQYWRkaW5nLCB0b1BhZGRpbmcobWluUGFkZGluZykpO1xuICAgICAgICBjb25zdCBjaGFydEFyZWEgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIG1heFBhZGRpbmcsXG4gICAgICAgICAgICB3OiBhdmFpbGFibGVXaWR0aCxcbiAgICAgICAgICAgIGg6IGF2YWlsYWJsZUhlaWdodCxcbiAgICAgICAgICAgIHg6IHBhZGRpbmcubGVmdCxcbiAgICAgICAgICAgIHk6IHBhZGRpbmcudG9wXG4gICAgICAgIH0sIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCBzdGFja3MgPSBzZXRMYXlvdXREaW1zKHZlcnRpY2FsQm94ZXMuY29uY2F0KGhvcml6b250YWxCb3hlcyksIHBhcmFtcyk7XG4gICAgICAgIGZpdEJveGVzKGJveGVzLmZ1bGxTaXplLCBjaGFydEFyZWEsIHBhcmFtcywgc3RhY2tzKTtcbiAgICAgICAgZml0Qm94ZXModmVydGljYWxCb3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG4gICAgICAgIGlmIChmaXRCb3hlcyhob3Jpem9udGFsQm94ZXMsIGNoYXJ0QXJlYSwgcGFyYW1zLCBzdGFja3MpKSB7XG4gICAgICAgICAgICBmaXRCb3hlcyh2ZXJ0aWNhbEJveGVzLCBjaGFydEFyZWEsIHBhcmFtcywgc3RhY2tzKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVNYXhQYWRkaW5nKGNoYXJ0QXJlYSk7XG4gICAgICAgIHBsYWNlQm94ZXMoYm94ZXMubGVmdEFuZFRvcCwgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG4gICAgICAgIGNoYXJ0QXJlYS54ICs9IGNoYXJ0QXJlYS53O1xuICAgICAgICBjaGFydEFyZWEueSArPSBjaGFydEFyZWEuaDtcbiAgICAgICAgcGxhY2VCb3hlcyhib3hlcy5yaWdodEFuZEJvdHRvbSwgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG4gICAgICAgIGNoYXJ0LmNoYXJ0QXJlYSA9IHtcbiAgICAgICAgICAgIGxlZnQ6IGNoYXJ0QXJlYS5sZWZ0LFxuICAgICAgICAgICAgdG9wOiBjaGFydEFyZWEudG9wLFxuICAgICAgICAgICAgcmlnaHQ6IGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLncsXG4gICAgICAgICAgICBib3R0b206IGNoYXJ0QXJlYS50b3AgKyBjaGFydEFyZWEuaCxcbiAgICAgICAgICAgIGhlaWdodDogY2hhcnRBcmVhLmgsXG4gICAgICAgICAgICB3aWR0aDogY2hhcnRBcmVhLndcbiAgICAgICAgfTtcbiAgICAgICAgZWFjaChib3hlcy5jaGFydEFyZWEsIChsYXlvdXQpPT57XG4gICAgICAgICAgICBjb25zdCBib3ggPSBsYXlvdXQuYm94O1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihib3gsIGNoYXJ0LmNoYXJ0QXJlYSk7XG4gICAgICAgICAgICBib3gudXBkYXRlKGNoYXJ0QXJlYS53LCBjaGFydEFyZWEuaCwge1xuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbmNsYXNzIEJhc2VQbGF0Zm9ybSB7XG4gYWNxdWlyZUNvbnRleHQoY2FudmFzLCBhc3BlY3RSYXRpbykge31cbiByZWxlYXNlQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gYWRkRXZlbnRMaXN0ZW5lcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHt9XG4gcmVtb3ZlRXZlbnRMaXN0ZW5lcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHt9XG4gZ2V0RGV2aWNlUGl4ZWxSYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuIGdldE1heGltdW1TaXplKGVsZW1lbnQsIHdpZHRoLCBoZWlnaHQsIGFzcGVjdFJhdGlvKSB7XG4gICAgICAgIHdpZHRoID0gTWF0aC5tYXgoMCwgd2lkdGggfHwgZWxlbWVudC53aWR0aCk7XG4gICAgICAgIGhlaWdodCA9IGhlaWdodCB8fCBlbGVtZW50LmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heCgwLCBhc3BlY3RSYXRpbyA/IE1hdGguZmxvb3Iod2lkdGggLyBhc3BlY3RSYXRpbykgOiBoZWlnaHQpXG4gICAgICAgIH07XG4gICAgfVxuIGlzQXR0YWNoZWQoY2FudmFzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiB1cGRhdGVDb25maWcoY29uZmlnKSB7XG4gICAgfVxufVxuXG5jbGFzcyBCYXNpY1BsYXRmb3JtIGV4dGVuZHMgQmFzZVBsYXRmb3JtIHtcbiAgICBhY3F1aXJlQ29udGV4dChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtICYmIGl0ZW0uZ2V0Q29udGV4dCAmJiBpdGVtLmdldENvbnRleHQoJzJkJykgfHwgbnVsbDtcbiAgICB9XG4gICAgdXBkYXRlQ29uZmlnKGNvbmZpZykge1xuICAgICAgICBjb25maWcub3B0aW9ucy5hbmltYXRpb24gPSBmYWxzZTtcbiAgICB9XG59XG5cbmNvbnN0IEVYUEFORE9fS0VZID0gJyRjaGFydGpzJztcbiBjb25zdCBFVkVOVF9UWVBFUyA9IHtcbiAgICB0b3VjaHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgICB0b3VjaG1vdmU6ICdtb3VzZW1vdmUnLFxuICAgIHRvdWNoZW5kOiAnbW91c2V1cCcsXG4gICAgcG9pbnRlcmVudGVyOiAnbW91c2VlbnRlcicsXG4gICAgcG9pbnRlcmRvd246ICdtb3VzZWRvd24nLFxuICAgIHBvaW50ZXJtb3ZlOiAnbW91c2Vtb3ZlJyxcbiAgICBwb2ludGVydXA6ICdtb3VzZXVwJyxcbiAgICBwb2ludGVybGVhdmU6ICdtb3VzZW91dCcsXG4gICAgcG9pbnRlcm91dDogJ21vdXNlb3V0J1xufTtcbmNvbnN0IGlzTnVsbE9yRW1wdHkgPSAodmFsdWUpPT52YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJyc7XG4gZnVuY3Rpb24gaW5pdENhbnZhcyhjYW52YXMsIGFzcGVjdFJhdGlvKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBjYW52YXMuc3R5bGU7XG4gICAgY29uc3QgcmVuZGVySGVpZ2h0ID0gY2FudmFzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gICAgY29uc3QgcmVuZGVyV2lkdGggPSBjYW52YXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgIGNhbnZhc1tFWFBBTkRPX0tFWV0gPSB7XG4gICAgICAgIGluaXRpYWw6IHtcbiAgICAgICAgICAgIGhlaWdodDogcmVuZGVySGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGg6IHJlbmRlcldpZHRoLFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBzdHlsZS5kaXNwbGF5LFxuICAgICAgICAgICAgICAgIGhlaWdodDogc3R5bGUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHdpZHRoOiBzdHlsZS53aWR0aFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBzdHlsZS5kaXNwbGF5ID0gc3R5bGUuZGlzcGxheSB8fCAnYmxvY2snO1xuICAgIHN0eWxlLmJveFNpemluZyA9IHN0eWxlLmJveFNpemluZyB8fCAnYm9yZGVyLWJveCc7XG4gICAgaWYgKGlzTnVsbE9yRW1wdHkocmVuZGVyV2lkdGgpKSB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlXaWR0aCA9IHJlYWRVc2VkU2l6ZShjYW52YXMsICd3aWR0aCcpO1xuICAgICAgICBpZiAoZGlzcGxheVdpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGRpc3BsYXlXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNOdWxsT3JFbXB0eShyZW5kZXJIZWlnaHQpKSB7XG4gICAgICAgIGlmIChjYW52YXMuc3R5bGUuaGVpZ2h0ID09PSAnJykge1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGNhbnZhcy53aWR0aCAvIChhc3BlY3RSYXRpbyB8fCAyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlIZWlnaHQgPSByZWFkVXNlZFNpemUoY2FudmFzLCAnaGVpZ2h0Jyk7XG4gICAgICAgICAgICBpZiAoZGlzcGxheUhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGRpc3BsYXlIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhbnZhcztcbn1cbmNvbnN0IGV2ZW50TGlzdGVuZXJPcHRpb25zID0gc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyA/IHtcbiAgICBwYXNzaXZlOiB0cnVlXG59IDogZmFsc2U7XG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihub2RlLCB0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmIChub2RlKSB7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmIChjaGFydCAmJiBjaGFydC5jYW52YXMpIHtcbiAgICAgICAgY2hhcnQuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIGV2ZW50TGlzdGVuZXJPcHRpb25zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmcm9tTmF0aXZlRXZlbnQoZXZlbnQsIGNoYXJ0KSB7XG4gICAgY29uc3QgdHlwZSA9IEVWRU5UX1RZUEVTW2V2ZW50LnR5cGVdIHx8IGV2ZW50LnR5cGU7XG4gICAgY29uc3QgeyB4ICwgeSAgfSA9IGdldFJlbGF0aXZlUG9zaXRpb24oZXZlbnQsIGNoYXJ0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBjaGFydCxcbiAgICAgICAgbmF0aXZlOiBldmVudCxcbiAgICAgICAgeDogeCAhPT0gdW5kZWZpbmVkID8geCA6IG51bGwsXG4gICAgICAgIHk6IHkgIT09IHVuZGVmaW5lZCA/IHkgOiBudWxsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIG5vZGVMaXN0Q29udGFpbnMobm9kZUxpc3QsIGNhbnZhcykge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2RlTGlzdCl7XG4gICAgICAgIGlmIChub2RlID09PSBjYW52YXMgfHwgbm9kZS5jb250YWlucyhjYW52YXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUF0dGFjaE9ic2VydmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICAgIGNvbnN0IGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChlbnRyaWVzKT0+e1xuICAgICAgICBsZXQgdHJpZ2dlciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpe1xuICAgICAgICAgICAgdHJpZ2dlciA9IHRyaWdnZXIgfHwgbm9kZUxpc3RDb250YWlucyhlbnRyeS5hZGRlZE5vZGVzLCBjYW52YXMpO1xuICAgICAgICAgICAgdHJpZ2dlciA9IHRyaWdnZXIgJiYgIW5vZGVMaXN0Q29udGFpbnMoZW50cnkucmVtb3ZlZE5vZGVzLCBjYW52YXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge1xuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzZXJ2ZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVEZXRhY2hPYnNlcnZlcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgICBjb25zdCBjYW52YXMgPSBjaGFydC5jYW52YXM7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoZW50cmllcyk9PntcbiAgICAgICAgbGV0IHRyaWdnZXIgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKXtcbiAgICAgICAgICAgIHRyaWdnZXIgPSB0cmlnZ2VyIHx8IG5vZGVMaXN0Q29udGFpbnMoZW50cnkucmVtb3ZlZE5vZGVzLCBjYW52YXMpO1xuICAgICAgICAgICAgdHJpZ2dlciA9IHRyaWdnZXIgJiYgIW5vZGVMaXN0Q29udGFpbnMoZW50cnkuYWRkZWROb2RlcywgY2FudmFzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJpZ2dlcikge1xuICAgICAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIG9ic2VydmVyO1xufVxuY29uc3QgZHJwTGlzdGVuaW5nQ2hhcnRzID0gbmV3IE1hcCgpO1xubGV0IG9sZERldmljZVBpeGVsUmF0aW8gPSAwO1xuZnVuY3Rpb24gb25XaW5kb3dSZXNpemUoKSB7XG4gICAgY29uc3QgZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgaWYgKGRwciA9PT0gb2xkRGV2aWNlUGl4ZWxSYXRpbykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIG9sZERldmljZVBpeGVsUmF0aW8gPSBkcHI7XG4gICAgZHJwTGlzdGVuaW5nQ2hhcnRzLmZvckVhY2goKHJlc2l6ZSwgY2hhcnQpPT57XG4gICAgICAgIGlmIChjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyAhPT0gZHByKSB7XG4gICAgICAgICAgICByZXNpemUoKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gbGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMoY2hhcnQsIHJlc2l6ZSkge1xuICAgIGlmICghZHJwTGlzdGVuaW5nQ2hhcnRzLnNpemUpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uV2luZG93UmVzaXplKTtcbiAgICB9XG4gICAgZHJwTGlzdGVuaW5nQ2hhcnRzLnNldChjaGFydCwgcmVzaXplKTtcbn1cbmZ1bmN0aW9uIHVubGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMoY2hhcnQpIHtcbiAgICBkcnBMaXN0ZW5pbmdDaGFydHMuZGVsZXRlKGNoYXJ0KTtcbiAgICBpZiAoIWRycExpc3RlbmluZ0NoYXJ0cy5zaXplKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvbldpbmRvd1Jlc2l6ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlUmVzaXplT2JzZXJ2ZXIoY2hhcnQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgY29uc3QgY2FudmFzID0gY2hhcnQuY2FudmFzO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNhbnZhcyAmJiBfZ2V0UGFyZW50Tm9kZShjYW52YXMpO1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzaXplID0gdGhyb3R0bGVkKCh3aWR0aCwgaGVpZ2h0KT0+e1xuICAgICAgICBjb25zdCB3ID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICAgICAgICBsaXN0ZW5lcih3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHcgPCBjb250YWluZXIuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICB9LCB3aW5kb3cpO1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKT0+e1xuICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbMF07XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZW50cnkuY29udGVudFJlY3Qud2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGVudHJ5LmNvbnRlbnRSZWN0LmhlaWdodDtcbiAgICAgICAgaWYgKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcik7XG4gICAgbGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMoY2hhcnQsIHJlc2l6ZSk7XG4gICAgcmV0dXJuIG9ic2VydmVyO1xufVxuZnVuY3Rpb24gcmVsZWFzZU9ic2VydmVyKGNoYXJ0LCB0eXBlLCBvYnNlcnZlcikge1xuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAncmVzaXplJykge1xuICAgICAgICB1bmxpc3RlbkRldmljZVBpeGVsUmF0aW9DaGFuZ2VzKGNoYXJ0KTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVQcm94eUFuZExpc3RlbihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgICBjb25zdCBjYW52YXMgPSBjaGFydC5jYW52YXM7XG4gICAgY29uc3QgcHJveHkgPSB0aHJvdHRsZWQoKGV2ZW50KT0+e1xuICAgICAgICBpZiAoY2hhcnQuY3R4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihmcm9tTmF0aXZlRXZlbnQoZXZlbnQsIGNoYXJ0KSk7XG4gICAgICAgIH1cbiAgICB9LCBjaGFydCk7XG4gICAgYWRkTGlzdGVuZXIoY2FudmFzLCB0eXBlLCBwcm94eSk7XG4gICAgcmV0dXJuIHByb3h5O1xufVxuIGNsYXNzIERvbVBsYXRmb3JtIGV4dGVuZHMgQmFzZVBsYXRmb3JtIHtcbiBhY3F1aXJlQ29udGV4dChjYW52YXMsIGFzcGVjdFJhdGlvKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMgJiYgY2FudmFzLmdldENvbnRleHQgJiYgY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuY2FudmFzID09PSBjYW52YXMpIHtcbiAgICAgICAgICAgIGluaXRDYW52YXMoY2FudmFzLCBhc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gcmVsZWFzZUNvbnRleHQoY29udGV4dCkge1xuICAgICAgICBjb25zdCBjYW52YXMgPSBjb250ZXh0LmNhbnZhcztcbiAgICAgICAgaWYgKCFjYW52YXNbRVhQQU5ET19LRVldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IGNhbnZhc1tFWFBBTkRPX0tFWV0uaW5pdGlhbDtcbiAgICAgICAgW1xuICAgICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgICAnd2lkdGgnXG4gICAgICAgIF0uZm9yRWFjaCgocHJvcCk9PntcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW5pdGlhbFtwcm9wXTtcbiAgICAgICAgICAgIGlmIChpc051bGxPclVuZGVmKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUocHJvcCwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBpbml0aWFsLnN0eWxlIHx8IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhzdHlsZSkuZm9yRWFjaCgoa2V5KT0+e1xuICAgICAgICAgICAgY2FudmFzLnN0eWxlW2tleV0gPSBzdHlsZVtrZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgY2FudmFzLndpZHRoID0gY2FudmFzLndpZHRoO1xuICAgICAgICBkZWxldGUgY2FudmFzW0VYUEFORE9fS0VZXTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuIGFkZEV2ZW50TGlzdGVuZXIoY2hhcnQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjaGFydCwgdHlwZSk7XG4gICAgICAgIGNvbnN0IHByb3hpZXMgPSBjaGFydC4kcHJveGllcyB8fCAoY2hhcnQuJHByb3hpZXMgPSB7fSk7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgICAgICAgYXR0YWNoOiBjcmVhdGVBdHRhY2hPYnNlcnZlcixcbiAgICAgICAgICAgIGRldGFjaDogY3JlYXRlRGV0YWNoT2JzZXJ2ZXIsXG4gICAgICAgICAgICByZXNpemU6IGNyZWF0ZVJlc2l6ZU9ic2VydmVyXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyc1t0eXBlXSB8fCBjcmVhdGVQcm94eUFuZExpc3RlbjtcbiAgICAgICAgcHJveGllc1t0eXBlXSA9IGhhbmRsZXIoY2hhcnQsIHR5cGUsIGxpc3RlbmVyKTtcbiAgICB9XG4gcmVtb3ZlRXZlbnRMaXN0ZW5lcihjaGFydCwgdHlwZSkge1xuICAgICAgICBjb25zdCBwcm94aWVzID0gY2hhcnQuJHByb3hpZXMgfHwgKGNoYXJ0LiRwcm94aWVzID0ge30pO1xuICAgICAgICBjb25zdCBwcm94eSA9IHByb3hpZXNbdHlwZV07XG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgICAgICAgIGF0dGFjaDogcmVsZWFzZU9ic2VydmVyLFxuICAgICAgICAgICAgZGV0YWNoOiByZWxlYXNlT2JzZXJ2ZXIsXG4gICAgICAgICAgICByZXNpemU6IHJlbGVhc2VPYnNlcnZlclxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbdHlwZV0gfHwgcmVtb3ZlTGlzdGVuZXI7XG4gICAgICAgIGhhbmRsZXIoY2hhcnQsIHR5cGUsIHByb3h5KTtcbiAgICAgICAgcHJveGllc1t0eXBlXSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0RGV2aWNlUGl4ZWxSYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgIH1cbiBnZXRNYXhpbXVtU2l6ZShjYW52YXMsIHdpZHRoLCBoZWlnaHQsIGFzcGVjdFJhdGlvKSB7XG4gICAgICAgIHJldHVybiBnZXRNYXhpbXVtU2l6ZShjYW52YXMsIHdpZHRoLCBoZWlnaHQsIGFzcGVjdFJhdGlvKTtcbiAgICB9XG4gaXNBdHRhY2hlZChjYW52YXMpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gY2FudmFzICYmIF9nZXRQYXJlbnROb2RlKGNhbnZhcyk7XG4gICAgICAgIHJldHVybiAhIShjb250YWluZXIgJiYgY29udGFpbmVyLmlzQ29ubmVjdGVkKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9kZXRlY3RQbGF0Zm9ybShjYW52YXMpIHtcbiAgICBpZiAoIV9pc0RvbVN1cHBvcnRlZCgpIHx8IHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnICYmIGNhbnZhcyBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcykge1xuICAgICAgICByZXR1cm4gQmFzaWNQbGF0Zm9ybTtcbiAgICB9XG4gICAgcmV0dXJuIERvbVBsYXRmb3JtO1xufVxuXG5jbGFzcyBFbGVtZW50IHtcbiAgICBzdGF0aWMgZGVmYXVsdHMgPSB7fTtcbiAgICBzdGF0aWMgZGVmYXVsdFJvdXRlcyA9IHVuZGVmaW5lZDtcbiAgICB4O1xuICAgIHk7XG4gICAgYWN0aXZlID0gZmFsc2U7XG4gICAgb3B0aW9ucztcbiAgICAkYW5pbWF0aW9ucztcbiAgICB0b29sdGlwUG9zaXRpb24odXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgICBjb25zdCB7IHggLCB5ICB9ID0gdGhpcy5nZXRQcm9wcyhbXG4gICAgICAgICAgICAneCcsXG4gICAgICAgICAgICAneSdcbiAgICAgICAgXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeVxuICAgICAgICB9O1xuICAgIH1cbiAgICBoYXNWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIGlzTnVtYmVyKHRoaXMueCkgJiYgaXNOdW1iZXIodGhpcy55KTtcbiAgICB9XG4gICAgZ2V0UHJvcHMocHJvcHMsIGZpbmFsKSB7XG4gICAgICAgIGNvbnN0IGFuaW1zID0gdGhpcy4kYW5pbWF0aW9ucztcbiAgICAgICAgaWYgKCFmaW5hbCB8fCAhYW5pbXMpIHtcbiAgICAgICAgICAgIC8vIGxldCdzIG5vdCBjcmVhdGUgYW4gb2JqZWN0LCBpZiBub3QgbmVlZGVkXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXQgPSB7fTtcbiAgICAgICAgcHJvcHMuZm9yRWFjaCgocHJvcCk9PntcbiAgICAgICAgICAgIHJldFtwcm9wXSA9IGFuaW1zW3Byb3BdICYmIGFuaW1zW3Byb3BdLmFjdGl2ZSgpID8gYW5pbXNbcHJvcF0uX3RvIDogdGhpc1twcm9wXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhdXRvU2tpcChzY2FsZSwgdGlja3MpIHtcbiAgICBjb25zdCB0aWNrT3B0cyA9IHNjYWxlLm9wdGlvbnMudGlja3M7XG4gICAgY29uc3QgZGV0ZXJtaW5lZE1heFRpY2tzID0gZGV0ZXJtaW5lTWF4VGlja3Moc2NhbGUpO1xuICAgIGNvbnN0IHRpY2tzTGltaXQgPSBNYXRoLm1pbih0aWNrT3B0cy5tYXhUaWNrc0xpbWl0IHx8IGRldGVybWluZWRNYXhUaWNrcywgZGV0ZXJtaW5lZE1heFRpY2tzKTtcbiAgICBjb25zdCBtYWpvckluZGljZXMgPSB0aWNrT3B0cy5tYWpvci5lbmFibGVkID8gZ2V0TWFqb3JJbmRpY2VzKHRpY2tzKSA6IFtdO1xuICAgIGNvbnN0IG51bU1ham9ySW5kaWNlcyA9IG1ham9ySW5kaWNlcy5sZW5ndGg7XG4gICAgY29uc3QgZmlyc3QgPSBtYWpvckluZGljZXNbMF07XG4gICAgY29uc3QgbGFzdCA9IG1ham9ySW5kaWNlc1tudW1NYWpvckluZGljZXMgLSAxXTtcbiAgICBjb25zdCBuZXdUaWNrcyA9IFtdO1xuICAgIGlmIChudW1NYWpvckluZGljZXMgPiB0aWNrc0xpbWl0KSB7XG4gICAgICAgIHNraXBNYWpvcnModGlja3MsIG5ld1RpY2tzLCBtYWpvckluZGljZXMsIG51bU1ham9ySW5kaWNlcyAvIHRpY2tzTGltaXQpO1xuICAgICAgICByZXR1cm4gbmV3VGlja3M7XG4gICAgfVxuICAgIGNvbnN0IHNwYWNpbmcgPSBjYWxjdWxhdGVTcGFjaW5nKG1ham9ySW5kaWNlcywgdGlja3MsIHRpY2tzTGltaXQpO1xuICAgIGlmIChudW1NYWpvckluZGljZXMgPiAwKSB7XG4gICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICBjb25zdCBhdmdNYWpvclNwYWNpbmcgPSBudW1NYWpvckluZGljZXMgPiAxID8gTWF0aC5yb3VuZCgobGFzdCAtIGZpcnN0KSAvIChudW1NYWpvckluZGljZXMgLSAxKSkgOiBudWxsO1xuICAgICAgICBza2lwKHRpY2tzLCBuZXdUaWNrcywgc3BhY2luZywgaXNOdWxsT3JVbmRlZihhdmdNYWpvclNwYWNpbmcpID8gMCA6IGZpcnN0IC0gYXZnTWFqb3JTcGFjaW5nLCBmaXJzdCk7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IG51bU1ham9ySW5kaWNlcyAtIDE7IGkgPCBpbGVuOyBpKyspe1xuICAgICAgICAgICAgc2tpcCh0aWNrcywgbmV3VGlja3MsIHNwYWNpbmcsIG1ham9ySW5kaWNlc1tpXSwgbWFqb3JJbmRpY2VzW2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgc2tpcCh0aWNrcywgbmV3VGlja3MsIHNwYWNpbmcsIGxhc3QsIGlzTnVsbE9yVW5kZWYoYXZnTWFqb3JTcGFjaW5nKSA/IHRpY2tzLmxlbmd0aCA6IGxhc3QgKyBhdmdNYWpvclNwYWNpbmcpO1xuICAgICAgICByZXR1cm4gbmV3VGlja3M7XG4gICAgfVxuICAgIHNraXAodGlja3MsIG5ld1RpY2tzLCBzcGFjaW5nKTtcbiAgICByZXR1cm4gbmV3VGlja3M7XG59XG5mdW5jdGlvbiBkZXRlcm1pbmVNYXhUaWNrcyhzY2FsZSkge1xuICAgIGNvbnN0IG9mZnNldCA9IHNjYWxlLm9wdGlvbnMub2Zmc2V0O1xuICAgIGNvbnN0IHRpY2tMZW5ndGggPSBzY2FsZS5fdGlja1NpemUoKTtcbiAgICBjb25zdCBtYXhTY2FsZSA9IHNjYWxlLl9sZW5ndGggLyB0aWNrTGVuZ3RoICsgKG9mZnNldCA/IDAgOiAxKTtcbiAgICBjb25zdCBtYXhDaGFydCA9IHNjYWxlLl9tYXhMZW5ndGggLyB0aWNrTGVuZ3RoO1xuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgubWluKG1heFNjYWxlLCBtYXhDaGFydCkpO1xufVxuIGZ1bmN0aW9uIGNhbGN1bGF0ZVNwYWNpbmcobWFqb3JJbmRpY2VzLCB0aWNrcywgdGlja3NMaW1pdCkge1xuICAgIGNvbnN0IGV2ZW5NYWpvclNwYWNpbmcgPSBnZXRFdmVuU3BhY2luZyhtYWpvckluZGljZXMpO1xuICAgIGNvbnN0IHNwYWNpbmcgPSB0aWNrcy5sZW5ndGggLyB0aWNrc0xpbWl0O1xuICAgIGlmICghZXZlbk1ham9yU3BhY2luZykge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoc3BhY2luZywgMSk7XG4gICAgfVxuICAgIGNvbnN0IGZhY3RvcnMgPSBfZmFjdG9yaXplKGV2ZW5NYWpvclNwYWNpbmcpO1xuICAgIGZvcihsZXQgaSA9IDAsIGlsZW4gPSBmYWN0b3JzLmxlbmd0aCAtIDE7IGkgPCBpbGVuOyBpKyspe1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBmYWN0b3JzW2ldO1xuICAgICAgICBpZiAoZmFjdG9yID4gc3BhY2luZykge1xuICAgICAgICAgICAgcmV0dXJuIGZhY3RvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTWF0aC5tYXgoc3BhY2luZywgMSk7XG59XG4gZnVuY3Rpb24gZ2V0TWFqb3JJbmRpY2VzKHRpY2tzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGksIGlsZW47XG4gICAgZm9yKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKXtcbiAgICAgICAgaWYgKHRpY2tzW2ldLm1ham9yKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIGZ1bmN0aW9uIHNraXBNYWpvcnModGlja3MsIG5ld1RpY2tzLCBtYWpvckluZGljZXMsIHNwYWNpbmcpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBuZXh0ID0gbWFqb3JJbmRpY2VzWzBdO1xuICAgIGxldCBpO1xuICAgIHNwYWNpbmcgPSBNYXRoLmNlaWwoc3BhY2luZyk7XG4gICAgZm9yKGkgPSAwOyBpIDwgdGlja3MubGVuZ3RoOyBpKyspe1xuICAgICAgICBpZiAoaSA9PT0gbmV4dCkge1xuICAgICAgICAgICAgbmV3VGlja3MucHVzaCh0aWNrc1tpXSk7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgbmV4dCA9IG1ham9ySW5kaWNlc1tjb3VudCAqIHNwYWNpbmddO1xuICAgICAgICB9XG4gICAgfVxufVxuIGZ1bmN0aW9uIHNraXAodGlja3MsIG5ld1RpY2tzLCBzcGFjaW5nLCBtYWpvclN0YXJ0LCBtYWpvckVuZCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gdmFsdWVPckRlZmF1bHQobWFqb3JTdGFydCwgMCk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4odmFsdWVPckRlZmF1bHQobWFqb3JFbmQsIHRpY2tzLmxlbmd0aCksIHRpY2tzLmxlbmd0aCk7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBsZXQgbGVuZ3RoLCBpLCBuZXh0O1xuICAgIHNwYWNpbmcgPSBNYXRoLmNlaWwoc3BhY2luZyk7XG4gICAgaWYgKG1ham9yRW5kKSB7XG4gICAgICAgIGxlbmd0aCA9IG1ham9yRW5kIC0gbWFqb3JTdGFydDtcbiAgICAgICAgc3BhY2luZyA9IGxlbmd0aCAvIE1hdGguZmxvb3IobGVuZ3RoIC8gc3BhY2luZyk7XG4gICAgfVxuICAgIG5leHQgPSBzdGFydDtcbiAgICB3aGlsZShuZXh0IDwgMCl7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIG5leHQgPSBNYXRoLnJvdW5kKHN0YXJ0ICsgY291bnQgKiBzcGFjaW5nKTtcbiAgICB9XG4gICAgZm9yKGkgPSBNYXRoLm1heChzdGFydCwgMCk7IGkgPCBlbmQ7IGkrKyl7XG4gICAgICAgIGlmIChpID09PSBuZXh0KSB7XG4gICAgICAgICAgICBuZXdUaWNrcy5wdXNoKHRpY2tzW2ldKTtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICBuZXh0ID0gTWF0aC5yb3VuZChzdGFydCArIGNvdW50ICogc3BhY2luZyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4gZnVuY3Rpb24gZ2V0RXZlblNwYWNpbmcoYXJyKSB7XG4gICAgY29uc3QgbGVuID0gYXJyLmxlbmd0aDtcbiAgICBsZXQgaSwgZGlmZjtcbiAgICBpZiAobGVuIDwgMikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvcihkaWZmID0gYXJyWzBdLCBpID0gMTsgaSA8IGxlbjsgKytpKXtcbiAgICAgICAgaWYgKGFycltpXSAtIGFycltpIC0gMV0gIT09IGRpZmYpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlmZjtcbn1cblxuY29uc3QgcmV2ZXJzZUFsaWduID0gKGFsaWduKT0+YWxpZ24gPT09ICdsZWZ0JyA/ICdyaWdodCcgOiBhbGlnbiA9PT0gJ3JpZ2h0JyA/ICdsZWZ0JyA6IGFsaWduO1xuY29uc3Qgb2Zmc2V0RnJvbUVkZ2UgPSAoc2NhbGUsIGVkZ2UsIG9mZnNldCk9PmVkZ2UgPT09ICd0b3AnIHx8IGVkZ2UgPT09ICdsZWZ0JyA/IHNjYWxlW2VkZ2VdICsgb2Zmc2V0IDogc2NhbGVbZWRnZV0gLSBvZmZzZXQ7XG5jb25zdCBnZXRUaWNrc0xpbWl0ID0gKHRpY2tzTGVuZ3RoLCBtYXhUaWNrc0xpbWl0KT0+TWF0aC5taW4obWF4VGlja3NMaW1pdCB8fCB0aWNrc0xlbmd0aCwgdGlja3NMZW5ndGgpO1xuIGZ1bmN0aW9uIHNhbXBsZShhcnIsIG51bUl0ZW1zKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgaW5jcmVtZW50ID0gYXJyLmxlbmd0aCAvIG51bUl0ZW1zO1xuICAgIGNvbnN0IGxlbiA9IGFyci5sZW5ndGg7XG4gICAgbGV0IGkgPSAwO1xuICAgIGZvcig7IGkgPCBsZW47IGkgKz0gaW5jcmVtZW50KXtcbiAgICAgICAgcmVzdWx0LnB1c2goYXJyW01hdGguZmxvb3IoaSldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiBmdW5jdGlvbiBnZXRQaXhlbEZvckdyaWRMaW5lKHNjYWxlLCBpbmRleCwgb2Zmc2V0R3JpZExpbmVzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gc2NhbGUudGlja3MubGVuZ3RoO1xuICAgIGNvbnN0IHZhbGlkSW5kZXggPSBNYXRoLm1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgY29uc3Qgc3RhcnQgPSBzY2FsZS5fc3RhcnRQaXhlbDtcbiAgICBjb25zdCBlbmQgPSBzY2FsZS5fZW5kUGl4ZWw7XG4gICAgY29uc3QgZXBzaWxvbiA9IDFlLTY7XG4gICAgbGV0IGxpbmVWYWx1ZSA9IHNjYWxlLmdldFBpeGVsRm9yVGljayh2YWxpZEluZGV4KTtcbiAgICBsZXQgb2Zmc2V0O1xuICAgIGlmIChvZmZzZXRHcmlkTGluZXMpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgobGluZVZhbHVlIC0gc3RhcnQsIGVuZCAtIGxpbmVWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIG9mZnNldCA9IChzY2FsZS5nZXRQaXhlbEZvclRpY2soMSkgLSBsaW5lVmFsdWUpIC8gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9mZnNldCA9IChsaW5lVmFsdWUgLSBzY2FsZS5nZXRQaXhlbEZvclRpY2sodmFsaWRJbmRleCAtIDEpKSAvIDI7XG4gICAgICAgIH1cbiAgICAgICAgbGluZVZhbHVlICs9IHZhbGlkSW5kZXggPCBpbmRleCA/IG9mZnNldCA6IC1vZmZzZXQ7XG4gICAgICAgIGlmIChsaW5lVmFsdWUgPCBzdGFydCAtIGVwc2lsb24gfHwgbGluZVZhbHVlID4gZW5kICsgZXBzaWxvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaW5lVmFsdWU7XG59XG4gZnVuY3Rpb24gZ2FyYmFnZUNvbGxlY3QoY2FjaGVzLCBsZW5ndGgpIHtcbiAgICBlYWNoKGNhY2hlcywgKGNhY2hlKT0+e1xuICAgICAgICBjb25zdCBnYyA9IGNhY2hlLmdjO1xuICAgICAgICBjb25zdCBnY0xlbiA9IGdjLmxlbmd0aCAvIDI7XG4gICAgICAgIGxldCBpO1xuICAgICAgICBpZiAoZ2NMZW4gPiBsZW5ndGgpIHtcbiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGdjTGVuOyArK2kpe1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZS5kYXRhW2djW2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdjLnNwbGljZSgwLCBnY0xlbik7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiBmdW5jdGlvbiBnZXRUaWNrTWFya0xlbmd0aChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZHJhd1RpY2tzID8gb3B0aW9ucy50aWNrTGVuZ3RoIDogMDtcbn1cbiBmdW5jdGlvbiBnZXRUaXRsZUhlaWdodChvcHRpb25zLCBmYWxsYmFjaykge1xuICAgIGlmICghb3B0aW9ucy5kaXNwbGF5KSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBmb250ID0gdG9Gb250KG9wdGlvbnMuZm9udCwgZmFsbGJhY2spO1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0b1BhZGRpbmcob3B0aW9ucy5wYWRkaW5nKTtcbiAgICBjb25zdCBsaW5lcyA9IGlzQXJyYXkob3B0aW9ucy50ZXh0KSA/IG9wdGlvbnMudGV4dC5sZW5ndGggOiAxO1xuICAgIHJldHVybiBsaW5lcyAqIGZvbnQubGluZUhlaWdodCArIHBhZGRpbmcuaGVpZ2h0O1xufVxuZnVuY3Rpb24gY3JlYXRlU2NhbGVDb250ZXh0KHBhcmVudCwgc2NhbGUpIHtcbiAgICByZXR1cm4gY3JlYXRlQ29udGV4dChwYXJlbnQsIHtcbiAgICAgICAgc2NhbGUsXG4gICAgICAgIHR5cGU6ICdzY2FsZSdcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRpY2tDb250ZXh0KHBhcmVudCwgaW5kZXgsIHRpY2spIHtcbiAgICByZXR1cm4gY3JlYXRlQ29udGV4dChwYXJlbnQsIHtcbiAgICAgICAgdGljayxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHR5cGU6ICd0aWNrJ1xuICAgIH0pO1xufVxuZnVuY3Rpb24gdGl0bGVBbGlnbihhbGlnbiwgcG9zaXRpb24sIHJldmVyc2UpIHtcbiAgICAgbGV0IHJldCA9IF90b0xlZnRSaWdodENlbnRlcihhbGlnbik7XG4gICAgaWYgKHJldmVyc2UgJiYgcG9zaXRpb24gIT09ICdyaWdodCcgfHwgIXJldmVyc2UgJiYgcG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgcmV0ID0gcmV2ZXJzZUFsaWduKHJldCk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiB0aXRsZUFyZ3Moc2NhbGUsIG9mZnNldCwgcG9zaXRpb24sIGFsaWduKSB7XG4gICAgY29uc3QgeyB0b3AgLCBsZWZ0ICwgYm90dG9tICwgcmlnaHQgLCBjaGFydCAgfSA9IHNjYWxlO1xuICAgIGNvbnN0IHsgY2hhcnRBcmVhICwgc2NhbGVzICB9ID0gY2hhcnQ7XG4gICAgbGV0IHJvdGF0aW9uID0gMDtcbiAgICBsZXQgbWF4V2lkdGgsIHRpdGxlWCwgdGl0bGVZO1xuICAgIGNvbnN0IGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgICBjb25zdCB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgICBpZiAoc2NhbGUuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgdGl0bGVYID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25BeGlzSUQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbilbMF07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW3Bvc2l0aW9uQXhpc0lEXTtcbiAgICAgICAgICAgIHRpdGxlWSA9IHNjYWxlc1twb3NpdGlvbkF4aXNJRF0uZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkgKyBoZWlnaHQgLSBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICB0aXRsZVkgPSAoY2hhcnRBcmVhLmJvdHRvbSArIGNoYXJ0QXJlYS50b3ApIC8gMiArIGhlaWdodCAtIG9mZnNldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpdGxlWSA9IG9mZnNldEZyb21FZGdlKHNjYWxlLCBwb3NpdGlvbiwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBtYXhXaWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNPYmplY3QocG9zaXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbkF4aXNJRCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uKVswXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcG9zaXRpb25bcG9zaXRpb25BeGlzSURdO1xuICAgICAgICAgICAgdGl0bGVYID0gc2NhbGVzW3Bvc2l0aW9uQXhpc0lEXS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlKSAtIHdpZHRoICsgb2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgdGl0bGVYID0gKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDIgLSB3aWR0aCArIG9mZnNldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpdGxlWCA9IG9mZnNldEZyb21FZGdlKHNjYWxlLCBwb3NpdGlvbiwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aXRsZVkgPSBfYWxpZ25TdGFydEVuZChhbGlnbiwgYm90dG9tLCB0b3ApO1xuICAgICAgICByb3RhdGlvbiA9IHBvc2l0aW9uID09PSAnbGVmdCcgPyAtSEFMRl9QSSA6IEhBTEZfUEk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlWCxcbiAgICAgICAgdGl0bGVZLFxuICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgcm90YXRpb25cbiAgICB9O1xufVxuY2xhc3MgU2NhbGUgZXh0ZW5kcyBFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3RvcihjZmcpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAgdGhpcy5pZCA9IGNmZy5pZDtcbiAgICAgICAgIHRoaXMudHlwZSA9IGNmZy50eXBlO1xuICAgICAgICAgdGhpcy5vcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5jdHggPSBjZmcuY3R4O1xuICAgICAgICAgdGhpcy5jaGFydCA9IGNmZy5jaGFydDtcbiAgICAgICAgIHRoaXMudG9wID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5ib3R0b20gPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLmxlZnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLnJpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy53aWR0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9tYXJnaW5zID0ge1xuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgYm90dG9tOiAwXG4gICAgICAgIH07XG4gICAgICAgICB0aGlzLm1heFdpZHRoID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5tYXhIZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLnBhZGRpbmdUb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5wYWRkaW5nUmlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLmF4aXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLmxhYmVsUm90YXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubWluID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm1heCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fcmFuZ2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLnRpY2tzID0gW107XG4gICAgICAgICB0aGlzLl9ncmlkTGluZUl0ZW1zID0gbnVsbDtcbiAgICAgICAgIHRoaXMuX2xhYmVsSXRlbXMgPSBudWxsO1xuICAgICAgICAgdGhpcy5fbGFiZWxTaXplcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX21heExlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX2xvbmdlc3RUZXh0Q2FjaGUgPSB7fTtcbiAgICAgICAgIHRoaXMuX3N0YXJ0UGl4ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLl9lbmRQaXhlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fcmV2ZXJzZVBpeGVscyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl91c2VyTWF4ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl91c2VyTWluID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zdWdnZXN0ZWRNYXggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3RlZE1pbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGlja3NMZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9ib3JkZXJWYWx1ZSA9IDA7XG4gICAgICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgICAgIHRoaXMuX2RhdGFMaW1pdHNDYWNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSk7XG4gICAgICAgIHRoaXMuYXhpcyA9IG9wdGlvbnMuYXhpcztcbiAgICAgICAgdGhpcy5fdXNlck1pbiA9IHRoaXMucGFyc2Uob3B0aW9ucy5taW4pO1xuICAgICAgICB0aGlzLl91c2VyTWF4ID0gdGhpcy5wYXJzZShvcHRpb25zLm1heCk7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3RlZE1pbiA9IHRoaXMucGFyc2Uob3B0aW9ucy5zdWdnZXN0ZWRNaW4pO1xuICAgICAgICB0aGlzLl9zdWdnZXN0ZWRNYXggPSB0aGlzLnBhcnNlKG9wdGlvbnMuc3VnZ2VzdGVkTWF4KTtcbiAgICB9XG4gcGFyc2UocmF3LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gcmF3O1xuICAgIH1cbiBnZXRVc2VyQm91bmRzKCkge1xuICAgICAgICBsZXQgeyBfdXNlck1pbiAsIF91c2VyTWF4ICwgX3N1Z2dlc3RlZE1pbiAsIF9zdWdnZXN0ZWRNYXggIH0gPSB0aGlzO1xuICAgICAgICBfdXNlck1pbiA9IGZpbml0ZU9yRGVmYXVsdChfdXNlck1pbiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICAgICAgX3VzZXJNYXggPSBmaW5pdGVPckRlZmF1bHQoX3VzZXJNYXgsIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7XG4gICAgICAgIF9zdWdnZXN0ZWRNaW4gPSBmaW5pdGVPckRlZmF1bHQoX3N1Z2dlc3RlZE1pbiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICAgICAgX3N1Z2dlc3RlZE1heCA9IGZpbml0ZU9yRGVmYXVsdChfc3VnZ2VzdGVkTWF4LCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWluOiBmaW5pdGVPckRlZmF1bHQoX3VzZXJNaW4sIF9zdWdnZXN0ZWRNaW4pLFxuICAgICAgICAgICAgbWF4OiBmaW5pdGVPckRlZmF1bHQoX3VzZXJNYXgsIF9zdWdnZXN0ZWRNYXgpLFxuICAgICAgICAgICAgbWluRGVmaW5lZDogaXNOdW1iZXJGaW5pdGUoX3VzZXJNaW4pLFxuICAgICAgICAgICAgbWF4RGVmaW5lZDogaXNOdW1iZXJGaW5pdGUoX3VzZXJNYXgpXG4gICAgICAgIH07XG4gICAgfVxuIGdldE1pbk1heChjYW5TdGFjaykge1xuICAgICAgICBsZXQgeyBtaW4gLCBtYXggLCBtaW5EZWZpbmVkICwgbWF4RGVmaW5lZCAgfSA9IHRoaXMuZ2V0VXNlckJvdW5kcygpO1xuICAgICAgICBsZXQgcmFuZ2U7XG4gICAgICAgIGlmIChtaW5EZWZpbmVkICYmIG1heERlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgICAgIG1heFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhcyA9IHRoaXMuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMoKTtcbiAgICAgICAgZm9yKGxldCBpID0gMCwgaWxlbiA9IG1ldGFzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICByYW5nZSA9IG1ldGFzW2ldLmNvbnRyb2xsZXIuZ2V0TWluTWF4KHRoaXMsIGNhblN0YWNrKTtcbiAgICAgICAgICAgIGlmICghbWluRGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgcmFuZ2UubWluKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbWF4RGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgcmFuZ2UubWF4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtaW4gPSBtYXhEZWZpbmVkICYmIG1pbiA+IG1heCA/IG1heCA6IG1pbjtcbiAgICAgICAgbWF4ID0gbWluRGVmaW5lZCAmJiBtaW4gPiBtYXggPyBtaW4gOiBtYXg7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW46IGZpbml0ZU9yRGVmYXVsdChtaW4sIGZpbml0ZU9yRGVmYXVsdChtYXgsIG1pbikpLFxuICAgICAgICAgICAgbWF4OiBmaW5pdGVPckRlZmF1bHQobWF4LCBmaW5pdGVPckRlZmF1bHQobWluLCBtYXgpKVxuICAgICAgICB9O1xuICAgIH1cbiBnZXRQYWRkaW5nKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdDogdGhpcy5wYWRkaW5nTGVmdCB8fCAwLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnBhZGRpbmdUb3AgfHwgMCxcbiAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnBhZGRpbmdSaWdodCB8fCAwLFxuICAgICAgICAgICAgYm90dG9tOiB0aGlzLnBhZGRpbmdCb3R0b20gfHwgMFxuICAgICAgICB9O1xuICAgIH1cbiBnZXRUaWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlja3M7XG4gICAgfVxuIGdldExhYmVscygpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2hhcnQuZGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbHMgfHwgKHRoaXMuaXNIb3Jpem9udGFsKCkgPyBkYXRhLnhMYWJlbHMgOiBkYXRhLnlMYWJlbHMpIHx8IGRhdGEubGFiZWxzIHx8IFtdO1xuICAgIH1cbiBnZXRMYWJlbEl0ZW1zKGNoYXJ0QXJlYSA9IHRoaXMuY2hhcnQuY2hhcnRBcmVhKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fbGFiZWxJdGVtcyB8fCAodGhpcy5fbGFiZWxJdGVtcyA9IHRoaXMuX2NvbXB1dGVMYWJlbEl0ZW1zKGNoYXJ0QXJlYSkpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIGJlZm9yZUxheW91dCgpIHtcbiAgICAgICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5fZGF0YUxpbWl0c0NhY2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBiZWZvcmVVcGRhdGUoKSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUsIFtcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgXSk7XG4gICAgfVxuIHVwZGF0ZShtYXhXaWR0aCwgbWF4SGVpZ2h0LCBtYXJnaW5zKSB7XG4gICAgICAgIGNvbnN0IHsgYmVnaW5BdFplcm8gLCBncmFjZSAsIHRpY2tzOiB0aWNrT3B0cyAgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IHRpY2tPcHRzLnNhbXBsZVNpemU7XG4gICAgICAgIHRoaXMuYmVmb3JlVXBkYXRlKCk7XG4gICAgICAgIHRoaXMubWF4V2lkdGggPSBtYXhXaWR0aDtcbiAgICAgICAgdGhpcy5tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMuX21hcmdpbnMgPSBtYXJnaW5zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICBib3R0b206IDBcbiAgICAgICAgfSwgbWFyZ2lucyk7XG4gICAgICAgIHRoaXMudGlja3MgPSBudWxsO1xuICAgICAgICB0aGlzLl9sYWJlbFNpemVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZ3JpZExpbmVJdGVtcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xhYmVsSXRlbXMgPSBudWxsO1xuICAgICAgICB0aGlzLmJlZm9yZVNldERpbWVuc2lvbnMoKTtcbiAgICAgICAgdGhpcy5zZXREaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuYWZ0ZXJTZXREaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuX21heExlbmd0aCA9IHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aGlzLndpZHRoICsgbWFyZ2lucy5sZWZ0ICsgbWFyZ2lucy5yaWdodCA6IHRoaXMuaGVpZ2h0ICsgbWFyZ2lucy50b3AgKyBtYXJnaW5zLmJvdHRvbTtcbiAgICAgICAgaWYgKCF0aGlzLl9kYXRhTGltaXRzQ2FjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmJlZm9yZURhdGFMaW1pdHMoKTtcbiAgICAgICAgICAgIHRoaXMuZGV0ZXJtaW5lRGF0YUxpbWl0cygpO1xuICAgICAgICAgICAgdGhpcy5hZnRlckRhdGFMaW1pdHMoKTtcbiAgICAgICAgICAgIHRoaXMuX3JhbmdlID0gX2FkZEdyYWNlKHRoaXMsIGdyYWNlLCBiZWdpbkF0WmVybyk7XG4gICAgICAgICAgICB0aGlzLl9kYXRhTGltaXRzQ2FjaGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJlZm9yZUJ1aWxkVGlja3MoKTtcbiAgICAgICAgdGhpcy50aWNrcyA9IHRoaXMuYnVpbGRUaWNrcygpIHx8IFtdO1xuICAgICAgICB0aGlzLmFmdGVyQnVpbGRUaWNrcygpO1xuICAgICAgICBjb25zdCBzYW1wbGluZ0VuYWJsZWQgPSBzYW1wbGVTaXplIDwgdGhpcy50aWNrcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHNhbXBsaW5nRW5hYmxlZCA/IHNhbXBsZSh0aGlzLnRpY2tzLCBzYW1wbGVTaXplKSA6IHRoaXMudGlja3MpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZSgpO1xuICAgICAgICB0aGlzLmJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCk7XG4gICAgICAgIHRoaXMuYWZ0ZXJDYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCk7XG4gICAgICAgIGlmICh0aWNrT3B0cy5kaXNwbGF5ICYmICh0aWNrT3B0cy5hdXRvU2tpcCB8fCB0aWNrT3B0cy5zb3VyY2UgPT09ICdhdXRvJykpIHtcbiAgICAgICAgICAgIHRoaXMudGlja3MgPSBhdXRvU2tpcCh0aGlzLCB0aGlzLnRpY2tzKTtcbiAgICAgICAgICAgIHRoaXMuX2xhYmVsU2l6ZXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5hZnRlckF1dG9Ta2lwKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhbXBsaW5nRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5fY29udmVydFRpY2tzVG9MYWJlbHModGhpcy50aWNrcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iZWZvcmVGaXQoKTtcbiAgICAgICAgdGhpcy5maXQoKTtcbiAgICAgICAgdGhpcy5hZnRlckZpdCgpO1xuICAgICAgICB0aGlzLmFmdGVyVXBkYXRlKCk7XG4gICAgfVxuIGNvbmZpZ3VyZSgpIHtcbiAgICAgICAgbGV0IHJldmVyc2VQaXhlbHMgPSB0aGlzLm9wdGlvbnMucmV2ZXJzZTtcbiAgICAgICAgbGV0IHN0YXJ0UGl4ZWwsIGVuZFBpeGVsO1xuICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgc3RhcnRQaXhlbCA9IHRoaXMubGVmdDtcbiAgICAgICAgICAgIGVuZFBpeGVsID0gdGhpcy5yaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0UGl4ZWwgPSB0aGlzLnRvcDtcbiAgICAgICAgICAgIGVuZFBpeGVsID0gdGhpcy5ib3R0b207XG4gICAgICAgICAgICByZXZlcnNlUGl4ZWxzID0gIXJldmVyc2VQaXhlbHM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhcnRQaXhlbCA9IHN0YXJ0UGl4ZWw7XG4gICAgICAgIHRoaXMuX2VuZFBpeGVsID0gZW5kUGl4ZWw7XG4gICAgICAgIHRoaXMuX3JldmVyc2VQaXhlbHMgPSByZXZlcnNlUGl4ZWxzO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSBlbmRQaXhlbCAtIHN0YXJ0UGl4ZWw7XG4gICAgICAgIHRoaXMuX2FsaWduVG9QaXhlbHMgPSB0aGlzLm9wdGlvbnMuYWxpZ25Ub1BpeGVscztcbiAgICB9XG4gICAgYWZ0ZXJVcGRhdGUoKSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlclVwZGF0ZSwgW1xuICAgICAgICAgICAgdGhpc1xuICAgICAgICBdKTtcbiAgICB9XG4gICAgYmVmb3JlU2V0RGltZW5zaW9ucygpIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZVNldERpbWVuc2lvbnMsIFtcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIHNldERpbWVuc2lvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5tYXhXaWR0aDtcbiAgICAgICAgICAgIHRoaXMubGVmdCA9IDA7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0ID0gdGhpcy53aWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLnRvcCA9IDA7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbSA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFkZGluZ0xlZnQgPSAwO1xuICAgICAgICB0aGlzLnBhZGRpbmdUb3AgPSAwO1xuICAgICAgICB0aGlzLnBhZGRpbmdSaWdodCA9IDA7XG4gICAgICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IDA7XG4gICAgfVxuICAgIGFmdGVyU2V0RGltZW5zaW9ucygpIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyU2V0RGltZW5zaW9ucywgW1xuICAgICAgICAgICAgdGhpc1xuICAgICAgICBdKTtcbiAgICB9XG4gICAgX2NhbGxIb29rcyhuYW1lKSB7XG4gICAgICAgIHRoaXMuY2hhcnQubm90aWZ5UGx1Z2lucyhuYW1lLCB0aGlzLmdldENvbnRleHQoKSk7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMub3B0aW9uc1tuYW1lXSwgW1xuICAgICAgICAgICAgdGhpc1xuICAgICAgICBdKTtcbiAgICB9XG4gICAgYmVmb3JlRGF0YUxpbWl0cygpIHtcbiAgICAgICAgdGhpcy5fY2FsbEhvb2tzKCdiZWZvcmVEYXRhTGltaXRzJyk7XG4gICAgfVxuICAgIGRldGVybWluZURhdGFMaW1pdHMoKSB7fVxuICAgIGFmdGVyRGF0YUxpbWl0cygpIHtcbiAgICAgICAgdGhpcy5fY2FsbEhvb2tzKCdhZnRlckRhdGFMaW1pdHMnKTtcbiAgICB9XG4gICAgYmVmb3JlQnVpbGRUaWNrcygpIHtcbiAgICAgICAgdGhpcy5fY2FsbEhvb2tzKCdiZWZvcmVCdWlsZFRpY2tzJyk7XG4gICAgfVxuIGJ1aWxkVGlja3MoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgYWZ0ZXJCdWlsZFRpY2tzKCkge1xuICAgICAgICB0aGlzLl9jYWxsSG9va3MoJ2FmdGVyQnVpbGRUaWNrcycpO1xuICAgIH1cbiAgICBiZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24oKSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24sIFtcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgXSk7XG4gICAgfVxuIGdlbmVyYXRlVGlja0xhYmVscyh0aWNrcykge1xuICAgICAgICBjb25zdCB0aWNrT3B0cyA9IHRoaXMub3B0aW9ucy50aWNrcztcbiAgICAgICAgbGV0IGksIGlsZW4sIHRpY2s7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IHRpY2tzLmxlbmd0aDsgaSA8IGlsZW47IGkrKyl7XG4gICAgICAgICAgICB0aWNrID0gdGlja3NbaV07XG4gICAgICAgICAgICB0aWNrLmxhYmVsID0gY2FsbGJhY2sodGlja09wdHMuY2FsbGJhY2ssIFtcbiAgICAgICAgICAgICAgICB0aWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgdGlja3NcbiAgICAgICAgICAgIF0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uKCkge1xuICAgICAgICBjYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24sIFtcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVDYWxjdWxhdGVMYWJlbFJvdGF0aW9uLCBbXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCB0aWNrT3B0cyA9IG9wdGlvbnMudGlja3M7XG4gICAgICAgIGNvbnN0IG51bVRpY2tzID0gZ2V0VGlja3NMaW1pdCh0aGlzLnRpY2tzLmxlbmd0aCwgb3B0aW9ucy50aWNrcy5tYXhUaWNrc0xpbWl0KTtcbiAgICAgICAgY29uc3QgbWluUm90YXRpb24gPSB0aWNrT3B0cy5taW5Sb3RhdGlvbiB8fCAwO1xuICAgICAgICBjb25zdCBtYXhSb3RhdGlvbiA9IHRpY2tPcHRzLm1heFJvdGF0aW9uO1xuICAgICAgICBsZXQgbGFiZWxSb3RhdGlvbiA9IG1pblJvdGF0aW9uO1xuICAgICAgICBsZXQgdGlja1dpZHRoLCBtYXhIZWlnaHQsIG1heExhYmVsRGlhZ29uYWw7XG4gICAgICAgIGlmICghdGhpcy5faXNWaXNpYmxlKCkgfHwgIXRpY2tPcHRzLmRpc3BsYXkgfHwgbWluUm90YXRpb24gPj0gbWF4Um90YXRpb24gfHwgbnVtVGlja3MgPD0gMSB8fCAhdGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgdGhpcy5sYWJlbFJvdGF0aW9uID0gbWluUm90YXRpb247XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFiZWxTaXplcyA9IHRoaXMuX2dldExhYmVsU2l6ZXMoKTtcbiAgICAgICAgY29uc3QgbWF4TGFiZWxXaWR0aCA9IGxhYmVsU2l6ZXMud2lkZXN0LndpZHRoO1xuICAgICAgICBjb25zdCBtYXhMYWJlbEhlaWdodCA9IGxhYmVsU2l6ZXMuaGlnaGVzdC5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gX2xpbWl0VmFsdWUodGhpcy5jaGFydC53aWR0aCAtIG1heExhYmVsV2lkdGgsIDAsIHRoaXMubWF4V2lkdGgpO1xuICAgICAgICB0aWNrV2lkdGggPSBvcHRpb25zLm9mZnNldCA/IHRoaXMubWF4V2lkdGggLyBudW1UaWNrcyA6IG1heFdpZHRoIC8gKG51bVRpY2tzIC0gMSk7XG4gICAgICAgIGlmIChtYXhMYWJlbFdpZHRoICsgNiA+IHRpY2tXaWR0aCkge1xuICAgICAgICAgICAgdGlja1dpZHRoID0gbWF4V2lkdGggLyAobnVtVGlja3MgLSAob3B0aW9ucy5vZmZzZXQgPyAwLjUgOiAxKSk7XG4gICAgICAgICAgICBtYXhIZWlnaHQgPSB0aGlzLm1heEhlaWdodCAtIGdldFRpY2tNYXJrTGVuZ3RoKG9wdGlvbnMuZ3JpZCkgLSB0aWNrT3B0cy5wYWRkaW5nIC0gZ2V0VGl0bGVIZWlnaHQob3B0aW9ucy50aXRsZSwgdGhpcy5jaGFydC5vcHRpb25zLmZvbnQpO1xuICAgICAgICAgICAgbWF4TGFiZWxEaWFnb25hbCA9IE1hdGguc3FydChtYXhMYWJlbFdpZHRoICogbWF4TGFiZWxXaWR0aCArIG1heExhYmVsSGVpZ2h0ICogbWF4TGFiZWxIZWlnaHQpO1xuICAgICAgICAgICAgbGFiZWxSb3RhdGlvbiA9IHRvRGVncmVlcyhNYXRoLm1pbihNYXRoLmFzaW4oX2xpbWl0VmFsdWUoKGxhYmVsU2l6ZXMuaGlnaGVzdC5oZWlnaHQgKyA2KSAvIHRpY2tXaWR0aCwgLTEsIDEpKSwgTWF0aC5hc2luKF9saW1pdFZhbHVlKG1heEhlaWdodCAvIG1heExhYmVsRGlhZ29uYWwsIC0xLCAxKSkgLSBNYXRoLmFzaW4oX2xpbWl0VmFsdWUobWF4TGFiZWxIZWlnaHQgLyBtYXhMYWJlbERpYWdvbmFsLCAtMSwgMSkpKSk7XG4gICAgICAgICAgICBsYWJlbFJvdGF0aW9uID0gTWF0aC5tYXgobWluUm90YXRpb24sIE1hdGgubWluKG1heFJvdGF0aW9uLCBsYWJlbFJvdGF0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYWJlbFJvdGF0aW9uID0gbGFiZWxSb3RhdGlvbjtcbiAgICB9XG4gICAgYWZ0ZXJDYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJDYWxjdWxhdGVMYWJlbFJvdGF0aW9uLCBbXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBhZnRlckF1dG9Ta2lwKCkge31cbiAgICBiZWZvcmVGaXQoKSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVGaXQsIFtcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGZpdCgpIHtcbiAgICAgICAgY29uc3QgbWluU2l6ZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAwXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgY2hhcnQgLCBvcHRpb25zOiB7IHRpY2tzOiB0aWNrT3B0cyAsIHRpdGxlOiB0aXRsZU9wdHMgLCBncmlkOiBncmlkT3B0cyAgfSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLl9pc1Zpc2libGUoKTtcbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy5pc0hvcml6b250YWwoKTtcbiAgICAgICAgaWYgKGRpc3BsYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQodGl0bGVPcHRzLCBjaGFydC5vcHRpb25zLmZvbnQpO1xuICAgICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIG1pblNpemUud2lkdGggPSB0aGlzLm1heFdpZHRoO1xuICAgICAgICAgICAgICAgIG1pblNpemUuaGVpZ2h0ID0gZ2V0VGlja01hcmtMZW5ndGgoZ3JpZE9wdHMpICsgdGl0bGVIZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1pblNpemUuaGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQ7XG4gICAgICAgICAgICAgICAgbWluU2l6ZS53aWR0aCA9IGdldFRpY2tNYXJrTGVuZ3RoKGdyaWRPcHRzKSArIHRpdGxlSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRpY2tPcHRzLmRpc3BsYXkgJiYgdGhpcy50aWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZpcnN0ICwgbGFzdCAsIHdpZGVzdCAsIGhpZ2hlc3QgIH0gPSB0aGlzLl9nZXRMYWJlbFNpemVzKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlja1BhZGRpbmcgPSB0aWNrT3B0cy5wYWRkaW5nICogMjtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmdsZVJhZGlhbnMgPSB0b1JhZGlhbnModGhpcy5sYWJlbFJvdGF0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZVJhZGlhbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlUmFkaWFucyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbEhlaWdodCA9IHRpY2tPcHRzLm1pcnJvciA/IDAgOiBzaW4gKiB3aWRlc3Qud2lkdGggKyBjb3MgKiBoaWdoZXN0LmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgbWluU2l6ZS5oZWlnaHQgPSBNYXRoLm1pbih0aGlzLm1heEhlaWdodCwgbWluU2l6ZS5oZWlnaHQgKyBsYWJlbEhlaWdodCArIHRpY2tQYWRkaW5nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbFdpZHRoID0gdGlja09wdHMubWlycm9yID8gMCA6IGNvcyAqIHdpZGVzdC53aWR0aCArIHNpbiAqIGhpZ2hlc3QuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBtaW5TaXplLndpZHRoID0gTWF0aC5taW4odGhpcy5tYXhXaWR0aCwgbWluU2l6ZS53aWR0aCArIGxhYmVsV2lkdGggKyB0aWNrUGFkZGluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZVBhZGRpbmcoZmlyc3QsIGxhc3QsIHNpbiwgY29zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oYW5kbGVNYXJnaW5zKCk7XG4gICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLl9sZW5ndGggPSBjaGFydC53aWR0aCAtIHRoaXMuX21hcmdpbnMubGVmdCAtIHRoaXMuX21hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IG1pblNpemUuaGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IG1pblNpemUud2lkdGg7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuX2xlbmd0aCA9IGNoYXJ0LmhlaWdodCAtIHRoaXMuX21hcmdpbnMudG9wIC0gdGhpcy5fbWFyZ2lucy5ib3R0b207XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2NhbGN1bGF0ZVBhZGRpbmcoZmlyc3QsIGxhc3QsIHNpbiwgY29zKSB7XG4gICAgICAgIGNvbnN0IHsgdGlja3M6IHsgYWxpZ24gLCBwYWRkaW5nICB9ICwgcG9zaXRpb24gIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGlzUm90YXRlZCA9IHRoaXMubGFiZWxSb3RhdGlvbiAhPT0gMDtcbiAgICAgICAgY29uc3QgbGFiZWxzQmVsb3dUaWNrcyA9IHBvc2l0aW9uICE9PSAndG9wJyAmJiB0aGlzLmF4aXMgPT09ICd4JztcbiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldExlZnQgPSB0aGlzLmdldFBpeGVsRm9yVGljaygwKSAtIHRoaXMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFJpZ2h0ID0gdGhpcy5yaWdodCAtIHRoaXMuZ2V0UGl4ZWxGb3JUaWNrKHRoaXMudGlja3MubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBsZXQgcGFkZGluZ0xlZnQgPSAwO1xuICAgICAgICAgICAgbGV0IHBhZGRpbmdSaWdodCA9IDA7XG4gICAgICAgICAgICBpZiAoaXNSb3RhdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsc0JlbG93VGlja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQgPSBjb3MgKiBmaXJzdC53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0ID0gc2luICogbGFzdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQgPSBzaW4gKiBmaXJzdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodCA9IGNvcyAqIGxhc3Qud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodCA9IGxhc3Qud2lkdGg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFsaWduID09PSAnZW5kJykge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0ID0gZmlyc3Qud2lkdGg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFsaWduICE9PSAnaW5uZXInKSB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQgPSBmaXJzdC53aWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0ID0gbGFzdC53aWR0aCAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gTWF0aC5tYXgoKHBhZGRpbmdMZWZ0IC0gb2Zmc2V0TGVmdCArIHBhZGRpbmcpICogdGhpcy53aWR0aCAvICh0aGlzLndpZHRoIC0gb2Zmc2V0TGVmdCksIDApO1xuICAgICAgICAgICAgdGhpcy5wYWRkaW5nUmlnaHQgPSBNYXRoLm1heCgocGFkZGluZ1JpZ2h0IC0gb2Zmc2V0UmlnaHQgKyBwYWRkaW5nKSAqIHRoaXMud2lkdGggLyAodGhpcy53aWR0aCAtIG9mZnNldFJpZ2h0KSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcGFkZGluZ1RvcCA9IGxhc3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIGxldCBwYWRkaW5nQm90dG9tID0gZmlyc3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIGlmIChhbGlnbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3AgPSAwO1xuICAgICAgICAgICAgICAgIHBhZGRpbmdCb3R0b20gPSBmaXJzdC5oZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFsaWduID09PSAnZW5kJykge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3AgPSBsYXN0LmhlaWdodDtcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGFkZGluZ1RvcCA9IHBhZGRpbmdUb3AgKyBwYWRkaW5nO1xuICAgICAgICAgICAgdGhpcy5wYWRkaW5nQm90dG9tID0gcGFkZGluZ0JvdHRvbSArIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gX2hhbmRsZU1hcmdpbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXJnaW5zKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLmxlZnQgPSBNYXRoLm1heCh0aGlzLnBhZGRpbmdMZWZ0LCB0aGlzLl9tYXJnaW5zLmxlZnQpO1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy50b3AgPSBNYXRoLm1heCh0aGlzLnBhZGRpbmdUb3AsIHRoaXMuX21hcmdpbnMudG9wKTtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMucmlnaHQgPSBNYXRoLm1heCh0aGlzLnBhZGRpbmdSaWdodCwgdGhpcy5fbWFyZ2lucy5yaWdodCk7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLmJvdHRvbSA9IE1hdGgubWF4KHRoaXMucGFkZGluZ0JvdHRvbSwgdGhpcy5fbWFyZ2lucy5ib3R0b20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFmdGVyRml0KCkge1xuICAgICAgICBjYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJGaXQsIFtcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgXSk7XG4gICAgfVxuIGlzSG9yaXpvbnRhbCgpIHtcbiAgICAgICAgY29uc3QgeyBheGlzICwgcG9zaXRpb24gIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHJldHVybiBwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nIHx8IGF4aXMgPT09ICd4JztcbiAgICB9XG4gaXNGdWxsU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mdWxsU2l6ZTtcbiAgICB9XG4gX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHRpY2tzKSB7XG4gICAgICAgIHRoaXMuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUaWNrTGFiZWxzKHRpY2tzKTtcbiAgICAgICAgbGV0IGksIGlsZW47XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IHRpY2tzLmxlbmd0aDsgaSA8IGlsZW47IGkrKyl7XG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JVbmRlZih0aWNrc1tpXS5sYWJlbCkpIHtcbiAgICAgICAgICAgICAgICB0aWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgaWxlbi0tO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uKCk7XG4gICAgfVxuIF9nZXRMYWJlbFNpemVzKCkge1xuICAgICAgICBsZXQgbGFiZWxTaXplcyA9IHRoaXMuX2xhYmVsU2l6ZXM7XG4gICAgICAgIGlmICghbGFiZWxTaXplcykge1xuICAgICAgICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IHRoaXMub3B0aW9ucy50aWNrcy5zYW1wbGVTaXplO1xuICAgICAgICAgICAgbGV0IHRpY2tzID0gdGhpcy50aWNrcztcbiAgICAgICAgICAgIGlmIChzYW1wbGVTaXplIDwgdGlja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGlja3MgPSBzYW1wbGUodGlja3MsIHNhbXBsZVNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGFiZWxTaXplcyA9IGxhYmVsU2l6ZXMgPSB0aGlzLl9jb21wdXRlTGFiZWxTaXplcyh0aWNrcywgdGlja3MubGVuZ3RoLCB0aGlzLm9wdGlvbnMudGlja3MubWF4VGlja3NMaW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVsU2l6ZXM7XG4gICAgfVxuIF9jb21wdXRlTGFiZWxTaXplcyh0aWNrcywgbGVuZ3RoLCBtYXhUaWNrc0xpbWl0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4ICwgX2xvbmdlc3RUZXh0Q2FjaGU6IGNhY2hlcyAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHdpZHRocyA9IFtdO1xuICAgICAgICBjb25zdCBoZWlnaHRzID0gW107XG4gICAgICAgIGNvbnN0IGluY3JlbWVudCA9IE1hdGguZmxvb3IobGVuZ3RoIC8gZ2V0VGlja3NMaW1pdChsZW5ndGgsIG1heFRpY2tzTGltaXQpKTtcbiAgICAgICAgbGV0IHdpZGVzdExhYmVsU2l6ZSA9IDA7XG4gICAgICAgIGxldCBoaWdoZXN0TGFiZWxTaXplID0gMDtcbiAgICAgICAgbGV0IGksIGosIGpsZW4sIGxhYmVsLCB0aWNrRm9udCwgZm9udFN0cmluZywgY2FjaGUsIGxpbmVIZWlnaHQsIHdpZHRoLCBoZWlnaHQsIG5lc3RlZExhYmVsO1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gaW5jcmVtZW50KXtcbiAgICAgICAgICAgIGxhYmVsID0gdGlja3NbaV0ubGFiZWw7XG4gICAgICAgICAgICB0aWNrRm9udCA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoaSk7XG4gICAgICAgICAgICBjdHguZm9udCA9IGZvbnRTdHJpbmcgPSB0aWNrRm9udC5zdHJpbmc7XG4gICAgICAgICAgICBjYWNoZSA9IGNhY2hlc1tmb250U3RyaW5nXSA9IGNhY2hlc1tmb250U3RyaW5nXSB8fCB7XG4gICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgZ2M6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGluZUhlaWdodCA9IHRpY2tGb250LmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICB3aWR0aCA9IGhlaWdodCA9IDA7XG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWYobGFiZWwpICYmICFpc0FycmF5KGxhYmVsKSkge1xuICAgICAgICAgICAgICAgIHdpZHRoID0gX21lYXN1cmVUZXh0KGN0eCwgY2FjaGUuZGF0YSwgY2FjaGUuZ2MsIHdpZHRoLCBsYWJlbCk7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gbGluZUhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShsYWJlbCkpIHtcbiAgICAgICAgICAgICAgICBmb3IoaiA9IDAsIGpsZW4gPSBsYWJlbC5sZW5ndGg7IGogPCBqbGVuOyArK2ope1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRMYWJlbCA9ICBsYWJlbFtqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmKG5lc3RlZExhYmVsKSAmJiAhaXNBcnJheShuZXN0ZWRMYWJlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gX21lYXN1cmVUZXh0KGN0eCwgY2FjaGUuZGF0YSwgY2FjaGUuZ2MsIHdpZHRoLCBuZXN0ZWRMYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdpZHRocy5wdXNoKHdpZHRoKTtcbiAgICAgICAgICAgIGhlaWdodHMucHVzaChoZWlnaHQpO1xuICAgICAgICAgICAgd2lkZXN0TGFiZWxTaXplID0gTWF0aC5tYXgod2lkdGgsIHdpZGVzdExhYmVsU2l6ZSk7XG4gICAgICAgICAgICBoaWdoZXN0TGFiZWxTaXplID0gTWF0aC5tYXgoaGVpZ2h0LCBoaWdoZXN0TGFiZWxTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBnYXJiYWdlQ29sbGVjdChjYWNoZXMsIGxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHdpZGVzdCA9IHdpZHRocy5pbmRleE9mKHdpZGVzdExhYmVsU2l6ZSk7XG4gICAgICAgIGNvbnN0IGhpZ2hlc3QgPSBoZWlnaHRzLmluZGV4T2YoaGlnaGVzdExhYmVsU2l6ZSk7XG4gICAgICAgIGNvbnN0IHZhbHVlQXQgPSAoaWR4KT0+KHtcbiAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGhzW2lkeF0gfHwgMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodHNbaWR4XSB8fCAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpcnN0OiB2YWx1ZUF0KDApLFxuICAgICAgICAgICAgbGFzdDogdmFsdWVBdChsZW5ndGggLSAxKSxcbiAgICAgICAgICAgIHdpZGVzdDogdmFsdWVBdCh3aWRlc3QpLFxuICAgICAgICAgICAgaGlnaGVzdDogdmFsdWVBdChoaWdoZXN0KSxcbiAgICAgICAgICAgIHdpZHRocyxcbiAgICAgICAgICAgIGhlaWdodHNcbiAgICAgICAgfTtcbiAgICB9XG4gZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuIGdldFBpeGVsRm9yVmFsdWUodmFsdWUsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgfVxuIGdldFZhbHVlRm9yUGl4ZWwocGl4ZWwpIHt9XG4gZ2V0UGl4ZWxGb3JUaWNrKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IHRpY2tzID0gdGhpcy50aWNrcztcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRpY2tzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGlja3NbaW5kZXhdLnZhbHVlKTtcbiAgICB9XG4gZ2V0UGl4ZWxGb3JEZWNpbWFsKGRlY2ltYWwpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JldmVyc2VQaXhlbHMpIHtcbiAgICAgICAgICAgIGRlY2ltYWwgPSAxIC0gZGVjaW1hbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwaXhlbCA9IHRoaXMuX3N0YXJ0UGl4ZWwgKyBkZWNpbWFsICogdGhpcy5fbGVuZ3RoO1xuICAgICAgICByZXR1cm4gX2ludDE2UmFuZ2UodGhpcy5fYWxpZ25Ub1BpeGVscyA/IF9hbGlnblBpeGVsKHRoaXMuY2hhcnQsIHBpeGVsLCAwKSA6IHBpeGVsKTtcbiAgICB9XG4gZ2V0RGVjaW1hbEZvclBpeGVsKHBpeGVsKSB7XG4gICAgICAgIGNvbnN0IGRlY2ltYWwgPSAocGl4ZWwgLSB0aGlzLl9zdGFydFBpeGVsKSAvIHRoaXMuX2xlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldmVyc2VQaXhlbHMgPyAxIC0gZGVjaW1hbCA6IGRlY2ltYWw7XG4gICAgfVxuIGdldEJhc2VQaXhlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLmdldEJhc2VWYWx1ZSgpKTtcbiAgICB9XG4gZ2V0QmFzZVZhbHVlKCkge1xuICAgICAgICBjb25zdCB7IG1pbiAsIG1heCAgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBtaW4gPCAwICYmIG1heCA8IDAgPyBtYXggOiBtaW4gPiAwICYmIG1heCA+IDAgPyBtaW4gOiAwO1xuICAgIH1cbiBnZXRDb250ZXh0KGluZGV4KSB7XG4gICAgICAgIGNvbnN0IHRpY2tzID0gdGhpcy50aWNrcyB8fCBbXTtcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpY2sgPSB0aWNrc1tpbmRleF07XG4gICAgICAgICAgICByZXR1cm4gdGljay4kY29udGV4dCB8fCAodGljay4kY29udGV4dCA9IGNyZWF0ZVRpY2tDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpLCBpbmRleCwgdGljaykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiRjb250ZXh0IHx8ICh0aGlzLiRjb250ZXh0ID0gY3JlYXRlU2NhbGVDb250ZXh0KHRoaXMuY2hhcnQuZ2V0Q29udGV4dCgpLCB0aGlzKSk7XG4gICAgfVxuIF90aWNrU2l6ZSgpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uVGlja3MgPSB0aGlzLm9wdGlvbnMudGlja3M7XG4gICAgICAgIGNvbnN0IHJvdCA9IHRvUmFkaWFucyh0aGlzLmxhYmVsUm90YXRpb24pO1xuICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmFicyhNYXRoLmNvcyhyb3QpKTtcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5hYnMoTWF0aC5zaW4ocm90KSk7XG4gICAgICAgIGNvbnN0IGxhYmVsU2l6ZXMgPSB0aGlzLl9nZXRMYWJlbFNpemVzKCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSBvcHRpb25UaWNrcy5hdXRvU2tpcFBhZGRpbmcgfHwgMDtcbiAgICAgICAgY29uc3QgdyA9IGxhYmVsU2l6ZXMgPyBsYWJlbFNpemVzLndpZGVzdC53aWR0aCArIHBhZGRpbmcgOiAwO1xuICAgICAgICBjb25zdCBoID0gbGFiZWxTaXplcyA/IGxhYmVsU2l6ZXMuaGlnaGVzdC5oZWlnaHQgKyBwYWRkaW5nIDogMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsKCkgPyBoICogY29zID4gdyAqIHNpbiA/IHcgLyBjb3MgOiBoIC8gc2luIDogaCAqIHNpbiA8IHcgKiBjb3MgPyBoIC8gY29zIDogdyAvIHNpbjtcbiAgICB9XG4gX2lzVmlzaWJsZSgpIHtcbiAgICAgICAgY29uc3QgZGlzcGxheSA9IHRoaXMub3B0aW9ucy5kaXNwbGF5O1xuICAgICAgICBpZiAoZGlzcGxheSAhPT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICByZXR1cm4gISFkaXNwbGF5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCkubGVuZ3RoID4gMDtcbiAgICB9XG4gX2NvbXB1dGVHcmlkTGluZUl0ZW1zKGNoYXJ0QXJlYSkge1xuICAgICAgICBjb25zdCBheGlzID0gdGhpcy5heGlzO1xuICAgICAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHsgZ3JpZCAsIHBvc2l0aW9uICwgYm9yZGVyICB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZ3JpZC5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7XG4gICAgICAgIGNvbnN0IHRpY2tzID0gdGhpcy50aWNrcztcbiAgICAgICAgY29uc3QgdGlja3NMZW5ndGggPSB0aWNrcy5sZW5ndGggKyAob2Zmc2V0ID8gMSA6IDApO1xuICAgICAgICBjb25zdCB0bCA9IGdldFRpY2tNYXJrTGVuZ3RoKGdyaWQpO1xuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICBjb25zdCBib3JkZXJPcHRzID0gYm9yZGVyLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuICAgICAgICBjb25zdCBheGlzV2lkdGggPSBib3JkZXJPcHRzLmRpc3BsYXkgPyBib3JkZXJPcHRzLndpZHRoIDogMDtcbiAgICAgICAgY29uc3QgYXhpc0hhbGZXaWR0aCA9IGF4aXNXaWR0aCAvIDI7XG4gICAgICAgIGNvbnN0IGFsaWduQm9yZGVyVmFsdWUgPSBmdW5jdGlvbihwaXhlbCkge1xuICAgICAgICAgICAgcmV0dXJuIF9hbGlnblBpeGVsKGNoYXJ0LCBwaXhlbCwgYXhpc1dpZHRoKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGJvcmRlclZhbHVlLCBpLCBsaW5lVmFsdWUsIGFsaWduZWRMaW5lVmFsdWU7XG4gICAgICAgIGxldCB0eDEsIHR5MSwgdHgyLCB0eTIsIHgxLCB5MSwgeDIsIHkyO1xuICAgICAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUodGhpcy5ib3R0b20pO1xuICAgICAgICAgICAgdHkxID0gdGhpcy5ib3R0b20gLSB0bDtcbiAgICAgICAgICAgIHR5MiA9IGJvcmRlclZhbHVlIC0gYXhpc0hhbGZXaWR0aDtcbiAgICAgICAgICAgIHkxID0gYWxpZ25Cb3JkZXJWYWx1ZShjaGFydEFyZWEudG9wKSArIGF4aXNIYWxmV2lkdGg7XG4gICAgICAgICAgICB5MiA9IGNoYXJ0QXJlYS5ib3R0b207XG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUodGhpcy50b3ApO1xuICAgICAgICAgICAgeTEgPSBjaGFydEFyZWEudG9wO1xuICAgICAgICAgICAgeTIgPSBhbGlnbkJvcmRlclZhbHVlKGNoYXJ0QXJlYS5ib3R0b20pIC0gYXhpc0hhbGZXaWR0aDtcbiAgICAgICAgICAgIHR5MSA9IGJvcmRlclZhbHVlICsgYXhpc0hhbGZXaWR0aDtcbiAgICAgICAgICAgIHR5MiA9IHRoaXMudG9wICsgdGw7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgYm9yZGVyVmFsdWUgPSBhbGlnbkJvcmRlclZhbHVlKHRoaXMucmlnaHQpO1xuICAgICAgICAgICAgdHgxID0gdGhpcy5yaWdodCAtIHRsO1xuICAgICAgICAgICAgdHgyID0gYm9yZGVyVmFsdWUgLSBheGlzSGFsZldpZHRoO1xuICAgICAgICAgICAgeDEgPSBhbGlnbkJvcmRlclZhbHVlKGNoYXJ0QXJlYS5sZWZ0KSArIGF4aXNIYWxmV2lkdGg7XG4gICAgICAgICAgICB4MiA9IGNoYXJ0QXJlYS5yaWdodDtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgYm9yZGVyVmFsdWUgPSBhbGlnbkJvcmRlclZhbHVlKHRoaXMubGVmdCk7XG4gICAgICAgICAgICB4MSA9IGNoYXJ0QXJlYS5sZWZ0O1xuICAgICAgICAgICAgeDIgPSBhbGlnbkJvcmRlclZhbHVlKGNoYXJ0QXJlYS5yaWdodCkgLSBheGlzSGFsZldpZHRoO1xuICAgICAgICAgICAgdHgxID0gYm9yZGVyVmFsdWUgKyBheGlzSGFsZldpZHRoO1xuICAgICAgICAgICAgdHgyID0gdGhpcy5sZWZ0ICsgdGw7XG4gICAgICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ3gnKSB7XG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgYm9yZGVyVmFsdWUgPSBhbGlnbkJvcmRlclZhbHVlKChjaGFydEFyZWEudG9wICsgY2hhcnRBcmVhLmJvdHRvbSkgLyAyICsgMC41KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25BeGlzSUQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbilbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwb3NpdGlvbltwb3NpdGlvbkF4aXNJRF07XG4gICAgICAgICAgICAgICAgYm9yZGVyVmFsdWUgPSBhbGlnbkJvcmRlclZhbHVlKHRoaXMuY2hhcnQuc2NhbGVzW3Bvc2l0aW9uQXhpc0lEXS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5MSA9IGNoYXJ0QXJlYS50b3A7XG4gICAgICAgICAgICB5MiA9IGNoYXJ0QXJlYS5ib3R0b207XG4gICAgICAgICAgICB0eTEgPSBib3JkZXJWYWx1ZSArIGF4aXNIYWxmV2lkdGg7XG4gICAgICAgICAgICB0eTIgPSB0eTEgKyB0bDtcbiAgICAgICAgfSBlbHNlIGlmIChheGlzID09PSAneScpIHtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUoKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbkF4aXNJRCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uKVswXTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW3Bvc2l0aW9uQXhpc0lEXTtcbiAgICAgICAgICAgICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUodGhpcy5jaGFydC5zY2FsZXNbcG9zaXRpb25BeGlzSURdLmdldFBpeGVsRm9yVmFsdWUodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHR4MSA9IGJvcmRlclZhbHVlIC0gYXhpc0hhbGZXaWR0aDtcbiAgICAgICAgICAgIHR4MiA9IHR4MSAtIHRsO1xuICAgICAgICAgICAgeDEgPSBjaGFydEFyZWEubGVmdDtcbiAgICAgICAgICAgIHgyID0gY2hhcnRBcmVhLnJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy50aWNrcy5tYXhUaWNrc0xpbWl0LCB0aWNrc0xlbmd0aCk7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwodGlja3NMZW5ndGggLyBsaW1pdCkpO1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCB0aWNrc0xlbmd0aDsgaSArPSBzdGVwKXtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoaSk7XG4gICAgICAgICAgICBjb25zdCBvcHRzQXRJbmRleCA9IGdyaWQuc2V0Q29udGV4dChjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IG9wdHNBdEluZGV4Qm9yZGVyID0gYm9yZGVyLnNldENvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBvcHRzQXRJbmRleC5saW5lV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBsaW5lQ29sb3IgPSBvcHRzQXRJbmRleC5jb2xvcjtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlckRhc2ggPSBvcHRzQXRJbmRleEJvcmRlci5kYXNoIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgYm9yZGVyRGFzaE9mZnNldCA9IG9wdHNBdEluZGV4Qm9yZGVyLmRhc2hPZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCB0aWNrV2lkdGggPSBvcHRzQXRJbmRleC50aWNrV2lkdGg7XG4gICAgICAgICAgICBjb25zdCB0aWNrQ29sb3IgPSBvcHRzQXRJbmRleC50aWNrQ29sb3I7XG4gICAgICAgICAgICBjb25zdCB0aWNrQm9yZGVyRGFzaCA9IG9wdHNBdEluZGV4LnRpY2tCb3JkZXJEYXNoIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgdGlja0JvcmRlckRhc2hPZmZzZXQgPSBvcHRzQXRJbmRleC50aWNrQm9yZGVyRGFzaE9mZnNldDtcbiAgICAgICAgICAgIGxpbmVWYWx1ZSA9IGdldFBpeGVsRm9yR3JpZExpbmUodGhpcywgaSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChsaW5lVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxpZ25lZExpbmVWYWx1ZSA9IF9hbGlnblBpeGVsKGNoYXJ0LCBsaW5lVmFsdWUsIGxpbmVXaWR0aCk7XG4gICAgICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgdHgxID0gdHgyID0geDEgPSB4MiA9IGFsaWduZWRMaW5lVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHR5MSA9IHR5MiA9IHkxID0geTIgPSBhbGlnbmVkTGluZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHgxLFxuICAgICAgICAgICAgICAgIHR5MSxcbiAgICAgICAgICAgICAgICB0eDIsXG4gICAgICAgICAgICAgICAgdHkyLFxuICAgICAgICAgICAgICAgIHgxLFxuICAgICAgICAgICAgICAgIHkxLFxuICAgICAgICAgICAgICAgIHgyLFxuICAgICAgICAgICAgICAgIHkyLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBsaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgY29sb3I6IGxpbmVDb2xvcixcbiAgICAgICAgICAgICAgICBib3JkZXJEYXNoLFxuICAgICAgICAgICAgICAgIGJvcmRlckRhc2hPZmZzZXQsXG4gICAgICAgICAgICAgICAgdGlja1dpZHRoLFxuICAgICAgICAgICAgICAgIHRpY2tDb2xvcixcbiAgICAgICAgICAgICAgICB0aWNrQm9yZGVyRGFzaCxcbiAgICAgICAgICAgICAgICB0aWNrQm9yZGVyRGFzaE9mZnNldFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGlja3NMZW5ndGggPSB0aWNrc0xlbmd0aDtcbiAgICAgICAgdGhpcy5fYm9yZGVyVmFsdWUgPSBib3JkZXJWYWx1ZTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cbiBfY29tcHV0ZUxhYmVsSXRlbXMoY2hhcnRBcmVhKSB7XG4gICAgICAgIGNvbnN0IGF4aXMgPSB0aGlzLmF4aXM7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHsgcG9zaXRpb24gLCB0aWNrczogb3B0aW9uVGlja3MgIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLmlzSG9yaXpvbnRhbCgpO1xuICAgICAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgICAgIGNvbnN0IHsgYWxpZ24gLCBjcm9zc0FsaWduICwgcGFkZGluZyAsIG1pcnJvciAgfSA9IG9wdGlvblRpY2tzO1xuICAgICAgICBjb25zdCB0bCA9IGdldFRpY2tNYXJrTGVuZ3RoKG9wdGlvbnMuZ3JpZCk7XG4gICAgICAgIGNvbnN0IHRpY2tBbmRQYWRkaW5nID0gdGwgKyBwYWRkaW5nO1xuICAgICAgICBjb25zdCBoVGlja0FuZFBhZGRpbmcgPSBtaXJyb3IgPyAtcGFkZGluZyA6IHRpY2tBbmRQYWRkaW5nO1xuICAgICAgICBjb25zdCByb3RhdGlvbiA9IC10b1JhZGlhbnModGhpcy5sYWJlbFJvdGF0aW9uKTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgICAgbGV0IGksIGlsZW4sIHRpY2ssIGxhYmVsLCB4LCB5LCB0ZXh0QWxpZ24sIHBpeGVsLCBmb250LCBsaW5lSGVpZ2h0LCBsaW5lQ291bnQsIHRleHRPZmZzZXQ7XG4gICAgICAgIGxldCB0ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAndG9wJykge1xuICAgICAgICAgICAgeSA9IHRoaXMuYm90dG9tIC0gaFRpY2tBbmRQYWRkaW5nO1xuICAgICAgICAgICAgdGV4dEFsaWduID0gdGhpcy5fZ2V0WEF4aXNMYWJlbEFsaWdubWVudCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgeSA9IHRoaXMudG9wICsgaFRpY2tBbmRQYWRkaW5nO1xuICAgICAgICAgICAgdGV4dEFsaWduID0gdGhpcy5fZ2V0WEF4aXNMYWJlbEFsaWdubWVudCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHRoaXMuX2dldFlBeGlzTGFiZWxBbGlnbm1lbnQodGwpO1xuICAgICAgICAgICAgdGV4dEFsaWduID0gcmV0LnRleHRBbGlnbjtcbiAgICAgICAgICAgIHggPSByZXQueDtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5fZ2V0WUF4aXNMYWJlbEFsaWdubWVudCh0bCk7XG4gICAgICAgICAgICB0ZXh0QWxpZ24gPSByZXQudGV4dEFsaWduO1xuICAgICAgICAgICAgeCA9IHJldC54O1xuICAgICAgICB9IGVsc2UgaWYgKGF4aXMgPT09ICd4Jykge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgIHkgPSAoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMiArIHRpY2tBbmRQYWRkaW5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbkF4aXNJRCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uKVswXTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW3Bvc2l0aW9uQXhpc0lEXTtcbiAgICAgICAgICAgICAgICB5ID0gdGhpcy5jaGFydC5zY2FsZXNbcG9zaXRpb25BeGlzSURdLmdldFBpeGVsRm9yVmFsdWUodmFsdWUpICsgdGlja0FuZFBhZGRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZXh0QWxpZ24gPSB0aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgeCA9IChjaGFydEFyZWEubGVmdCArIGNoYXJ0QXJlYS5yaWdodCkgLyAyIC0gdGlja0FuZFBhZGRpbmc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uQXhpc0lEID0gT2JqZWN0LmtleXMocG9zaXRpb24pWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcG9zaXRpb25bcG9zaXRpb25BeGlzSURdO1xuICAgICAgICAgICAgICAgIHggPSB0aGlzLmNoYXJ0LnNjYWxlc1twb3NpdGlvbkF4aXNJRF0uZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZXh0QWxpZ24gPSB0aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KHRsKS50ZXh0QWxpZ247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09ICd5Jykge1xuICAgICAgICAgICAgaWYgKGFsaWduID09PSAnc3RhcnQnKSB7XG4gICAgICAgICAgICAgICAgdGV4dEJhc2VsaW5lID0gJ3RvcCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFsaWduID09PSAnZW5kJykge1xuICAgICAgICAgICAgICAgIHRleHRCYXNlbGluZSA9ICdib3R0b20nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhYmVsU2l6ZXMgPSB0aGlzLl9nZXRMYWJlbFNpemVzKCk7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IHRpY2tzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICB0aWNrID0gdGlja3NbaV07XG4gICAgICAgICAgICBsYWJlbCA9IHRpY2subGFiZWw7XG4gICAgICAgICAgICBjb25zdCBvcHRzQXRJbmRleCA9IG9wdGlvblRpY2tzLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGkpKTtcbiAgICAgICAgICAgIHBpeGVsID0gdGhpcy5nZXRQaXhlbEZvclRpY2soaSkgKyBvcHRpb25UaWNrcy5sYWJlbE9mZnNldDtcbiAgICAgICAgICAgIGZvbnQgPSB0aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKGkpO1xuICAgICAgICAgICAgbGluZUhlaWdodCA9IGZvbnQubGluZUhlaWdodDtcbiAgICAgICAgICAgIGxpbmVDb3VudCA9IGlzQXJyYXkobGFiZWwpID8gbGFiZWwubGVuZ3RoIDogMTtcbiAgICAgICAgICAgIGNvbnN0IGhhbGZDb3VudCA9IGxpbmVDb3VudCAvIDI7XG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IG9wdHNBdEluZGV4LmNvbG9yO1xuICAgICAgICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSBvcHRzQXRJbmRleC50ZXh0U3Ryb2tlQ29sb3I7XG4gICAgICAgICAgICBjb25zdCBzdHJva2VXaWR0aCA9IG9wdHNBdEluZGV4LnRleHRTdHJva2VXaWR0aDtcbiAgICAgICAgICAgIGxldCB0aWNrVGV4dEFsaWduID0gdGV4dEFsaWduO1xuICAgICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIHggPSBwaXhlbDtcbiAgICAgICAgICAgICAgICBpZiAodGV4dEFsaWduID09PSAnaW5uZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlja1RleHRBbGlnbiA9ICF0aGlzLm9wdGlvbnMucmV2ZXJzZSA/ICdyaWdodCcgOiAnbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlja1RleHRBbGlnbiA9ICF0aGlzLm9wdGlvbnMucmV2ZXJzZSA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrVGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Jvc3NBbGlnbiA9PT0gJ25lYXInIHx8IHJvdGF0aW9uICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gLWxpbmVDb3VudCAqIGxpbmVIZWlnaHQgKyBsaW5lSGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjcm9zc0FsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9IC1sYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0IC8gMiAtIGhhbGZDb3VudCAqIGxpbmVIZWlnaHQgKyBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9IC1sYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0ICsgbGluZUhlaWdodCAvIDI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Jvc3NBbGlnbiA9PT0gJ25lYXInIHx8IHJvdGF0aW9uICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gbGluZUhlaWdodCAvIDI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Jvc3NBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQgPSBsYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0IC8gMiAtIGhhbGZDb3VudCAqIGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gbGFiZWxTaXplcy5oaWdoZXN0LmhlaWdodCAtIGxpbmVDb3VudCAqIGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1pcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0ICo9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm90YXRpb24gIT09IDAgJiYgIW9wdHNBdEluZGV4LnNob3dMYWJlbEJhY2tkcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIHggKz0gbGluZUhlaWdodCAvIDIgKiBNYXRoLnNpbihyb3RhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB5ID0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9ICgxIC0gbGluZUNvdW50KSAqIGxpbmVIZWlnaHQgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGJhY2tkcm9wO1xuICAgICAgICAgICAgaWYgKG9wdHNBdEluZGV4LnNob3dMYWJlbEJhY2tkcm9wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxQYWRkaW5nID0gdG9QYWRkaW5nKG9wdHNBdEluZGV4LmJhY2tkcm9wUGFkZGluZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gbGFiZWxTaXplcy5oZWlnaHRzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gbGFiZWxTaXplcy53aWR0aHNbaV07XG4gICAgICAgICAgICAgICAgbGV0IHRvcCA9IHRleHRPZmZzZXQgLSBsYWJlbFBhZGRpbmcudG9wO1xuICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gMCAtIGxhYmVsUGFkZGluZy5sZWZ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCh0ZXh0QmFzZWxpbmUpe1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdtaWRkbGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wIC09IGhlaWdodCAvIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcCAtPSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoKHRleHRBbGlnbil7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IC09IHdpZHRoIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IC09IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2lubmVyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSB3aWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmFja2Ryb3AgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoICsgbGFiZWxQYWRkaW5nLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCArIGxhYmVsUGFkZGluZy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBvcHRzQXRJbmRleC5iYWNrZHJvcENvbG9yXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgICAgICAgdGV4dE9mZnNldCxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcixcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246IHRpY2tUZXh0QWxpZ24sXG4gICAgICAgICAgICAgICAgICAgIHRleHRCYXNlbGluZSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb246IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tkcm9wXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cbiAgICBfZ2V0WEF4aXNMYWJlbEFsaWdubWVudCgpIHtcbiAgICAgICAgY29uc3QgeyBwb3NpdGlvbiAsIHRpY2tzICB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCByb3RhdGlvbiA9IC10b1JhZGlhbnModGhpcy5sYWJlbFJvdGF0aW9uKTtcbiAgICAgICAgaWYgKHJvdGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gPT09ICd0b3AnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgaWYgKHRpY2tzLmFsaWduID09PSAnc3RhcnQnKSB7XG4gICAgICAgICAgICBhbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgfSBlbHNlIGlmICh0aWNrcy5hbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgIGFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgfSBlbHNlIGlmICh0aWNrcy5hbGlnbiA9PT0gJ2lubmVyJykge1xuICAgICAgICAgICAgYWxpZ24gPSAnaW5uZXInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGlnbjtcbiAgICB9XG4gICAgX2dldFlBeGlzTGFiZWxBbGlnbm1lbnQodGwpIHtcbiAgICAgICAgY29uc3QgeyBwb3NpdGlvbiAsIHRpY2tzOiB7IGNyb3NzQWxpZ24gLCBtaXJyb3IgLCBwYWRkaW5nICB9ICB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCBsYWJlbFNpemVzID0gdGhpcy5fZ2V0TGFiZWxTaXplcygpO1xuICAgICAgICBjb25zdCB0aWNrQW5kUGFkZGluZyA9IHRsICsgcGFkZGluZztcbiAgICAgICAgY29uc3Qgd2lkZXN0ID0gbGFiZWxTaXplcy53aWRlc3Qud2lkdGg7XG4gICAgICAgIGxldCB0ZXh0QWxpZ247XG4gICAgICAgIGxldCB4O1xuICAgICAgICBpZiAocG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgaWYgKG1pcnJvcikge1xuICAgICAgICAgICAgICAgIHggPSB0aGlzLnJpZ2h0ICsgcGFkZGluZztcbiAgICAgICAgICAgICAgICBpZiAoY3Jvc3NBbGlnbiA9PT0gJ25lYXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgICAgICB4ICs9IHdpZGVzdCAvIDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgICAgICAgICAgICAgeCArPSB3aWRlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB4ID0gdGhpcy5yaWdodCAtIHRpY2tBbmRQYWRkaW5nO1xuICAgICAgICAgICAgICAgIGlmIChjcm9zc0FsaWduID09PSAnbmVhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgICAgICB4IC09IHdpZGVzdCAvIDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICAgICAgICAgICAgICB4ID0gdGhpcy5sZWZ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgaWYgKG1pcnJvcikge1xuICAgICAgICAgICAgICAgIHggPSB0aGlzLmxlZnQgKyBwYWRkaW5nO1xuICAgICAgICAgICAgICAgIGlmIChjcm9zc0FsaWduID09PSAnbmVhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgICAgICB4IC09IHdpZGVzdCAvIDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICAgICAgICAgICAgICB4IC09IHdpZGVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHggPSB0aGlzLmxlZnQgKyB0aWNrQW5kUGFkZGluZztcbiAgICAgICAgICAgICAgICBpZiAoY3Jvc3NBbGlnbiA9PT0gJ25lYXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgICAgICB4ICs9IHdpZGVzdCAvIDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgICAgICAgICAgICAgeCA9IHRoaXMucmlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICAgICAgeFxuICAgICAgICB9O1xuICAgIH1cbiBfY29tcHV0ZUxhYmVsQXJlYSgpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50aWNrcy5taXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zaXRpb24gPT09ICdsZWZ0JyB8fCBwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgbGVmdDogdGhpcy5sZWZ0LFxuICAgICAgICAgICAgICAgIGJvdHRvbTogY2hhcnQuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnJpZ2h0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvcDogdGhpcy50b3AsXG4gICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICBib3R0b206IHRoaXMuYm90dG9tLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBjaGFydC53aWR0aFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiBkcmF3QmFja2dyb3VuZCgpIHtcbiAgICAgICAgY29uc3QgeyBjdHggLCBvcHRpb25zOiB7IGJhY2tncm91bmRDb2xvciAgfSAsIGxlZnQgLCB0b3AgLCB3aWR0aCAsIGhlaWdodCAgfSA9IHRoaXM7XG4gICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldExpbmVXaWR0aEZvclZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLm9wdGlvbnMuZ3JpZDtcbiAgICAgICAgaWYgKCF0aGlzLl9pc1Zpc2libGUoKSB8fCAhZ3JpZC5kaXNwbGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGlja3MuZmluZEluZGV4KCh0KT0+dC52YWx1ZSA9PT0gdmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IGdyaWQuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoaW5kZXgpKTtcbiAgICAgICAgICAgIHJldHVybiBvcHRzLmxpbmVXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gZHJhd0dyaWQoY2hhcnRBcmVhKSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLm9wdGlvbnMuZ3JpZDtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZ3JpZExpbmVJdGVtcyB8fCAodGhpcy5fZ3JpZExpbmVJdGVtcyA9IHRoaXMuX2NvbXB1dGVHcmlkTGluZUl0ZW1zKGNoYXJ0QXJlYSkpO1xuICAgICAgICBsZXQgaSwgaWxlbjtcbiAgICAgICAgY29uc3QgZHJhd0xpbmUgPSAocDEsIHAyLCBzdHlsZSk9PntcbiAgICAgICAgICAgIGlmICghc3R5bGUud2lkdGggfHwgIXN0eWxlLmNvbG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBzdHlsZS53aWR0aDtcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0eWxlLmNvbG9yO1xuICAgICAgICAgICAgY3R4LnNldExpbmVEYXNoKHN0eWxlLmJvcmRlckRhc2ggfHwgW10pO1xuICAgICAgICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gc3R5bGUuYm9yZGVyRGFzaE9mZnNldDtcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8ocDEueCwgcDEueSk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHAyLngsIHAyLnkpO1xuICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGdyaWQuZGlzcGxheSkge1xuICAgICAgICAgICAgZm9yKGkgPSAwLCBpbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGdyaWQuZHJhd09uQ2hhcnRBcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGl0ZW0ueDEsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBpdGVtLnkxXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGl0ZW0ueDIsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBpdGVtLnkyXG4gICAgICAgICAgICAgICAgICAgIH0sIGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZ3JpZC5kcmF3VGlja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogaXRlbS50eDEsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBpdGVtLnR5MVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBpdGVtLnR4MixcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGl0ZW0udHkyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBpdGVtLnRpY2tDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpdGVtLnRpY2tXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckRhc2g6IGl0ZW0udGlja0JvcmRlckRhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJEYXNoT2Zmc2V0OiBpdGVtLnRpY2tCb3JkZXJEYXNoT2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiBkcmF3Qm9yZGVyKCkge1xuICAgICAgICBjb25zdCB7IGNoYXJ0ICwgY3R4ICwgb3B0aW9uczogeyBib3JkZXIgLCBncmlkICB9ICB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgYm9yZGVyT3B0cyA9IGJvcmRlci5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICAgICAgY29uc3QgYXhpc1dpZHRoID0gYm9yZGVyLmRpc3BsYXkgPyBib3JkZXJPcHRzLndpZHRoIDogMDtcbiAgICAgICAgaWYgKCFheGlzV2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXN0TGluZVdpZHRoID0gZ3JpZC5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgwKSkubGluZVdpZHRoO1xuICAgICAgICBjb25zdCBib3JkZXJWYWx1ZSA9IHRoaXMuX2JvcmRlclZhbHVlO1xuICAgICAgICBsZXQgeDEsIHgyLCB5MSwgeTI7XG4gICAgICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgICB4MSA9IF9hbGlnblBpeGVsKGNoYXJ0LCB0aGlzLmxlZnQsIGF4aXNXaWR0aCkgLSBheGlzV2lkdGggLyAyO1xuICAgICAgICAgICAgeDIgPSBfYWxpZ25QaXhlbChjaGFydCwgdGhpcy5yaWdodCwgbGFzdExpbmVXaWR0aCkgKyBsYXN0TGluZVdpZHRoIC8gMjtcbiAgICAgICAgICAgIHkxID0geTIgPSBib3JkZXJWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHkxID0gX2FsaWduUGl4ZWwoY2hhcnQsIHRoaXMudG9wLCBheGlzV2lkdGgpIC0gYXhpc1dpZHRoIC8gMjtcbiAgICAgICAgICAgIHkyID0gX2FsaWduUGl4ZWwoY2hhcnQsIHRoaXMuYm90dG9tLCBsYXN0TGluZVdpZHRoKSArIGxhc3RMaW5lV2lkdGggLyAyO1xuICAgICAgICAgICAgeDEgPSB4MiA9IGJvcmRlclZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGN0eC5saW5lV2lkdGggPSBib3JkZXJPcHRzLndpZHRoO1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBib3JkZXJPcHRzLmNvbG9yO1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5tb3ZlVG8oeDEsIHkxKTtcbiAgICAgICAgY3R4LmxpbmVUbyh4MiwgeTIpO1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuIGRyYXdMYWJlbHMoY2hhcnRBcmVhKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvblRpY2tzID0gdGhpcy5vcHRpb25zLnRpY2tzO1xuICAgICAgICBpZiAoIW9wdGlvblRpY2tzLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMuX2NvbXB1dGVMYWJlbEFyZWEoKTtcbiAgICAgICAgaWYgKGFyZWEpIHtcbiAgICAgICAgICAgIGNsaXBBcmVhKGN0eCwgYXJlYSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldExhYmVsSXRlbXMoY2hhcnRBcmVhKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKXtcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlclRleHRPcHRpb25zID0gaXRlbS5vcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgdGlja0ZvbnQgPSBpdGVtLmZvbnQ7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGl0ZW0ubGFiZWw7XG4gICAgICAgICAgICBjb25zdCB5ID0gaXRlbS50ZXh0T2Zmc2V0O1xuICAgICAgICAgICAgcmVuZGVyVGV4dChjdHgsIGxhYmVsLCAwLCB5LCB0aWNrRm9udCwgcmVuZGVyVGV4dE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmVhKSB7XG4gICAgICAgICAgICB1bmNsaXBBcmVhKGN0eCk7XG4gICAgICAgIH1cbiAgICB9XG4gZHJhd1RpdGxlKCkge1xuICAgICAgICBjb25zdCB7IGN0eCAsIG9wdGlvbnM6IHsgcG9zaXRpb24gLCB0aXRsZSAsIHJldmVyc2UgIH0gIH0gPSB0aGlzO1xuICAgICAgICBpZiAoIXRpdGxlLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb250ID0gdG9Gb250KHRpdGxlLmZvbnQpO1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gdG9QYWRkaW5nKHRpdGxlLnBhZGRpbmcpO1xuICAgICAgICBjb25zdCBhbGlnbiA9IHRpdGxlLmFsaWduO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gZm9udC5saW5lSGVpZ2h0IC8gMjtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAnYm90dG9tJyB8fCBwb3NpdGlvbiA9PT0gJ2NlbnRlcicgfHwgaXNPYmplY3QocG9zaXRpb24pKSB7XG4gICAgICAgICAgICBvZmZzZXQgKz0gcGFkZGluZy5ib3R0b207XG4gICAgICAgICAgICBpZiAoaXNBcnJheSh0aXRsZS50ZXh0KSkge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBmb250LmxpbmVIZWlnaHQgKiAodGl0bGUudGV4dC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9mZnNldCArPSBwYWRkaW5nLnRvcDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHRpdGxlWCAsIHRpdGxlWSAsIG1heFdpZHRoICwgcm90YXRpb24gIH0gPSB0aXRsZUFyZ3ModGhpcywgb2Zmc2V0LCBwb3NpdGlvbiwgYWxpZ24pO1xuICAgICAgICByZW5kZXJUZXh0KGN0eCwgdGl0bGUudGV4dCwgMCwgMCwgZm9udCwge1xuICAgICAgICAgICAgY29sb3I6IHRpdGxlLmNvbG9yLFxuICAgICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICAgICByb3RhdGlvbixcbiAgICAgICAgICAgIHRleHRBbGlnbjogdGl0bGVBbGlnbihhbGlnbiwgcG9zaXRpb24sIHJldmVyc2UpLFxuICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uOiBbXG4gICAgICAgICAgICAgICAgdGl0bGVYLFxuICAgICAgICAgICAgICAgIHRpdGxlWVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJhdyhjaGFydEFyZWEpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc1Zpc2libGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJhd0JhY2tncm91bmQoKTtcbiAgICAgICAgdGhpcy5kcmF3R3JpZChjaGFydEFyZWEpO1xuICAgICAgICB0aGlzLmRyYXdCb3JkZXIoKTtcbiAgICAgICAgdGhpcy5kcmF3VGl0bGUoKTtcbiAgICAgICAgdGhpcy5kcmF3TGFiZWxzKGNoYXJ0QXJlYSk7XG4gICAgfVxuIF9sYXllcnMoKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHR6ID0gb3B0cy50aWNrcyAmJiBvcHRzLnRpY2tzLnogfHwgMDtcbiAgICAgICAgY29uc3QgZ3ogPSB2YWx1ZU9yRGVmYXVsdChvcHRzLmdyaWQgJiYgb3B0cy5ncmlkLnosIC0xKTtcbiAgICAgICAgY29uc3QgYnogPSB2YWx1ZU9yRGVmYXVsdChvcHRzLmJvcmRlciAmJiBvcHRzLmJvcmRlci56LCAwKTtcbiAgICAgICAgaWYgKCF0aGlzLl9pc1Zpc2libGUoKSB8fCB0aGlzLmRyYXcgIT09IFNjYWxlLnByb3RvdHlwZS5kcmF3KSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgejogdHosXG4gICAgICAgICAgICAgICAgICAgIGRyYXc6IChjaGFydEFyZWEpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXcoY2hhcnRBcmVhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB6OiBneixcbiAgICAgICAgICAgICAgICBkcmF3OiAoY2hhcnRBcmVhKT0+e1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdCYWNrZ3JvdW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0dyaWQoY2hhcnRBcmVhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VGl0bGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHo6IGJ6LFxuICAgICAgICAgICAgICAgIGRyYXc6ICgpPT57XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0JvcmRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgejogdHosXG4gICAgICAgICAgICAgICAgZHJhdzogKGNoYXJ0QXJlYSk9PntcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3TGFiZWxzKGNoYXJ0QXJlYSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cbiBnZXRNYXRjaGluZ1Zpc2libGVNZXRhcyh0eXBlKSB7XG4gICAgICAgIGNvbnN0IG1ldGFzID0gdGhpcy5jaGFydC5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7XG4gICAgICAgIGNvbnN0IGF4aXNJRCA9IHRoaXMuYXhpcyArICdBeGlzSUQnO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IGksIGlsZW47XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IG1ldGFzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YXNbaV07XG4gICAgICAgICAgICBpZiAobWV0YVtheGlzSURdID09PSB0aGlzLmlkICYmICghdHlwZSB8fCBtZXRhLnR5cGUgPT09IHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoaW5kZXgpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucy50aWNrcy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dChpbmRleCkpO1xuICAgICAgICByZXR1cm4gdG9Gb250KG9wdHMuZm9udCk7XG4gICAgfVxuIF9tYXhEaWdpdHMoKSB7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKS5saW5lSGVpZ2h0O1xuICAgICAgICByZXR1cm4gKHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aGlzLndpZHRoIDogdGhpcy5oZWlnaHQpIC8gZm9udFNpemU7XG4gICAgfVxufVxuXG5jbGFzcyBUeXBlZFJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBzY29wZSwgb3ZlcnJpZGUpe1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgICAgIHRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICAgIGlzRm9yVHlwZSh0eXBlKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmlzUHJvdG90eXBlT2YuY2FsbCh0aGlzLnR5cGUucHJvdG90eXBlLCB0eXBlLnByb3RvdHlwZSk7XG4gICAgfVxuIHJlZ2lzdGVyKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoaXRlbSk7XG4gICAgICAgIGxldCBwYXJlbnRTY29wZTtcbiAgICAgICAgaWYgKGlzSUNoYXJ0Q29tcG9uZW50KHByb3RvKSkge1xuICAgICAgICAgICAgcGFyZW50U2NvcGUgPSB0aGlzLnJlZ2lzdGVyKHByb3RvKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgICAgIGNvbnN0IGlkID0gaXRlbS5pZDtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlICsgJy4nICsgaWQ7XG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2xhc3MgZG9lcyBub3QgaGF2ZSBpZDogJyArIGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpZCBpbiBpdGVtcykge1xuICAgICAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW1zW2lkXSA9IGl0ZW07XG4gICAgICAgIHJlZ2lzdGVyRGVmYXVsdHMoaXRlbSwgc2NvcGUsIHBhcmVudFNjb3BlKTtcbiAgICAgICAgaWYgKHRoaXMub3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGRlZmF1bHRzLm92ZXJyaWRlKGl0ZW0uaWQsIGl0ZW0ub3ZlcnJpZGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfVxuIGdldChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1tpZF07XG4gICAgfVxuIHVucmVnaXN0ZXIoaXRlbSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgICAgIGNvbnN0IGlkID0gaXRlbS5pZDtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlO1xuICAgICAgICBpZiAoaWQgaW4gaXRlbXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtc1tpZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3BlICYmIGlkIGluIGRlZmF1bHRzW3Njb3BlXSkge1xuICAgICAgICAgICAgZGVsZXRlIGRlZmF1bHRzW3Njb3BlXVtpZF07XG4gICAgICAgICAgICBpZiAodGhpcy5vdmVycmlkZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBvdmVycmlkZXNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0cyhpdGVtLCBzY29wZSwgcGFyZW50U2NvcGUpIHtcbiAgICBjb25zdCBpdGVtRGVmYXVsdHMgPSBtZXJnZShPYmplY3QuY3JlYXRlKG51bGwpLCBbXG4gICAgICAgIHBhcmVudFNjb3BlID8gZGVmYXVsdHMuZ2V0KHBhcmVudFNjb3BlKSA6IHt9LFxuICAgICAgICBkZWZhdWx0cy5nZXQoc2NvcGUpLFxuICAgICAgICBpdGVtLmRlZmF1bHRzXG4gICAgXSk7XG4gICAgZGVmYXVsdHMuc2V0KHNjb3BlLCBpdGVtRGVmYXVsdHMpO1xuICAgIGlmIChpdGVtLmRlZmF1bHRSb3V0ZXMpIHtcbiAgICAgICAgcm91dGVEZWZhdWx0cyhzY29wZSwgaXRlbS5kZWZhdWx0Um91dGVzKTtcbiAgICB9XG4gICAgaWYgKGl0ZW0uZGVzY3JpcHRvcnMpIHtcbiAgICAgICAgZGVmYXVsdHMuZGVzY3JpYmUoc2NvcGUsIGl0ZW0uZGVzY3JpcHRvcnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJvdXRlRGVmYXVsdHMoc2NvcGUsIHJvdXRlcykge1xuICAgIE9iamVjdC5rZXlzKHJvdXRlcykuZm9yRWFjaCgocHJvcGVydHkpPT57XG4gICAgICAgIGNvbnN0IHByb3BlcnR5UGFydHMgPSBwcm9wZXJ0eS5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCBzb3VyY2VOYW1lID0gcHJvcGVydHlQYXJ0cy5wb3AoKTtcbiAgICAgICAgY29uc3Qgc291cmNlU2NvcGUgPSBbXG4gICAgICAgICAgICBzY29wZVxuICAgICAgICBdLmNvbmNhdChwcm9wZXJ0eVBhcnRzKS5qb2luKCcuJyk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcm91dGVzW3Byb3BlcnR5XS5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCB0YXJnZXROYW1lID0gcGFydHMucG9wKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldFNjb3BlID0gcGFydHMuam9pbignLicpO1xuICAgICAgICBkZWZhdWx0cy5yb3V0ZShzb3VyY2VTY29wZSwgc291cmNlTmFtZSwgdGFyZ2V0U2NvcGUsIHRhcmdldE5hbWUpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaXNJQ2hhcnRDb21wb25lbnQocHJvdG8pIHtcbiAgICByZXR1cm4gJ2lkJyBpbiBwcm90byAmJiAnZGVmYXVsdHMnIGluIHByb3RvO1xufVxuXG5jbGFzcyBSZWdpc3RyeSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IG5ldyBUeXBlZFJlZ2lzdHJ5KERhdGFzZXRDb250cm9sbGVyLCAnZGF0YXNldHMnLCB0cnVlKTtcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9IG5ldyBUeXBlZFJlZ2lzdHJ5KEVsZW1lbnQsICdlbGVtZW50cycpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBuZXcgVHlwZWRSZWdpc3RyeShPYmplY3QsICdwbHVnaW5zJyk7XG4gICAgICAgIHRoaXMuc2NhbGVzID0gbmV3IFR5cGVkUmVnaXN0cnkoU2NhbGUsICdzY2FsZXMnKTtcbiAgICAgICAgdGhpcy5fdHlwZWRSZWdpc3RyaWVzID0gW1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVycyxcbiAgICAgICAgICAgIHRoaXMuc2NhbGVzLFxuICAgICAgICAgICAgdGhpcy5lbGVtZW50c1xuICAgICAgICBdO1xuICAgIH1cbiBhZGQoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9lYWNoKCdyZWdpc3RlcicsIGFyZ3MpO1xuICAgIH1cbiAgICByZW1vdmUoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncyk7XG4gICAgfVxuIGFkZENvbnRyb2xsZXJzKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5fZWFjaCgncmVnaXN0ZXInLCBhcmdzLCB0aGlzLmNvbnRyb2xsZXJzKTtcbiAgICB9XG4gYWRkRWxlbWVudHMoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9lYWNoKCdyZWdpc3RlcicsIGFyZ3MsIHRoaXMuZWxlbWVudHMpO1xuICAgIH1cbiBhZGRQbHVnaW5zKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5fZWFjaCgncmVnaXN0ZXInLCBhcmdzLCB0aGlzLnBsdWdpbnMpO1xuICAgIH1cbiBhZGRTY2FsZXMoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9lYWNoKCdyZWdpc3RlcicsIGFyZ3MsIHRoaXMuc2NhbGVzKTtcbiAgICB9XG4gZ2V0Q29udHJvbGxlcihpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGlkLCB0aGlzLmNvbnRyb2xsZXJzLCAnY29udHJvbGxlcicpO1xuICAgIH1cbiBnZXRFbGVtZW50KGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQoaWQsIHRoaXMuZWxlbWVudHMsICdlbGVtZW50Jyk7XG4gICAgfVxuIGdldFBsdWdpbihpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGlkLCB0aGlzLnBsdWdpbnMsICdwbHVnaW4nKTtcbiAgICB9XG4gZ2V0U2NhbGUoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChpZCwgdGhpcy5zY2FsZXMsICdzY2FsZScpO1xuICAgIH1cbiByZW1vdmVDb250cm9sbGVycyguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2VhY2goJ3VucmVnaXN0ZXInLCBhcmdzLCB0aGlzLmNvbnRyb2xsZXJzKTtcbiAgICB9XG4gcmVtb3ZlRWxlbWVudHMoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncywgdGhpcy5lbGVtZW50cyk7XG4gICAgfVxuIHJlbW92ZVBsdWdpbnMoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncywgdGhpcy5wbHVnaW5zKTtcbiAgICB9XG4gcmVtb3ZlU2NhbGVzKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5fZWFjaCgndW5yZWdpc3RlcicsIGFyZ3MsIHRoaXMuc2NhbGVzKTtcbiAgICB9XG4gX2VhY2gobWV0aG9kLCBhcmdzLCB0eXBlZFJlZ2lzdHJ5KSB7XG4gICAgICAgIFtcbiAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgXS5mb3JFYWNoKChhcmcpPT57XG4gICAgICAgICAgICBjb25zdCByZWcgPSB0eXBlZFJlZ2lzdHJ5IHx8IHRoaXMuX2dldFJlZ2lzdHJ5Rm9yVHlwZShhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVkUmVnaXN0cnkgfHwgcmVnLmlzRm9yVHlwZShhcmcpIHx8IHJlZyA9PT0gdGhpcy5wbHVnaW5zICYmIGFyZy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2V4ZWMobWV0aG9kLCByZWcsIGFyZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVhY2goYXJnLCAoaXRlbSk9PntcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVJlZyA9IHR5cGVkUmVnaXN0cnkgfHwgdGhpcy5fZ2V0UmVnaXN0cnlGb3JUeXBlKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9leGVjKG1ldGhvZCwgaXRlbVJlZywgaXRlbSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiBfZXhlYyhtZXRob2QsIHJlZ2lzdHJ5LCBjb21wb25lbnQpIHtcbiAgICAgICAgY29uc3QgY2FtZWxNZXRob2QgPSBfY2FwaXRhbGl6ZShtZXRob2QpO1xuICAgICAgICBjYWxsYmFjayhjb21wb25lbnRbJ2JlZm9yZScgKyBjYW1lbE1ldGhvZF0sIFtdLCBjb21wb25lbnQpO1xuICAgICAgICByZWdpc3RyeVttZXRob2RdKGNvbXBvbmVudCk7XG4gICAgICAgIGNhbGxiYWNrKGNvbXBvbmVudFsnYWZ0ZXInICsgY2FtZWxNZXRob2RdLCBbXSwgY29tcG9uZW50KTtcbiAgICB9XG4gX2dldFJlZ2lzdHJ5Rm9yVHlwZSh0eXBlKSB7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLl90eXBlZFJlZ2lzdHJpZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgcmVnID0gdGhpcy5fdHlwZWRSZWdpc3RyaWVzW2ldO1xuICAgICAgICAgICAgaWYgKHJlZy5pc0ZvclR5cGUodHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbnM7XG4gICAgfVxuIF9nZXQoaWQsIHR5cGVkUmVnaXN0cnksIHR5cGUpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHR5cGVkUmVnaXN0cnkuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBpZCArICdcIiBpcyBub3QgYSByZWdpc3RlcmVkICcgKyB0eXBlICsgJy4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG59XG52YXIgcmVnaXN0cnkgPSAvKiAjX19QVVJFX18gKi8gbmV3IFJlZ2lzdHJ5KCk7XG5cbmNsYXNzIFBsdWdpblNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMuX2luaXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuIG5vdGlmeShjaGFydCwgaG9vaywgYXJncywgZmlsdGVyKSB7XG4gICAgICAgIGlmIChob29rID09PSAnYmVmb3JlSW5pdCcpIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXQgPSB0aGlzLl9jcmVhdGVEZXNjcmlwdG9ycyhjaGFydCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZnkodGhpcy5faW5pdCwgY2hhcnQsICdpbnN0YWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2luaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gZmlsdGVyID8gdGhpcy5fZGVzY3JpcHRvcnMoY2hhcnQpLmZpbHRlcihmaWx0ZXIpIDogdGhpcy5fZGVzY3JpcHRvcnMoY2hhcnQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9ub3RpZnkoZGVzY3JpcHRvcnMsIGNoYXJ0LCBob29rLCBhcmdzKTtcbiAgICAgICAgaWYgKGhvb2sgPT09ICdhZnRlckRlc3Ryb3knKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZnkoZGVzY3JpcHRvcnMsIGNoYXJ0LCAnc3RvcCcpO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5KHRoaXMuX2luaXQsIGNoYXJ0LCAndW5pbnN0YWxsJyk7XG4gICAgICAgICAgICB0aGlzLl9pbml0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuIF9ub3RpZnkoZGVzY3JpcHRvcnMsIGNoYXJ0LCBob29rLCBhcmdzKSB7XG4gICAgICAgIGFyZ3MgPSBhcmdzIHx8IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGRlc2NyaXB0b3Igb2YgZGVzY3JpcHRvcnMpe1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gZGVzY3JpcHRvci5wbHVnaW47XG4gICAgICAgICAgICBjb25zdCBtZXRob2QgPSBwbHVnaW5baG9va107XG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBbXG4gICAgICAgICAgICAgICAgY2hhcnQsXG4gICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLm9wdGlvbnNcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2sobWV0aG9kLCBwYXJhbXMsIHBsdWdpbikgPT09IGZhbHNlICYmIGFyZ3MuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmKHRoaXMuX2NhY2hlKSkge1xuICAgICAgICAgICAgdGhpcy5fb2xkQ2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuIF9kZXNjcmlwdG9ycyhjaGFydCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXNjcmlwdG9ycyA9IHRoaXMuX2NhY2hlID0gdGhpcy5fY3JlYXRlRGVzY3JpcHRvcnMoY2hhcnQpO1xuICAgICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZXMoY2hhcnQpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcnM7XG4gICAgfVxuICAgIF9jcmVhdGVEZXNjcmlwdG9ycyhjaGFydCwgYWxsKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGNoYXJ0ICYmIGNoYXJ0LmNvbmZpZztcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHZhbHVlT3JEZWZhdWx0KGNvbmZpZy5vcHRpb25zICYmIGNvbmZpZy5vcHRpb25zLnBsdWdpbnMsIHt9KTtcbiAgICAgICAgY29uc3QgcGx1Z2lucyA9IGFsbFBsdWdpbnMoY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMgPT09IGZhbHNlICYmICFhbGwgPyBbXSA6IGNyZWF0ZURlc2NyaXB0b3JzKGNoYXJ0LCBwbHVnaW5zLCBvcHRpb25zLCBhbGwpO1xuICAgIH1cbiBfbm90aWZ5U3RhdGVDaGFuZ2VzKGNoYXJ0KSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzRGVzY3JpcHRvcnMgPSB0aGlzLl9vbGRDYWNoZSB8fCBbXTtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcnMgPSB0aGlzLl9jYWNoZTtcbiAgICAgICAgY29uc3QgZGlmZiA9IChhLCBiKT0+YS5maWx0ZXIoKHgpPT4hYi5zb21lKCh5KT0+eC5wbHVnaW4uaWQgPT09IHkucGx1Z2luLmlkKSk7XG4gICAgICAgIHRoaXMuX25vdGlmeShkaWZmKHByZXZpb3VzRGVzY3JpcHRvcnMsIGRlc2NyaXB0b3JzKSwgY2hhcnQsICdzdG9wJyk7XG4gICAgICAgIHRoaXMuX25vdGlmeShkaWZmKGRlc2NyaXB0b3JzLCBwcmV2aW91c0Rlc2NyaXB0b3JzKSwgY2hhcnQsICdzdGFydCcpO1xuICAgIH1cbn1cbiBmdW5jdGlvbiBhbGxQbHVnaW5zKGNvbmZpZykge1xuICAgIGNvbnN0IGxvY2FsSWRzID0ge307XG4gICAgY29uc3QgcGx1Z2lucyA9IFtdO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZWdpc3RyeS5wbHVnaW5zLml0ZW1zKTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHBsdWdpbnMucHVzaChyZWdpc3RyeS5nZXRQbHVnaW4oa2V5c1tpXSkpO1xuICAgIH1cbiAgICBjb25zdCBsb2NhbCA9IGNvbmZpZy5wbHVnaW5zIHx8IFtdO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBsb2NhbC5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGxvY2FsW2ldO1xuICAgICAgICBpZiAocGx1Z2lucy5pbmRleE9mKHBsdWdpbikgPT09IC0xKSB7XG4gICAgICAgICAgICBwbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICAgICAgICAgIGxvY2FsSWRzW3BsdWdpbi5pZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHBsdWdpbnMsXG4gICAgICAgIGxvY2FsSWRzXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldE9wdHMob3B0aW9ucywgYWxsKSB7XG4gICAgaWYgKCFhbGwgJiYgb3B0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChvcHRpb25zID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5mdW5jdGlvbiBjcmVhdGVEZXNjcmlwdG9ycyhjaGFydCwgeyBwbHVnaW5zICwgbG9jYWxJZHMgIH0sIG9wdGlvbnMsIGFsbCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjaGFydC5nZXRDb250ZXh0KCk7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucyl7XG4gICAgICAgIGNvbnN0IGlkID0gcGx1Z2luLmlkO1xuICAgICAgICBjb25zdCBvcHRzID0gZ2V0T3B0cyhvcHRpb25zW2lkXSwgYWxsKTtcbiAgICAgICAgaWYgKG9wdHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgIHBsdWdpbixcbiAgICAgICAgICAgIG9wdGlvbnM6IHBsdWdpbk9wdHMoY2hhcnQuY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLFxuICAgICAgICAgICAgICAgIGxvY2FsOiBsb2NhbElkc1tpZF1cbiAgICAgICAgICAgIH0sIG9wdHMsIGNvbnRleHQpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcGx1Z2luT3B0cyhjb25maWcsIHsgcGx1Z2luICwgbG9jYWwgIH0sIG9wdHMsIGNvbnRleHQpIHtcbiAgICBjb25zdCBrZXlzID0gY29uZmlnLnBsdWdpblNjb3BlS2V5cyhwbHVnaW4pO1xuICAgIGNvbnN0IHNjb3BlcyA9IGNvbmZpZy5nZXRPcHRpb25TY29wZXMob3B0cywga2V5cyk7XG4gICAgaWYgKGxvY2FsICYmIHBsdWdpbi5kZWZhdWx0cykge1xuICAgICAgICBzY29wZXMucHVzaChwbHVnaW4uZGVmYXVsdHMpO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnLmNyZWF0ZVJlc29sdmVyKHNjb3BlcywgY29udGV4dCwgW1xuICAgICAgICAnJ1xuICAgIF0sIHtcbiAgICAgICAgc2NyaXB0YWJsZTogZmFsc2UsXG4gICAgICAgIGluZGV4YWJsZTogZmFsc2UsXG4gICAgICAgIGFsbEtleXM6IHRydWVcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5kZXhBeGlzKHR5cGUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXRhc2V0RGVmYXVsdHMgPSBkZWZhdWx0cy5kYXRhc2V0c1t0eXBlXSB8fCB7fTtcbiAgICBjb25zdCBkYXRhc2V0T3B0aW9ucyA9IChvcHRpb25zLmRhdGFzZXRzIHx8IHt9KVt0eXBlXSB8fCB7fTtcbiAgICByZXR1cm4gZGF0YXNldE9wdGlvbnMuaW5kZXhBeGlzIHx8IG9wdGlvbnMuaW5kZXhBeGlzIHx8IGRhdGFzZXREZWZhdWx0cy5pbmRleEF4aXMgfHwgJ3gnO1xufVxuZnVuY3Rpb24gZ2V0QXhpc0Zyb21EZWZhdWx0U2NhbGVJRChpZCwgaW5kZXhBeGlzKSB7XG4gICAgbGV0IGF4aXMgPSBpZDtcbiAgICBpZiAoaWQgPT09ICdfaW5kZXhfJykge1xuICAgICAgICBheGlzID0gaW5kZXhBeGlzO1xuICAgIH0gZWxzZSBpZiAoaWQgPT09ICdfdmFsdWVfJykge1xuICAgICAgICBheGlzID0gaW5kZXhBeGlzID09PSAneCcgPyAneScgOiAneCc7XG4gICAgfVxuICAgIHJldHVybiBheGlzO1xufVxuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjYWxlSURGcm9tQXhpcyhheGlzLCBpbmRleEF4aXMpIHtcbiAgICByZXR1cm4gYXhpcyA9PT0gaW5kZXhBeGlzID8gJ19pbmRleF8nIDogJ192YWx1ZV8nO1xufVxuZnVuY3Rpb24gaWRNYXRjaGVzQXhpcyhpZCkge1xuICAgIGlmIChpZCA9PT0gJ3gnIHx8IGlkID09PSAneScgfHwgaWQgPT09ICdyJykge1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxufVxuZnVuY3Rpb24gYXhpc0Zyb21Qb3NpdGlvbihwb3NpdGlvbikge1xuICAgIGlmIChwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICAgIHJldHVybiAneCc7XG4gICAgfVxuICAgIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnIHx8IHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgIHJldHVybiAneSc7XG4gICAgfVxufVxuZnVuY3Rpb24gZGV0ZXJtaW5lQXhpcyhpZCwgLi4uc2NhbGVPcHRpb25zKSB7XG4gICAgaWYgKGlkTWF0Y2hlc0F4aXMoaWQpKSB7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvcHRzIG9mIHNjYWxlT3B0aW9ucyl7XG4gICAgICAgIGNvbnN0IGF4aXMgPSBvcHRzLmF4aXMgfHwgYXhpc0Zyb21Qb3NpdGlvbihvcHRzLnBvc2l0aW9uKSB8fCBpZC5sZW5ndGggPiAxICYmIGlkTWF0Y2hlc0F4aXMoaWRbMF0udG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmIChheGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gYXhpcztcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZXRlcm1pbmUgdHlwZSBvZiAnJHtpZH0nIGF4aXMuIFBsZWFzZSBwcm92aWRlICdheGlzJyBvciAncG9zaXRpb24nIG9wdGlvbi5gKTtcbn1cbmZ1bmN0aW9uIGdldEF4aXNGcm9tRGF0YXNldChpZCwgYXhpcywgZGF0YXNldCkge1xuICAgIGlmIChkYXRhc2V0W2F4aXMgKyAnQXhpc0lEJ10gPT09IGlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBheGlzXG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gcmV0cmlldmVBeGlzRnJvbURhdGFzZXRzKGlkLCBjb25maWcpIHtcbiAgICBpZiAoY29uZmlnLmRhdGEgJiYgY29uZmlnLmRhdGEuZGF0YXNldHMpIHtcbiAgICAgICAgY29uc3QgYm91bmREcyA9IGNvbmZpZy5kYXRhLmRhdGFzZXRzLmZpbHRlcigoZCk9PmQueEF4aXNJRCA9PT0gaWQgfHwgZC55QXhpc0lEID09PSBpZCk7XG4gICAgICAgIGlmIChib3VuZERzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldEF4aXNGcm9tRGF0YXNldChpZCwgJ3gnLCBib3VuZERzWzBdKSB8fCBnZXRBeGlzRnJvbURhdGFzZXQoaWQsICd5JywgYm91bmREc1swXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9O1xufVxuZnVuY3Rpb24gbWVyZ2VTY2FsZUNvbmZpZyhjb25maWcsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjaGFydERlZmF1bHRzID0gb3ZlcnJpZGVzW2NvbmZpZy50eXBlXSB8fCB7XG4gICAgICAgIHNjYWxlczoge31cbiAgICB9O1xuICAgIGNvbnN0IGNvbmZpZ1NjYWxlcyA9IG9wdGlvbnMuc2NhbGVzIHx8IHt9O1xuICAgIGNvbnN0IGNoYXJ0SW5kZXhBeGlzID0gZ2V0SW5kZXhBeGlzKGNvbmZpZy50eXBlLCBvcHRpb25zKTtcbiAgICBjb25zdCBzY2FsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIE9iamVjdC5rZXlzKGNvbmZpZ1NjYWxlcykuZm9yRWFjaCgoaWQpPT57XG4gICAgICAgIGNvbnN0IHNjYWxlQ29uZiA9IGNvbmZpZ1NjYWxlc1tpZF07XG4gICAgICAgIGlmICghaXNPYmplY3Qoc2NhbGVDb25mKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgc2NhbGUgY29uZmlndXJhdGlvbiBmb3Igc2NhbGU6ICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjYWxlQ29uZi5fcHJveHkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oYElnbm9yaW5nIHJlc29sdmVyIHBhc3NlZCBhcyBvcHRpb25zIGZvciBzY2FsZTogJHtpZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBheGlzID0gZGV0ZXJtaW5lQXhpcyhpZCwgc2NhbGVDb25mLCByZXRyaWV2ZUF4aXNGcm9tRGF0YXNldHMoaWQsIGNvbmZpZyksIGRlZmF1bHRzLnNjYWxlc1tzY2FsZUNvbmYudHlwZV0pO1xuICAgICAgICBjb25zdCBkZWZhdWx0SWQgPSBnZXREZWZhdWx0U2NhbGVJREZyb21BeGlzKGF4aXMsIGNoYXJ0SW5kZXhBeGlzKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFNjYWxlT3B0aW9ucyA9IGNoYXJ0RGVmYXVsdHMuc2NhbGVzIHx8IHt9O1xuICAgICAgICBzY2FsZXNbaWRdID0gbWVyZ2VJZihPYmplY3QuY3JlYXRlKG51bGwpLCBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXhpc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNjYWxlQ29uZixcbiAgICAgICAgICAgIGRlZmF1bHRTY2FsZU9wdGlvbnNbYXhpc10sXG4gICAgICAgICAgICBkZWZhdWx0U2NhbGVPcHRpb25zW2RlZmF1bHRJZF1cbiAgICAgICAgXSk7XG4gICAgfSk7XG4gICAgY29uZmlnLmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldCk9PntcbiAgICAgICAgY29uc3QgdHlwZSA9IGRhdGFzZXQudHlwZSB8fCBjb25maWcudHlwZTtcbiAgICAgICAgY29uc3QgaW5kZXhBeGlzID0gZGF0YXNldC5pbmRleEF4aXMgfHwgZ2V0SW5kZXhBeGlzKHR5cGUsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBkYXRhc2V0RGVmYXVsdHMgPSBvdmVycmlkZXNbdHlwZV0gfHwge307XG4gICAgICAgIGNvbnN0IGRlZmF1bHRTY2FsZU9wdGlvbnMgPSBkYXRhc2V0RGVmYXVsdHMuc2NhbGVzIHx8IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0U2NhbGVPcHRpb25zKS5mb3JFYWNoKChkZWZhdWx0SUQpPT57XG4gICAgICAgICAgICBjb25zdCBheGlzID0gZ2V0QXhpc0Zyb21EZWZhdWx0U2NhbGVJRChkZWZhdWx0SUQsIGluZGV4QXhpcyk7XG4gICAgICAgICAgICBjb25zdCBpZCA9IGRhdGFzZXRbYXhpcyArICdBeGlzSUQnXSB8fCBheGlzO1xuICAgICAgICAgICAgc2NhbGVzW2lkXSA9IHNjYWxlc1tpZF0gfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIG1lcmdlSWYoc2NhbGVzW2lkXSwgW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYXhpc1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29uZmlnU2NhbGVzW2lkXSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0U2NhbGVPcHRpb25zW2RlZmF1bHRJRF1cbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBPYmplY3Qua2V5cyhzY2FsZXMpLmZvckVhY2goKGtleSk9PntcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBzY2FsZXNba2V5XTtcbiAgICAgICAgbWVyZ2VJZihzY2FsZSwgW1xuICAgICAgICAgICAgZGVmYXVsdHMuc2NhbGVzW3NjYWxlLnR5cGVdLFxuICAgICAgICAgICAgZGVmYXVsdHMuc2NhbGVcbiAgICAgICAgXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNjYWxlcztcbn1cbmZ1bmN0aW9uIGluaXRPcHRpb25zKGNvbmZpZykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb25maWcub3B0aW9ucyB8fCAoY29uZmlnLm9wdGlvbnMgPSB7fSk7XG4gICAgb3B0aW9ucy5wbHVnaW5zID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy5wbHVnaW5zLCB7fSk7XG4gICAgb3B0aW9ucy5zY2FsZXMgPSBtZXJnZVNjYWxlQ29uZmlnKGNvbmZpZywgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBpbml0RGF0YShkYXRhKSB7XG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YS5kYXRhc2V0cyA9IGRhdGEuZGF0YXNldHMgfHwgW107XG4gICAgZGF0YS5sYWJlbHMgPSBkYXRhLmxhYmVscyB8fCBbXTtcbiAgICByZXR1cm4gZGF0YTtcbn1cbmZ1bmN0aW9uIGluaXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgIGNvbmZpZy5kYXRhID0gaW5pdERhdGEoY29uZmlnLmRhdGEpO1xuICAgIGluaXRPcHRpb25zKGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmNvbnN0IGtleUNhY2hlID0gbmV3IE1hcCgpO1xuY29uc3Qga2V5c0NhY2hlZCA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIGNhY2hlZEtleXMoY2FjaGVLZXksIGdlbmVyYXRlKSB7XG4gICAgbGV0IGtleXMgPSBrZXlDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGlmICgha2V5cykge1xuICAgICAgICBrZXlzID0gZ2VuZXJhdGUoKTtcbiAgICAgICAga2V5Q2FjaGUuc2V0KGNhY2hlS2V5LCBrZXlzKTtcbiAgICAgICAga2V5c0NhY2hlZC5hZGQoa2V5cyk7XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xufVxuY29uc3QgYWRkSWZGb3VuZCA9IChzZXQsIG9iaiwga2V5KT0+e1xuICAgIGNvbnN0IG9wdHMgPSByZXNvbHZlT2JqZWN0S2V5KG9iaiwga2V5KTtcbiAgICBpZiAob3B0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNldC5hZGQob3B0cyk7XG4gICAgfVxufTtcbmNsYXNzIENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKXtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gaW5pdENvbmZpZyhjb25maWcpO1xuICAgICAgICB0aGlzLl9zY29wZUNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9yZXNvbHZlckNhY2hlID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBnZXQgcGxhdGZvcm0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcucGxhdGZvcm07XG4gICAgfVxuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLnR5cGU7XG4gICAgfVxuICAgIHNldCB0eXBlKHR5cGUpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnLnR5cGUgPSB0eXBlO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5kYXRhO1xuICAgIH1cbiAgICBzZXQgZGF0YShkYXRhKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZy5kYXRhID0gaW5pdERhdGEoZGF0YSk7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLm9wdGlvbnM7XG4gICAgfVxuICAgIHNldCBvcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICBnZXQgcGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5wbHVnaW5zO1xuICAgIH1cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX2NvbmZpZztcbiAgICAgICAgdGhpcy5jbGVhckNhY2hlKCk7XG4gICAgICAgIGluaXRPcHRpb25zKGNvbmZpZyk7XG4gICAgfVxuICAgIGNsZWFyQ2FjaGUoKSB7XG4gICAgICAgIHRoaXMuX3Njb3BlQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZXJDYWNoZS5jbGVhcigpO1xuICAgIH1cbiBkYXRhc2V0U2NvcGVLZXlzKGRhdGFzZXRUeXBlKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRLZXlzKGRhdGFzZXRUeXBlLCAoKT0+W1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYGRhdGFzZXRzLiR7ZGF0YXNldFR5cGV9YCxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICBdKTtcbiAgICB9XG4gZGF0YXNldEFuaW1hdGlvblNjb3BlS2V5cyhkYXRhc2V0VHlwZSwgdHJhbnNpdGlvbikge1xuICAgICAgICByZXR1cm4gY2FjaGVkS2V5cyhgJHtkYXRhc2V0VHlwZX0udHJhbnNpdGlvbi4ke3RyYW5zaXRpb259YCwgKCk9PltcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGBkYXRhc2V0cy4ke2RhdGFzZXRUeXBlfS50cmFuc2l0aW9ucy4ke3RyYW5zaXRpb259YCxcbiAgICAgICAgICAgICAgICAgICAgYHRyYW5zaXRpb25zLiR7dHJhbnNpdGlvbn1gXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGBkYXRhc2V0cy4ke2RhdGFzZXRUeXBlfWAsXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgXSk7XG4gICAgfVxuIGRhdGFzZXRFbGVtZW50U2NvcGVLZXlzKGRhdGFzZXRUeXBlLCBlbGVtZW50VHlwZSkge1xuICAgICAgICByZXR1cm4gY2FjaGVkS2V5cyhgJHtkYXRhc2V0VHlwZX0tJHtlbGVtZW50VHlwZX1gLCAoKT0+W1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYGRhdGFzZXRzLiR7ZGF0YXNldFR5cGV9LmVsZW1lbnRzLiR7ZWxlbWVudFR5cGV9YCxcbiAgICAgICAgICAgICAgICAgICAgYGRhdGFzZXRzLiR7ZGF0YXNldFR5cGV9YCxcbiAgICAgICAgICAgICAgICAgICAgYGVsZW1lbnRzLiR7ZWxlbWVudFR5cGV9YCxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICBdKTtcbiAgICB9XG4gcGx1Z2luU2NvcGVLZXlzKHBsdWdpbikge1xuICAgICAgICBjb25zdCBpZCA9IHBsdWdpbi5pZDtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZTtcbiAgICAgICAgcmV0dXJuIGNhY2hlZEtleXMoYCR7dHlwZX0tcGx1Z2luLSR7aWR9YCwgKCk9PltcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGBwbHVnaW5zLiR7aWR9YCxcbiAgICAgICAgICAgICAgICAgICAgLi4ucGx1Z2luLmFkZGl0aW9uYWxPcHRpb25TY29wZXMgfHwgW11cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICBdKTtcbiAgICB9XG4gX2NhY2hlZFNjb3BlcyhtYWluU2NvcGUsIHJlc2V0Q2FjaGUpIHtcbiAgICAgICAgY29uc3QgX3Njb3BlQ2FjaGUgPSB0aGlzLl9zY29wZUNhY2hlO1xuICAgICAgICBsZXQgY2FjaGUgPSBfc2NvcGVDYWNoZS5nZXQobWFpblNjb3BlKTtcbiAgICAgICAgaWYgKCFjYWNoZSB8fCByZXNldENhY2hlKSB7XG4gICAgICAgICAgICBjYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIF9zY29wZUNhY2hlLnNldChtYWluU2NvcGUsIGNhY2hlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuIGdldE9wdGlvblNjb3BlcyhtYWluU2NvcGUsIGtleUxpc3RzLCByZXNldENhY2hlKSB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9ucyAsIHR5cGUgIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuX2NhY2hlZFNjb3BlcyhtYWluU2NvcGUsIHJlc2V0Q2FjaGUpO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoa2V5TGlzdHMpO1xuICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjb3BlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAga2V5TGlzdHMuZm9yRWFjaCgoa2V5cyk9PntcbiAgICAgICAgICAgIGlmIChtYWluU2NvcGUpIHtcbiAgICAgICAgICAgICAgICBzY29wZXMuYWRkKG1haW5TY29wZSk7XG4gICAgICAgICAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpPT5hZGRJZkZvdW5kKHNjb3BlcywgbWFpblNjb3BlLCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KT0+YWRkSWZGb3VuZChzY29wZXMsIG9wdGlvbnMsIGtleSkpO1xuICAgICAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpPT5hZGRJZkZvdW5kKHNjb3Blcywgb3ZlcnJpZGVzW3R5cGVdIHx8IHt9LCBrZXkpKTtcbiAgICAgICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KT0+YWRkSWZGb3VuZChzY29wZXMsIGRlZmF1bHRzLCBrZXkpKTtcbiAgICAgICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KT0+YWRkSWZGb3VuZChzY29wZXMsIGRlc2NyaXB0b3JzLCBrZXkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gQXJyYXkuZnJvbShzY29wZXMpO1xuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBhcnJheS5wdXNoKE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXlzQ2FjaGVkLmhhcyhrZXlMaXN0cykpIHtcbiAgICAgICAgICAgIGNhY2hlLnNldChrZXlMaXN0cywgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG4gY2hhcnRPcHRpb25TY29wZXMoKSB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9ucyAsIHR5cGUgIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIG92ZXJyaWRlc1t0eXBlXSB8fCB7fSxcbiAgICAgICAgICAgIGRlZmF1bHRzLmRhdGFzZXRzW3R5cGVdIHx8IHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWZhdWx0cyxcbiAgICAgICAgICAgIGRlc2NyaXB0b3JzXG4gICAgICAgIF07XG4gICAgfVxuIHJlc29sdmVOYW1lZE9wdGlvbnMoc2NvcGVzLCBuYW1lcywgY29udGV4dCwgcHJlZml4ZXMgPSBbXG4gICAgICAgICcnXG4gICAgXSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAkc2hhcmVkOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgcmVzb2x2ZXIgLCBzdWJQcmVmaXhlcyAgfSA9IGdldFJlc29sdmVyKHRoaXMuX3Jlc29sdmVyQ2FjaGUsIHNjb3BlcywgcHJlZml4ZXMpO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHJlc29sdmVyO1xuICAgICAgICBpZiAobmVlZENvbnRleHQocmVzb2x2ZXIsIG5hbWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0LiRzaGFyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRleHQgPSBpc0Z1bmN0aW9uKGNvbnRleHQpID8gY29udGV4dCgpIDogY29udGV4dDtcbiAgICAgICAgICAgIGNvbnN0IHN1YlJlc29sdmVyID0gdGhpcy5jcmVhdGVSZXNvbHZlcihzY29wZXMsIGNvbnRleHQsIHN1YlByZWZpeGVzKTtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfYXR0YWNoQ29udGV4dChyZXNvbHZlciwgY29udGV4dCwgc3ViUmVzb2x2ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBuYW1lcyl7XG4gICAgICAgICAgICByZXN1bHRbcHJvcF0gPSBvcHRpb25zW3Byb3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuIGNyZWF0ZVJlc29sdmVyKHNjb3BlcywgY29udGV4dCwgcHJlZml4ZXMgPSBbXG4gICAgICAgICcnXG4gICAgXSwgZGVzY3JpcHRvckRlZmF1bHRzKSB7XG4gICAgICAgIGNvbnN0IHsgcmVzb2x2ZXIgIH0gPSBnZXRSZXNvbHZlcih0aGlzLl9yZXNvbHZlckNhY2hlLCBzY29wZXMsIHByZWZpeGVzKTtcbiAgICAgICAgcmV0dXJuIGlzT2JqZWN0KGNvbnRleHQpID8gX2F0dGFjaENvbnRleHQocmVzb2x2ZXIsIGNvbnRleHQsIHVuZGVmaW5lZCwgZGVzY3JpcHRvckRlZmF1bHRzKSA6IHJlc29sdmVyO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFJlc29sdmVyKHJlc29sdmVyQ2FjaGUsIHNjb3BlcywgcHJlZml4ZXMpIHtcbiAgICBsZXQgY2FjaGUgPSByZXNvbHZlckNhY2hlLmdldChzY29wZXMpO1xuICAgIGlmICghY2FjaGUpIHtcbiAgICAgICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJlc29sdmVyQ2FjaGUuc2V0KHNjb3BlcywgY2FjaGUpO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZUtleSA9IHByZWZpeGVzLmpvaW4oKTtcbiAgICBsZXQgY2FjaGVkID0gY2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IF9jcmVhdGVSZXNvbHZlcihzY29wZXMsIHByZWZpeGVzKTtcbiAgICAgICAgY2FjaGVkID0ge1xuICAgICAgICAgICAgcmVzb2x2ZXIsXG4gICAgICAgICAgICBzdWJQcmVmaXhlczogcHJlZml4ZXMuZmlsdGVyKChwKT0+IXAudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnaG92ZXInKSlcbiAgICAgICAgfTtcbiAgICAgICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBjYWNoZWQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xufVxuY29uc3QgaGFzRnVuY3Rpb24gPSAodmFsdWUpPT5pc09iamVjdCh2YWx1ZSkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpLnNvbWUoKGtleSk9PmlzRnVuY3Rpb24odmFsdWVba2V5XSkpO1xuZnVuY3Rpb24gbmVlZENvbnRleHQocHJveHksIG5hbWVzKSB7XG4gICAgY29uc3QgeyBpc1NjcmlwdGFibGUgLCBpc0luZGV4YWJsZSAgfSA9IF9kZXNjcmlwdG9ycyhwcm94eSk7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIG5hbWVzKXtcbiAgICAgICAgY29uc3Qgc2NyaXB0YWJsZSA9IGlzU2NyaXB0YWJsZShwcm9wKTtcbiAgICAgICAgY29uc3QgaW5kZXhhYmxlID0gaXNJbmRleGFibGUocHJvcCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGluZGV4YWJsZSB8fCBzY3JpcHRhYmxlKSAmJiBwcm94eVtwcm9wXTtcbiAgICAgICAgaWYgKHNjcmlwdGFibGUgJiYgKGlzRnVuY3Rpb24odmFsdWUpIHx8IGhhc0Z1bmN0aW9uKHZhbHVlKSkgfHwgaW5kZXhhYmxlICYmIGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciB2ZXJzaW9uID0gXCI0LjUuMVwiO1xuXG5jb25zdCBLTk9XTl9QT1NJVElPTlMgPSBbXG4gICAgJ3RvcCcsXG4gICAgJ2JvdHRvbScsXG4gICAgJ2xlZnQnLFxuICAgICdyaWdodCcsXG4gICAgJ2NoYXJ0QXJlYSdcbl07XG5mdW5jdGlvbiBwb3NpdGlvbklzSG9yaXpvbnRhbChwb3NpdGlvbiwgYXhpcykge1xuICAgIHJldHVybiBwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nIHx8IEtOT1dOX1BPU0lUSU9OUy5pbmRleE9mKHBvc2l0aW9uKSA9PT0gLTEgJiYgYXhpcyA9PT0gJ3gnO1xufVxuZnVuY3Rpb24gY29tcGFyZTJMZXZlbChsMSwgbDIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgICAgICByZXR1cm4gYVtsMV0gPT09IGJbbDFdID8gYVtsMl0gLSBiW2wyXSA6IGFbbDFdIC0gYltsMV07XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG9uQW5pbWF0aW9uc0NvbXBsZXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCBjaGFydCA9IGNvbnRleHQuY2hhcnQ7XG4gICAgY29uc3QgYW5pbWF0aW9uT3B0aW9ucyA9IGNoYXJ0Lm9wdGlvbnMuYW5pbWF0aW9uO1xuICAgIGNoYXJ0Lm5vdGlmeVBsdWdpbnMoJ2FmdGVyUmVuZGVyJyk7XG4gICAgY2FsbGJhY2soYW5pbWF0aW9uT3B0aW9ucyAmJiBhbmltYXRpb25PcHRpb25zLm9uQ29tcGxldGUsIFtcbiAgICAgICAgY29udGV4dFxuICAgIF0sIGNoYXJ0KTtcbn1cbmZ1bmN0aW9uIG9uQW5pbWF0aW9uUHJvZ3Jlc3MoY29udGV4dCkge1xuICAgIGNvbnN0IGNoYXJ0ID0gY29udGV4dC5jaGFydDtcbiAgICBjb25zdCBhbmltYXRpb25PcHRpb25zID0gY2hhcnQub3B0aW9ucy5hbmltYXRpb247XG4gICAgY2FsbGJhY2soYW5pbWF0aW9uT3B0aW9ucyAmJiBhbmltYXRpb25PcHRpb25zLm9uUHJvZ3Jlc3MsIFtcbiAgICAgICAgY29udGV4dFxuICAgIF0sIGNoYXJ0KTtcbn1cbiBmdW5jdGlvbiBnZXRDYW52YXMoaXRlbSkge1xuICAgIGlmIChfaXNEb21TdXBwb3J0ZWQoKSAmJiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaXRlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGl0ZW0pO1xuICAgIH0gZWxzZSBpZiAoaXRlbSAmJiBpdGVtLmxlbmd0aCkge1xuICAgICAgICBpdGVtID0gaXRlbVswXTtcbiAgICB9XG4gICAgaWYgKGl0ZW0gJiYgaXRlbS5jYW52YXMpIHtcbiAgICAgICAgaXRlbSA9IGl0ZW0uY2FudmFzO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbn1cbmNvbnN0IGluc3RhbmNlcyA9IHt9O1xuY29uc3QgZ2V0Q2hhcnQgPSAoa2V5KT0+e1xuICAgIGNvbnN0IGNhbnZhcyA9IGdldENhbnZhcyhrZXkpO1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGluc3RhbmNlcykuZmlsdGVyKChjKT0+Yy5jYW52YXMgPT09IGNhbnZhcykucG9wKCk7XG59O1xuZnVuY3Rpb24gbW92ZU51bWVyaWNLZXlzKG9iaiwgc3RhcnQsIG1vdmUpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKXtcbiAgICAgICAgY29uc3QgaW50S2V5ID0gK2tleTtcbiAgICAgICAgaWYgKGludEtleSA+PSBzdGFydCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAgICAgICAgIGlmIChtb3ZlID4gMCB8fCBpbnRLZXkgPiBzdGFydCkge1xuICAgICAgICAgICAgICAgIG9ialtpbnRLZXkgKyBtb3ZlXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIGZ1bmN0aW9uIGRldGVybWluZUxhc3RFdmVudChlLCBsYXN0RXZlbnQsIGluQ2hhcnRBcmVhLCBpc0NsaWNrKSB7XG4gICAgaWYgKCFpbkNoYXJ0QXJlYSB8fCBlLnR5cGUgPT09ICdtb3VzZW91dCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChpc0NsaWNrKSB7XG4gICAgICAgIHJldHVybiBsYXN0RXZlbnQ7XG4gICAgfVxuICAgIHJldHVybiBlO1xufVxuY2xhc3MgQ2hhcnQge1xuICAgIHN0YXRpYyBkZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgIHN0YXRpYyBpbnN0YW5jZXMgPSBpbnN0YW5jZXM7XG4gICAgc3RhdGljIG92ZXJyaWRlcyA9IG92ZXJyaWRlcztcbiAgICBzdGF0aWMgcmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICBzdGF0aWMgdmVyc2lvbiA9IHZlcnNpb247XG4gICAgc3RhdGljIGdldENoYXJ0ID0gZ2V0Q2hhcnQ7XG4gICAgc3RhdGljIHJlZ2lzdGVyKC4uLml0ZW1zKSB7XG4gICAgICAgIHJlZ2lzdHJ5LmFkZCguLi5pdGVtcyk7XG4gICAgICAgIGludmFsaWRhdGVQbHVnaW5zKCk7XG4gICAgfVxuICAgIHN0YXRpYyB1bnJlZ2lzdGVyKC4uLml0ZW1zKSB7XG4gICAgICAgIHJlZ2lzdHJ5LnJlbW92ZSguLi5pdGVtcyk7XG4gICAgICAgIGludmFsaWRhdGVQbHVnaW5zKCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGl0ZW0sIHVzZXJDb25maWcpe1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZyA9IG5ldyBDb25maWcodXNlckNvbmZpZyk7XG4gICAgICAgIGNvbnN0IGluaXRpYWxDYW52YXMgPSBnZXRDYW52YXMoaXRlbSk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ2hhcnQgPSBnZXRDaGFydChpbml0aWFsQ2FudmFzKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQ2hhcnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FudmFzIGlzIGFscmVhZHkgaW4gdXNlLiBDaGFydCB3aXRoIElEIFxcJycgKyBleGlzdGluZ0NoYXJ0LmlkICsgJ1xcJycgKyAnIG11c3QgYmUgZGVzdHJveWVkIGJlZm9yZSB0aGUgY2FudmFzIHdpdGggSUQgXFwnJyArIGV4aXN0aW5nQ2hhcnQuY2FudmFzLmlkICsgJ1xcJyBjYW4gYmUgcmV1c2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoY29uZmlnLmNoYXJ0T3B0aW9uU2NvcGVzKCksIHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IG5ldyAoY29uZmlnLnBsYXRmb3JtIHx8IF9kZXRlY3RQbGF0Zm9ybShpbml0aWFsQ2FudmFzKSkoKTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybS51cGRhdGVDb25maWcoY29uZmlnKTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucGxhdGZvcm0uYWNxdWlyZUNvbnRleHQoaW5pdGlhbENhbnZhcywgb3B0aW9ucy5hc3BlY3RSYXRpbyk7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGNvbnRleHQgJiYgY29udGV4dC5jYW52YXM7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGNhbnZhcyAmJiBjYW52YXMuaGVpZ2h0O1xuICAgICAgICBjb25zdCB3aWR0aCA9IGNhbnZhcyAmJiBjYW52YXMud2lkdGg7XG4gICAgICAgIHRoaXMuaWQgPSB1aWQoKTtcbiAgICAgICAgdGhpcy5jdHggPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuX2FzcGVjdFJhdGlvID0gdGhpcy5hc3BlY3RSYXRpbztcbiAgICAgICAgdGhpcy5fbGF5ZXJzID0gW107XG4gICAgICAgIHRoaXMuX21ldGFzZXRzID0gW107XG4gICAgICAgIHRoaXMuX3N0YWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ib3hlcyA9IFtdO1xuICAgICAgICB0aGlzLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNoYXJ0QXJlYSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gW107XG4gICAgICAgIHRoaXMuX2xhc3RFdmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0ge307XG4gICAgICAgICB0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zb3J0ZWRNZXRhc2V0cyA9IFtdO1xuICAgICAgICB0aGlzLnNjYWxlcyA9IHt9O1xuICAgICAgICB0aGlzLl9wbHVnaW5zID0gbmV3IFBsdWdpblNlcnZpY2UoKTtcbiAgICAgICAgdGhpcy4kcHJveGllcyA9IHt9O1xuICAgICAgICB0aGlzLl9oaWRkZW5JbmRpY2VzID0ge307XG4gICAgICAgIHRoaXMuYXR0YWNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLiRjb250ZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9kb1Jlc2l6ZSA9IGRlYm91bmNlKChtb2RlKT0+dGhpcy51cGRhdGUobW9kZSksIG9wdGlvbnMucmVzaXplRGVsYXkgfHwgMCk7XG4gICAgICAgIHRoaXMuX2RhdGFDaGFuZ2VzID0gW107XG4gICAgICAgIGluc3RhbmNlc1t0aGlzLmlkXSA9IHRoaXM7XG4gICAgICAgIGlmICghY29udGV4dCB8fCAhY2FudmFzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSBjaGFydDogY2FuJ3QgYWNxdWlyZSBjb250ZXh0IGZyb20gdGhlIGdpdmVuIGl0ZW1cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYW5pbWF0b3IubGlzdGVuKHRoaXMsICdjb21wbGV0ZScsIG9uQW5pbWF0aW9uc0NvbXBsZXRlKTtcbiAgICAgICAgYW5pbWF0b3IubGlzdGVuKHRoaXMsICdwcm9ncmVzcycsIG9uQW5pbWF0aW9uUHJvZ3Jlc3MpO1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBhc3BlY3RSYXRpbygpIHtcbiAgICAgICAgY29uc3QgeyBvcHRpb25zOiB7IGFzcGVjdFJhdGlvICwgbWFpbnRhaW5Bc3BlY3RSYXRpbyAgfSAsIHdpZHRoICwgaGVpZ2h0ICwgX2FzcGVjdFJhdGlvICB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmKGFzcGVjdFJhdGlvKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFzcGVjdFJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYWludGFpbkFzcGVjdFJhdGlvICYmIF9hc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgcmV0dXJuIF9hc3BlY3RSYXRpbztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0ID8gd2lkdGggLyBoZWlnaHQgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGE7XG4gICAgfVxuICAgIHNldCBkYXRhKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jb25maWcuZGF0YSA9IGRhdGE7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICB9XG4gICAgc2V0IG9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgICAgICByZXR1cm4gcmVnaXN0cnk7XG4gICAgfVxuIF9pbml0aWFsaXplKCkge1xuICAgICAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZUluaXQnKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZXNwb25zaXZlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0aW5hU2NhbGUodGhpcywgdGhpcy5vcHRpb25zLmRldmljZVBpeGVsUmF0aW8pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVySW5pdCcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGNsZWFyQ2FudmFzKHRoaXMuY2FudmFzLCB0aGlzLmN0eCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBhbmltYXRvci5zdG9wKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKCFhbmltYXRvci5ydW5uaW5nKHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNpemVCZWZvcmVEcmF3ID0ge1xuICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gb3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvICYmIHRoaXMuYXNwZWN0UmF0aW87XG4gICAgICAgIGNvbnN0IG5ld1NpemUgPSB0aGlzLnBsYXRmb3JtLmdldE1heGltdW1TaXplKGNhbnZhcywgd2lkdGgsIGhlaWdodCwgYXNwZWN0UmF0aW8pO1xuICAgICAgICBjb25zdCBuZXdSYXRpbyA9IG9wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbyB8fCB0aGlzLnBsYXRmb3JtLmdldERldmljZVBpeGVsUmF0aW8oKTtcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMud2lkdGggPyAncmVzaXplJyA6ICdhdHRhY2gnO1xuICAgICAgICB0aGlzLndpZHRoID0gbmV3U2l6ZS53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBuZXdTaXplLmhlaWdodDtcbiAgICAgICAgdGhpcy5fYXNwZWN0UmF0aW8gPSB0aGlzLmFzcGVjdFJhdGlvO1xuICAgICAgICBpZiAoIXJldGluYVNjYWxlKHRoaXMsIG5ld1JhdGlvLCB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5UGx1Z2lucygncmVzaXplJywge1xuICAgICAgICAgICAgc2l6ZTogbmV3U2l6ZVxuICAgICAgICB9KTtcbiAgICAgICAgY2FsbGJhY2sob3B0aW9ucy5vblJlc2l6ZSwgW1xuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG5ld1NpemVcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZG9SZXNpemUobW9kZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVuc3VyZVNjYWxlc0hhdmVJRHMoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHNjYWxlc09wdGlvbnMgPSBvcHRpb25zLnNjYWxlcyB8fCB7fTtcbiAgICAgICAgZWFjaChzY2FsZXNPcHRpb25zLCAoYXhpc09wdGlvbnMsIGF4aXNJRCk9PntcbiAgICAgICAgICAgIGF4aXNPcHRpb25zLmlkID0gYXhpc0lEO1xuICAgICAgICB9KTtcbiAgICB9XG4gYnVpbGRPclVwZGF0ZVNjYWxlcygpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3Qgc2NhbGVPcHRzID0gb3B0aW9ucy5zY2FsZXM7XG4gICAgICAgIGNvbnN0IHNjYWxlcyA9IHRoaXMuc2NhbGVzO1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gT2JqZWN0LmtleXMoc2NhbGVzKS5yZWR1Y2UoKG9iaiwgaWQpPT57XG4gICAgICAgICAgICBvYmpbaWRdID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIGxldCBpdGVtcyA9IFtdO1xuICAgICAgICBpZiAoc2NhbGVPcHRzKSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmNvbmNhdChPYmplY3Qua2V5cyhzY2FsZU9wdHMpLm1hcCgoaWQpPT57XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NhbGVPcHRpb25zID0gc2NhbGVPcHRzW2lkXTtcbiAgICAgICAgICAgICAgICBjb25zdCBheGlzID0gZGV0ZXJtaW5lQXhpcyhpZCwgc2NhbGVPcHRpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1JhZGlhbCA9IGF4aXMgPT09ICdyJztcbiAgICAgICAgICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBheGlzID09PSAneCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogc2NhbGVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBkcG9zaXRpb246IGlzUmFkaWFsID8gJ2NoYXJ0QXJlYScgOiBpc0hvcml6b250YWwgPyAnYm90dG9tJyA6ICdsZWZ0JyxcbiAgICAgICAgICAgICAgICAgICAgZHR5cGU6IGlzUmFkaWFsID8gJ3JhZGlhbExpbmVhcicgOiBpc0hvcml6b250YWwgPyAnY2F0ZWdvcnknIDogJ2xpbmVhcidcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVhY2goaXRlbXMsIChpdGVtKT0+e1xuICAgICAgICAgICAgY29uc3Qgc2NhbGVPcHRpb25zID0gaXRlbS5vcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgaWQgPSBzY2FsZU9wdGlvbnMuaWQ7XG4gICAgICAgICAgICBjb25zdCBheGlzID0gZGV0ZXJtaW5lQXhpcyhpZCwgc2NhbGVPcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlVHlwZSA9IHZhbHVlT3JEZWZhdWx0KHNjYWxlT3B0aW9ucy50eXBlLCBpdGVtLmR0eXBlKTtcbiAgICAgICAgICAgIGlmIChzY2FsZU9wdGlvbnMucG9zaXRpb24gPT09IHVuZGVmaW5lZCB8fCBwb3NpdGlvbklzSG9yaXpvbnRhbChzY2FsZU9wdGlvbnMucG9zaXRpb24sIGF4aXMpICE9PSBwb3NpdGlvbklzSG9yaXpvbnRhbChpdGVtLmRwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICBzY2FsZU9wdGlvbnMucG9zaXRpb24gPSBpdGVtLmRwb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZWRbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBzY2FsZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaWQgaW4gc2NhbGVzICYmIHNjYWxlc1tpZF0udHlwZSA9PT0gc2NhbGVUeXBlKSB7XG4gICAgICAgICAgICAgICAgc2NhbGUgPSBzY2FsZXNbaWRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2FsZUNsYXNzID0gcmVnaXN0cnkuZ2V0U2NhbGUoc2NhbGVUeXBlKTtcbiAgICAgICAgICAgICAgICBzY2FsZSA9IG5ldyBzY2FsZUNsYXNzKHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHNjYWxlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgY3R4OiB0aGlzLmN0eCxcbiAgICAgICAgICAgICAgICAgICAgY2hhcnQ6IHRoaXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzY2FsZXNbc2NhbGUuaWRdID0gc2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY2FsZS5pbml0KHNjYWxlT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgICBlYWNoKHVwZGF0ZWQsIChoYXNVcGRhdGVkLCBpZCk9PntcbiAgICAgICAgICAgIGlmICghaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2FsZXNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZWFjaChzY2FsZXMsIChzY2FsZSk9PntcbiAgICAgICAgICAgIGxheW91dHMuY29uZmlndXJlKHRoaXMsIHNjYWxlLCBzY2FsZS5vcHRpb25zKTtcbiAgICAgICAgICAgIGxheW91dHMuYWRkQm94KHRoaXMsIHNjYWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuIF91cGRhdGVNZXRhc2V0cygpIHtcbiAgICAgICAgY29uc3QgbWV0YXNldHMgPSB0aGlzLl9tZXRhc2V0cztcbiAgICAgICAgY29uc3QgbnVtRGF0YSA9IHRoaXMuZGF0YS5kYXRhc2V0cy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG51bU1ldGEgPSBtZXRhc2V0cy5sZW5ndGg7XG4gICAgICAgIG1ldGFzZXRzLnNvcnQoKGEsIGIpPT5hLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICAgIGlmIChudW1NZXRhID4gbnVtRGF0YSkge1xuICAgICAgICAgICAgZm9yKGxldCBpID0gbnVtRGF0YTsgaSA8IG51bU1ldGE7ICsraSl7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveURhdGFzZXRNZXRhKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWV0YXNldHMuc3BsaWNlKG51bURhdGEsIG51bU1ldGEgLSBudW1EYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3J0ZWRNZXRhc2V0cyA9IG1ldGFzZXRzLnNsaWNlKDApLnNvcnQoY29tcGFyZTJMZXZlbCgnb3JkZXInLCAnaW5kZXgnKSk7XG4gICAgfVxuIF9yZW1vdmVVbnJlZmVyZW5jZWRNZXRhc2V0cygpIHtcbiAgICAgICAgY29uc3QgeyBfbWV0YXNldHM6IG1ldGFzZXRzICwgZGF0YTogeyBkYXRhc2V0cyAgfSAgfSA9IHRoaXM7XG4gICAgICAgIGlmIChtZXRhc2V0cy5sZW5ndGggPiBkYXRhc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zdGFja3M7XG4gICAgICAgIH1cbiAgICAgICAgbWV0YXNldHMuZm9yRWFjaCgobWV0YSwgaW5kZXgpPT57XG4gICAgICAgICAgICBpZiAoZGF0YXNldHMuZmlsdGVyKCh4KT0+eCA9PT0gbWV0YS5fZGF0YXNldCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveURhdGFzZXRNZXRhKGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGJ1aWxkT3JVcGRhdGVDb250cm9sbGVycygpIHtcbiAgICAgICAgY29uc3QgbmV3Q29udHJvbGxlcnMgPSBbXTtcbiAgICAgICAgY29uc3QgZGF0YXNldHMgPSB0aGlzLmRhdGEuZGF0YXNldHM7XG4gICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICB0aGlzLl9yZW1vdmVVbnJlZmVyZW5jZWRNZXRhc2V0cygpO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBkYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRzW2ldO1xuICAgICAgICAgICAgbGV0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGRhdGFzZXQudHlwZSB8fCB0aGlzLmNvbmZpZy50eXBlO1xuICAgICAgICAgICAgaWYgKG1ldGEudHlwZSAmJiBtZXRhLnR5cGUgIT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoaSk7XG4gICAgICAgICAgICAgICAgbWV0YSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZXRhLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgbWV0YS5pbmRleEF4aXMgPSBkYXRhc2V0LmluZGV4QXhpcyB8fCBnZXRJbmRleEF4aXModHlwZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgIG1ldGEub3JkZXIgPSBkYXRhc2V0Lm9yZGVyIHx8IDA7XG4gICAgICAgICAgICBtZXRhLmluZGV4ID0gaTtcbiAgICAgICAgICAgIG1ldGEubGFiZWwgPSAnJyArIGRhdGFzZXQubGFiZWw7XG4gICAgICAgICAgICBtZXRhLnZpc2libGUgPSB0aGlzLmlzRGF0YXNldFZpc2libGUoaSk7XG4gICAgICAgICAgICBpZiAobWV0YS5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgbWV0YS5jb250cm9sbGVyLnVwZGF0ZUluZGV4KGkpO1xuICAgICAgICAgICAgICAgIG1ldGEuY29udHJvbGxlci5saW5rU2NhbGVzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IENvbnRyb2xsZXJDbGFzcyA9IHJlZ2lzdHJ5LmdldENvbnRyb2xsZXIodHlwZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhc2V0RWxlbWVudFR5cGUgLCBkYXRhRWxlbWVudFR5cGUgIH0gPSBkZWZhdWx0cy5kYXRhc2V0c1t0eXBlXTtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKENvbnRyb2xsZXJDbGFzcywge1xuICAgICAgICAgICAgICAgICAgICBkYXRhRWxlbWVudFR5cGU6IHJlZ2lzdHJ5LmdldEVsZW1lbnQoZGF0YUVsZW1lbnRUeXBlKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNldEVsZW1lbnRUeXBlOiBkYXRhc2V0RWxlbWVudFR5cGUgJiYgcmVnaXN0cnkuZ2V0RWxlbWVudChkYXRhc2V0RWxlbWVudFR5cGUpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbWV0YS5jb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXJDbGFzcyh0aGlzLCBpKTtcbiAgICAgICAgICAgICAgICBuZXdDb250cm9sbGVycy5wdXNoKG1ldGEuY29udHJvbGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlTWV0YXNldHMoKTtcbiAgICAgICAgcmV0dXJuIG5ld0NvbnRyb2xsZXJzO1xuICAgIH1cbiBfcmVzZXRFbGVtZW50cygpIHtcbiAgICAgICAgZWFjaCh0aGlzLmRhdGEuZGF0YXNldHMsIChkYXRhc2V0LCBkYXRhc2V0SW5kZXgpPT57XG4gICAgICAgICAgICB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCkuY29udHJvbGxlci5yZXNldCgpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICB9XG4gcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0RWxlbWVudHMoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdyZXNldCcpO1xuICAgIH1cbiAgICB1cGRhdGUobW9kZSkge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgICAgY29uZmlnLnVwZGF0ZSgpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fb3B0aW9ucyA9IGNvbmZpZy5jcmVhdGVSZXNvbHZlcihjb25maWcuY2hhcnRPcHRpb25TY29wZXMoKSwgdGhpcy5nZXRDb250ZXh0KCkpO1xuICAgICAgICBjb25zdCBhbmltc0Rpc2FibGVkID0gdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkID0gIW9wdGlvbnMuYW5pbWF0aW9uO1xuICAgICAgICB0aGlzLl91cGRhdGVTY2FsZXMoKTtcbiAgICAgICAgdGhpcy5fY2hlY2tFdmVudEJpbmRpbmdzKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUhpZGRlbkluZGljZXMoKTtcbiAgICAgICAgdGhpcy5fcGx1Z2lucy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZVVwZGF0ZScsIHtcbiAgICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIH0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0NvbnRyb2xsZXJzID0gdGhpcy5idWlsZE9yVXBkYXRlQ29udHJvbGxlcnMoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVFbGVtZW50c1VwZGF0ZScpO1xuICAgICAgICBsZXQgbWluUGFkZGluZyA9IDA7XG4gICAgICAgIGZvcihsZXQgaSA9IDAsIGlsZW4gPSB0aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHsgY29udHJvbGxlciAgfSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoaSk7XG4gICAgICAgICAgICBjb25zdCByZXNldCA9ICFhbmltc0Rpc2FibGVkICYmIG5ld0NvbnRyb2xsZXJzLmluZGV4T2YoY29udHJvbGxlcikgPT09IC0xO1xuICAgICAgICAgICAgY29udHJvbGxlci5idWlsZE9yVXBkYXRlRWxlbWVudHMocmVzZXQpO1xuICAgICAgICAgICAgbWluUGFkZGluZyA9IE1hdGgubWF4KCtjb250cm9sbGVyLmdldE1heE92ZXJmbG93KCksIG1pblBhZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIG1pblBhZGRpbmcgPSB0aGlzLl9taW5QYWRkaW5nID0gb3B0aW9ucy5sYXlvdXQuYXV0b1BhZGRpbmcgPyBtaW5QYWRkaW5nIDogMDtcbiAgICAgICAgdGhpcy5fdXBkYXRlTGF5b3V0KG1pblBhZGRpbmcpO1xuICAgICAgICBpZiAoIWFuaW1zRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGVhY2gobmV3Q29udHJvbGxlcnMsIChjb250cm9sbGVyKT0+e1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVzZXQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZURhdGFzZXRzKG1vZGUpO1xuICAgICAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyVXBkYXRlJywge1xuICAgICAgICAgICAgbW9kZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbGF5ZXJzLnNvcnQoY29tcGFyZTJMZXZlbCgneicsICdfaWR4JykpO1xuICAgICAgICBjb25zdCB7IF9hY3RpdmUgLCBfbGFzdEV2ZW50ICB9ID0gdGhpcztcbiAgICAgICAgaWYgKF9sYXN0RXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcihfbGFzdEV2ZW50LCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChfYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMoX2FjdGl2ZSwgX2FjdGl2ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gX3VwZGF0ZVNjYWxlcygpIHtcbiAgICAgICAgZWFjaCh0aGlzLnNjYWxlcywgKHNjYWxlKT0+e1xuICAgICAgICAgICAgbGF5b3V0cy5yZW1vdmVCb3godGhpcywgc2NhbGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbnN1cmVTY2FsZXNIYXZlSURzKCk7XG4gICAgICAgIHRoaXMuYnVpbGRPclVwZGF0ZVNjYWxlcygpO1xuICAgIH1cbiBfY2hlY2tFdmVudEJpbmRpbmdzKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCBleGlzdGluZ0V2ZW50cyA9IG5ldyBTZXQoT2JqZWN0LmtleXModGhpcy5fbGlzdGVuZXJzKSk7XG4gICAgICAgIGNvbnN0IG5ld0V2ZW50cyA9IG5ldyBTZXQob3B0aW9ucy5ldmVudHMpO1xuICAgICAgICBpZiAoIXNldHNFcXVhbChleGlzdGluZ0V2ZW50cywgbmV3RXZlbnRzKSB8fCAhIXRoaXMuX3Jlc3BvbnNpdmVMaXN0ZW5lcnMgIT09IG9wdGlvbnMucmVzcG9uc2l2ZSkge1xuICAgICAgICAgICAgdGhpcy51bmJpbmRFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICB9XG4gICAgfVxuIF91cGRhdGVIaWRkZW5JbmRpY2VzKCkge1xuICAgICAgICBjb25zdCB7IF9oaWRkZW5JbmRpY2VzICB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2dldFVuaWZvcm1EYXRhQ2hhbmdlcygpIHx8IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHsgbWV0aG9kICwgc3RhcnQgLCBjb3VudCAgfSBvZiBjaGFuZ2VzKXtcbiAgICAgICAgICAgIGNvbnN0IG1vdmUgPSBtZXRob2QgPT09ICdfcmVtb3ZlRWxlbWVudHMnID8gLWNvdW50IDogY291bnQ7XG4gICAgICAgICAgICBtb3ZlTnVtZXJpY0tleXMoX2hpZGRlbkluZGljZXMsIHN0YXJ0LCBtb3ZlKTtcbiAgICAgICAgfVxuICAgIH1cbiBfZ2V0VW5pZm9ybURhdGFDaGFuZ2VzKCkge1xuICAgICAgICBjb25zdCBfZGF0YUNoYW5nZXMgPSB0aGlzLl9kYXRhQ2hhbmdlcztcbiAgICAgICAgaWYgKCFfZGF0YUNoYW5nZXMgfHwgIV9kYXRhQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhQ2hhbmdlcyA9IFtdO1xuICAgICAgICBjb25zdCBkYXRhc2V0Q291bnQgPSB0aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBtYWtlU2V0ID0gKGlkeCk9Pm5ldyBTZXQoX2RhdGFDaGFuZ2VzLmZpbHRlcigoYyk9PmNbMF0gPT09IGlkeCkubWFwKChjLCBpKT0+aSArICcsJyArIGMuc3BsaWNlKDEpLmpvaW4oJywnKSkpO1xuICAgICAgICBjb25zdCBjaGFuZ2VTZXQgPSBtYWtlU2V0KDApO1xuICAgICAgICBmb3IobGV0IGkgPSAxOyBpIDwgZGF0YXNldENvdW50OyBpKyspe1xuICAgICAgICAgICAgaWYgKCFzZXRzRXF1YWwoY2hhbmdlU2V0LCBtYWtlU2V0KGkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShjaGFuZ2VTZXQpLm1hcCgoYyk9PmMuc3BsaXQoJywnKSkubWFwKChhKT0+KHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IGFbMV0sXG4gICAgICAgICAgICAgICAgc3RhcnQ6ICthWzJdLFxuICAgICAgICAgICAgICAgIGNvdW50OiArYVszXVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiBfdXBkYXRlTGF5b3V0KG1pblBhZGRpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMubm90aWZ5UGx1Z2lucygnYmVmb3JlTGF5b3V0Jywge1xuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICB9KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsYXlvdXRzLnVwZGF0ZSh0aGlzLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgbWluUGFkZGluZyk7XG4gICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLmNoYXJ0QXJlYTtcbiAgICAgICAgY29uc3Qgbm9BcmVhID0gYXJlYS53aWR0aCA8PSAwIHx8IGFyZWEuaGVpZ2h0IDw9IDA7XG4gICAgICAgIHRoaXMuX2xheWVycyA9IFtdO1xuICAgICAgICBlYWNoKHRoaXMuYm94ZXMsIChib3gpPT57XG4gICAgICAgICAgICBpZiAobm9BcmVhICYmIGJveC5wb3NpdGlvbiA9PT0gJ2NoYXJ0QXJlYScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYm94LmNvbmZpZ3VyZSkge1xuICAgICAgICAgICAgICAgIGJveC5jb25maWd1cmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xheWVycy5wdXNoKC4uLmJveC5fbGF5ZXJzKCkpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgdGhpcy5fbGF5ZXJzLmZvckVhY2goKGl0ZW0sIGluZGV4KT0+e1xuICAgICAgICAgICAgaXRlbS5faWR4ID0gaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyTGF5b3V0Jyk7XG4gICAgfVxuIF91cGRhdGVEYXRhc2V0cyhtb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZURhdGFzZXRzVXBkYXRlJywge1xuICAgICAgICAgICAgbW9kZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGxldCBpID0gMCwgaWxlbiA9IHRoaXMuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgdGhpcy5nZXREYXRhc2V0TWV0YShpKS5jb250cm9sbGVyLmNvbmZpZ3VyZSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvcihsZXQgaSA9IDAsIGlsZW4gPSB0aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURhdGFzZXQoaSwgaXNGdW5jdGlvbihtb2RlKSA/IG1vZGUoe1xuICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleDogaVxuICAgICAgICAgICAgfSkgOiBtb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyRGF0YXNldHNVcGRhdGUnLCB7XG4gICAgICAgICAgICBtb2RlXG4gICAgICAgIH0pO1xuICAgIH1cbiBfdXBkYXRlRGF0YXNldChpbmRleCwgbW9kZSkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5nZXREYXRhc2V0TWV0YShpbmRleCk7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgICAgICBtZXRhLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBtb2RlLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEYXRhc2V0VXBkYXRlJywgYXJncykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbWV0YS5jb250cm9sbGVyLl91cGRhdGUobW9kZSk7XG4gICAgICAgIGFyZ3MuY2FuY2VsYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyRGF0YXNldFVwZGF0ZScsIGFyZ3MpO1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZVJlbmRlcicsIHtcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFuaW1hdG9yLmhhcyh0aGlzKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXR0YWNoZWQgJiYgIWFuaW1hdG9yLnJ1bm5pbmcodGhpcykpIHtcbiAgICAgICAgICAgICAgICBhbmltYXRvci5zdGFydCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZHJhdygpO1xuICAgICAgICAgICAgb25BbmltYXRpb25zQ29tcGxldGUoe1xuICAgICAgICAgICAgICAgIGNoYXJ0OiB0aGlzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkcmF3KCkge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgaWYgKHRoaXMuX3Jlc2l6ZUJlZm9yZURyYXcpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgd2lkdGggLCBoZWlnaHQgIH0gPSB0aGlzLl9yZXNpemVCZWZvcmVEcmF3O1xuICAgICAgICAgICAgdGhpcy5fcmVzaXplQmVmb3JlRHJhdyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9yZXNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBpZiAodGhpcy53aWR0aCA8PSAwIHx8IHRoaXMuaGVpZ2h0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEcmF3Jywge1xuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICB9KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXllcnMgPSB0aGlzLl9sYXllcnM7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGxheWVycy5sZW5ndGggJiYgbGF5ZXJzW2ldLnogPD0gMDsgKytpKXtcbiAgICAgICAgICAgIGxheWVyc1tpXS5kcmF3KHRoaXMuY2hhcnRBcmVhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kcmF3RGF0YXNldHMoKTtcbiAgICAgICAgZm9yKDsgaSA8IGxheWVycy5sZW5ndGg7ICsraSl7XG4gICAgICAgICAgICBsYXllcnNbaV0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckRyYXcnKTtcbiAgICB9XG4gX2dldFNvcnRlZERhdGFzZXRNZXRhcyhmaWx0ZXJWaXNpYmxlKSB7XG4gICAgICAgIGNvbnN0IG1ldGFzZXRzID0gdGhpcy5fc29ydGVkTWV0YXNldHM7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgaSwgaWxlbjtcbiAgICAgICAgZm9yKGkgPSAwLCBpbGVuID0gbWV0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhc2V0c1tpXTtcbiAgICAgICAgICAgIGlmICghZmlsdGVyVmlzaWJsZSB8fCBtZXRhLnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtZXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiBnZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKHRydWUpO1xuICAgIH1cbiBfZHJhd0RhdGFzZXRzKCkge1xuICAgICAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEYXRhc2V0c0RyYXcnLCB7XG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIH0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFzZXRzID0gdGhpcy5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7XG4gICAgICAgIGZvcihsZXQgaSA9IG1ldGFzZXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKXtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdEYXRhc2V0KG1ldGFzZXRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyRGF0YXNldHNEcmF3Jyk7XG4gICAgfVxuIF9kcmF3RGF0YXNldChtZXRhKSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgICAgICBjb25zdCBhcmdzID0ge1xuICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgIGluZGV4OiBtZXRhLmluZGV4LFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjbGlwID0gZ2V0RGF0YXNldENsaXBBcmVhKHRoaXMsIG1ldGEpO1xuICAgICAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEYXRhc2V0RHJhdycsIGFyZ3MpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGlwKSB7XG4gICAgICAgICAgICBjbGlwQXJlYShjdHgsIGNsaXApO1xuICAgICAgICB9XG4gICAgICAgIG1ldGEuY29udHJvbGxlci5kcmF3KCk7XG4gICAgICAgIGlmIChjbGlwKSB7XG4gICAgICAgICAgICB1bmNsaXBBcmVhKGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgYXJncy5jYW5jZWxhYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJEYXRhc2V0RHJhdycsIGFyZ3MpO1xuICAgIH1cbiBpc1BvaW50SW5BcmVhKHBvaW50KSB7XG4gICAgICAgIHJldHVybiBfaXNQb2ludEluQXJlYShwb2ludCwgdGhpcy5jaGFydEFyZWEsIHRoaXMuX21pblBhZGRpbmcpO1xuICAgIH1cbiAgICBnZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKGUsIG1vZGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gSW50ZXJhY3Rpb24ubW9kZXNbbW9kZV07XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kKHRoaXMsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KSB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XTtcbiAgICAgICAgY29uc3QgbWV0YXNldHMgPSB0aGlzLl9tZXRhc2V0cztcbiAgICAgICAgbGV0IG1ldGEgPSBtZXRhc2V0cy5maWx0ZXIoKHgpPT54ICYmIHguX2RhdGFzZXQgPT09IGRhdGFzZXQpLnBvcCgpO1xuICAgICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgICAgIG1ldGEgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogbnVsbCxcbiAgICAgICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgICAgICBkYXRhc2V0OiBudWxsLFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgaGlkZGVuOiBudWxsLFxuICAgICAgICAgICAgICAgIHhBeGlzSUQ6IG51bGwsXG4gICAgICAgICAgICAgICAgeUF4aXNJRDogbnVsbCxcbiAgICAgICAgICAgICAgICBvcmRlcjogZGF0YXNldCAmJiBkYXRhc2V0Lm9yZGVyIHx8IDAsXG4gICAgICAgICAgICAgICAgaW5kZXg6IGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICBfZGF0YXNldDogZGF0YXNldCxcbiAgICAgICAgICAgICAgICBfcGFyc2VkOiBbXSxcbiAgICAgICAgICAgICAgICBfc29ydGVkOiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1ldGFzZXRzLnB1c2gobWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGE7XG4gICAgfVxuICAgIGdldENvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRjb250ZXh0IHx8ICh0aGlzLiRjb250ZXh0ID0gY3JlYXRlQ29udGV4dChudWxsLCB7XG4gICAgICAgICAgICBjaGFydDogdGhpcyxcbiAgICAgICAgICAgIHR5cGU6ICdjaGFydCdcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXRWaXNpYmxlRGF0YXNldENvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCkubGVuZ3RoO1xuICAgIH1cbiAgICBpc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkge1xuICAgICAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF07XG4gICAgICAgIGlmICghZGF0YXNldCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbWV0YS5oaWRkZW4gPT09ICdib29sZWFuJyA/ICFtZXRhLmhpZGRlbiA6ICFkYXRhc2V0LmhpZGRlbjtcbiAgICB9XG4gICAgc2V0RGF0YXNldFZpc2liaWxpdHkoZGF0YXNldEluZGV4LCB2aXNpYmxlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG4gICAgICAgIG1ldGEuaGlkZGVuID0gIXZpc2libGU7XG4gICAgfVxuICAgIHRvZ2dsZURhdGFWaXNpYmlsaXR5KGluZGV4KSB7XG4gICAgICAgIHRoaXMuX2hpZGRlbkluZGljZXNbaW5kZXhdID0gIXRoaXMuX2hpZGRlbkluZGljZXNbaW5kZXhdO1xuICAgIH1cbiAgICBnZXREYXRhVmlzaWJpbGl0eShpbmRleCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2hpZGRlbkluZGljZXNbaW5kZXhdO1xuICAgIH1cbiBfdXBkYXRlVmlzaWJpbGl0eShkYXRhc2V0SW5kZXgsIGRhdGFJbmRleCwgdmlzaWJsZSkge1xuICAgICAgICBjb25zdCBtb2RlID0gdmlzaWJsZSA/ICdzaG93JyA6ICdoaWRlJztcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcbiAgICAgICAgY29uc3QgYW5pbXMgPSBtZXRhLmNvbnRyb2xsZXIuX3Jlc29sdmVBbmltYXRpb25zKHVuZGVmaW5lZCwgbW9kZSk7XG4gICAgICAgIGlmIChkZWZpbmVkKGRhdGFJbmRleCkpIHtcbiAgICAgICAgICAgIG1ldGEuZGF0YVtkYXRhSW5kZXhdLmhpZGRlbiA9ICF2aXNpYmxlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YXNldFZpc2liaWxpdHkoZGF0YXNldEluZGV4LCB2aXNpYmxlKTtcbiAgICAgICAgICAgIGFuaW1zLnVwZGF0ZShtZXRhLCB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgoY3R4KT0+Y3R4LmRhdGFzZXRJbmRleCA9PT0gZGF0YXNldEluZGV4ID8gbW9kZSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGlkZShkYXRhc2V0SW5kZXgsIGRhdGFJbmRleCkge1xuICAgICAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5KGRhdGFzZXRJbmRleCwgZGF0YUluZGV4LCBmYWxzZSk7XG4gICAgfVxuICAgIHNob3coZGF0YXNldEluZGV4LCBkYXRhSW5kZXgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlVmlzaWJpbGl0eShkYXRhc2V0SW5kZXgsIGRhdGFJbmRleCwgdHJ1ZSk7XG4gICAgfVxuIF9kZXN0cm95RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tZXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xuICAgICAgICBpZiAobWV0YSAmJiBtZXRhLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIG1ldGEuY29udHJvbGxlci5fZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tZXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xuICAgIH1cbiAgICBfc3RvcCgpIHtcbiAgICAgICAgbGV0IGksIGlsZW47XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICBhbmltYXRvci5yZW1vdmUodGhpcyk7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IHRoaXMuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgdGhpcy5fZGVzdHJveURhdGFzZXRNZXRhKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYmVmb3JlRGVzdHJveScpO1xuICAgICAgICBjb25zdCB7IGNhbnZhcyAsIGN0eCAgfSA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3N0b3AoKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2xlYXJDYWNoZSgpO1xuICAgICAgICBpZiAoY2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuICAgICAgICAgICAgY2xlYXJDYW52YXMoY2FudmFzLCBjdHgpO1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybS5yZWxlYXNlQ29udGV4dChjdHgpO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jdHggPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBpbnN0YW5jZXNbdGhpcy5pZF07XG4gICAgICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJEZXN0cm95Jyk7XG4gICAgfVxuICAgIHRvQmFzZTY0SW1hZ2UoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMudG9EYXRhVVJMKC4uLmFyZ3MpO1xuICAgIH1cbiBiaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLmJpbmRVc2VyRXZlbnRzKCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZSkge1xuICAgICAgICAgICAgdGhpcy5iaW5kUmVzcG9uc2l2ZUV2ZW50cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gYmluZFVzZXJFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcbiAgICAgICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgICAgICBjb25zdCBfYWRkID0gKHR5cGUsIGxpc3RlbmVyKT0+e1xuICAgICAgICAgICAgcGxhdGZvcm0uYWRkRXZlbnRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZSwgeCwgeSk9PntcbiAgICAgICAgICAgIGUub2Zmc2V0WCA9IHg7XG4gICAgICAgICAgICBlLm9mZnNldFkgPSB5O1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyKGUpO1xuICAgICAgICB9O1xuICAgICAgICBlYWNoKHRoaXMub3B0aW9ucy5ldmVudHMsICh0eXBlKT0+X2FkZCh0eXBlLCBsaXN0ZW5lcikpO1xuICAgIH1cbiBiaW5kUmVzcG9uc2l2ZUV2ZW50cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycztcbiAgICAgICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgICAgICBjb25zdCBfYWRkID0gKHR5cGUsIGxpc3RlbmVyKT0+e1xuICAgICAgICAgICAgcGxhdGZvcm0uYWRkRXZlbnRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgX3JlbW92ZSA9ICh0eXBlLCBsaXN0ZW5lcik9PntcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgICAgICAgICBwbGF0Zm9ybS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgbGlzdGVuZXJzW3R5cGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9ICh3aWR0aCwgaGVpZ2h0KT0+e1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxldCBkZXRhY2hlZDtcbiAgICAgICAgY29uc3QgYXR0YWNoZWQgPSAoKT0+e1xuICAgICAgICAgICAgX3JlbW92ZSgnYXR0YWNoJywgYXR0YWNoZWQpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICAgICAgX2FkZCgncmVzaXplJywgbGlzdGVuZXIpO1xuICAgICAgICAgICAgX2FkZCgnZGV0YWNoJywgZGV0YWNoZWQpO1xuICAgICAgICB9O1xuICAgICAgICBkZXRhY2hlZCA9ICgpPT57XG4gICAgICAgICAgICB0aGlzLmF0dGFjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICBfcmVtb3ZlKCdyZXNpemUnLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICB0aGlzLl9zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9yZXNpemUoMCwgMCk7XG4gICAgICAgICAgICBfYWRkKCdhdHRhY2gnLCBhdHRhY2hlZCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChwbGF0Zm9ybS5pc0F0dGFjaGVkKHRoaXMuY2FudmFzKSkge1xuICAgICAgICAgICAgYXR0YWNoZWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gdW5iaW5kRXZlbnRzKCkge1xuICAgICAgICBlYWNoKHRoaXMuX2xpc3RlbmVycywgKGxpc3RlbmVyLCB0eXBlKT0+e1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuICAgICAgICBlYWNoKHRoaXMuX3Jlc3BvbnNpdmVMaXN0ZW5lcnMsIChsaXN0ZW5lciwgdHlwZSk9PntcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB1cGRhdGVIb3ZlclN0eWxlKGl0ZW1zLCBtb2RlLCBlbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGVuYWJsZWQgPyAnc2V0JyA6ICdyZW1vdmUnO1xuICAgICAgICBsZXQgbWV0YSwgaXRlbSwgaSwgaWxlbjtcbiAgICAgICAgaWYgKG1vZGUgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICAgICAgbWV0YSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoaXRlbXNbMF0uZGF0YXNldEluZGV4KTtcbiAgICAgICAgICAgIG1ldGEuY29udHJvbGxlclsnXycgKyBwcmVmaXggKyAnRGF0YXNldEhvdmVyU3R5bGUnXSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyID0gaXRlbSAmJiB0aGlzLmdldERhdGFzZXRNZXRhKGl0ZW0uZGF0YXNldEluZGV4KS5jb250cm9sbGVyO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyW3ByZWZpeCArICdIb3ZlclN0eWxlJ10oaXRlbS5lbGVtZW50LCBpdGVtLmRhdGFzZXRJbmRleCwgaXRlbS5pbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gZ2V0QWN0aXZlRWxlbWVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmUgfHwgW107XG4gICAgfVxuIHNldEFjdGl2ZUVsZW1lbnRzKGFjdGl2ZUVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGxhc3RBY3RpdmUgPSB0aGlzLl9hY3RpdmUgfHwgW107XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZUVsZW1lbnRzLm1hcCgoeyBkYXRhc2V0SW5kZXggLCBpbmRleCAgfSk9PntcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG4gICAgICAgICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGFzZXQgZm91bmQgYXQgaW5kZXggJyArIGRhdGFzZXRJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBtZXRhLmRhdGFbaW5kZXhdLFxuICAgICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9ICFfZWxlbWVudHNFcXVhbChhY3RpdmUsIGxhc3RBY3RpdmUpO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5fbGFzdEV2ZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUhvdmVyU3R5bGVzKGFjdGl2ZSwgbGFzdEFjdGl2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gbm90aWZ5UGx1Z2lucyhob29rLCBhcmdzLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsdWdpbnMubm90aWZ5KHRoaXMsIGhvb2ssIGFyZ3MsIGZpbHRlcik7XG4gICAgfVxuIGlzUGx1Z2luRW5hYmxlZChwbHVnaW5JZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGx1Z2lucy5fY2FjaGUuZmlsdGVyKChwKT0+cC5wbHVnaW4uaWQgPT09IHBsdWdpbklkKS5sZW5ndGggPT09IDE7XG4gICAgfVxuIF91cGRhdGVIb3ZlclN0eWxlcyhhY3RpdmUsIGxhc3RBY3RpdmUsIHJlcGxheSkge1xuICAgICAgICBjb25zdCBob3Zlck9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuaG92ZXI7XG4gICAgICAgIGNvbnN0IGRpZmYgPSAoYSwgYik9PmEuZmlsdGVyKCh4KT0+IWIuc29tZSgoeSk9PnguZGF0YXNldEluZGV4ID09PSB5LmRhdGFzZXRJbmRleCAmJiB4LmluZGV4ID09PSB5LmluZGV4KSk7XG4gICAgICAgIGNvbnN0IGRlYWN0aXZhdGVkID0gZGlmZihsYXN0QWN0aXZlLCBhY3RpdmUpO1xuICAgICAgICBjb25zdCBhY3RpdmF0ZWQgPSByZXBsYXkgPyBhY3RpdmUgOiBkaWZmKGFjdGl2ZSwgbGFzdEFjdGl2ZSk7XG4gICAgICAgIGlmIChkZWFjdGl2YXRlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSG92ZXJTdHlsZShkZWFjdGl2YXRlZCwgaG92ZXJPcHRpb25zLm1vZGUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aXZhdGVkLmxlbmd0aCAmJiBob3Zlck9wdGlvbnMubW9kZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVIb3ZlclN0eWxlKGFjdGl2YXRlZCwgaG92ZXJPcHRpb25zLm1vZGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuIF9ldmVudEhhbmRsZXIoZSwgcmVwbGF5KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgICAgICBldmVudDogZSxcbiAgICAgICAgICAgIHJlcGxheSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgICBpbkNoYXJ0QXJlYTogdGhpcy5pc1BvaW50SW5BcmVhKGUpXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gKHBsdWdpbik9PihwbHVnaW4ub3B0aW9ucy5ldmVudHMgfHwgdGhpcy5vcHRpb25zLmV2ZW50cykuaW5jbHVkZXMoZS5uYXRpdmUudHlwZSk7XG4gICAgICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZUV2ZW50JywgYXJncywgZXZlbnRGaWx0ZXIpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl9oYW5kbGVFdmVudChlLCByZXBsYXksIGFyZ3MuaW5DaGFydEFyZWEpO1xuICAgICAgICBhcmdzLmNhbmNlbGFibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckV2ZW50JywgYXJncywgZXZlbnRGaWx0ZXIpO1xuICAgICAgICBpZiAoY2hhbmdlZCB8fCBhcmdzLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuIF9oYW5kbGVFdmVudChlLCByZXBsYXksIGluQ2hhcnRBcmVhKSB7XG4gICAgICAgIGNvbnN0IHsgX2FjdGl2ZTogbGFzdEFjdGl2ZSA9IFtdICwgb3B0aW9ucyAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHVzZUZpbmFsUG9zaXRpb24gPSByZXBsYXk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW1lbnRzKGUsIGxhc3RBY3RpdmUsIGluQ2hhcnRBcmVhLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgaXNDbGljayA9IF9pc0NsaWNrRXZlbnQoZSk7XG4gICAgICAgIGNvbnN0IGxhc3RFdmVudCA9IGRldGVybWluZUxhc3RFdmVudChlLCB0aGlzLl9sYXN0RXZlbnQsIGluQ2hhcnRBcmVhLCBpc0NsaWNrKTtcbiAgICAgICAgaWYgKGluQ2hhcnRBcmVhKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucy5vbkhvdmVyLCBbXG4gICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgICBhY3RpdmUsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgICAgICBpZiAoaXNDbGljaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMub25DbGljaywgW1xuICAgICAgICAgICAgICAgICAgICBlLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFuZ2VkID0gIV9lbGVtZW50c0VxdWFsKGFjdGl2ZSwgbGFzdEFjdGl2ZSk7XG4gICAgICAgIGlmIChjaGFuZ2VkIHx8IHJlcGxheSkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMoYWN0aXZlLCBsYXN0QWN0aXZlLCByZXBsYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xhc3RFdmVudCA9IGxhc3RFdmVudDtcbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuIF9nZXRBY3RpdmVFbGVtZW50cyhlLCBsYXN0QWN0aXZlLCBpbkNoYXJ0QXJlYSwgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2VvdXQnKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbkNoYXJ0QXJlYSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3RBY3RpdmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG92ZXJPcHRpb25zID0gdGhpcy5vcHRpb25zLmhvdmVyO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKGUsIGhvdmVyT3B0aW9ucy5tb2RlLCBob3Zlck9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGludmFsaWRhdGVQbHVnaW5zKCkge1xuICAgIHJldHVybiBlYWNoKENoYXJ0Lmluc3RhbmNlcywgKGNoYXJ0KT0+Y2hhcnQuX3BsdWdpbnMuaW52YWxpZGF0ZSgpKTtcbn1cblxuZnVuY3Rpb24gY2xpcFNlbGYoY3R4LCBlbGVtZW50LCBlbmRBbmdsZSkge1xuICAgIGNvbnN0IHsgc3RhcnRBbmdsZSAsIHggLCB5ICwgb3V0ZXJSYWRpdXMgLCBpbm5lclJhZGl1cyAsIG9wdGlvbnMgIH0gPSBlbGVtZW50O1xuICAgIGNvbnN0IHsgYm9yZGVyV2lkdGggLCBib3JkZXJKb2luU3R5bGUgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG91dGVyQW5nbGVDbGlwID0gTWF0aC5taW4oYm9yZGVyV2lkdGggLyBvdXRlclJhZGl1cywgX25vcm1hbGl6ZUFuZ2xlKHN0YXJ0QW5nbGUgLSBlbmRBbmdsZSkpO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHguYXJjKHgsIHksIG91dGVyUmFkaXVzIC0gYm9yZGVyV2lkdGggLyAyLCBzdGFydEFuZ2xlICsgb3V0ZXJBbmdsZUNsaXAgLyAyLCBlbmRBbmdsZSAtIG91dGVyQW5nbGVDbGlwIC8gMik7XG4gICAgaWYgKGlubmVyUmFkaXVzID4gMCkge1xuICAgICAgICBjb25zdCBpbm5lckFuZ2xlQ2xpcCA9IE1hdGgubWluKGJvcmRlcldpZHRoIC8gaW5uZXJSYWRpdXMsIF9ub3JtYWxpemVBbmdsZShzdGFydEFuZ2xlIC0gZW5kQW5nbGUpKTtcbiAgICAgICAgY3R4LmFyYyh4LCB5LCBpbm5lclJhZGl1cyArIGJvcmRlcldpZHRoIC8gMiwgZW5kQW5nbGUgLSBpbm5lckFuZ2xlQ2xpcCAvIDIsIHN0YXJ0QW5nbGUgKyBpbm5lckFuZ2xlQ2xpcCAvIDIsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNsaXBXaWR0aCA9IE1hdGgubWluKGJvcmRlcldpZHRoIC8gMiwgb3V0ZXJSYWRpdXMgKiBfbm9ybWFsaXplQW5nbGUoc3RhcnRBbmdsZSAtIGVuZEFuZ2xlKSk7XG4gICAgICAgIGlmIChib3JkZXJKb2luU3R5bGUgPT09ICdyb3VuZCcpIHtcbiAgICAgICAgICAgIGN0eC5hcmMoeCwgeSwgY2xpcFdpZHRoLCBlbmRBbmdsZSAtIFBJIC8gMiwgc3RhcnRBbmdsZSArIFBJIC8gMiwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoYm9yZGVySm9pblN0eWxlID09PSAnYmV2ZWwnKSB7XG4gICAgICAgICAgICBjb25zdCByID0gMiAqIGNsaXBXaWR0aCAqIGNsaXBXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGVuZFggPSAtciAqIE1hdGguY29zKGVuZEFuZ2xlICsgUEkgLyAyKSArIHg7XG4gICAgICAgICAgICBjb25zdCBlbmRZID0gLXIgKiBNYXRoLnNpbihlbmRBbmdsZSArIFBJIC8gMikgKyB5O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRYID0gciAqIE1hdGguY29zKHN0YXJ0QW5nbGUgKyBQSSAvIDIpICsgeDtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0WSA9IHIgKiBNYXRoLnNpbihzdGFydEFuZ2xlICsgUEkgLyAyKSArIHk7XG4gICAgICAgICAgICBjdHgubGluZVRvKGVuZFgsIGVuZFkpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyhzdGFydFgsIHN0YXJ0WSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGN0eC5tb3ZlVG8oMCwgMCk7XG4gICAgY3R4LnJlY3QoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIGN0eC5jbGlwKCdldmVub2RkJyk7XG59XG5mdW5jdGlvbiBjbGlwQXJjKGN0eCwgZWxlbWVudCwgZW5kQW5nbGUpIHtcbiAgICBjb25zdCB7IHN0YXJ0QW5nbGUgLCBwaXhlbE1hcmdpbiAsIHggLCB5ICwgb3V0ZXJSYWRpdXMgLCBpbm5lclJhZGl1cyAgfSA9IGVsZW1lbnQ7XG4gICAgbGV0IGFuZ2xlTWFyZ2luID0gcGl4ZWxNYXJnaW4gLyBvdXRlclJhZGl1cztcbiAgICAvLyBEcmF3IGFuIGlubmVyIGJvcmRlciBieSBjbGlwcGluZyB0aGUgYXJjIGFuZCBkcmF3aW5nIGEgZG91YmxlLXdpZHRoIGJvcmRlclxuICAgIC8vIEVubGFyZ2UgdGhlIGNsaXBwaW5nIGFyYyBieSAwLjMzIHBpeGVscyB0byBlbGltaW5hdGUgZ2xpdGNoZXMgYmV0d2VlbiBib3JkZXJzXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGN0eC5hcmMoeCwgeSwgb3V0ZXJSYWRpdXMsIHN0YXJ0QW5nbGUgLSBhbmdsZU1hcmdpbiwgZW5kQW5nbGUgKyBhbmdsZU1hcmdpbik7XG4gICAgaWYgKGlubmVyUmFkaXVzID4gcGl4ZWxNYXJnaW4pIHtcbiAgICAgICAgYW5nbGVNYXJnaW4gPSBwaXhlbE1hcmdpbiAvIGlubmVyUmFkaXVzO1xuICAgICAgICBjdHguYXJjKHgsIHksIGlubmVyUmFkaXVzLCBlbmRBbmdsZSArIGFuZ2xlTWFyZ2luLCBzdGFydEFuZ2xlIC0gYW5nbGVNYXJnaW4sIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eC5hcmMoeCwgeSwgcGl4ZWxNYXJnaW4sIGVuZEFuZ2xlICsgSEFMRl9QSSwgc3RhcnRBbmdsZSAtIEhBTEZfUEkpO1xuICAgIH1cbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgY3R4LmNsaXAoKTtcbn1cbmZ1bmN0aW9uIHRvUmFkaXVzQ29ybmVycyh2YWx1ZSkge1xuICAgIHJldHVybiBfcmVhZFZhbHVlVG9Qcm9wcyh2YWx1ZSwgW1xuICAgICAgICAnb3V0ZXJTdGFydCcsXG4gICAgICAgICdvdXRlckVuZCcsXG4gICAgICAgICdpbm5lclN0YXJ0JyxcbiAgICAgICAgJ2lubmVyRW5kJ1xuICAgIF0pO1xufVxuLyoqXG4gKiBQYXJzZSBib3JkZXIgcmFkaXVzIGZyb20gdGhlIHByb3ZpZGVkIG9wdGlvbnNcbiAqLyBmdW5jdGlvbiBwYXJzZUJvcmRlclJhZGl1cyQxKGFyYywgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBhbmdsZURlbHRhKSB7XG4gICAgY29uc3QgbyA9IHRvUmFkaXVzQ29ybmVycyhhcmMub3B0aW9ucy5ib3JkZXJSYWRpdXMpO1xuICAgIGNvbnN0IGhhbGZUaGlja25lc3MgPSAob3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cykgLyAyO1xuICAgIGNvbnN0IGlubmVyTGltaXQgPSBNYXRoLm1pbihoYWxmVGhpY2tuZXNzLCBhbmdsZURlbHRhICogaW5uZXJSYWRpdXMgLyAyKTtcbiAgICAvLyBPdXRlciBsaW1pdHMgYXJlIGNvbXBsaWNhdGVkLiBXZSB3YW50IHRvIGNvbXB1dGUgdGhlIGF2YWlsYWJsZSBhbmd1bGFyIGRpc3RhbmNlIGF0XG4gICAgLy8gYSByYWRpdXMgb2Ygb3V0ZXJSYWRpdXMgLSBib3JkZXJSYWRpdXMgYmVjYXVzZSBmb3Igc21hbGwgYW5ndWxhciBkaXN0YW5jZXMsIHRoaXMgdGVybSBsaW1pdHMuXG4gICAgLy8gV2UgY29tcHV0ZSBhdCByID0gb3V0ZXJSYWRpdXMgLSBib3JkZXJSYWRpdXMgYmVjYXVzZSB0aGlzIGNpcmNsZSBkZWZpbmVzIHRoZSBjZW50ZXIgb2YgdGhlIGJvcmRlciBjb3JuZXJzLlxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGJvcmRlclJhZGl1cyBpcyBsYXJnZSwgdGhhdCB2YWx1ZSBjYW4gYmVjb21lIG5lZ2F0aXZlLlxuICAgIC8vIFRoaXMgY2F1c2VzIHRoZSBvdXRlciBib3JkZXJzIHRvIGxvc2UgdGhlaXIgcmFkaXVzIGVudGlyZWx5LCB3aGljaCBpcyByYXRoZXIgdW5leHBlY3RlZC4gVG8gc29sdmUgdGhhdCwgaWYgYm9yZGVyUmFkaXVzID4gb3V0ZXJSYWRpdXNcbiAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIHRoaWNrbmVzcyB0ZXJtIHdpbGwgZG9taW5hdGUgYW5kIGNvbXB1dGUgdGhlIGxpbWl0cyBhdCB0aGF0IHBvaW50XG4gICAgY29uc3QgY29tcHV0ZU91dGVyTGltaXQgPSAodmFsKT0+e1xuICAgICAgICBjb25zdCBvdXRlckFyY0xpbWl0ID0gKG91dGVyUmFkaXVzIC0gTWF0aC5taW4oaGFsZlRoaWNrbmVzcywgdmFsKSkgKiBhbmdsZURlbHRhIC8gMjtcbiAgICAgICAgcmV0dXJuIF9saW1pdFZhbHVlKHZhbCwgMCwgTWF0aC5taW4oaGFsZlRoaWNrbmVzcywgb3V0ZXJBcmNMaW1pdCkpO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3V0ZXJTdGFydDogY29tcHV0ZU91dGVyTGltaXQoby5vdXRlclN0YXJ0KSxcbiAgICAgICAgb3V0ZXJFbmQ6IGNvbXB1dGVPdXRlckxpbWl0KG8ub3V0ZXJFbmQpLFxuICAgICAgICBpbm5lclN0YXJ0OiBfbGltaXRWYWx1ZShvLmlubmVyU3RhcnQsIDAsIGlubmVyTGltaXQpLFxuICAgICAgICBpbm5lckVuZDogX2xpbWl0VmFsdWUoby5pbm5lckVuZCwgMCwgaW5uZXJMaW1pdClcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0IChyLCDwnZyDKSB0byAoeCwgeSlcbiAqLyBmdW5jdGlvbiByVGhldGFUb1hZKHIsIHRoZXRhLCB4LCB5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCArIHIgKiBNYXRoLmNvcyh0aGV0YSksXG4gICAgICAgIHk6IHkgKyByICogTWF0aC5zaW4odGhldGEpXG4gICAgfTtcbn1cbi8qKlxuICogUGF0aCB0aGUgYXJjLCByZXNwZWN0aW5nIGJvcmRlciByYWRpdXMgYnkgc2VwYXJhdGluZyBpbnRvIGxlZnQgYW5kIHJpZ2h0IGhhbHZlcy5cbiAqXG4gKiAgIFN0YXJ0ICAgICAgRW5kXG4gKlxuICogICAgMS0tLT5hLS0tPjIgICAgT3V0ZXJcbiAqICAgLyAgICAgICAgICAgXFxcbiAqICAgOCAgICAgICAgICAgM1xuICogICB8ICAgICAgICAgICB8XG4gKiAgIHwgICAgICAgICAgIHxcbiAqICAgNyAgICAgICAgICAgNFxuICogICBcXCAgICAgICAgICAgL1xuICogICAgNjwtLS1iPC0tLTUgICAgSW5uZXJcbiAqLyBmdW5jdGlvbiBwYXRoQXJjKGN0eCwgZWxlbWVudCwgb2Zmc2V0LCBzcGFjaW5nLCBlbmQsIGNpcmN1bGFyKSB7XG4gICAgY29uc3QgeyB4ICwgeSAsIHN0YXJ0QW5nbGU6IHN0YXJ0ICwgcGl4ZWxNYXJnaW4gLCBpbm5lclJhZGl1czogaW5uZXJSICB9ID0gZWxlbWVudDtcbiAgICBjb25zdCBvdXRlclJhZGl1cyA9IE1hdGgubWF4KGVsZW1lbnQub3V0ZXJSYWRpdXMgKyBzcGFjaW5nICsgb2Zmc2V0IC0gcGl4ZWxNYXJnaW4sIDApO1xuICAgIGNvbnN0IGlubmVyUmFkaXVzID0gaW5uZXJSID4gMCA/IGlubmVyUiArIHNwYWNpbmcgKyBvZmZzZXQgKyBwaXhlbE1hcmdpbiA6IDA7XG4gICAgbGV0IHNwYWNpbmdPZmZzZXQgPSAwO1xuICAgIGNvbnN0IGFscGhhID0gZW5kIC0gc3RhcnQ7XG4gICAgaWYgKHNwYWNpbmcpIHtcbiAgICAgICAgLy8gV2hlbiBzcGFjaW5nIGlzIHByZXNlbnQsIGl0IGlzIHRoZSBzYW1lIGZvciBhbGwgaXRlbXNcbiAgICAgICAgLy8gU28gd2UgYWRqdXN0IHRoZSBzdGFydCBhbmQgZW5kIGFuZ2xlIG9mIHRoZSBhcmMgc3VjaCB0aGF0XG4gICAgICAgIC8vIHRoZSBkaXN0YW5jZSBpcyB0aGUgc2FtZSBhcyBpdCB3b3VsZCBiZSB3aXRob3V0IHRoZSBzcGFjaW5nXG4gICAgICAgIGNvbnN0IG5vU3BhY2luZ0lubmVyUmFkaXVzID0gaW5uZXJSID4gMCA/IGlubmVyUiAtIHNwYWNpbmcgOiAwO1xuICAgICAgICBjb25zdCBub1NwYWNpbmdPdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzID4gMCA/IG91dGVyUmFkaXVzIC0gc3BhY2luZyA6IDA7XG4gICAgICAgIGNvbnN0IGF2Tm9nU3BhY2luZ1JhZGl1cyA9IChub1NwYWNpbmdJbm5lclJhZGl1cyArIG5vU3BhY2luZ091dGVyUmFkaXVzKSAvIDI7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkQW5nbGUgPSBhdk5vZ1NwYWNpbmdSYWRpdXMgIT09IDAgPyBhbHBoYSAqIGF2Tm9nU3BhY2luZ1JhZGl1cyAvIChhdk5vZ1NwYWNpbmdSYWRpdXMgKyBzcGFjaW5nKSA6IGFscGhhO1xuICAgICAgICBzcGFjaW5nT2Zmc2V0ID0gKGFscGhhIC0gYWRqdXN0ZWRBbmdsZSkgLyAyO1xuICAgIH1cbiAgICBjb25zdCBiZXRhID0gTWF0aC5tYXgoMC4wMDEsIGFscGhhICogb3V0ZXJSYWRpdXMgLSBvZmZzZXQgLyBQSSkgLyBvdXRlclJhZGl1cztcbiAgICBjb25zdCBhbmdsZU9mZnNldCA9IChhbHBoYSAtIGJldGEpIC8gMjtcbiAgICBjb25zdCBzdGFydEFuZ2xlID0gc3RhcnQgKyBhbmdsZU9mZnNldCArIHNwYWNpbmdPZmZzZXQ7XG4gICAgY29uc3QgZW5kQW5nbGUgPSBlbmQgLSBhbmdsZU9mZnNldCAtIHNwYWNpbmdPZmZzZXQ7XG4gICAgY29uc3QgeyBvdXRlclN0YXJ0ICwgb3V0ZXJFbmQgLCBpbm5lclN0YXJ0ICwgaW5uZXJFbmQgIH0gPSBwYXJzZUJvcmRlclJhZGl1cyQxKGVsZW1lbnQsIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgZW5kQW5nbGUgLSBzdGFydEFuZ2xlKTtcbiAgICBjb25zdCBvdXRlclN0YXJ0QWRqdXN0ZWRSYWRpdXMgPSBvdXRlclJhZGl1cyAtIG91dGVyU3RhcnQ7XG4gICAgY29uc3Qgb3V0ZXJFbmRBZGp1c3RlZFJhZGl1cyA9IG91dGVyUmFkaXVzIC0gb3V0ZXJFbmQ7XG4gICAgY29uc3Qgb3V0ZXJTdGFydEFkanVzdGVkQW5nbGUgPSBzdGFydEFuZ2xlICsgb3V0ZXJTdGFydCAvIG91dGVyU3RhcnRBZGp1c3RlZFJhZGl1cztcbiAgICBjb25zdCBvdXRlckVuZEFkanVzdGVkQW5nbGUgPSBlbmRBbmdsZSAtIG91dGVyRW5kIC8gb3V0ZXJFbmRBZGp1c3RlZFJhZGl1cztcbiAgICBjb25zdCBpbm5lclN0YXJ0QWRqdXN0ZWRSYWRpdXMgPSBpbm5lclJhZGl1cyArIGlubmVyU3RhcnQ7XG4gICAgY29uc3QgaW5uZXJFbmRBZGp1c3RlZFJhZGl1cyA9IGlubmVyUmFkaXVzICsgaW5uZXJFbmQ7XG4gICAgY29uc3QgaW5uZXJTdGFydEFkanVzdGVkQW5nbGUgPSBzdGFydEFuZ2xlICsgaW5uZXJTdGFydCAvIGlubmVyU3RhcnRBZGp1c3RlZFJhZGl1cztcbiAgICBjb25zdCBpbm5lckVuZEFkanVzdGVkQW5nbGUgPSBlbmRBbmdsZSAtIGlubmVyRW5kIC8gaW5uZXJFbmRBZGp1c3RlZFJhZGl1cztcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBhcmMgc2VnbWVudHMgZnJvbSBwb2ludCAxIHRvIHBvaW50IGEgdG8gcG9pbnQgMlxuICAgICAgICBjb25zdCBvdXRlck1pZEFkanVzdGVkQW5nbGUgPSAob3V0ZXJTdGFydEFkanVzdGVkQW5nbGUgKyBvdXRlckVuZEFkanVzdGVkQW5nbGUpIC8gMjtcbiAgICAgICAgY3R4LmFyYyh4LCB5LCBvdXRlclJhZGl1cywgb3V0ZXJTdGFydEFkanVzdGVkQW5nbGUsIG91dGVyTWlkQWRqdXN0ZWRBbmdsZSk7XG4gICAgICAgIGN0eC5hcmMoeCwgeSwgb3V0ZXJSYWRpdXMsIG91dGVyTWlkQWRqdXN0ZWRBbmdsZSwgb3V0ZXJFbmRBZGp1c3RlZEFuZ2xlKTtcbiAgICAgICAgLy8gVGhlIGNvcm5lciBzZWdtZW50IGZyb20gcG9pbnQgMiB0byBwb2ludCAzXG4gICAgICAgIGlmIChvdXRlckVuZCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHBDZW50ZXIgPSByVGhldGFUb1hZKG91dGVyRW5kQWRqdXN0ZWRSYWRpdXMsIG91dGVyRW5kQWRqdXN0ZWRBbmdsZSwgeCwgeSk7XG4gICAgICAgICAgICBjdHguYXJjKHBDZW50ZXIueCwgcENlbnRlci55LCBvdXRlckVuZCwgb3V0ZXJFbmRBZGp1c3RlZEFuZ2xlLCBlbmRBbmdsZSArIEhBTEZfUEkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBsaW5lIGZyb20gcG9pbnQgMyB0byBwb2ludCA0XG4gICAgICAgIGNvbnN0IHA0ID0gclRoZXRhVG9YWShpbm5lckVuZEFkanVzdGVkUmFkaXVzLCBlbmRBbmdsZSwgeCwgeSk7XG4gICAgICAgIGN0eC5saW5lVG8ocDQueCwgcDQueSk7XG4gICAgICAgIC8vIFRoZSBjb3JuZXIgc2VnbWVudCBmcm9tIHBvaW50IDQgdG8gcG9pbnQgNVxuICAgICAgICBpZiAoaW5uZXJFbmQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwQ2VudGVyID0gclRoZXRhVG9YWShpbm5lckVuZEFkanVzdGVkUmFkaXVzLCBpbm5lckVuZEFkanVzdGVkQW5nbGUsIHgsIHkpO1xuICAgICAgICAgICAgY3R4LmFyYyhwQ2VudGVyLngsIHBDZW50ZXIueSwgaW5uZXJFbmQsIGVuZEFuZ2xlICsgSEFMRl9QSSwgaW5uZXJFbmRBZGp1c3RlZEFuZ2xlICsgTWF0aC5QSSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGlubmVyIGFyYyBmcm9tIHBvaW50IDUgdG8gcG9pbnQgYiB0byBwb2ludCA2XG4gICAgICAgIGNvbnN0IGlubmVyTWlkQWRqdXN0ZWRBbmdsZSA9IChlbmRBbmdsZSAtIGlubmVyRW5kIC8gaW5uZXJSYWRpdXMgKyAoc3RhcnRBbmdsZSArIGlubmVyU3RhcnQgLyBpbm5lclJhZGl1cykpIC8gMjtcbiAgICAgICAgY3R4LmFyYyh4LCB5LCBpbm5lclJhZGl1cywgZW5kQW5nbGUgLSBpbm5lckVuZCAvIGlubmVyUmFkaXVzLCBpbm5lck1pZEFkanVzdGVkQW5nbGUsIHRydWUpO1xuICAgICAgICBjdHguYXJjKHgsIHksIGlubmVyUmFkaXVzLCBpbm5lck1pZEFkanVzdGVkQW5nbGUsIHN0YXJ0QW5nbGUgKyBpbm5lclN0YXJ0IC8gaW5uZXJSYWRpdXMsIHRydWUpO1xuICAgICAgICAvLyBUaGUgY29ybmVyIHNlZ21lbnQgZnJvbSBwb2ludCA2IHRvIHBvaW50IDdcbiAgICAgICAgaWYgKGlubmVyU3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwQ2VudGVyID0gclRoZXRhVG9YWShpbm5lclN0YXJ0QWRqdXN0ZWRSYWRpdXMsIGlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlLCB4LCB5KTtcbiAgICAgICAgICAgIGN0eC5hcmMocENlbnRlci54LCBwQ2VudGVyLnksIGlubmVyU3RhcnQsIGlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlICsgTWF0aC5QSSwgc3RhcnRBbmdsZSAtIEhBTEZfUEkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBsaW5lIGZyb20gcG9pbnQgNyB0byBwb2ludCA4XG4gICAgICAgIGNvbnN0IHA4ID0gclRoZXRhVG9YWShvdXRlclN0YXJ0QWRqdXN0ZWRSYWRpdXMsIHN0YXJ0QW5nbGUsIHgsIHkpO1xuICAgICAgICBjdHgubGluZVRvKHA4LngsIHA4LnkpO1xuICAgICAgICAvLyBUaGUgY29ybmVyIHNlZ21lbnQgZnJvbSBwb2ludCA4IHRvIHBvaW50IDFcbiAgICAgICAgaWYgKG91dGVyU3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwQ2VudGVyID0gclRoZXRhVG9YWShvdXRlclN0YXJ0QWRqdXN0ZWRSYWRpdXMsIG91dGVyU3RhcnRBZGp1c3RlZEFuZ2xlLCB4LCB5KTtcbiAgICAgICAgICAgIGN0eC5hcmMocENlbnRlci54LCBwQ2VudGVyLnksIG91dGVyU3RhcnQsIHN0YXJ0QW5nbGUgLSBIQUxGX1BJLCBvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBjdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICBjb25zdCBvdXRlclN0YXJ0WCA9IE1hdGguY29zKG91dGVyU3RhcnRBZGp1c3RlZEFuZ2xlKSAqIG91dGVyUmFkaXVzICsgeDtcbiAgICAgICAgY29uc3Qgb3V0ZXJTdGFydFkgPSBNYXRoLnNpbihvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSkgKiBvdXRlclJhZGl1cyArIHk7XG4gICAgICAgIGN0eC5saW5lVG8ob3V0ZXJTdGFydFgsIG91dGVyU3RhcnRZKTtcbiAgICAgICAgY29uc3Qgb3V0ZXJFbmRYID0gTWF0aC5jb3Mob3V0ZXJFbmRBZGp1c3RlZEFuZ2xlKSAqIG91dGVyUmFkaXVzICsgeDtcbiAgICAgICAgY29uc3Qgb3V0ZXJFbmRZID0gTWF0aC5zaW4ob3V0ZXJFbmRBZGp1c3RlZEFuZ2xlKSAqIG91dGVyUmFkaXVzICsgeTtcbiAgICAgICAgY3R4LmxpbmVUbyhvdXRlckVuZFgsIG91dGVyRW5kWSk7XG4gICAgfVxuICAgIGN0eC5jbG9zZVBhdGgoKTtcbn1cbmZ1bmN0aW9uIGRyYXdBcmMoY3R4LCBlbGVtZW50LCBvZmZzZXQsIHNwYWNpbmcsIGNpcmN1bGFyKSB7XG4gICAgY29uc3QgeyBmdWxsQ2lyY2xlcyAsIHN0YXJ0QW5nbGUgLCBjaXJjdW1mZXJlbmNlICB9ID0gZWxlbWVudDtcbiAgICBsZXQgZW5kQW5nbGUgPSBlbGVtZW50LmVuZEFuZ2xlO1xuICAgIGlmIChmdWxsQ2lyY2xlcykge1xuICAgICAgICBwYXRoQXJjKGN0eCwgZWxlbWVudCwgb2Zmc2V0LCBzcGFjaW5nLCBlbmRBbmdsZSwgY2lyY3VsYXIpO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZnVsbENpcmNsZXM7ICsraSl7XG4gICAgICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNOYU4oY2lyY3VtZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIGVuZEFuZ2xlID0gc3RhcnRBbmdsZSArIChjaXJjdW1mZXJlbmNlICUgVEFVIHx8IFRBVSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGF0aEFyYyhjdHgsIGVsZW1lbnQsIG9mZnNldCwgc3BhY2luZywgZW5kQW5nbGUsIGNpcmN1bGFyKTtcbiAgICBjdHguZmlsbCgpO1xuICAgIHJldHVybiBlbmRBbmdsZTtcbn1cbmZ1bmN0aW9uIGRyYXdCb3JkZXIoY3R4LCBlbGVtZW50LCBvZmZzZXQsIHNwYWNpbmcsIGNpcmN1bGFyKSB7XG4gICAgY29uc3QgeyBmdWxsQ2lyY2xlcyAsIHN0YXJ0QW5nbGUgLCBjaXJjdW1mZXJlbmNlICwgb3B0aW9ucyAgfSA9IGVsZW1lbnQ7XG4gICAgY29uc3QgeyBib3JkZXJXaWR0aCAsIGJvcmRlckpvaW5TdHlsZSAsIGJvcmRlckRhc2ggLCBib3JkZXJEYXNoT2Zmc2V0ICwgYm9yZGVyUmFkaXVzICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBpbm5lciA9IG9wdGlvbnMuYm9yZGVyQWxpZ24gPT09ICdpbm5lcic7XG4gICAgaWYgKCFib3JkZXJXaWR0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGN0eC5zZXRMaW5lRGFzaChib3JkZXJEYXNoIHx8IFtdKTtcbiAgICBjdHgubGluZURhc2hPZmZzZXQgPSBib3JkZXJEYXNoT2Zmc2V0O1xuICAgIGlmIChpbm5lcikge1xuICAgICAgICBjdHgubGluZVdpZHRoID0gYm9yZGVyV2lkdGggKiAyO1xuICAgICAgICBjdHgubGluZUpvaW4gPSBib3JkZXJKb2luU3R5bGUgfHwgJ3JvdW5kJztcbiAgICB9IGVsc2Uge1xuICAgICAgICBjdHgubGluZVdpZHRoID0gYm9yZGVyV2lkdGg7XG4gICAgICAgIGN0eC5saW5lSm9pbiA9IGJvcmRlckpvaW5TdHlsZSB8fCAnYmV2ZWwnO1xuICAgIH1cbiAgICBsZXQgZW5kQW5nbGUgPSBlbGVtZW50LmVuZEFuZ2xlO1xuICAgIGlmIChmdWxsQ2lyY2xlcykge1xuICAgICAgICBwYXRoQXJjKGN0eCwgZWxlbWVudCwgb2Zmc2V0LCBzcGFjaW5nLCBlbmRBbmdsZSwgY2lyY3VsYXIpO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZnVsbENpcmNsZXM7ICsraSl7XG4gICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc05hTihjaXJjdW1mZXJlbmNlKSkge1xuICAgICAgICAgICAgZW5kQW5nbGUgPSBzdGFydEFuZ2xlICsgKGNpcmN1bWZlcmVuY2UgJSBUQVUgfHwgVEFVKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgY2xpcEFyYyhjdHgsIGVsZW1lbnQsIGVuZEFuZ2xlKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2VsZkpvaW4gJiYgZW5kQW5nbGUgLSBzdGFydEFuZ2xlID49IFBJICYmIGJvcmRlclJhZGl1cyA9PT0gMCAmJiBib3JkZXJKb2luU3R5bGUgIT09ICdtaXRlcicpIHtcbiAgICAgICAgY2xpcFNlbGYoY3R4LCBlbGVtZW50LCBlbmRBbmdsZSk7XG4gICAgfVxuICAgIGlmICghZnVsbENpcmNsZXMpIHtcbiAgICAgICAgcGF0aEFyYyhjdHgsIGVsZW1lbnQsIG9mZnNldCwgc3BhY2luZywgZW5kQW5nbGUsIGNpcmN1bGFyKTtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgIH1cbn1cbmNsYXNzIEFyY0VsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgICBzdGF0aWMgaWQgPSAnYXJjJztcbiAgICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIGJvcmRlckFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgYm9yZGVyQ29sb3I6ICcjZmZmJyxcbiAgICAgICAgYm9yZGVyRGFzaDogW10sXG4gICAgICAgIGJvcmRlckRhc2hPZmZzZXQ6IDAsXG4gICAgICAgIGJvcmRlckpvaW5TdHlsZTogdW5kZWZpbmVkLFxuICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgIHNwYWNpbmc6IDAsXG4gICAgICAgIGFuZ2xlOiB1bmRlZmluZWQsXG4gICAgICAgIGNpcmN1bGFyOiB0cnVlLFxuICAgICAgICBzZWxmSm9pbjogZmFsc2VcbiAgICB9O1xuICAgIHN0YXRpYyBkZWZhdWx0Um91dGVzID0ge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdiYWNrZ3JvdW5kQ29sb3InXG4gICAgfTtcbiAgICBzdGF0aWMgZGVzY3JpcHRvcnMgPSB7XG4gICAgICAgIF9zY3JpcHRhYmxlOiB0cnVlLFxuICAgICAgICBfaW5kZXhhYmxlOiAobmFtZSk9Pm5hbWUgIT09ICdib3JkZXJEYXNoJ1xuICAgIH07XG4gICAgY2lyY3VtZmVyZW5jZTtcbiAgICBlbmRBbmdsZTtcbiAgICBmdWxsQ2lyY2xlcztcbiAgICBpbm5lclJhZGl1cztcbiAgICBvdXRlclJhZGl1cztcbiAgICBwaXhlbE1hcmdpbjtcbiAgICBzdGFydEFuZ2xlO1xuICAgIGNvbnN0cnVjdG9yKGNmZyl7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jaXJjdW1mZXJlbmNlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnN0YXJ0QW5nbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZW5kQW5nbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaW5uZXJSYWRpdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMub3V0ZXJSYWRpdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucGl4ZWxNYXJnaW4gPSAwO1xuICAgICAgICB0aGlzLmZ1bGxDaXJjbGVzID0gMDtcbiAgICAgICAgaWYgKGNmZykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjZmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluUmFuZ2UoY2hhcnRYLCBjaGFydFksIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLmdldFByb3BzKFtcbiAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICd5J1xuICAgICAgICBdLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgeyBhbmdsZSAsIGRpc3RhbmNlICB9ID0gZ2V0QW5nbGVGcm9tUG9pbnQocG9pbnQsIHtcbiAgICAgICAgICAgIHg6IGNoYXJ0WCxcbiAgICAgICAgICAgIHk6IGNoYXJ0WVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgeyBzdGFydEFuZ2xlICwgZW5kQW5nbGUgLCBpbm5lclJhZGl1cyAsIG91dGVyUmFkaXVzICwgY2lyY3VtZmVyZW5jZSAgfSA9IHRoaXMuZ2V0UHJvcHMoW1xuICAgICAgICAgICAgJ3N0YXJ0QW5nbGUnLFxuICAgICAgICAgICAgJ2VuZEFuZ2xlJyxcbiAgICAgICAgICAgICdpbm5lclJhZGl1cycsXG4gICAgICAgICAgICAnb3V0ZXJSYWRpdXMnLFxuICAgICAgICAgICAgJ2NpcmN1bWZlcmVuY2UnXG4gICAgICAgIF0sIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgICAgICBjb25zdCByQWRqdXN0ID0gKHRoaXMub3B0aW9ucy5zcGFjaW5nICsgdGhpcy5vcHRpb25zLmJvcmRlcldpZHRoKSAvIDI7XG4gICAgICAgIGNvbnN0IF9jaXJjdW1mZXJlbmNlID0gdmFsdWVPckRlZmF1bHQoY2lyY3VtZmVyZW5jZSwgZW5kQW5nbGUgLSBzdGFydEFuZ2xlKTtcbiAgICAgICAgY29uc3Qgbm9uWmVyb0JldHdlZW4gPSBfYW5nbGVCZXR3ZWVuKGFuZ2xlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSkgJiYgc3RhcnRBbmdsZSAhPT0gZW5kQW5nbGU7XG4gICAgICAgIGNvbnN0IGJldHdlZW5BbmdsZXMgPSBfY2lyY3VtZmVyZW5jZSA+PSBUQVUgfHwgbm9uWmVyb0JldHdlZW47XG4gICAgICAgIGNvbnN0IHdpdGhpblJhZGl1cyA9IF9pc0JldHdlZW4oZGlzdGFuY2UsIGlubmVyUmFkaXVzICsgckFkanVzdCwgb3V0ZXJSYWRpdXMgKyByQWRqdXN0KTtcbiAgICAgICAgcmV0dXJuIGJldHdlZW5BbmdsZXMgJiYgd2l0aGluUmFkaXVzO1xuICAgIH1cbiAgICBnZXRDZW50ZXJQb2ludCh1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHsgeCAsIHkgLCBzdGFydEFuZ2xlICwgZW5kQW5nbGUgLCBpbm5lclJhZGl1cyAsIG91dGVyUmFkaXVzICB9ID0gdGhpcy5nZXRQcm9wcyhbXG4gICAgICAgICAgICAneCcsXG4gICAgICAgICAgICAneScsXG4gICAgICAgICAgICAnc3RhcnRBbmdsZScsXG4gICAgICAgICAgICAnZW5kQW5nbGUnLFxuICAgICAgICAgICAgJ2lubmVyUmFkaXVzJyxcbiAgICAgICAgICAgICdvdXRlclJhZGl1cydcbiAgICAgICAgXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHsgb2Zmc2V0ICwgc3BhY2luZyAgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgaGFsZkFuZ2xlID0gKHN0YXJ0QW5nbGUgKyBlbmRBbmdsZSkgLyAyO1xuICAgICAgICBjb25zdCBoYWxmUmFkaXVzID0gKGlubmVyUmFkaXVzICsgb3V0ZXJSYWRpdXMgKyBzcGFjaW5nICsgb2Zmc2V0KSAvIDI7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB4ICsgTWF0aC5jb3MoaGFsZkFuZ2xlKSAqIGhhbGZSYWRpdXMsXG4gICAgICAgICAgICB5OiB5ICsgTWF0aC5zaW4oaGFsZkFuZ2xlKSAqIGhhbGZSYWRpdXNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdG9vbHRpcFBvc2l0aW9uKHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2VudGVyUG9pbnQodXNlRmluYWxQb3NpdGlvbik7XG4gICAgfVxuICAgIGRyYXcoY3R4KSB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9ucyAsIGNpcmN1bWZlcmVuY2UgIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSAob3B0aW9ucy5vZmZzZXQgfHwgMCkgLyA0O1xuICAgICAgICBjb25zdCBzcGFjaW5nID0gKG9wdGlvbnMuc3BhY2luZyB8fCAwKSAvIDI7XG4gICAgICAgIGNvbnN0IGNpcmN1bGFyID0gb3B0aW9ucy5jaXJjdWxhcjtcbiAgICAgICAgdGhpcy5waXhlbE1hcmdpbiA9IG9wdGlvbnMuYm9yZGVyQWxpZ24gPT09ICdpbm5lcicgPyAwLjMzIDogMDtcbiAgICAgICAgdGhpcy5mdWxsQ2lyY2xlcyA9IGNpcmN1bWZlcmVuY2UgPiBUQVUgPyBNYXRoLmZsb29yKGNpcmN1bWZlcmVuY2UgLyBUQVUpIDogMDtcbiAgICAgICAgaWYgKGNpcmN1bWZlcmVuY2UgPT09IDAgfHwgdGhpcy5pbm5lclJhZGl1cyA8IDAgfHwgdGhpcy5vdXRlclJhZGl1cyA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICBjb25zdCBoYWxmQW5nbGUgPSAodGhpcy5zdGFydEFuZ2xlICsgdGhpcy5lbmRBbmdsZSkgLyAyO1xuICAgICAgICBjdHgudHJhbnNsYXRlKE1hdGguY29zKGhhbGZBbmdsZSkgKiBvZmZzZXQsIE1hdGguc2luKGhhbGZBbmdsZSkgKiBvZmZzZXQpO1xuICAgICAgICBjb25zdCBmaXggPSAxIC0gTWF0aC5zaW4oTWF0aC5taW4oUEksIGNpcmN1bWZlcmVuY2UgfHwgMCkpO1xuICAgICAgICBjb25zdCByYWRpdXNPZmZzZXQgPSBvZmZzZXQgKiBmaXg7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBvcHRpb25zLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gb3B0aW9ucy5ib3JkZXJDb2xvcjtcbiAgICAgICAgZHJhd0FyYyhjdHgsIHRoaXMsIHJhZGl1c09mZnNldCwgc3BhY2luZywgY2lyY3VsYXIpO1xuICAgICAgICBkcmF3Qm9yZGVyKGN0eCwgdGhpcywgcmFkaXVzT2Zmc2V0LCBzcGFjaW5nLCBjaXJjdWxhcik7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRTdHlsZShjdHgsIG9wdGlvbnMsIHN0eWxlID0gb3B0aW9ucykge1xuICAgIGN0eC5saW5lQ2FwID0gdmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyQ2FwU3R5bGUsIG9wdGlvbnMuYm9yZGVyQ2FwU3R5bGUpO1xuICAgIGN0eC5zZXRMaW5lRGFzaCh2YWx1ZU9yRGVmYXVsdChzdHlsZS5ib3JkZXJEYXNoLCBvcHRpb25zLmJvcmRlckRhc2gpKTtcbiAgICBjdHgubGluZURhc2hPZmZzZXQgPSB2YWx1ZU9yRGVmYXVsdChzdHlsZS5ib3JkZXJEYXNoT2Zmc2V0LCBvcHRpb25zLmJvcmRlckRhc2hPZmZzZXQpO1xuICAgIGN0eC5saW5lSm9pbiA9IHZhbHVlT3JEZWZhdWx0KHN0eWxlLmJvcmRlckpvaW5TdHlsZSwgb3B0aW9ucy5ib3JkZXJKb2luU3R5bGUpO1xuICAgIGN0eC5saW5lV2lkdGggPSB2YWx1ZU9yRGVmYXVsdChzdHlsZS5ib3JkZXJXaWR0aCwgb3B0aW9ucy5ib3JkZXJXaWR0aCk7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gdmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyQ29sb3IsIG9wdGlvbnMuYm9yZGVyQ29sb3IpO1xufVxuZnVuY3Rpb24gbGluZVRvKGN0eCwgcHJldmlvdXMsIHRhcmdldCkge1xuICAgIGN0eC5saW5lVG8odGFyZ2V0LngsIHRhcmdldC55KTtcbn1cbiBmdW5jdGlvbiBnZXRMaW5lTWV0aG9kKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5zdGVwcGVkKSB7XG4gICAgICAgIHJldHVybiBfc3RlcHBlZExpbmVUbztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVuc2lvbiB8fCBvcHRpb25zLmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgPT09ICdtb25vdG9uZScpIHtcbiAgICAgICAgcmV0dXJuIF9iZXppZXJDdXJ2ZVRvO1xuICAgIH1cbiAgICByZXR1cm4gbGluZVRvO1xufVxuZnVuY3Rpb24gcGF0aFZhcnMocG9pbnRzLCBzZWdtZW50LCBwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICBjb25zdCB7IHN0YXJ0OiBwYXJhbXNTdGFydCA9IDAgLCBlbmQ6IHBhcmFtc0VuZCA9IGNvdW50IC0gMSAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IHN0YXJ0OiBzZWdtZW50U3RhcnQgLCBlbmQ6IHNlZ21lbnRFbmQgIH0gPSBzZWdtZW50O1xuICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgocGFyYW1zU3RhcnQsIHNlZ21lbnRTdGFydCk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4ocGFyYW1zRW5kLCBzZWdtZW50RW5kKTtcbiAgICBjb25zdCBvdXRzaWRlID0gcGFyYW1zU3RhcnQgPCBzZWdtZW50U3RhcnQgJiYgcGFyYW1zRW5kIDwgc2VnbWVudFN0YXJ0IHx8IHBhcmFtc1N0YXJ0ID4gc2VnbWVudEVuZCAmJiBwYXJhbXNFbmQgPiBzZWdtZW50RW5kO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvdW50LFxuICAgICAgICBzdGFydCxcbiAgICAgICAgbG9vcDogc2VnbWVudC5sb29wLFxuICAgICAgICBpbGVuOiBlbmQgPCBzdGFydCAmJiAhb3V0c2lkZSA/IGNvdW50ICsgZW5kIC0gc3RhcnQgOiBlbmQgLSBzdGFydFxuICAgIH07XG59XG4gZnVuY3Rpb24gcGF0aFNlZ21lbnQoY3R4LCBsaW5lLCBzZWdtZW50LCBwYXJhbXMpIHtcbiAgICBjb25zdCB7IHBvaW50cyAsIG9wdGlvbnMgIH0gPSBsaW5lO1xuICAgIGNvbnN0IHsgY291bnQgLCBzdGFydCAsIGxvb3AgLCBpbGVuICB9ID0gcGF0aFZhcnMocG9pbnRzLCBzZWdtZW50LCBwYXJhbXMpO1xuICAgIGNvbnN0IGxpbmVNZXRob2QgPSBnZXRMaW5lTWV0aG9kKG9wdGlvbnMpO1xuICAgIGxldCB7IG1vdmUgPXRydWUgLCByZXZlcnNlICB9ID0gcGFyYW1zIHx8IHt9O1xuICAgIGxldCBpLCBwb2ludCwgcHJldjtcbiAgICBmb3IoaSA9IDA7IGkgPD0gaWxlbjsgKytpKXtcbiAgICAgICAgcG9pbnQgPSBwb2ludHNbKHN0YXJ0ICsgKHJldmVyc2UgPyBpbGVuIC0gaSA6IGkpKSAlIGNvdW50XTtcbiAgICAgICAgaWYgKHBvaW50LnNraXApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKG1vdmUpIHtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8ocG9pbnQueCwgcG9pbnQueSk7XG4gICAgICAgICAgICBtb3ZlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaW5lTWV0aG9kKGN0eCwgcHJldiwgcG9pbnQsIHJldmVyc2UsIG9wdGlvbnMuc3RlcHBlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcHJldiA9IHBvaW50O1xuICAgIH1cbiAgICBpZiAobG9vcCkge1xuICAgICAgICBwb2ludCA9IHBvaW50c1soc3RhcnQgKyAocmV2ZXJzZSA/IGlsZW4gOiAwKSkgJSBjb3VudF07XG4gICAgICAgIGxpbmVNZXRob2QoY3R4LCBwcmV2LCBwb2ludCwgcmV2ZXJzZSwgb3B0aW9ucy5zdGVwcGVkKTtcbiAgICB9XG4gICAgcmV0dXJuICEhbG9vcDtcbn1cbiBmdW5jdGlvbiBmYXN0UGF0aFNlZ21lbnQoY3R4LCBsaW5lLCBzZWdtZW50LCBwYXJhbXMpIHtcbiAgICBjb25zdCBwb2ludHMgPSBsaW5lLnBvaW50cztcbiAgICBjb25zdCB7IGNvdW50ICwgc3RhcnQgLCBpbGVuICB9ID0gcGF0aFZhcnMocG9pbnRzLCBzZWdtZW50LCBwYXJhbXMpO1xuICAgIGNvbnN0IHsgbW92ZSA9dHJ1ZSAsIHJldmVyc2UgIH0gPSBwYXJhbXMgfHwge307XG4gICAgbGV0IGF2Z1ggPSAwO1xuICAgIGxldCBjb3VudFggPSAwO1xuICAgIGxldCBpLCBwb2ludCwgcHJldlgsIG1pblksIG1heFksIGxhc3RZO1xuICAgIGNvbnN0IHBvaW50SW5kZXggPSAoaW5kZXgpPT4oc3RhcnQgKyAocmV2ZXJzZSA/IGlsZW4gLSBpbmRleCA6IGluZGV4KSkgJSBjb3VudDtcbiAgICBjb25zdCBkcmF3WCA9ICgpPT57XG4gICAgICAgIGlmIChtaW5ZICE9PSBtYXhZKSB7XG4gICAgICAgICAgICBjdHgubGluZVRvKGF2Z1gsIG1heFkpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyhhdmdYLCBtaW5ZKTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oYXZnWCwgbGFzdFkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAobW92ZSkge1xuICAgICAgICBwb2ludCA9IHBvaW50c1twb2ludEluZGV4KDApXTtcbiAgICAgICAgY3R4Lm1vdmVUbyhwb2ludC54LCBwb2ludC55KTtcbiAgICB9XG4gICAgZm9yKGkgPSAwOyBpIDw9IGlsZW47ICsraSl7XG4gICAgICAgIHBvaW50ID0gcG9pbnRzW3BvaW50SW5kZXgoaSldO1xuICAgICAgICBpZiAocG9pbnQuc2tpcCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeCA9IHBvaW50Lng7XG4gICAgICAgIGNvbnN0IHkgPSBwb2ludC55O1xuICAgICAgICBjb25zdCB0cnVuY1ggPSB4IHwgMDtcbiAgICAgICAgaWYgKHRydW5jWCA9PT0gcHJldlgpIHtcbiAgICAgICAgICAgIGlmICh5IDwgbWluWSkge1xuICAgICAgICAgICAgICAgIG1pblkgPSB5O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh5ID4gbWF4WSkge1xuICAgICAgICAgICAgICAgIG1heFkgPSB5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXZnWCA9IChjb3VudFggKiBhdmdYICsgeCkgLyArK2NvdW50WDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRyYXdYKCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgcHJldlggPSB0cnVuY1g7XG4gICAgICAgICAgICBjb3VudFggPSAwO1xuICAgICAgICAgICAgbWluWSA9IG1heFkgPSB5O1xuICAgICAgICB9XG4gICAgICAgIGxhc3RZID0geTtcbiAgICB9XG4gICAgZHJhd1goKTtcbn1cbiBmdW5jdGlvbiBfZ2V0U2VnbWVudE1ldGhvZChsaW5lKSB7XG4gICAgY29uc3Qgb3B0cyA9IGxpbmUub3B0aW9ucztcbiAgICBjb25zdCBib3JkZXJEYXNoID0gb3B0cy5ib3JkZXJEYXNoICYmIG9wdHMuYm9yZGVyRGFzaC5sZW5ndGg7XG4gICAgY29uc3QgdXNlRmFzdFBhdGggPSAhbGluZS5fZGVjaW1hdGVkICYmICFsaW5lLl9sb29wICYmICFvcHRzLnRlbnNpb24gJiYgb3B0cy5jdWJpY0ludGVycG9sYXRpb25Nb2RlICE9PSAnbW9ub3RvbmUnICYmICFvcHRzLnN0ZXBwZWQgJiYgIWJvcmRlckRhc2g7XG4gICAgcmV0dXJuIHVzZUZhc3RQYXRoID8gZmFzdFBhdGhTZWdtZW50IDogcGF0aFNlZ21lbnQ7XG59XG4gZnVuY3Rpb24gX2dldEludGVycG9sYXRpb25NZXRob2Qob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnN0ZXBwZWQpIHtcbiAgICAgICAgcmV0dXJuIF9zdGVwcGVkSW50ZXJwb2xhdGlvbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVuc2lvbiB8fCBvcHRpb25zLmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgPT09ICdtb25vdG9uZScpIHtcbiAgICAgICAgcmV0dXJuIF9iZXppZXJJbnRlcnBvbGF0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gX3BvaW50SW5MaW5lO1xufVxuZnVuY3Rpb24gc3Ryb2tlUGF0aFdpdGhDYWNoZShjdHgsIGxpbmUsIHN0YXJ0LCBjb3VudCkge1xuICAgIGxldCBwYXRoID0gbGluZS5fcGF0aDtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcGF0aCA9IGxpbmUuX3BhdGggPSBuZXcgUGF0aDJEKCk7XG4gICAgICAgIGlmIChsaW5lLnBhdGgocGF0aCwgc3RhcnQsIGNvdW50KSkge1xuICAgICAgICAgICAgcGF0aC5jbG9zZVBhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRTdHlsZShjdHgsIGxpbmUub3B0aW9ucyk7XG4gICAgY3R4LnN0cm9rZShwYXRoKTtcbn1cbmZ1bmN0aW9uIHN0cm9rZVBhdGhEaXJlY3QoY3R4LCBsaW5lLCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCB7IHNlZ21lbnRzICwgb3B0aW9ucyAgfSA9IGxpbmU7XG4gICAgY29uc3Qgc2VnbWVudE1ldGhvZCA9IF9nZXRTZWdtZW50TWV0aG9kKGxpbmUpO1xuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cyl7XG4gICAgICAgIHNldFN0eWxlKGN0eCwgb3B0aW9ucywgc2VnbWVudC5zdHlsZSk7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgaWYgKHNlZ21lbnRNZXRob2QoY3R4LCBsaW5lLCBzZWdtZW50LCB7XG4gICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnQgKyBjb3VudCAtIDFcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfVxufVxuY29uc3QgdXNlUGF0aDJEID0gdHlwZW9mIFBhdGgyRCA9PT0gJ2Z1bmN0aW9uJztcbmZ1bmN0aW9uIGRyYXcoY3R4LCBsaW5lLCBzdGFydCwgY291bnQpIHtcbiAgICBpZiAodXNlUGF0aDJEICYmICFsaW5lLm9wdGlvbnMuc2VnbWVudCkge1xuICAgICAgICBzdHJva2VQYXRoV2l0aENhY2hlKGN0eCwgbGluZSwgc3RhcnQsIGNvdW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzdHJva2VQYXRoRGlyZWN0KGN0eCwgbGluZSwgc3RhcnQsIGNvdW50KTtcbiAgICB9XG59XG5jbGFzcyBMaW5lRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICAgIHN0YXRpYyBpZCA9ICdsaW5lJztcbiBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIGJvcmRlckNhcFN0eWxlOiAnYnV0dCcsXG4gICAgICAgIGJvcmRlckRhc2g6IFtdLFxuICAgICAgICBib3JkZXJEYXNoT2Zmc2V0OiAwLFxuICAgICAgICBib3JkZXJKb2luU3R5bGU6ICdtaXRlcicsXG4gICAgICAgIGJvcmRlcldpZHRoOiAzLFxuICAgICAgICBjYXBCZXppZXJQb2ludHM6IHRydWUsXG4gICAgICAgIGN1YmljSW50ZXJwb2xhdGlvbk1vZGU6ICdkZWZhdWx0JyxcbiAgICAgICAgZmlsbDogZmFsc2UsXG4gICAgICAgIHNwYW5HYXBzOiBmYWxzZSxcbiAgICAgICAgc3RlcHBlZDogZmFsc2UsXG4gICAgICAgIHRlbnNpb246IDBcbiAgICB9O1xuIHN0YXRpYyBkZWZhdWx0Um91dGVzID0ge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdiYWNrZ3JvdW5kQ29sb3InLFxuICAgICAgICBib3JkZXJDb2xvcjogJ2JvcmRlckNvbG9yJ1xuICAgIH07XG4gICAgc3RhdGljIGRlc2NyaXB0b3JzID0ge1xuICAgICAgICBfc2NyaXB0YWJsZTogdHJ1ZSxcbiAgICAgICAgX2luZGV4YWJsZTogKG5hbWUpPT5uYW1lICE9PSAnYm9yZGVyRGFzaCcgJiYgbmFtZSAhPT0gJ2ZpbGwnXG4gICAgfTtcbiAgICBjb25zdHJ1Y3RvcihjZmcpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmFuaW1hdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9jaGFydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fbG9vcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fZnVsbExvb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3BhdGggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3BvaW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2VnbWVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2RlY2ltYXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wb2ludHNVcGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RhdGFzZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGNmZykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjZmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUNvbnRyb2xQb2ludHMoY2hhcnRBcmVhLCBpbmRleEF4aXMpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgaWYgKChvcHRpb25zLnRlbnNpb24gfHwgb3B0aW9ucy5jdWJpY0ludGVycG9sYXRpb25Nb2RlID09PSAnbW9ub3RvbmUnKSAmJiAhb3B0aW9ucy5zdGVwcGVkICYmICF0aGlzLl9wb2ludHNVcGRhdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBsb29wID0gb3B0aW9ucy5zcGFuR2FwcyA/IHRoaXMuX2xvb3AgOiB0aGlzLl9mdWxsTG9vcDtcbiAgICAgICAgICAgIF91cGRhdGVCZXppZXJDb250cm9sUG9pbnRzKHRoaXMuX3BvaW50cywgb3B0aW9ucywgY2hhcnRBcmVhLCBsb29wLCBpbmRleEF4aXMpO1xuICAgICAgICAgICAgdGhpcy5fcG9pbnRzVXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0IHBvaW50cyhwb2ludHMpIHtcbiAgICAgICAgdGhpcy5fcG9pbnRzID0gcG9pbnRzO1xuICAgICAgICBkZWxldGUgdGhpcy5fc2VnbWVudHM7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9wYXRoO1xuICAgICAgICB0aGlzLl9wb2ludHNVcGRhdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGdldCBwb2ludHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb2ludHM7XG4gICAgfVxuICAgIGdldCBzZWdtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlZ21lbnRzIHx8ICh0aGlzLl9zZWdtZW50cyA9IF9jb21wdXRlU2VnbWVudHModGhpcywgdGhpcy5vcHRpb25zLnNlZ21lbnQpKTtcbiAgICB9XG4gZmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5zZWdtZW50cztcbiAgICAgICAgY29uc3QgcG9pbnRzID0gdGhpcy5wb2ludHM7XG4gICAgICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggJiYgcG9pbnRzW3NlZ21lbnRzWzBdLnN0YXJ0XTtcbiAgICB9XG4gbGFzdCgpIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzO1xuICAgICAgICBjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cztcbiAgICAgICAgY29uc3QgY291bnQgPSBzZWdtZW50cy5sZW5ndGg7XG4gICAgICAgIHJldHVybiBjb3VudCAmJiBwb2ludHNbc2VnbWVudHNbY291bnQgLSAxXS5lbmRdO1xuICAgIH1cbiBpbnRlcnBvbGF0ZShwb2ludCwgcHJvcGVydHkpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwb2ludFtwcm9wZXJ0eV07XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IF9ib3VuZFNlZ21lbnRzKHRoaXMsIHtcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgc3RhcnQ6IHZhbHVlLFxuICAgICAgICAgICAgZW5kOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFzZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgX2ludGVycG9sYXRlID0gX2dldEludGVycG9sYXRpb25NZXRob2Qob3B0aW9ucyk7XG4gICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgY29uc3QgeyBzdGFydCAsIGVuZCAgfSA9IHNlZ21lbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgcDEgPSBwb2ludHNbc3RhcnRdO1xuICAgICAgICAgICAgY29uc3QgcDIgPSBwb2ludHNbZW5kXTtcbiAgICAgICAgICAgIGlmIChwMSA9PT0gcDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwMSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5hYnMoKHZhbHVlIC0gcDFbcHJvcGVydHldKSAvIChwMltwcm9wZXJ0eV0gLSBwMVtwcm9wZXJ0eV0pKTtcbiAgICAgICAgICAgIGNvbnN0IGludGVycG9sYXRlZCA9IF9pbnRlcnBvbGF0ZShwMSwgcDIsIHQsIG9wdGlvbnMuc3RlcHBlZCk7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWRbcHJvcGVydHldID0gcG9pbnRbcHJvcGVydHldO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goaW50ZXJwb2xhdGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gMSA/IHJlc3VsdFswXSA6IHJlc3VsdDtcbiAgICB9XG4gcGF0aFNlZ21lbnQoY3R4LCBzZWdtZW50LCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudE1ldGhvZCA9IF9nZXRTZWdtZW50TWV0aG9kKHRoaXMpO1xuICAgICAgICByZXR1cm4gc2VnbWVudE1ldGhvZChjdHgsIHRoaXMsIHNlZ21lbnQsIHBhcmFtcyk7XG4gICAgfVxuIHBhdGgoY3R4LCBzdGFydCwgY291bnQpIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzO1xuICAgICAgICBjb25zdCBzZWdtZW50TWV0aG9kID0gX2dldFNlZ21lbnRNZXRob2QodGhpcyk7XG4gICAgICAgIGxldCBsb29wID0gdGhpcy5fbG9vcDtcbiAgICAgICAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICAgICAgICBjb3VudCA9IGNvdW50IHx8IHRoaXMucG9pbnRzLmxlbmd0aCAtIHN0YXJ0O1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpe1xuICAgICAgICAgICAgbG9vcCAmPSBzZWdtZW50TWV0aG9kKGN0eCwgdGhpcywgc2VnbWVudCwge1xuICAgICAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogc3RhcnQgKyBjb3VudCAtIDFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIWxvb3A7XG4gICAgfVxuIGRyYXcoY3R4LCBjaGFydEFyZWEsIHN0YXJ0LCBjb3VudCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cyB8fCBbXTtcbiAgICAgICAgaWYgKHBvaW50cy5sZW5ndGggJiYgb3B0aW9ucy5ib3JkZXJXaWR0aCkge1xuICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIGRyYXcoY3R4LCB0aGlzLCBzdGFydCwgY291bnQpO1xuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hbmltYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5fcG9pbnRzVXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fcGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaW5SYW5nZSQxKGVsLCBwb3MsIGF4aXMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICBjb25zdCBvcHRpb25zID0gZWwub3B0aW9ucztcbiAgICBjb25zdCB7IFtheGlzXTogdmFsdWUgIH0gPSBlbC5nZXRQcm9wcyhbXG4gICAgICAgIGF4aXNcbiAgICBdLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICByZXR1cm4gTWF0aC5hYnMocG9zIC0gdmFsdWUpIDwgb3B0aW9ucy5yYWRpdXMgKyBvcHRpb25zLmhpdFJhZGl1cztcbn1cbmNsYXNzIFBvaW50RWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICAgIHN0YXRpYyBpZCA9ICdwb2ludCc7XG4gICAgcGFyc2VkO1xuICAgIHNraXA7XG4gICAgc3RvcDtcbiAgICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAgICAgYm9yZGVyV2lkdGg6IDEsXG4gICAgICAgIGhpdFJhZGl1czogMSxcbiAgICAgICAgaG92ZXJCb3JkZXJXaWR0aDogMSxcbiAgICAgICAgaG92ZXJSYWRpdXM6IDQsXG4gICAgICAgIHBvaW50U3R5bGU6ICdjaXJjbGUnLFxuICAgICAgICByYWRpdXM6IDMsXG4gICAgICAgIHJvdGF0aW9uOiAwXG4gICAgfTtcbiAgICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovIHN0YXRpYyBkZWZhdWx0Um91dGVzID0ge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdiYWNrZ3JvdW5kQ29sb3InLFxuICAgICAgICBib3JkZXJDb2xvcjogJ2JvcmRlckNvbG9yJ1xuICAgIH07XG4gICAgY29uc3RydWN0b3IoY2ZnKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnBhcnNlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5za2lwID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnN0b3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChjZmcpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2ZnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpblJhbmdlKG1vdXNlWCwgbW91c2VZLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHsgeCAsIHkgIH0gPSB0aGlzLmdldFByb3BzKFtcbiAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICd5J1xuICAgICAgICBdLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KG1vdXNlWCAtIHgsIDIpICsgTWF0aC5wb3cobW91c2VZIC0geSwgMikgPCBNYXRoLnBvdyhvcHRpb25zLmhpdFJhZGl1cyArIG9wdGlvbnMucmFkaXVzLCAyKTtcbiAgICB9XG4gICAgaW5YUmFuZ2UobW91c2VYLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBpblJhbmdlJDEodGhpcywgbW91c2VYLCAneCcsIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIH1cbiAgICBpbllSYW5nZShtb3VzZVksIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGluUmFuZ2UkMSh0aGlzLCBtb3VzZVksICd5JywgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgfVxuICAgIGdldENlbnRlclBvaW50KHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgeyB4ICwgeSAgfSA9IHRoaXMuZ2V0UHJvcHMoW1xuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knXG4gICAgICAgIF0sIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc2l6ZShvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMub3B0aW9ucyB8fCB7fTtcbiAgICAgICAgbGV0IHJhZGl1cyA9IG9wdGlvbnMucmFkaXVzIHx8IDA7XG4gICAgICAgIHJhZGl1cyA9IE1hdGgubWF4KHJhZGl1cywgcmFkaXVzICYmIG9wdGlvbnMuaG92ZXJSYWRpdXMgfHwgMCk7XG4gICAgICAgIGNvbnN0IGJvcmRlcldpZHRoID0gcmFkaXVzICYmIG9wdGlvbnMuYm9yZGVyV2lkdGggfHwgMDtcbiAgICAgICAgcmV0dXJuIChyYWRpdXMgKyBib3JkZXJXaWR0aCkgKiAyO1xuICAgIH1cbiAgICBkcmF3KGN0eCwgYXJlYSkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5za2lwIHx8IG9wdGlvbnMucmFkaXVzIDwgMC4xIHx8ICFfaXNQb2ludEluQXJlYSh0aGlzLCBhcmVhLCB0aGlzLnNpemUob3B0aW9ucykgLyAyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IG9wdGlvbnMuYm9yZGVyQ29sb3I7XG4gICAgICAgIGN0eC5saW5lV2lkdGggPSBvcHRpb25zLmJvcmRlcldpZHRoO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIGRyYXdQb2ludChjdHgsIG9wdGlvbnMsIHRoaXMueCwgdGhpcy55KTtcbiAgICB9XG4gICAgZ2V0UmFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgfHwge307XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRmFsbGJhY2tzIHNob3VsZCBuZXZlciBiZSBoaXQgaW4gcHJhY3RpY2VcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMucmFkaXVzICsgb3B0aW9ucy5oaXRSYWRpdXM7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRCYXJCb3VuZHMoYmFyLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgY29uc3QgeyB4ICwgeSAsIGJhc2UgLCB3aWR0aCAsIGhlaWdodCAgfSA9ICBiYXIuZ2V0UHJvcHMoW1xuICAgICAgICAneCcsXG4gICAgICAgICd5JyxcbiAgICAgICAgJ2Jhc2UnLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICAnaGVpZ2h0J1xuICAgIF0sIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIGxldCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIGhhbGY7XG4gICAgaWYgKGJhci5ob3Jpem9udGFsKSB7XG4gICAgICAgIGhhbGYgPSBoZWlnaHQgLyAyO1xuICAgICAgICBsZWZ0ID0gTWF0aC5taW4oeCwgYmFzZSk7XG4gICAgICAgIHJpZ2h0ID0gTWF0aC5tYXgoeCwgYmFzZSk7XG4gICAgICAgIHRvcCA9IHkgLSBoYWxmO1xuICAgICAgICBib3R0b20gPSB5ICsgaGFsZjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBoYWxmID0gd2lkdGggLyAyO1xuICAgICAgICBsZWZ0ID0geCAtIGhhbGY7XG4gICAgICAgIHJpZ2h0ID0geCArIGhhbGY7XG4gICAgICAgIHRvcCA9IE1hdGgubWluKHksIGJhc2UpO1xuICAgICAgICBib3R0b20gPSBNYXRoLm1heCh5LCBiYXNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdCxcbiAgICAgICAgdG9wLFxuICAgICAgICByaWdodCxcbiAgICAgICAgYm90dG9tXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNraXBPckxpbWl0KHNraXAsIHZhbHVlLCBtaW4sIG1heCkge1xuICAgIHJldHVybiBza2lwID8gMCA6IF9saW1pdFZhbHVlKHZhbHVlLCBtaW4sIG1heCk7XG59XG5mdW5jdGlvbiBwYXJzZUJvcmRlcldpZHRoKGJhciwgbWF4VywgbWF4SCkge1xuICAgIGNvbnN0IHZhbHVlID0gYmFyLm9wdGlvbnMuYm9yZGVyV2lkdGg7XG4gICAgY29uc3Qgc2tpcCA9IGJhci5ib3JkZXJTa2lwcGVkO1xuICAgIGNvbnN0IG8gPSB0b1RSQkwodmFsdWUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHQ6IHNraXBPckxpbWl0KHNraXAudG9wLCBvLnRvcCwgMCwgbWF4SCksXG4gICAgICAgIHI6IHNraXBPckxpbWl0KHNraXAucmlnaHQsIG8ucmlnaHQsIDAsIG1heFcpLFxuICAgICAgICBiOiBza2lwT3JMaW1pdChza2lwLmJvdHRvbSwgby5ib3R0b20sIDAsIG1heEgpLFxuICAgICAgICBsOiBza2lwT3JMaW1pdChza2lwLmxlZnQsIG8ubGVmdCwgMCwgbWF4VylcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VCb3JkZXJSYWRpdXMoYmFyLCBtYXhXLCBtYXhIKSB7XG4gICAgY29uc3QgeyBlbmFibGVCb3JkZXJSYWRpdXMgIH0gPSBiYXIuZ2V0UHJvcHMoW1xuICAgICAgICAnZW5hYmxlQm9yZGVyUmFkaXVzJ1xuICAgIF0pO1xuICAgIGNvbnN0IHZhbHVlID0gYmFyLm9wdGlvbnMuYm9yZGVyUmFkaXVzO1xuICAgIGNvbnN0IG8gPSB0b1RSQkxDb3JuZXJzKHZhbHVlKTtcbiAgICBjb25zdCBtYXhSID0gTWF0aC5taW4obWF4VywgbWF4SCk7XG4gICAgY29uc3Qgc2tpcCA9IGJhci5ib3JkZXJTa2lwcGVkO1xuICAgIGNvbnN0IGVuYWJsZUJvcmRlciA9IGVuYWJsZUJvcmRlclJhZGl1cyB8fCBpc09iamVjdCh2YWx1ZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdG9wTGVmdDogc2tpcE9yTGltaXQoIWVuYWJsZUJvcmRlciB8fCBza2lwLnRvcCB8fCBza2lwLmxlZnQsIG8udG9wTGVmdCwgMCwgbWF4UiksXG4gICAgICAgIHRvcFJpZ2h0OiBza2lwT3JMaW1pdCghZW5hYmxlQm9yZGVyIHx8IHNraXAudG9wIHx8IHNraXAucmlnaHQsIG8udG9wUmlnaHQsIDAsIG1heFIpLFxuICAgICAgICBib3R0b21MZWZ0OiBza2lwT3JMaW1pdCghZW5hYmxlQm9yZGVyIHx8IHNraXAuYm90dG9tIHx8IHNraXAubGVmdCwgby5ib3R0b21MZWZ0LCAwLCBtYXhSKSxcbiAgICAgICAgYm90dG9tUmlnaHQ6IHNraXBPckxpbWl0KCFlbmFibGVCb3JkZXIgfHwgc2tpcC5ib3R0b20gfHwgc2tpcC5yaWdodCwgby5ib3R0b21SaWdodCwgMCwgbWF4UilcbiAgICB9O1xufVxuZnVuY3Rpb24gYm91bmRpbmdSZWN0cyhiYXIpIHtcbiAgICBjb25zdCBib3VuZHMgPSBnZXRCYXJCb3VuZHMoYmFyKTtcbiAgICBjb25zdCB3aWR0aCA9IGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0O1xuICAgIGNvbnN0IGhlaWdodCA9IGJvdW5kcy5ib3R0b20gLSBib3VuZHMudG9wO1xuICAgIGNvbnN0IGJvcmRlciA9IHBhcnNlQm9yZGVyV2lkdGgoYmFyLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgIGNvbnN0IHJhZGl1cyA9IHBhcnNlQm9yZGVyUmFkaXVzKGJhciwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBvdXRlcjoge1xuICAgICAgICAgICAgeDogYm91bmRzLmxlZnQsXG4gICAgICAgICAgICB5OiBib3VuZHMudG9wLFxuICAgICAgICAgICAgdzogd2lkdGgsXG4gICAgICAgICAgICBoOiBoZWlnaHQsXG4gICAgICAgICAgICByYWRpdXNcbiAgICAgICAgfSxcbiAgICAgICAgaW5uZXI6IHtcbiAgICAgICAgICAgIHg6IGJvdW5kcy5sZWZ0ICsgYm9yZGVyLmwsXG4gICAgICAgICAgICB5OiBib3VuZHMudG9wICsgYm9yZGVyLnQsXG4gICAgICAgICAgICB3OiB3aWR0aCAtIGJvcmRlci5sIC0gYm9yZGVyLnIsXG4gICAgICAgICAgICBoOiBoZWlnaHQgLSBib3JkZXIudCAtIGJvcmRlci5iLFxuICAgICAgICAgICAgcmFkaXVzOiB7XG4gICAgICAgICAgICAgICAgdG9wTGVmdDogTWF0aC5tYXgoMCwgcmFkaXVzLnRvcExlZnQgLSBNYXRoLm1heChib3JkZXIudCwgYm9yZGVyLmwpKSxcbiAgICAgICAgICAgICAgICB0b3BSaWdodDogTWF0aC5tYXgoMCwgcmFkaXVzLnRvcFJpZ2h0IC0gTWF0aC5tYXgoYm9yZGVyLnQsIGJvcmRlci5yKSksXG4gICAgICAgICAgICAgICAgYm90dG9tTGVmdDogTWF0aC5tYXgoMCwgcmFkaXVzLmJvdHRvbUxlZnQgLSBNYXRoLm1heChib3JkZXIuYiwgYm9yZGVyLmwpKSxcbiAgICAgICAgICAgICAgICBib3R0b21SaWdodDogTWF0aC5tYXgoMCwgcmFkaXVzLmJvdHRvbVJpZ2h0IC0gTWF0aC5tYXgoYm9yZGVyLmIsIGJvcmRlci5yKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBpblJhbmdlKGJhciwgeCwgeSwgdXNlRmluYWxQb3NpdGlvbikge1xuICAgIGNvbnN0IHNraXBYID0geCA9PT0gbnVsbDtcbiAgICBjb25zdCBza2lwWSA9IHkgPT09IG51bGw7XG4gICAgY29uc3Qgc2tpcEJvdGggPSBza2lwWCAmJiBza2lwWTtcbiAgICBjb25zdCBib3VuZHMgPSBiYXIgJiYgIXNraXBCb3RoICYmIGdldEJhckJvdW5kcyhiYXIsIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIHJldHVybiBib3VuZHMgJiYgKHNraXBYIHx8IF9pc0JldHdlZW4oeCwgYm91bmRzLmxlZnQsIGJvdW5kcy5yaWdodCkpICYmIChza2lwWSB8fCBfaXNCZXR3ZWVuKHksIGJvdW5kcy50b3AsIGJvdW5kcy5ib3R0b20pKTtcbn1cbmZ1bmN0aW9uIGhhc1JhZGl1cyhyYWRpdXMpIHtcbiAgICByZXR1cm4gcmFkaXVzLnRvcExlZnQgfHwgcmFkaXVzLnRvcFJpZ2h0IHx8IHJhZGl1cy5ib3R0b21MZWZ0IHx8IHJhZGl1cy5ib3R0b21SaWdodDtcbn1cbiBmdW5jdGlvbiBhZGROb3JtYWxSZWN0UGF0aChjdHgsIHJlY3QpIHtcbiAgICBjdHgucmVjdChyZWN0LngsIHJlY3QueSwgcmVjdC53LCByZWN0LmgpO1xufVxuZnVuY3Rpb24gaW5mbGF0ZVJlY3QocmVjdCwgYW1vdW50LCByZWZSZWN0ID0ge30pIHtcbiAgICBjb25zdCB4ID0gcmVjdC54ICE9PSByZWZSZWN0LnggPyAtYW1vdW50IDogMDtcbiAgICBjb25zdCB5ID0gcmVjdC55ICE9PSByZWZSZWN0LnkgPyAtYW1vdW50IDogMDtcbiAgICBjb25zdCB3ID0gKHJlY3QueCArIHJlY3QudyAhPT0gcmVmUmVjdC54ICsgcmVmUmVjdC53ID8gYW1vdW50IDogMCkgLSB4O1xuICAgIGNvbnN0IGggPSAocmVjdC55ICsgcmVjdC5oICE9PSByZWZSZWN0LnkgKyByZWZSZWN0LmggPyBhbW91bnQgOiAwKSAtIHk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcmVjdC54ICsgeCxcbiAgICAgICAgeTogcmVjdC55ICsgeSxcbiAgICAgICAgdzogcmVjdC53ICsgdyxcbiAgICAgICAgaDogcmVjdC5oICsgaCxcbiAgICAgICAgcmFkaXVzOiByZWN0LnJhZGl1c1xuICAgIH07XG59XG5jbGFzcyBCYXJFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gICAgc3RhdGljIGlkID0gJ2Jhcic7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBib3JkZXJTa2lwcGVkOiAnc3RhcnQnLFxuICAgICAgICBib3JkZXJXaWR0aDogMCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICBpbmZsYXRlQW1vdW50OiAnYXV0bycsXG4gICAgICAgIHBvaW50U3R5bGU6IHVuZGVmaW5lZFxuICAgIH07XG4gc3RhdGljIGRlZmF1bHRSb3V0ZXMgPSB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ2JhY2tncm91bmRDb2xvcicsXG4gICAgICAgIGJvcmRlckNvbG9yOiAnYm9yZGVyQ29sb3InXG4gICAgfTtcbiAgICBjb25zdHJ1Y3RvcihjZmcpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaG9yaXpvbnRhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5iYXNlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLndpZHRoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pbmZsYXRlQW1vdW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2ZnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNmZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhdyhjdHgpIHtcbiAgICAgICAgY29uc3QgeyBpbmZsYXRlQW1vdW50ICwgb3B0aW9uczogeyBib3JkZXJDb2xvciAsIGJhY2tncm91bmRDb2xvciAgfSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgaW5uZXIgLCBvdXRlciAgfSA9IGJvdW5kaW5nUmVjdHModGhpcyk7XG4gICAgICAgIGNvbnN0IGFkZFJlY3RQYXRoID0gaGFzUmFkaXVzKG91dGVyLnJhZGl1cykgPyBhZGRSb3VuZGVkUmVjdFBhdGggOiBhZGROb3JtYWxSZWN0UGF0aDtcbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgaWYgKG91dGVyLncgIT09IGlubmVyLncgfHwgb3V0ZXIuaCAhPT0gaW5uZXIuaCkge1xuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgYWRkUmVjdFBhdGgoY3R4LCBpbmZsYXRlUmVjdChvdXRlciwgaW5mbGF0ZUFtb3VudCwgaW5uZXIpKTtcbiAgICAgICAgICAgIGN0eC5jbGlwKCk7XG4gICAgICAgICAgICBhZGRSZWN0UGF0aChjdHgsIGluZmxhdGVSZWN0KGlubmVyLCAtaW5mbGF0ZUFtb3VudCwgb3V0ZXIpKTtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBib3JkZXJDb2xvcjtcbiAgICAgICAgICAgIGN0eC5maWxsKCdldmVub2RkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBhZGRSZWN0UGF0aChjdHgsIGluZmxhdGVSZWN0KGlubmVyLCBpbmZsYXRlQW1vdW50KSk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICAgIGluUmFuZ2UobW91c2VYLCBtb3VzZVksIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGluUmFuZ2UodGhpcywgbW91c2VYLCBtb3VzZVksIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIH1cbiAgICBpblhSYW5nZShtb3VzZVgsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGluUmFuZ2UodGhpcywgbW91c2VYLCBudWxsLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICB9XG4gICAgaW5ZUmFuZ2UobW91c2VZLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBpblJhbmdlKHRoaXMsIG51bGwsIG1vdXNlWSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgfVxuICAgIGdldENlbnRlclBvaW50KHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgeyB4ICwgeSAsIGJhc2UgLCBob3Jpem9udGFsICB9ID0gIHRoaXMuZ2V0UHJvcHMoW1xuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ2Jhc2UnLFxuICAgICAgICAgICAgJ2hvcml6b250YWwnXG4gICAgICAgIF0sIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogaG9yaXpvbnRhbCA/ICh4ICsgYmFzZSkgLyAyIDogeCxcbiAgICAgICAgICAgIHk6IGhvcml6b250YWwgPyB5IDogKHkgKyBiYXNlKSAvIDJcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0UmFuZ2UoYXhpcykge1xuICAgICAgICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gdGhpcy53aWR0aCAvIDIgOiB0aGlzLmhlaWdodCAvIDI7XG4gICAgfVxufVxuXG52YXIgZWxlbWVudHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5fX3Byb3RvX186IG51bGwsXG5BcmNFbGVtZW50OiBBcmNFbGVtZW50LFxuQmFyRWxlbWVudDogQmFyRWxlbWVudCxcbkxpbmVFbGVtZW50OiBMaW5lRWxlbWVudCxcblBvaW50RWxlbWVudDogUG9pbnRFbGVtZW50XG59KTtcblxuY29uc3QgQk9SREVSX0NPTE9SUyA9IFtcbiAgICAncmdiKDU0LCAxNjIsIDIzNSknLFxuICAgICdyZ2IoMjU1LCA5OSwgMTMyKScsXG4gICAgJ3JnYigyNTUsIDE1OSwgNjQpJyxcbiAgICAncmdiKDI1NSwgMjA1LCA4NiknLFxuICAgICdyZ2IoNzUsIDE5MiwgMTkyKScsXG4gICAgJ3JnYigxNTMsIDEwMiwgMjU1KScsXG4gICAgJ3JnYigyMDEsIDIwMywgMjA3KScgLy8gZ3JleVxuXTtcbi8vIEJvcmRlciBjb2xvcnMgd2l0aCA1MCUgdHJhbnNwYXJlbmN5XG5jb25zdCBCQUNLR1JPVU5EX0NPTE9SUyA9IC8qICNfX1BVUkVfXyAqLyBCT1JERVJfQ09MT1JTLm1hcCgoY29sb3IpPT5jb2xvci5yZXBsYWNlKCdyZ2IoJywgJ3JnYmEoJykucmVwbGFjZSgnKScsICcsIDAuNSknKSk7XG5mdW5jdGlvbiBnZXRCb3JkZXJDb2xvcihpKSB7XG4gICAgcmV0dXJuIEJPUkRFUl9DT0xPUlNbaSAlIEJPUkRFUl9DT0xPUlMubGVuZ3RoXTtcbn1cbmZ1bmN0aW9uIGdldEJhY2tncm91bmRDb2xvcihpKSB7XG4gICAgcmV0dXJuIEJBQ0tHUk9VTkRfQ09MT1JTW2kgJSBCQUNLR1JPVU5EX0NPTE9SUy5sZW5ndGhdO1xufVxuZnVuY3Rpb24gY29sb3JpemVEZWZhdWx0RGF0YXNldChkYXRhc2V0LCBpKSB7XG4gICAgZGF0YXNldC5ib3JkZXJDb2xvciA9IGdldEJvcmRlckNvbG9yKGkpO1xuICAgIGRhdGFzZXQuYmFja2dyb3VuZENvbG9yID0gZ2V0QmFja2dyb3VuZENvbG9yKGkpO1xuICAgIHJldHVybiArK2k7XG59XG5mdW5jdGlvbiBjb2xvcml6ZURvdWdobnV0RGF0YXNldChkYXRhc2V0LCBpKSB7XG4gICAgZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgPSBkYXRhc2V0LmRhdGEubWFwKCgpPT5nZXRCb3JkZXJDb2xvcihpKyspKTtcbiAgICByZXR1cm4gaTtcbn1cbmZ1bmN0aW9uIGNvbG9yaXplUG9sYXJBcmVhRGF0YXNldChkYXRhc2V0LCBpKSB7XG4gICAgZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgPSBkYXRhc2V0LmRhdGEubWFwKCgpPT5nZXRCYWNrZ3JvdW5kQ29sb3IoaSsrKSk7XG4gICAgcmV0dXJuIGk7XG59XG5mdW5jdGlvbiBnZXRDb2xvcml6ZXIoY2hhcnQpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgcmV0dXJuIChkYXRhc2V0LCBkYXRhc2V0SW5kZXgpPT57XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXI7XG4gICAgICAgIGlmIChjb250cm9sbGVyIGluc3RhbmNlb2YgRG91Z2hudXRDb250cm9sbGVyKSB7XG4gICAgICAgICAgICBpID0gY29sb3JpemVEb3VnaG51dERhdGFzZXQoZGF0YXNldCwgaSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udHJvbGxlciBpbnN0YW5jZW9mIFBvbGFyQXJlYUNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGkgPSBjb2xvcml6ZVBvbGFyQXJlYURhdGFzZXQoZGF0YXNldCwgaSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udHJvbGxlcikge1xuICAgICAgICAgICAgaSA9IGNvbG9yaXplRGVmYXVsdERhdGFzZXQoZGF0YXNldCwgaSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY29udGFpbnNDb2xvcnNEZWZpbml0aW9ucyhkZXNjcmlwdG9ycykge1xuICAgIGxldCBrO1xuICAgIGZvcihrIGluIGRlc2NyaXB0b3JzKXtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3JzW2tdLmJvcmRlckNvbG9yIHx8IGRlc2NyaXB0b3JzW2tdLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY29udGFpbnNDb2xvcnNEZWZpbml0aW9uKGRlc2NyaXB0b3IpIHtcbiAgICByZXR1cm4gZGVzY3JpcHRvciAmJiAoZGVzY3JpcHRvci5ib3JkZXJDb2xvciB8fCBkZXNjcmlwdG9yLmJhY2tncm91bmRDb2xvcik7XG59XG5mdW5jdGlvbiBjb250YWluc0RlZmF1bHRDb2xvcnNEZWZlbml0aW9ucygpIHtcbiAgICByZXR1cm4gZGVmYXVsdHMuYm9yZGVyQ29sb3IgIT09ICdyZ2JhKDAsMCwwLDAuMSknIHx8IGRlZmF1bHRzLmJhY2tncm91bmRDb2xvciAhPT0gJ3JnYmEoMCwwLDAsMC4xKSc7XG59XG52YXIgcGx1Z2luX2NvbG9ycyA9IHtcbiAgICBpZDogJ2NvbG9ycycsXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9yY2VPdmVycmlkZTogZmFsc2VcbiAgICB9LFxuICAgIGJlZm9yZUxheW91dCAoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBkYXRhOiB7IGRhdGFzZXRzICB9ICwgb3B0aW9uczogY2hhcnRPcHRpb25zICB9ID0gY2hhcnQuY29uZmlnO1xuICAgICAgICBjb25zdCB7IGVsZW1lbnRzICB9ID0gY2hhcnRPcHRpb25zO1xuICAgICAgICBjb25zdCBjb250YWluc0NvbG9yRGVmZW5pdGlvbiA9IGNvbnRhaW5zQ29sb3JzRGVmaW5pdGlvbnMoZGF0YXNldHMpIHx8IGNvbnRhaW5zQ29sb3JzRGVmaW5pdGlvbihjaGFydE9wdGlvbnMpIHx8IGVsZW1lbnRzICYmIGNvbnRhaW5zQ29sb3JzRGVmaW5pdGlvbnMoZWxlbWVudHMpIHx8IGNvbnRhaW5zRGVmYXVsdENvbG9yc0RlZmVuaXRpb25zKCk7XG4gICAgICAgIGlmICghb3B0aW9ucy5mb3JjZU92ZXJyaWRlICYmIGNvbnRhaW5zQ29sb3JEZWZlbml0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sb3JpemVyID0gZ2V0Q29sb3JpemVyKGNoYXJ0KTtcbiAgICAgICAgZGF0YXNldHMuZm9yRWFjaChjb2xvcml6ZXIpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGx0dGJEZWNpbWF0aW9uKGRhdGEsIHN0YXJ0LCBjb3VudCwgYXZhaWxhYmxlV2lkdGgsIG9wdGlvbnMpIHtcbiBjb25zdCBzYW1wbGVzID0gb3B0aW9ucy5zYW1wbGVzIHx8IGF2YWlsYWJsZVdpZHRoO1xuICAgIGlmIChzYW1wbGVzID49IGNvdW50KSB7XG4gICAgICAgIHJldHVybiBkYXRhLnNsaWNlKHN0YXJ0LCBzdGFydCArIGNvdW50KTtcbiAgICB9XG4gICAgY29uc3QgZGVjaW1hdGVkID0gW107XG4gICAgY29uc3QgYnVja2V0V2lkdGggPSAoY291bnQgLSAyKSAvIChzYW1wbGVzIC0gMik7XG4gICAgbGV0IHNhbXBsZWRJbmRleCA9IDA7XG4gICAgY29uc3QgZW5kSW5kZXggPSBzdGFydCArIGNvdW50IC0gMTtcbiAgICBsZXQgYSA9IHN0YXJ0O1xuICAgIGxldCBpLCBtYXhBcmVhUG9pbnQsIG1heEFyZWEsIGFyZWEsIG5leHRBO1xuICAgIGRlY2ltYXRlZFtzYW1wbGVkSW5kZXgrK10gPSBkYXRhW2FdO1xuICAgIGZvcihpID0gMDsgaSA8IHNhbXBsZXMgLSAyOyBpKyspe1xuICAgICAgICBsZXQgYXZnWCA9IDA7XG4gICAgICAgIGxldCBhdmdZID0gMDtcbiAgICAgICAgbGV0IGo7XG4gICAgICAgIGNvbnN0IGF2Z1JhbmdlU3RhcnQgPSBNYXRoLmZsb29yKChpICsgMSkgKiBidWNrZXRXaWR0aCkgKyAxICsgc3RhcnQ7XG4gICAgICAgIGNvbnN0IGF2Z1JhbmdlRW5kID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSArIDIpICogYnVja2V0V2lkdGgpICsgMSwgY291bnQpICsgc3RhcnQ7XG4gICAgICAgIGNvbnN0IGF2Z1JhbmdlTGVuZ3RoID0gYXZnUmFuZ2VFbmQgLSBhdmdSYW5nZVN0YXJ0O1xuICAgICAgICBmb3IoaiA9IGF2Z1JhbmdlU3RhcnQ7IGogPCBhdmdSYW5nZUVuZDsgaisrKXtcbiAgICAgICAgICAgIGF2Z1ggKz0gZGF0YVtqXS54O1xuICAgICAgICAgICAgYXZnWSArPSBkYXRhW2pdLnk7XG4gICAgICAgIH1cbiAgICAgICAgYXZnWCAvPSBhdmdSYW5nZUxlbmd0aDtcbiAgICAgICAgYXZnWSAvPSBhdmdSYW5nZUxlbmd0aDtcbiAgICAgICAgY29uc3QgcmFuZ2VPZmZzID0gTWF0aC5mbG9vcihpICogYnVja2V0V2lkdGgpICsgMSArIHN0YXJ0O1xuICAgICAgICBjb25zdCByYW5nZVRvID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSArIDEpICogYnVja2V0V2lkdGgpICsgMSwgY291bnQpICsgc3RhcnQ7XG4gICAgICAgIGNvbnN0IHsgeDogcG9pbnRBeCAsIHk6IHBvaW50QXkgIH0gPSBkYXRhW2FdO1xuICAgICAgICBtYXhBcmVhID0gYXJlYSA9IC0xO1xuICAgICAgICBmb3IoaiA9IHJhbmdlT2ZmczsgaiA8IHJhbmdlVG87IGorKyl7XG4gICAgICAgICAgICBhcmVhID0gMC41ICogTWF0aC5hYnMoKHBvaW50QXggLSBhdmdYKSAqIChkYXRhW2pdLnkgLSBwb2ludEF5KSAtIChwb2ludEF4IC0gZGF0YVtqXS54KSAqIChhdmdZIC0gcG9pbnRBeSkpO1xuICAgICAgICAgICAgaWYgKGFyZWEgPiBtYXhBcmVhKSB7XG4gICAgICAgICAgICAgICAgbWF4QXJlYSA9IGFyZWE7XG4gICAgICAgICAgICAgICAgbWF4QXJlYVBvaW50ID0gZGF0YVtqXTtcbiAgICAgICAgICAgICAgICBuZXh0QSA9IGo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVjaW1hdGVkW3NhbXBsZWRJbmRleCsrXSA9IG1heEFyZWFQb2ludDtcbiAgICAgICAgYSA9IG5leHRBO1xuICAgIH1cbiAgICBkZWNpbWF0ZWRbc2FtcGxlZEluZGV4KytdID0gZGF0YVtlbmRJbmRleF07XG4gICAgcmV0dXJuIGRlY2ltYXRlZDtcbn1cbmZ1bmN0aW9uIG1pbk1heERlY2ltYXRpb24oZGF0YSwgc3RhcnQsIGNvdW50LCBhdmFpbGFibGVXaWR0aCkge1xuICAgIGxldCBhdmdYID0gMDtcbiAgICBsZXQgY291bnRYID0gMDtcbiAgICBsZXQgaSwgcG9pbnQsIHgsIHksIHByZXZYLCBtaW5JbmRleCwgbWF4SW5kZXgsIHN0YXJ0SW5kZXgsIG1pblksIG1heFk7XG4gICAgY29uc3QgZGVjaW1hdGVkID0gW107XG4gICAgY29uc3QgZW5kSW5kZXggPSBzdGFydCArIGNvdW50IC0gMTtcbiAgICBjb25zdCB4TWluID0gZGF0YVtzdGFydF0ueDtcbiAgICBjb25zdCB4TWF4ID0gZGF0YVtlbmRJbmRleF0ueDtcbiAgICBjb25zdCBkeCA9IHhNYXggLSB4TWluO1xuICAgIGZvcihpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyArK2kpe1xuICAgICAgICBwb2ludCA9IGRhdGFbaV07XG4gICAgICAgIHggPSAocG9pbnQueCAtIHhNaW4pIC8gZHggKiBhdmFpbGFibGVXaWR0aDtcbiAgICAgICAgeSA9IHBvaW50Lnk7XG4gICAgICAgIGNvbnN0IHRydW5jWCA9IHggfCAwO1xuICAgICAgICBpZiAodHJ1bmNYID09PSBwcmV2WCkge1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSB7XG4gICAgICAgICAgICAgICAgbWluWSA9IHk7XG4gICAgICAgICAgICAgICAgbWluSW5kZXggPSBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh5ID4gbWF4WSkge1xuICAgICAgICAgICAgICAgIG1heFkgPSB5O1xuICAgICAgICAgICAgICAgIG1heEluZGV4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF2Z1ggPSAoY291bnRYICogYXZnWCArIHBvaW50LngpIC8gKytjb3VudFg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBpIC0gMTtcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZihtaW5JbmRleCkgJiYgIWlzTnVsbE9yVW5kZWYobWF4SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJtZWRpYXRlSW5kZXgxID0gTWF0aC5taW4obWluSW5kZXgsIG1heEluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm1lZGlhdGVJbmRleDIgPSBNYXRoLm1heChtaW5JbmRleCwgbWF4SW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcm1lZGlhdGVJbmRleDEgIT09IHN0YXJ0SW5kZXggJiYgaW50ZXJtZWRpYXRlSW5kZXgxICE9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVjaW1hdGVkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGF0YVtpbnRlcm1lZGlhdGVJbmRleDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgeDogYXZnWFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGludGVybWVkaWF0ZUluZGV4MiAhPT0gc3RhcnRJbmRleCAmJiBpbnRlcm1lZGlhdGVJbmRleDIgIT09IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBkZWNpbWF0ZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5kYXRhW2ludGVybWVkaWF0ZUluZGV4Ml0sXG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBhdmdYXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID4gMCAmJiBsYXN0SW5kZXggIT09IHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBkZWNpbWF0ZWQucHVzaChkYXRhW2xhc3RJbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjaW1hdGVkLnB1c2gocG9pbnQpO1xuICAgICAgICAgICAgcHJldlggPSB0cnVuY1g7XG4gICAgICAgICAgICBjb3VudFggPSAwO1xuICAgICAgICAgICAgbWluWSA9IG1heFkgPSB5O1xuICAgICAgICAgICAgbWluSW5kZXggPSBtYXhJbmRleCA9IHN0YXJ0SW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWNpbWF0ZWQ7XG59XG5mdW5jdGlvbiBjbGVhbkRlY2ltYXRlZERhdGFzZXQoZGF0YXNldCkge1xuICAgIGlmIChkYXRhc2V0Ll9kZWNpbWF0ZWQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGRhdGFzZXQuX2RhdGE7XG4gICAgICAgIGRlbGV0ZSBkYXRhc2V0Ll9kZWNpbWF0ZWQ7XG4gICAgICAgIGRlbGV0ZSBkYXRhc2V0Ll9kYXRhO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0YXNldCwgJ2RhdGEnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogZGF0YVxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGVhbkRlY2ltYXRlZERhdGEoY2hhcnQpIHtcbiAgICBjaGFydC5kYXRhLmRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQpPT57XG4gICAgICAgIGNsZWFuRGVjaW1hdGVkRGF0YXNldChkYXRhc2V0KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGdldFN0YXJ0QW5kQ291bnRPZlZpc2libGVQb2ludHNTaW1wbGlmaWVkKG1ldGEsIHBvaW50cykge1xuICAgIGNvbnN0IHBvaW50Q291bnQgPSBwb2ludHMubGVuZ3RoO1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IGNvdW50O1xuICAgIGNvbnN0IHsgaVNjYWxlICB9ID0gbWV0YTtcbiAgICBjb25zdCB7IG1pbiAsIG1heCAsIG1pbkRlZmluZWQgLCBtYXhEZWZpbmVkICB9ID0gaVNjYWxlLmdldFVzZXJCb3VuZHMoKTtcbiAgICBpZiAobWluRGVmaW5lZCkge1xuICAgICAgICBzdGFydCA9IF9saW1pdFZhbHVlKF9sb29rdXBCeUtleShwb2ludHMsIGlTY2FsZS5heGlzLCBtaW4pLmxvLCAwLCBwb2ludENvdW50IC0gMSk7XG4gICAgfVxuICAgIGlmIChtYXhEZWZpbmVkKSB7XG4gICAgICAgIGNvdW50ID0gX2xpbWl0VmFsdWUoX2xvb2t1cEJ5S2V5KHBvaW50cywgaVNjYWxlLmF4aXMsIG1heCkuaGkgKyAxLCBzdGFydCwgcG9pbnRDb3VudCkgLSBzdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb3VudCA9IHBvaW50Q291bnQgLSBzdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGNvdW50XG4gICAgfTtcbn1cbnZhciBwbHVnaW5fZGVjaW1hdGlvbiA9IHtcbiAgICBpZDogJ2RlY2ltYXRpb24nLFxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGFsZ29yaXRobTogJ21pbi1tYXgnLFxuICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgIH0sXG4gICAgYmVmb3JlRWxlbWVudHNVcGRhdGU6IChjaGFydCwgYXJncywgb3B0aW9ucyk9PntcbiAgICAgICAgaWYgKCFvcHRpb25zLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIGNsZWFuRGVjaW1hdGVkRGF0YShjaGFydCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSBjaGFydC53aWR0aDtcbiAgICAgICAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0LCBkYXRhc2V0SW5kZXgpPT57XG4gICAgICAgICAgICBjb25zdCB7IF9kYXRhICwgaW5kZXhBeGlzICB9ID0gZGF0YXNldDtcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IF9kYXRhIHx8IGRhdGFzZXQuZGF0YTtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlKFtcbiAgICAgICAgICAgICAgICBpbmRleEF4aXMsXG4gICAgICAgICAgICAgICAgY2hhcnQub3B0aW9ucy5pbmRleEF4aXNcbiAgICAgICAgICAgIF0pID09PSAneScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1ldGEuY29udHJvbGxlci5zdXBwb3J0c0RlY2ltYXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB4QXhpcyA9IGNoYXJ0LnNjYWxlc1ttZXRhLnhBeGlzSURdO1xuICAgICAgICAgICAgaWYgKHhBeGlzLnR5cGUgIT09ICdsaW5lYXInICYmIHhBeGlzLnR5cGUgIT09ICd0aW1lJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFydC5vcHRpb25zLnBhcnNpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgeyBzdGFydCAsIGNvdW50ICB9ID0gZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50c1NpbXBsaWZpZWQobWV0YSwgZGF0YSk7XG4gICAgICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSBvcHRpb25zLnRocmVzaG9sZCB8fCA0ICogYXZhaWxhYmxlV2lkdGg7XG4gICAgICAgICAgICBpZiAoY291bnQgPD0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgY2xlYW5EZWNpbWF0ZWREYXRhc2V0KGRhdGFzZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc051bGxPclVuZGVmKF9kYXRhKSkge1xuICAgICAgICAgICAgICAgIGRhdGFzZXQuX2RhdGEgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhc2V0LmRhdGE7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGFzZXQsICdkYXRhJywge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVjaW1hdGVkO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGEgPSBkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZGVjaW1hdGVkO1xuICAgICAgICAgICAgc3dpdGNoKG9wdGlvbnMuYWxnb3JpdGhtKXtcbiAgICAgICAgICAgICAgICBjYXNlICdsdHRiJzpcbiAgICAgICAgICAgICAgICAgICAgZGVjaW1hdGVkID0gbHR0YkRlY2ltYXRpb24oZGF0YSwgc3RhcnQsIGNvdW50LCBhdmFpbGFibGVXaWR0aCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21pbi1tYXgnOlxuICAgICAgICAgICAgICAgICAgICBkZWNpbWF0ZWQgPSBtaW5NYXhEZWNpbWF0aW9uKGRhdGEsIHN0YXJ0LCBjb3VudCwgYXZhaWxhYmxlV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRlY2ltYXRpb24gYWxnb3JpdGhtICcke29wdGlvbnMuYWxnb3JpdGhtfSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFzZXQuX2RlY2ltYXRlZCA9IGRlY2ltYXRlZDtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBkZXN0cm95IChjaGFydCkge1xuICAgICAgICBjbGVhbkRlY2ltYXRlZERhdGEoY2hhcnQpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIF9zZWdtZW50cyhsaW5lLCB0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBsaW5lLnNlZ21lbnRzO1xuICAgIGNvbnN0IHBvaW50cyA9IGxpbmUucG9pbnRzO1xuICAgIGNvbnN0IHRwb2ludHMgPSB0YXJnZXQucG9pbnRzO1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKXtcbiAgICAgICAgbGV0IHsgc3RhcnQgLCBlbmQgIH0gPSBzZWdtZW50O1xuICAgICAgICBlbmQgPSBfZmluZFNlZ21lbnRFbmQoc3RhcnQsIGVuZCwgcG9pbnRzKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gX2dldEJvdW5kcyhwcm9wZXJ0eSwgcG9pbnRzW3N0YXJ0XSwgcG9pbnRzW2VuZF0sIHNlZ21lbnQubG9vcCk7XG4gICAgICAgIGlmICghdGFyZ2V0LnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNlZ21lbnQsXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBib3VuZHMsXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHBvaW50c1tzdGFydF0sXG4gICAgICAgICAgICAgICAgZW5kOiBwb2ludHNbZW5kXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXRTZWdtZW50cyA9IF9ib3VuZFNlZ21lbnRzKHRhcmdldCwgYm91bmRzKTtcbiAgICAgICAgZm9yIChjb25zdCB0Z3Qgb2YgdGFyZ2V0U2VnbWVudHMpe1xuICAgICAgICAgICAgY29uc3Qgc3ViQm91bmRzID0gX2dldEJvdW5kcyhwcm9wZXJ0eSwgdHBvaW50c1t0Z3Quc3RhcnRdLCB0cG9pbnRzW3RndC5lbmRdLCB0Z3QubG9vcCk7XG4gICAgICAgICAgICBjb25zdCBmaWxsU291cmNlcyA9IF9ib3VuZFNlZ21lbnQoc2VnbWVudCwgcG9pbnRzLCBzdWJCb3VuZHMpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxsU291cmNlIG9mIGZpbGxTb3VyY2VzKXtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmaWxsU291cmNlLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRndCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eV06IF9nZXRFZGdlKGJvdW5kcywgc3ViQm91bmRzLCAnc3RhcnQnLCBNYXRoLm1heClcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHldOiBfZ2V0RWRnZShib3VuZHMsIHN1YkJvdW5kcywgJ2VuZCcsIE1hdGgubWluKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzO1xufVxuZnVuY3Rpb24gX2dldEJvdW5kcyhwcm9wZXJ0eSwgZmlyc3QsIGxhc3QsIGxvb3ApIHtcbiAgICBpZiAobG9vcCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBzdGFydCA9IGZpcnN0W3Byb3BlcnR5XTtcbiAgICBsZXQgZW5kID0gbGFzdFtwcm9wZXJ0eV07XG4gICAgaWYgKHByb3BlcnR5ID09PSAnYW5nbGUnKSB7XG4gICAgICAgIHN0YXJ0ID0gX25vcm1hbGl6ZUFuZ2xlKHN0YXJ0KTtcbiAgICAgICAgZW5kID0gX25vcm1hbGl6ZUFuZ2xlKGVuZCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHByb3BlcnR5LFxuICAgICAgICBzdGFydCxcbiAgICAgICAgZW5kXG4gICAgfTtcbn1cbmZ1bmN0aW9uIF9wb2ludHNGcm9tU2VnbWVudHMoYm91bmRhcnksIGxpbmUpIHtcbiAgICBjb25zdCB7IHggPW51bGwgLCB5ID1udWxsICB9ID0gYm91bmRhcnkgfHwge307XG4gICAgY29uc3QgbGluZVBvaW50cyA9IGxpbmUucG9pbnRzO1xuICAgIGNvbnN0IHBvaW50cyA9IFtdO1xuICAgIGxpbmUuc2VnbWVudHMuZm9yRWFjaCgoeyBzdGFydCAsIGVuZCAgfSk9PntcbiAgICAgICAgZW5kID0gX2ZpbmRTZWdtZW50RW5kKHN0YXJ0LCBlbmQsIGxpbmVQb2ludHMpO1xuICAgICAgICBjb25zdCBmaXJzdCA9IGxpbmVQb2ludHNbc3RhcnRdO1xuICAgICAgICBjb25zdCBsYXN0ID0gbGluZVBvaW50c1tlbmRdO1xuICAgICAgICBpZiAoeSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHg6IGZpcnN0LngsXG4gICAgICAgICAgICAgICAgeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgICAgICAgICAgeDogbGFzdC54LFxuICAgICAgICAgICAgICAgIHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHggIT09IG51bGwpIHtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgIHk6IGZpcnN0LnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgeTogbGFzdC55XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwb2ludHM7XG59XG5mdW5jdGlvbiBfZmluZFNlZ21lbnRFbmQoc3RhcnQsIGVuZCwgcG9pbnRzKSB7XG4gICAgZm9yKDsgZW5kID4gc3RhcnQ7IGVuZC0tKXtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHNbZW5kXTtcbiAgICAgICAgaWYgKCFpc05hTihwb2ludC54KSAmJiAhaXNOYU4ocG9pbnQueSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbmQ7XG59XG5mdW5jdGlvbiBfZ2V0RWRnZShhLCBiLCBwcm9wLCBmbikge1xuICAgIGlmIChhICYmIGIpIHtcbiAgICAgICAgcmV0dXJuIGZuKGFbcHJvcF0sIGJbcHJvcF0pO1xuICAgIH1cbiAgICByZXR1cm4gYSA/IGFbcHJvcF0gOiBiID8gYltwcm9wXSA6IDA7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVCb3VuZGFyeUxpbmUoYm91bmRhcnksIGxpbmUpIHtcbiAgICBsZXQgcG9pbnRzID0gW107XG4gICAgbGV0IF9sb29wID0gZmFsc2U7XG4gICAgaWYgKGlzQXJyYXkoYm91bmRhcnkpKSB7XG4gICAgICAgIF9sb29wID0gdHJ1ZTtcbiAgICAgICAgcG9pbnRzID0gYm91bmRhcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcG9pbnRzID0gX3BvaW50c0Zyb21TZWdtZW50cyhib3VuZGFyeSwgbGluZSk7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHMubGVuZ3RoID8gbmV3IExpbmVFbGVtZW50KHtcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB0ZW5zaW9uOiAwXG4gICAgICAgIH0sXG4gICAgICAgIF9sb29wLFxuICAgICAgICBfZnVsbExvb3A6IF9sb29wXG4gICAgfSkgOiBudWxsO1xufVxuZnVuY3Rpb24gX3Nob3VsZEFwcGx5RmlsbChzb3VyY2UpIHtcbiAgICByZXR1cm4gc291cmNlICYmIHNvdXJjZS5maWxsICE9PSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVUYXJnZXQoc291cmNlcywgaW5kZXgsIHByb3BhZ2F0ZSkge1xuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgIGxldCBmaWxsID0gc291cmNlLmZpbGw7XG4gICAgY29uc3QgdmlzaXRlZCA9IFtcbiAgICAgICAgaW5kZXhcbiAgICBdO1xuICAgIGxldCB0YXJnZXQ7XG4gICAgaWYgKCFwcm9wYWdhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGw7XG4gICAgfVxuICAgIHdoaWxlKGZpbGwgIT09IGZhbHNlICYmIHZpc2l0ZWQuaW5kZXhPZihmaWxsKSA9PT0gLTEpe1xuICAgICAgICBpZiAoIWlzTnVtYmVyRmluaXRlKGZpbGwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsbDtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBzb3VyY2VzW2ZpbGxdO1xuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGw7XG4gICAgICAgIH1cbiAgICAgICAgdmlzaXRlZC5wdXNoKGZpbGwpO1xuICAgICAgICBmaWxsID0gdGFyZ2V0LmZpbGw7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbiBmdW5jdGlvbiBfZGVjb2RlRmlsbChsaW5lLCBpbmRleCwgY291bnQpIHtcbiAgICAgY29uc3QgZmlsbCA9IHBhcnNlRmlsbE9wdGlvbihsaW5lKTtcbiAgICBpZiAoaXNPYmplY3QoZmlsbCkpIHtcbiAgICAgICAgcmV0dXJuIGlzTmFOKGZpbGwudmFsdWUpID8gZmFsc2UgOiBmaWxsO1xuICAgIH1cbiAgICBsZXQgdGFyZ2V0ID0gcGFyc2VGbG9hdChmaWxsKTtcbiAgICBpZiAoaXNOdW1iZXJGaW5pdGUodGFyZ2V0KSAmJiBNYXRoLmZsb29yKHRhcmdldCkgPT09IHRhcmdldCkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVGFyZ2V0SW5kZXgoZmlsbFswXSwgaW5kZXgsIHRhcmdldCwgY291bnQpO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICAnb3JpZ2luJyxcbiAgICAgICAgJ3N0YXJ0JyxcbiAgICAgICAgJ2VuZCcsXG4gICAgICAgICdzdGFjaycsXG4gICAgICAgICdzaGFwZSdcbiAgICBdLmluZGV4T2YoZmlsbCkgPj0gMCAmJiBmaWxsO1xufVxuZnVuY3Rpb24gZGVjb2RlVGFyZ2V0SW5kZXgoZmlyc3RDaCwgaW5kZXgsIHRhcmdldCwgY291bnQpIHtcbiAgICBpZiAoZmlyc3RDaCA9PT0gJy0nIHx8IGZpcnN0Q2ggPT09ICcrJykge1xuICAgICAgICB0YXJnZXQgPSBpbmRleCArIHRhcmdldDtcbiAgICB9XG4gICAgaWYgKHRhcmdldCA9PT0gaW5kZXggfHwgdGFyZ2V0IDwgMCB8fCB0YXJnZXQgPj0gY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuIGZ1bmN0aW9uIF9nZXRUYXJnZXRQaXhlbChmaWxsLCBzY2FsZSkge1xuICAgIGxldCBwaXhlbCA9IG51bGw7XG4gICAgaWYgKGZpbGwgPT09ICdzdGFydCcpIHtcbiAgICAgICAgcGl4ZWwgPSBzY2FsZS5ib3R0b207XG4gICAgfSBlbHNlIGlmIChmaWxsID09PSAnZW5kJykge1xuICAgICAgICBwaXhlbCA9IHNjYWxlLnRvcDtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpbGwpKSB7XG4gICAgICAgIHBpeGVsID0gc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShmaWxsLnZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHNjYWxlLmdldEJhc2VQaXhlbCkge1xuICAgICAgICBwaXhlbCA9IHNjYWxlLmdldEJhc2VQaXhlbCgpO1xuICAgIH1cbiAgICByZXR1cm4gcGl4ZWw7XG59XG4gZnVuY3Rpb24gX2dldFRhcmdldFZhbHVlKGZpbGwsIHNjYWxlLCBzdGFydFZhbHVlKSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChmaWxsID09PSAnc3RhcnQnKSB7XG4gICAgICAgIHZhbHVlID0gc3RhcnRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGZpbGwgPT09ICdlbmQnKSB7XG4gICAgICAgIHZhbHVlID0gc2NhbGUub3B0aW9ucy5yZXZlcnNlID8gc2NhbGUubWluIDogc2NhbGUubWF4O1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZmlsbCkpIHtcbiAgICAgICAgdmFsdWUgPSBmaWxsLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gc2NhbGUuZ2V0QmFzZVZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbiBmdW5jdGlvbiBwYXJzZUZpbGxPcHRpb24obGluZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBsaW5lLm9wdGlvbnM7XG4gICAgY29uc3QgZmlsbE9wdGlvbiA9IG9wdGlvbnMuZmlsbDtcbiAgICBsZXQgZmlsbCA9IHZhbHVlT3JEZWZhdWx0KGZpbGxPcHRpb24gJiYgZmlsbE9wdGlvbi50YXJnZXQsIGZpbGxPcHRpb24pO1xuICAgIGlmIChmaWxsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZmlsbCA9ICEhb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuICAgIGlmIChmaWxsID09PSBmYWxzZSB8fCBmaWxsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZpbGwgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuICdvcmlnaW4nO1xuICAgIH1cbiAgICByZXR1cm4gZmlsbDtcbn1cblxuZnVuY3Rpb24gX2J1aWxkU3RhY2tMaW5lKHNvdXJjZSkge1xuICAgIGNvbnN0IHsgc2NhbGUgLCBpbmRleCAsIGxpbmUgIH0gPSBzb3VyY2U7XG4gICAgY29uc3QgcG9pbnRzID0gW107XG4gICAgY29uc3Qgc2VnbWVudHMgPSBsaW5lLnNlZ21lbnRzO1xuICAgIGNvbnN0IHNvdXJjZVBvaW50cyA9IGxpbmUucG9pbnRzO1xuICAgIGNvbnN0IGxpbmVzQmVsb3cgPSBnZXRMaW5lc0JlbG93KHNjYWxlLCBpbmRleCk7XG4gICAgbGluZXNCZWxvdy5wdXNoKF9jcmVhdGVCb3VuZGFyeUxpbmUoe1xuICAgICAgICB4OiBudWxsLFxuICAgICAgICB5OiBzY2FsZS5ib3R0b21cbiAgICB9LCBsaW5lKSk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2ldO1xuICAgICAgICBmb3IobGV0IGogPSBzZWdtZW50LnN0YXJ0OyBqIDw9IHNlZ21lbnQuZW5kOyBqKyspe1xuICAgICAgICAgICAgYWRkUG9pbnRzQmVsb3cocG9pbnRzLCBzb3VyY2VQb2ludHNbal0sIGxpbmVzQmVsb3cpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgTGluZUVsZW1lbnQoe1xuICAgICAgICBwb2ludHMsXG4gICAgICAgIG9wdGlvbnM6IHt9XG4gICAgfSk7XG59XG4gZnVuY3Rpb24gZ2V0TGluZXNCZWxvdyhzY2FsZSwgaW5kZXgpIHtcbiAgICBjb25zdCBiZWxvdyA9IFtdO1xuICAgIGNvbnN0IG1ldGFzID0gc2NhbGUuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMoJ2xpbmUnKTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgbWV0YXMubGVuZ3RoOyBpKyspe1xuICAgICAgICBjb25zdCBtZXRhID0gbWV0YXNbaV07XG4gICAgICAgIGlmIChtZXRhLmluZGV4ID09PSBpbmRleCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXRhLmhpZGRlbikge1xuICAgICAgICAgICAgYmVsb3cudW5zaGlmdChtZXRhLmRhdGFzZXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiZWxvdztcbn1cbiBmdW5jdGlvbiBhZGRQb2ludHNCZWxvdyhwb2ludHMsIHNvdXJjZVBvaW50LCBsaW5lc0JlbG93KSB7XG4gICAgY29uc3QgcG9zdHBvbmVkID0gW107XG4gICAgZm9yKGxldCBqID0gMDsgaiA8IGxpbmVzQmVsb3cubGVuZ3RoOyBqKyspe1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNCZWxvd1tqXTtcbiAgICAgICAgY29uc3QgeyBmaXJzdCAsIGxhc3QgLCBwb2ludCAgfSA9IGZpbmRQb2ludChsaW5lLCBzb3VyY2VQb2ludCwgJ3gnKTtcbiAgICAgICAgaWYgKCFwb2ludCB8fCBmaXJzdCAmJiBsYXN0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgIHBvc3Rwb25lZC51bnNoaWZ0KHBvaW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHBvaW50KTtcbiAgICAgICAgICAgIGlmICghbGFzdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHBvaW50cy5wdXNoKC4uLnBvc3Rwb25lZCk7XG59XG4gZnVuY3Rpb24gZmluZFBvaW50KGxpbmUsIHNvdXJjZVBvaW50LCBwcm9wZXJ0eSkge1xuICAgIGNvbnN0IHBvaW50ID0gbGluZS5pbnRlcnBvbGF0ZShzb3VyY2VQb2ludCwgcHJvcGVydHkpO1xuICAgIGlmICghcG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBwb2ludFZhbHVlID0gcG9pbnRbcHJvcGVydHldO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gbGluZS5zZWdtZW50cztcbiAgICBjb25zdCBsaW5lUG9pbnRzID0gbGluZS5wb2ludHM7XG4gICAgbGV0IGZpcnN0ID0gZmFsc2U7XG4gICAgbGV0IGxhc3QgPSBmYWxzZTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gc2VnbWVudHNbaV07XG4gICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBsaW5lUG9pbnRzW3NlZ21lbnQuc3RhcnRdW3Byb3BlcnR5XTtcbiAgICAgICAgY29uc3QgbGFzdFZhbHVlID0gbGluZVBvaW50c1tzZWdtZW50LmVuZF1bcHJvcGVydHldO1xuICAgICAgICBpZiAoX2lzQmV0d2Vlbihwb2ludFZhbHVlLCBmaXJzdFZhbHVlLCBsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgICBmaXJzdCA9IHBvaW50VmFsdWUgPT09IGZpcnN0VmFsdWU7XG4gICAgICAgICAgICBsYXN0ID0gcG9pbnRWYWx1ZSA9PT0gbGFzdFZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmlyc3QsXG4gICAgICAgIGxhc3QsXG4gICAgICAgIHBvaW50XG4gICAgfTtcbn1cblxuY2xhc3Mgc2ltcGxlQXJjIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKXtcbiAgICAgICAgdGhpcy54ID0gb3B0cy54O1xuICAgICAgICB0aGlzLnkgPSBvcHRzLnk7XG4gICAgICAgIHRoaXMucmFkaXVzID0gb3B0cy5yYWRpdXM7XG4gICAgfVxuICAgIHBhdGhTZWdtZW50KGN0eCwgYm91bmRzLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgeCAsIHkgLCByYWRpdXMgIH0gPSB0aGlzO1xuICAgICAgICBib3VuZHMgPSBib3VuZHMgfHwge1xuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBlbmQ6IFRBVVxuICAgICAgICB9O1xuICAgICAgICBjdHguYXJjKHgsIHksIHJhZGl1cywgYm91bmRzLmVuZCwgYm91bmRzLnN0YXJ0LCB0cnVlKTtcbiAgICAgICAgcmV0dXJuICFvcHRzLmJvdW5kcztcbiAgICB9XG4gICAgaW50ZXJwb2xhdGUocG9pbnQpIHtcbiAgICAgICAgY29uc3QgeyB4ICwgeSAsIHJhZGl1cyAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGFuZ2xlID0gcG9pbnQuYW5nbGU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB4ICsgTWF0aC5jb3MoYW5nbGUpICogcmFkaXVzLFxuICAgICAgICAgICAgeTogeSArIE1hdGguc2luKGFuZ2xlKSAqIHJhZGl1cyxcbiAgICAgICAgICAgIGFuZ2xlXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0VGFyZ2V0KHNvdXJjZSkge1xuICAgIGNvbnN0IHsgY2hhcnQgLCBmaWxsICwgbGluZSAgfSA9IHNvdXJjZTtcbiAgICBpZiAoaXNOdW1iZXJGaW5pdGUoZmlsbCkpIHtcbiAgICAgICAgcmV0dXJuIGdldExpbmVCeUluZGV4KGNoYXJ0LCBmaWxsKTtcbiAgICB9XG4gICAgaWYgKGZpbGwgPT09ICdzdGFjaycpIHtcbiAgICAgICAgcmV0dXJuIF9idWlsZFN0YWNrTGluZShzb3VyY2UpO1xuICAgIH1cbiAgICBpZiAoZmlsbCA9PT0gJ3NoYXBlJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgYm91bmRhcnkgPSBjb21wdXRlQm91bmRhcnkoc291cmNlKTtcbiAgICBpZiAoYm91bmRhcnkgaW5zdGFuY2VvZiBzaW1wbGVBcmMpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kYXJ5O1xuICAgIH1cbiAgICByZXR1cm4gX2NyZWF0ZUJvdW5kYXJ5TGluZShib3VuZGFyeSwgbGluZSk7XG59XG4gZnVuY3Rpb24gZ2V0TGluZUJ5SW5kZXgoY2hhcnQsIGluZGV4KSB7XG4gICAgY29uc3QgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGluZGV4KTtcbiAgICBjb25zdCB2aXNpYmxlID0gbWV0YSAmJiBjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGluZGV4KTtcbiAgICByZXR1cm4gdmlzaWJsZSA/IG1ldGEuZGF0YXNldCA6IG51bGw7XG59XG5mdW5jdGlvbiBjb21wdXRlQm91bmRhcnkoc291cmNlKSB7XG4gICAgY29uc3Qgc2NhbGUgPSBzb3VyY2Uuc2NhbGUgfHwge307XG4gICAgaWYgKHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSkge1xuICAgICAgICByZXR1cm4gY29tcHV0ZUNpcmN1bGFyQm91bmRhcnkoc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXB1dGVMaW5lYXJCb3VuZGFyeShzb3VyY2UpO1xufVxuZnVuY3Rpb24gY29tcHV0ZUxpbmVhckJvdW5kYXJ5KHNvdXJjZSkge1xuICAgIGNvbnN0IHsgc2NhbGUgPXt9ICwgZmlsbCAgfSA9IHNvdXJjZTtcbiAgICBjb25zdCBwaXhlbCA9IF9nZXRUYXJnZXRQaXhlbChmaWxsLCBzY2FsZSk7XG4gICAgaWYgKGlzTnVtYmVyRmluaXRlKHBpeGVsKSkge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsID0gc2NhbGUuaXNIb3Jpem9udGFsKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBob3Jpem9udGFsID8gcGl4ZWwgOiBudWxsLFxuICAgICAgICAgICAgeTogaG9yaXpvbnRhbCA/IG51bGwgOiBwaXhlbFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVDaXJjdWxhckJvdW5kYXJ5KHNvdXJjZSkge1xuICAgIGNvbnN0IHsgc2NhbGUgLCBmaWxsICB9ID0gc291cmNlO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBzY2FsZS5vcHRpb25zO1xuICAgIGNvbnN0IGxlbmd0aCA9IHNjYWxlLmdldExhYmVscygpLmxlbmd0aDtcbiAgICBjb25zdCBzdGFydCA9IG9wdGlvbnMucmV2ZXJzZSA/IHNjYWxlLm1heCA6IHNjYWxlLm1pbjtcbiAgICBjb25zdCB2YWx1ZSA9IF9nZXRUYXJnZXRWYWx1ZShmaWxsLCBzY2FsZSwgc3RhcnQpO1xuICAgIGNvbnN0IHRhcmdldCA9IFtdO1xuICAgIGlmIChvcHRpb25zLmdyaWQuY2lyY3VsYXIpIHtcbiAgICAgICAgY29uc3QgY2VudGVyID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKDAsIHN0YXJ0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBzaW1wbGVBcmMoe1xuICAgICAgICAgICAgeDogY2VudGVyLngsXG4gICAgICAgICAgICB5OiBjZW50ZXIueSxcbiAgICAgICAgICAgIHJhZGl1czogc2NhbGUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodmFsdWUpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpe1xuICAgICAgICB0YXJnZXQucHVzaChzY2FsZS5nZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUoaSwgdmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX2RyYXdmaWxsKGN0eCwgc291cmNlLCBhcmVhKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gX2dldFRhcmdldChzb3VyY2UpO1xuICAgIGNvbnN0IHsgY2hhcnQgLCBpbmRleCAsIGxpbmUgLCBzY2FsZSAsIGF4aXMgIH0gPSBzb3VyY2U7XG4gICAgY29uc3QgbGluZU9wdHMgPSBsaW5lLm9wdGlvbnM7XG4gICAgY29uc3QgZmlsbE9wdGlvbiA9IGxpbmVPcHRzLmZpbGw7XG4gICAgY29uc3QgY29sb3IgPSBsaW5lT3B0cy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgY29uc3QgeyBhYm92ZSA9Y29sb3IgLCBiZWxvdyA9Y29sb3IgIH0gPSBmaWxsT3B0aW9uIHx8IHt9O1xuICAgIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpbmRleCk7XG4gICAgY29uc3QgY2xpcCA9IGdldERhdGFzZXRDbGlwQXJlYShjaGFydCwgbWV0YSk7XG4gICAgaWYgKHRhcmdldCAmJiBsaW5lLnBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgY2xpcEFyZWEoY3R4LCBhcmVhKTtcbiAgICAgICAgZG9GaWxsKGN0eCwge1xuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIGFib3ZlLFxuICAgICAgICAgICAgYmVsb3csXG4gICAgICAgICAgICBhcmVhLFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICBheGlzLFxuICAgICAgICAgICAgY2xpcFxuICAgICAgICB9KTtcbiAgICAgICAgdW5jbGlwQXJlYShjdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRvRmlsbChjdHgsIGNmZykge1xuICAgIGNvbnN0IHsgbGluZSAsIHRhcmdldCAsIGFib3ZlICwgYmVsb3cgLCBhcmVhICwgc2NhbGUgLCBjbGlwICB9ID0gY2ZnO1xuICAgIGNvbnN0IHByb3BlcnR5ID0gbGluZS5fbG9vcCA/ICdhbmdsZScgOiBjZmcuYXhpcztcbiAgICBjdHguc2F2ZSgpO1xuICAgIGxldCBmaWxsQ29sb3IgPSBiZWxvdztcbiAgICBpZiAoYmVsb3cgIT09IGFib3ZlKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICBjbGlwVmVydGljYWwoY3R4LCB0YXJnZXQsIGFyZWEudG9wKTtcbiAgICAgICAgICAgIGZpbGwoY3R4LCB7XG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgY29sb3I6IGFib3ZlLFxuICAgICAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgIGNsaXBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICBjbGlwVmVydGljYWwoY3R4LCB0YXJnZXQsIGFyZWEuYm90dG9tKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSA9PT0gJ3knKSB7XG4gICAgICAgICAgICBjbGlwSG9yaXpvbnRhbChjdHgsIHRhcmdldCwgYXJlYS5sZWZ0KTtcbiAgICAgICAgICAgIGZpbGwoY3R4LCB7XG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgY29sb3I6IGJlbG93LFxuICAgICAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgIGNsaXBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICBjbGlwSG9yaXpvbnRhbChjdHgsIHRhcmdldCwgYXJlYS5yaWdodCk7XG4gICAgICAgICAgICBmaWxsQ29sb3IgPSBhYm92ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaWxsKGN0eCwge1xuICAgICAgICBsaW5lLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGNvbG9yOiBmaWxsQ29sb3IsXG4gICAgICAgIHNjYWxlLFxuICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgY2xpcFxuICAgIH0pO1xuICAgIGN0eC5yZXN0b3JlKCk7XG59XG5mdW5jdGlvbiBjbGlwVmVydGljYWwoY3R4LCB0YXJnZXQsIGNsaXBZKSB7XG4gICAgY29uc3QgeyBzZWdtZW50cyAsIHBvaW50cyAgfSA9IHRhcmdldDtcbiAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgIGxldCBsaW5lTG9vcCA9IGZhbHNlO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpe1xuICAgICAgICBjb25zdCB7IHN0YXJ0ICwgZW5kICB9ID0gc2VnbWVudDtcbiAgICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHBvaW50c1tzdGFydF07XG4gICAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50c1tfZmluZFNlZ21lbnRFbmQoc3RhcnQsIGVuZCwgcG9pbnRzKV07XG4gICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyhmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSk7XG4gICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3R4LmxpbmVUbyhmaXJzdFBvaW50LngsIGNsaXBZKTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnkpO1xuICAgICAgICB9XG4gICAgICAgIGxpbmVMb29wID0gISF0YXJnZXQucGF0aFNlZ21lbnQoY3R4LCBzZWdtZW50LCB7XG4gICAgICAgICAgICBtb3ZlOiBsaW5lTG9vcFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGxpbmVMb29wKSB7XG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHgubGluZVRvKGxhc3RQb2ludC54LCBjbGlwWSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3R4LmxpbmVUbyh0YXJnZXQuZmlyc3QoKS54LCBjbGlwWSk7XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGN0eC5jbGlwKCk7XG59XG5mdW5jdGlvbiBjbGlwSG9yaXpvbnRhbChjdHgsIHRhcmdldCwgY2xpcFgpIHtcbiAgICBjb25zdCB7IHNlZ21lbnRzICwgcG9pbnRzICB9ID0gdGFyZ2V0O1xuICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgbGV0IGxpbmVMb29wID0gZmFsc2U7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cyl7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQgLCBlbmQgIH0gPSBzZWdtZW50O1xuICAgICAgICBjb25zdCBmaXJzdFBvaW50ID0gcG9pbnRzW3N0YXJ0XTtcbiAgICAgICAgY29uc3QgbGFzdFBvaW50ID0gcG9pbnRzW19maW5kU2VnbWVudEVuZChzdGFydCwgZW5kLCBwb2ludHMpXTtcbiAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICBjdHgubW92ZVRvKGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55KTtcbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHgubGluZVRvKGNsaXBYLCBmaXJzdFBvaW50LnkpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyhmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSk7XG4gICAgICAgIH1cbiAgICAgICAgbGluZUxvb3AgPSAhIXRhcmdldC5wYXRoU2VnbWVudChjdHgsIHNlZ21lbnQsIHtcbiAgICAgICAgICAgIG1vdmU6IGxpbmVMb29wXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobGluZUxvb3ApIHtcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oY2xpcFgsIGxhc3RQb2ludC55KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjdHgubGluZVRvKGNsaXBYLCB0YXJnZXQuZmlyc3QoKS55KTtcbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgY3R4LmNsaXAoKTtcbn1cbmZ1bmN0aW9uIGZpbGwoY3R4LCBjZmcpIHtcbiAgICBjb25zdCB7IGxpbmUgLCB0YXJnZXQgLCBwcm9wZXJ0eSAsIGNvbG9yICwgc2NhbGUgLCBjbGlwICB9ID0gY2ZnO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gX3NlZ21lbnRzKGxpbmUsIHRhcmdldCwgcHJvcGVydHkpO1xuICAgIGZvciAoY29uc3QgeyBzb3VyY2U6IHNyYyAsIHRhcmdldDogdGd0ICwgc3RhcnQgLCBlbmQgIH0gb2Ygc2VnbWVudHMpe1xuICAgICAgICBjb25zdCB7IHN0eWxlOiB7IGJhY2tncm91bmRDb2xvciA9Y29sb3IgIH0gPSB7fSAgfSA9IHNyYztcbiAgICAgICAgY29uc3Qgbm90U2hhcGUgPSB0YXJnZXQgIT09IHRydWU7XG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIGNsaXBCb3VuZHMoY3R4LCBzY2FsZSwgY2xpcCwgbm90U2hhcGUgJiYgX2dldEJvdW5kcyhwcm9wZXJ0eSwgc3RhcnQsIGVuZCkpO1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnN0IGxpbmVMb29wID0gISFsaW5lLnBhdGhTZWdtZW50KGN0eCwgc3JjKTtcbiAgICAgICAgbGV0IGxvb3A7XG4gICAgICAgIGlmIChub3RTaGFwZSkge1xuICAgICAgICAgICAgaWYgKGxpbmVMb29wKSB7XG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZWRMaW5lVG8oY3R4LCB0YXJnZXQsIGVuZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0TG9vcCA9ICEhdGFyZ2V0LnBhdGhTZWdtZW50KGN0eCwgdGd0LCB7XG4gICAgICAgICAgICAgICAgbW92ZTogbGluZUxvb3AsXG4gICAgICAgICAgICAgICAgcmV2ZXJzZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsb29wID0gbGluZUxvb3AgJiYgdGFyZ2V0TG9vcDtcbiAgICAgICAgICAgIGlmICghbG9vcCkge1xuICAgICAgICAgICAgICAgIGludGVycG9sYXRlZExpbmVUbyhjdHgsIHRhcmdldCwgc3RhcnQsIHByb3BlcnR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgIGN0eC5maWxsKGxvb3AgPyAnZXZlbm9kZCcgOiAnbm9uemVybycpO1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsaXBCb3VuZHMoY3R4LCBzY2FsZSwgY2xpcCwgYm91bmRzKSB7XG4gICAgY29uc3QgY2hhcnRBcmVhID0gc2NhbGUuY2hhcnQuY2hhcnRBcmVhO1xuICAgIGNvbnN0IHsgcHJvcGVydHkgLCBzdGFydCAsIGVuZCAgfSA9IGJvdW5kcyB8fCB7fTtcbiAgICBpZiAocHJvcGVydHkgPT09ICd4JyB8fCBwcm9wZXJ0eSA9PT0gJ3knKSB7XG4gICAgICAgIGxldCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207XG4gICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICBsZWZ0ID0gc3RhcnQ7XG4gICAgICAgICAgICB0b3AgPSBjaGFydEFyZWEudG9wO1xuICAgICAgICAgICAgcmlnaHQgPSBlbmQ7XG4gICAgICAgICAgICBib3R0b20gPSBjaGFydEFyZWEuYm90dG9tO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGVmdCA9IGNoYXJ0QXJlYS5sZWZ0O1xuICAgICAgICAgICAgdG9wID0gc3RhcnQ7XG4gICAgICAgICAgICByaWdodCA9IGNoYXJ0QXJlYS5yaWdodDtcbiAgICAgICAgICAgIGJvdHRvbSA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGlmIChjbGlwKSB7XG4gICAgICAgICAgICBsZWZ0ID0gTWF0aC5tYXgobGVmdCwgY2xpcC5sZWZ0KTtcbiAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIGNsaXAucmlnaHQpO1xuICAgICAgICAgICAgdG9wID0gTWF0aC5tYXgodG9wLCBjbGlwLnRvcCk7XG4gICAgICAgICAgICBib3R0b20gPSBNYXRoLm1pbihib3R0b20sIGNsaXAuYm90dG9tKTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucmVjdChsZWZ0LCB0b3AsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTtcbiAgICAgICAgY3R4LmNsaXAoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnRlcnBvbGF0ZWRMaW5lVG8oY3R4LCB0YXJnZXQsIHBvaW50LCBwcm9wZXJ0eSkge1xuICAgIGNvbnN0IGludGVycG9sYXRlZFBvaW50ID0gdGFyZ2V0LmludGVycG9sYXRlKHBvaW50LCBwcm9wZXJ0eSk7XG4gICAgaWYgKGludGVycG9sYXRlZFBvaW50KSB7XG4gICAgICAgIGN0eC5saW5lVG8oaW50ZXJwb2xhdGVkUG9pbnQueCwgaW50ZXJwb2xhdGVkUG9pbnQueSk7XG4gICAgfVxufVxuXG52YXIgaW5kZXggPSB7XG4gICAgaWQ6ICdmaWxsZXInLFxuICAgIGFmdGVyRGF0YXNldHNVcGRhdGUgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBjb3VudCA9IChjaGFydC5kYXRhLmRhdGFzZXRzIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHNvdXJjZXMgPSBbXTtcbiAgICAgICAgbGV0IG1ldGEsIGksIGxpbmUsIHNvdXJjZTtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgY291bnQ7ICsraSl7XG4gICAgICAgICAgICBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG4gICAgICAgICAgICBsaW5lID0gbWV0YS5kYXRhc2V0O1xuICAgICAgICAgICAgc291cmNlID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChsaW5lICYmIGxpbmUub3B0aW9ucyAmJiBsaW5lIGluc3RhbmNlb2YgTGluZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSksXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBfZGVjb2RlRmlsbChsaW5lLCBpLCBjb3VudCksXG4gICAgICAgICAgICAgICAgICAgIGNoYXJ0LFxuICAgICAgICAgICAgICAgICAgICBheGlzOiBtZXRhLmNvbnRyb2xsZXIub3B0aW9ucy5pbmRleEF4aXMsXG4gICAgICAgICAgICAgICAgICAgIHNjYWxlOiBtZXRhLnZTY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgbGluZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZXRhLiRmaWxsZXIgPSBzb3VyY2U7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IoaSA9IDA7IGkgPCBjb3VudDsgKytpKXtcbiAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZXNbaV07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UuZmlsbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvdXJjZS5maWxsID0gX3Jlc29sdmVUYXJnZXQoc291cmNlcywgaSwgb3B0aW9ucy5wcm9wYWdhdGUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBiZWZvcmVEcmF3IChjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZHJhdyA9IG9wdGlvbnMuZHJhd1RpbWUgPT09ICdiZWZvcmVEcmF3JztcbiAgICAgICAgY29uc3QgbWV0YXNldHMgPSBjaGFydC5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7XG4gICAgICAgIGNvbnN0IGFyZWEgPSBjaGFydC5jaGFydEFyZWE7XG4gICAgICAgIGZvcihsZXQgaSA9IG1ldGFzZXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKXtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG1ldGFzZXRzW2ldLiRmaWxsZXI7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc291cmNlLmxpbmUudXBkYXRlQ29udHJvbFBvaW50cyhhcmVhLCBzb3VyY2UuYXhpcyk7XG4gICAgICAgICAgICBpZiAoZHJhdyAmJiBzb3VyY2UuZmlsbCkge1xuICAgICAgICAgICAgICAgIF9kcmF3ZmlsbChjaGFydC5jdHgsIHNvdXJjZSwgYXJlYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGJlZm9yZURhdGFzZXRzRHJhdyAoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmRyYXdUaW1lICE9PSAnYmVmb3JlRGF0YXNldHNEcmF3Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFzZXRzID0gY2hhcnQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpO1xuICAgICAgICBmb3IobGV0IGkgPSBtZXRhc2V0cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSl7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBtZXRhc2V0c1tpXS4kZmlsbGVyO1xuICAgICAgICAgICAgaWYgKF9zaG91bGRBcHBseUZpbGwoc291cmNlKSkge1xuICAgICAgICAgICAgICAgIF9kcmF3ZmlsbChjaGFydC5jdHgsIHNvdXJjZSwgY2hhcnQuY2hhcnRBcmVhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgYmVmb3JlRGF0YXNldERyYXcgKGNoYXJ0LCBhcmdzLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGFyZ3MubWV0YS4kZmlsbGVyO1xuICAgICAgICBpZiAoIV9zaG91bGRBcHBseUZpbGwoc291cmNlKSB8fCBvcHRpb25zLmRyYXdUaW1lICE9PSAnYmVmb3JlRGF0YXNldERyYXcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX2RyYXdmaWxsKGNoYXJ0LmN0eCwgc291cmNlLCBjaGFydC5jaGFydEFyZWEpO1xuICAgIH0sXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgcHJvcGFnYXRlOiB0cnVlLFxuICAgICAgICBkcmF3VGltZTogJ2JlZm9yZURhdGFzZXREcmF3J1xuICAgIH1cbn07XG5cbmNvbnN0IGdldEJveFNpemUgPSAobGFiZWxPcHRzLCBmb250U2l6ZSk9PntcbiAgICBsZXQgeyBib3hIZWlnaHQgPWZvbnRTaXplICwgYm94V2lkdGggPWZvbnRTaXplICB9ID0gbGFiZWxPcHRzO1xuICAgIGlmIChsYWJlbE9wdHMudXNlUG9pbnRTdHlsZSkge1xuICAgICAgICBib3hIZWlnaHQgPSBNYXRoLm1pbihib3hIZWlnaHQsIGZvbnRTaXplKTtcbiAgICAgICAgYm94V2lkdGggPSBsYWJlbE9wdHMucG9pbnRTdHlsZVdpZHRoIHx8IE1hdGgubWluKGJveFdpZHRoLCBmb250U2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJveFdpZHRoLFxuICAgICAgICBib3hIZWlnaHQsXG4gICAgICAgIGl0ZW1IZWlnaHQ6IE1hdGgubWF4KGZvbnRTaXplLCBib3hIZWlnaHQpXG4gICAgfTtcbn07XG5jb25zdCBpdGVtc0VxdWFsID0gKGEsIGIpPT5hICE9PSBudWxsICYmIGIgIT09IG51bGwgJiYgYS5kYXRhc2V0SW5kZXggPT09IGIuZGF0YXNldEluZGV4ICYmIGEuaW5kZXggPT09IGIuaW5kZXg7XG5jbGFzcyBMZWdlbmQgZXh0ZW5kcyBFbGVtZW50IHtcbiBjb25zdHJ1Y3Rvcihjb25maWcpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9hZGRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxlZ2VuZEhpdEJveGVzID0gW107XG4gdGhpcy5faG92ZXJlZEl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLmRvdWdobnV0TW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYXJ0ID0gY29uZmlnLmNoYXJ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcub3B0aW9ucztcbiAgICAgICAgdGhpcy5jdHggPSBjb25maWcuY3R4O1xuICAgICAgICB0aGlzLmxlZ2VuZEl0ZW1zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNvbHVtblNpemVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxpbmVXaWR0aHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubWF4SGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm1heFdpZHRoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ib3R0b20gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubGVmdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMud2lkdGggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX21hcmdpbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMud2VpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmZ1bGxTaXplID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB1cGRhdGUobWF4V2lkdGgsIG1heEhlaWdodCwgbWFyZ2lucykge1xuICAgICAgICB0aGlzLm1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgICAgIHRoaXMubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xuICAgICAgICB0aGlzLl9tYXJnaW5zID0gbWFyZ2lucztcbiAgICAgICAgdGhpcy5zZXREaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuYnVpbGRMYWJlbHMoKTtcbiAgICAgICAgdGhpcy5maXQoKTtcbiAgICB9XG4gICAgc2V0RGltZW5zaW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLm1heFdpZHRoO1xuICAgICAgICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5fbWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgdGhpcy5yaWdodCA9IHRoaXMud2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMubWF4SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy50b3AgPSB0aGlzLl9tYXJnaW5zLnRvcDtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVpbGRMYWJlbHMoKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsT3B0cyA9IHRoaXMub3B0aW9ucy5sYWJlbHMgfHwge307XG4gICAgICAgIGxldCBsZWdlbmRJdGVtcyA9IGNhbGxiYWNrKGxhYmVsT3B0cy5nZW5lcmF0ZUxhYmVscywgW1xuICAgICAgICAgICAgdGhpcy5jaGFydFxuICAgICAgICBdLCB0aGlzKSB8fCBbXTtcbiAgICAgICAgaWYgKGxhYmVsT3B0cy5maWx0ZXIpIHtcbiAgICAgICAgICAgIGxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXMuZmlsdGVyKChpdGVtKT0+bGFiZWxPcHRzLmZpbHRlcihpdGVtLCB0aGlzLmNoYXJ0LmRhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFiZWxPcHRzLnNvcnQpIHtcbiAgICAgICAgICAgIGxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXMuc29ydCgoYSwgYik9PmxhYmVsT3B0cy5zb3J0KGEsIGIsIHRoaXMuY2hhcnQuZGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmV2ZXJzZSkge1xuICAgICAgICAgICAgbGVnZW5kSXRlbXMucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGVnZW5kSXRlbXMgPSBsZWdlbmRJdGVtcztcbiAgICB9XG4gICAgZml0KCkge1xuICAgICAgICBjb25zdCB7IG9wdGlvbnMgLCBjdHggIH0gPSB0aGlzO1xuICAgICAgICBpZiAoIW9wdGlvbnMuZGlzcGxheSkge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYWJlbE9wdHMgPSBvcHRpb25zLmxhYmVscztcbiAgICAgICAgY29uc3QgbGFiZWxGb250ID0gdG9Gb250KGxhYmVsT3B0cy5mb250KTtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBsYWJlbEZvbnQuc2l6ZTtcbiAgICAgICAgY29uc3QgdGl0bGVIZWlnaHQgPSB0aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgeyBib3hXaWR0aCAsIGl0ZW1IZWlnaHQgIH0gPSBnZXRCb3hTaXplKGxhYmVsT3B0cywgZm9udFNpemUpO1xuICAgICAgICBsZXQgd2lkdGgsIGhlaWdodDtcbiAgICAgICAgY3R4LmZvbnQgPSBsYWJlbEZvbnQuc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLm1heFdpZHRoO1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fZml0Um93cyh0aXRsZUhlaWdodCwgZm9udFNpemUsIGJveFdpZHRoLCBpdGVtSGVpZ2h0KSArIDEwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQ7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuX2ZpdENvbHModGl0bGVIZWlnaHQsIGxhYmVsRm9udCwgYm94V2lkdGgsIGl0ZW1IZWlnaHQpICsgMTA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53aWR0aCA9IE1hdGgubWluKHdpZHRoLCBvcHRpb25zLm1heFdpZHRoIHx8IHRoaXMubWF4V2lkdGgpO1xuICAgICAgICB0aGlzLmhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgb3B0aW9ucy5tYXhIZWlnaHQgfHwgdGhpcy5tYXhIZWlnaHQpO1xuICAgIH1cbiBfZml0Um93cyh0aXRsZUhlaWdodCwgZm9udFNpemUsIGJveFdpZHRoLCBpdGVtSGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4ICwgbWF4V2lkdGggLCBvcHRpb25zOiB7IGxhYmVsczogeyBwYWRkaW5nICB9ICB9ICB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgaGl0Ym94ZXMgPSB0aGlzLmxlZ2VuZEhpdEJveGVzID0gW107XG4gICAgICAgIGNvbnN0IGxpbmVXaWR0aHMgPSB0aGlzLmxpbmVXaWR0aHMgPSBbXG4gICAgICAgICAgICAwXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBpdGVtSGVpZ2h0ICsgcGFkZGluZztcbiAgICAgICAgbGV0IHRvdGFsSGVpZ2h0ID0gdGl0bGVIZWlnaHQ7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcbiAgICAgICAgbGV0IHJvdyA9IC0xO1xuICAgICAgICBsZXQgdG9wID0gLWxpbmVIZWlnaHQ7XG4gICAgICAgIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgobGVnZW5kSXRlbSwgaSk9PntcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1XaWR0aCA9IGJveFdpZHRoICsgZm9udFNpemUgLyAyICsgY3R4Lm1lYXN1cmVUZXh0KGxlZ2VuZEl0ZW0udGV4dCkud2lkdGg7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCB8fCBsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gMV0gKyBpdGVtV2lkdGggKyAyICogcGFkZGluZyA+IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgdG90YWxIZWlnaHQgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gKGkgPiAwID8gMCA6IDEpXSA9IDA7XG4gICAgICAgICAgICAgICAgdG9wICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgcm93Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoaXRib3hlc1tpXSA9IHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgd2lkdGg6IGl0ZW1XaWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGl0ZW1IZWlnaHRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gMV0gKz0gaXRlbVdpZHRoICsgcGFkZGluZztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0b3RhbEhlaWdodDtcbiAgICB9XG4gICAgX2ZpdENvbHModGl0bGVIZWlnaHQsIGxhYmVsRm9udCwgYm94V2lkdGgsIF9pdGVtSGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4ICwgbWF4SGVpZ2h0ICwgb3B0aW9uczogeyBsYWJlbHM6IHsgcGFkZGluZyAgfSAgfSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGhpdGJveGVzID0gdGhpcy5sZWdlbmRIaXRCb3hlcyA9IFtdO1xuICAgICAgICBjb25zdCBjb2x1bW5TaXplcyA9IHRoaXMuY29sdW1uU2l6ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgaGVpZ2h0TGltaXQgPSBtYXhIZWlnaHQgLSB0aXRsZUhlaWdodDtcbiAgICAgICAgbGV0IHRvdGFsV2lkdGggPSBwYWRkaW5nO1xuICAgICAgICBsZXQgY3VycmVudENvbFdpZHRoID0gMDtcbiAgICAgICAgbGV0IGN1cnJlbnRDb2xIZWlnaHQgPSAwO1xuICAgICAgICBsZXQgbGVmdCA9IDA7XG4gICAgICAgIGxldCBjb2wgPSAwO1xuICAgICAgICB0aGlzLmxlZ2VuZEl0ZW1zLmZvckVhY2goKGxlZ2VuZEl0ZW0sIGkpPT57XG4gICAgICAgICAgICBjb25zdCB7IGl0ZW1XaWR0aCAsIGl0ZW1IZWlnaHQgIH0gPSBjYWxjdWxhdGVJdGVtU2l6ZShib3hXaWR0aCwgbGFiZWxGb250LCBjdHgsIGxlZ2VuZEl0ZW0sIF9pdGVtSGVpZ2h0KTtcbiAgICAgICAgICAgIGlmIChpID4gMCAmJiBjdXJyZW50Q29sSGVpZ2h0ICsgaXRlbUhlaWdodCArIDIgKiBwYWRkaW5nID4gaGVpZ2h0TGltaXQpIHtcbiAgICAgICAgICAgICAgICB0b3RhbFdpZHRoICs9IGN1cnJlbnRDb2xXaWR0aCArIHBhZGRpbmc7XG4gICAgICAgICAgICAgICAgY29sdW1uU2l6ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBjdXJyZW50Q29sV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogY3VycmVudENvbEhlaWdodFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxlZnQgKz0gY3VycmVudENvbFdpZHRoICsgcGFkZGluZztcbiAgICAgICAgICAgICAgICBjb2wrKztcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29sV2lkdGggPSBjdXJyZW50Q29sSGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhpdGJveGVzW2ldID0ge1xuICAgICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICAgICAgdG9wOiBjdXJyZW50Q29sSGVpZ2h0LFxuICAgICAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgICAgICB3aWR0aDogaXRlbVdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogaXRlbUhlaWdodFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGN1cnJlbnRDb2xXaWR0aCA9IE1hdGgubWF4KGN1cnJlbnRDb2xXaWR0aCwgaXRlbVdpZHRoKTtcbiAgICAgICAgICAgIGN1cnJlbnRDb2xIZWlnaHQgKz0gaXRlbUhlaWdodCArIHBhZGRpbmc7XG4gICAgICAgIH0pO1xuICAgICAgICB0b3RhbFdpZHRoICs9IGN1cnJlbnRDb2xXaWR0aDtcbiAgICAgICAgY29sdW1uU2l6ZXMucHVzaCh7XG4gICAgICAgICAgICB3aWR0aDogY3VycmVudENvbFdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBjdXJyZW50Q29sSGVpZ2h0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdG90YWxXaWR0aDtcbiAgICB9XG4gICAgYWRqdXN0SGl0Qm94ZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aXRsZUhlaWdodCA9IHRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpO1xuICAgICAgICBjb25zdCB7IGxlZ2VuZEhpdEJveGVzOiBoaXRib3hlcyAsIG9wdGlvbnM6IHsgYWxpZ24gLCBsYWJlbHM6IHsgcGFkZGluZyAgfSAsIHJ0bCAgfSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHJ0bEhlbHBlciA9IGdldFJ0bEFkYXB0ZXIocnRsLCB0aGlzLmxlZnQsIHRoaXMud2lkdGgpO1xuICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgbGV0IHJvdyA9IDA7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLmxlZnQgKyBwYWRkaW5nLCB0aGlzLnJpZ2h0IC0gdGhpcy5saW5lV2lkdGhzW3Jvd10pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBoaXRib3ggb2YgaGl0Ym94ZXMpe1xuICAgICAgICAgICAgICAgIGlmIChyb3cgIT09IGhpdGJveC5yb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93ID0gaGl0Ym94LnJvdztcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLmxlZnQgKyBwYWRkaW5nLCB0aGlzLnJpZ2h0IC0gdGhpcy5saW5lV2lkdGhzW3Jvd10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoaXRib3gudG9wICs9IHRoaXMudG9wICsgdGl0bGVIZWlnaHQgKyBwYWRkaW5nO1xuICAgICAgICAgICAgICAgIGhpdGJveC5sZWZ0ID0gcnRsSGVscGVyLmxlZnRGb3JMdHIocnRsSGVscGVyLngobGVmdCksIGhpdGJveC53aWR0aCk7XG4gICAgICAgICAgICAgICAgbGVmdCArPSBoaXRib3gud2lkdGggKyBwYWRkaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbCA9IDA7XG4gICAgICAgICAgICBsZXQgdG9wID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMudG9wICsgdGl0bGVIZWlnaHQgKyBwYWRkaW5nLCB0aGlzLmJvdHRvbSAtIHRoaXMuY29sdW1uU2l6ZXNbY29sXS5oZWlnaHQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBoaXRib3ggb2YgaGl0Ym94ZXMpe1xuICAgICAgICAgICAgICAgIGlmIChoaXRib3guY29sICE9PSBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sID0gaGl0Ym94LmNvbDtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMudG9wICsgdGl0bGVIZWlnaHQgKyBwYWRkaW5nLCB0aGlzLmJvdHRvbSAtIHRoaXMuY29sdW1uU2l6ZXNbY29sXS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoaXRib3gudG9wID0gdG9wO1xuICAgICAgICAgICAgICAgIGhpdGJveC5sZWZ0ICs9IHRoaXMubGVmdCArIHBhZGRpbmc7XG4gICAgICAgICAgICAgICAgaGl0Ym94LmxlZnQgPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxIZWxwZXIueChoaXRib3gubGVmdCksIGhpdGJveC53aWR0aCk7XG4gICAgICAgICAgICAgICAgdG9wICs9IGhpdGJveC5oZWlnaHQgKyBwYWRkaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlzSG9yaXpvbnRhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uID09PSAnYm90dG9tJztcbiAgICB9XG4gICAgZHJhdygpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNwbGF5KSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgICAgIGNsaXBBcmVhKGN0eCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9kcmF3KCk7XG4gICAgICAgICAgICB1bmNsaXBBcmVhKGN0eCk7XG4gICAgICAgIH1cbiAgICB9XG4gX2RyYXcoKSB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9uczogb3B0cyAsIGNvbHVtblNpemVzICwgbGluZVdpZHRocyAsIGN0eCAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgYWxpZ24gLCBsYWJlbHM6IGxhYmVsT3B0cyAgfSA9IG9wdHM7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDb2xvciA9IGRlZmF1bHRzLmNvbG9yO1xuICAgICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdHMucnRsLCB0aGlzLmxlZnQsIHRoaXMud2lkdGgpO1xuICAgICAgICBjb25zdCBsYWJlbEZvbnQgPSB0b0ZvbnQobGFiZWxPcHRzLmZvbnQpO1xuICAgICAgICBjb25zdCB7IHBhZGRpbmcgIH0gPSBsYWJlbE9wdHM7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gbGFiZWxGb250LnNpemU7XG4gICAgICAgIGNvbnN0IGhhbGZGb250U2l6ZSA9IGZvbnRTaXplIC8gMjtcbiAgICAgICAgbGV0IGN1cnNvcjtcbiAgICAgICAgdGhpcy5kcmF3VGl0bGUoKTtcbiAgICAgICAgY3R4LnRleHRBbGlnbiA9IHJ0bEhlbHBlci50ZXh0QWxpZ24oJ2xlZnQnKTtcbiAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gMC41O1xuICAgICAgICBjdHguZm9udCA9IGxhYmVsRm9udC5zdHJpbmc7XG4gICAgICAgIGNvbnN0IHsgYm94V2lkdGggLCBib3hIZWlnaHQgLCBpdGVtSGVpZ2h0ICB9ID0gZ2V0Qm94U2l6ZShsYWJlbE9wdHMsIGZvbnRTaXplKTtcbiAgICAgICAgY29uc3QgZHJhd0xlZ2VuZEJveCA9IGZ1bmN0aW9uKHgsIHksIGxlZ2VuZEl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChpc05hTihib3hXaWR0aCkgfHwgYm94V2lkdGggPD0gMCB8fCBpc05hTihib3hIZWlnaHQpIHx8IGJveEhlaWdodCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgICAgY29uc3QgbGluZVdpZHRoID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lV2lkdGgsIDEpO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0uZmlsbFN0eWxlLCBkZWZhdWx0Q29sb3IpO1xuICAgICAgICAgICAgY3R4LmxpbmVDYXAgPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVDYXAsICdidXR0Jyk7XG4gICAgICAgICAgICBjdHgubGluZURhc2hPZmZzZXQgPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVEYXNoT2Zmc2V0LCAwKTtcbiAgICAgICAgICAgIGN0eC5saW5lSm9pbiA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZUpvaW4sICdtaXRlcicpO1xuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0uc3Ryb2tlU3R5bGUsIGRlZmF1bHRDb2xvcik7XG4gICAgICAgICAgICBjdHguc2V0TGluZURhc2godmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lRGFzaCwgW10pKTtcbiAgICAgICAgICAgIGlmIChsYWJlbE9wdHMudXNlUG9pbnRTdHlsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyYXdPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICByYWRpdXM6IGJveEhlaWdodCAqIE1hdGguU1FSVDIgLyAyLFxuICAgICAgICAgICAgICAgICAgICBwb2ludFN0eWxlOiBsZWdlbmRJdGVtLnBvaW50U3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBsZWdlbmRJdGVtLnJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogbGluZVdpZHRoXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBjZW50ZXJYID0gcnRsSGVscGVyLnhQbHVzKHgsIGJveFdpZHRoIC8gMik7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VudGVyWSA9IHkgKyBoYWxmRm9udFNpemU7XG4gICAgICAgICAgICAgICAgZHJhd1BvaW50TGVnZW5kKGN0eCwgZHJhd09wdGlvbnMsIGNlbnRlclgsIGNlbnRlclksIGxhYmVsT3B0cy5wb2ludFN0eWxlV2lkdGggJiYgYm94V2lkdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB5Qm94VG9wID0geSArIE1hdGgubWF4KChmb250U2l6ZSAtIGJveEhlaWdodCkgLyAyLCAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCB4Qm94TGVmdCA9IHJ0bEhlbHBlci5sZWZ0Rm9yTHRyKHgsIGJveFdpZHRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJSYWRpdXMgPSB0b1RSQkxDb3JuZXJzKGxlZ2VuZEl0ZW0uYm9yZGVyUmFkaXVzKTtcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMoYm9yZGVyUmFkaXVzKS5zb21lKCh2KT0+diAhPT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogeEJveExlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiB5Qm94VG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgdzogYm94V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBoOiBib3hIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpdXM6IGJvcmRlclJhZGl1c1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdHgucmVjdCh4Qm94TGVmdCwgeUJveFRvcCwgYm94V2lkdGgsIGJveEhlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVXaWR0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmlsbFRleHQgPSBmdW5jdGlvbih4LCB5LCBsZWdlbmRJdGVtKSB7XG4gICAgICAgICAgICByZW5kZXJUZXh0KGN0eCwgbGVnZW5kSXRlbS50ZXh0LCB4LCB5ICsgaXRlbUhlaWdodCAvIDIsIGxhYmVsRm9udCwge1xuICAgICAgICAgICAgICAgIHN0cmlrZXRocm91Z2g6IGxlZ2VuZEl0ZW0uaGlkZGVuLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogcnRsSGVscGVyLnRleHRBbGlnbihsZWdlbmRJdGVtLnRleHRBbGlnbilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLmlzSG9yaXpvbnRhbCgpO1xuICAgICAgICBjb25zdCB0aXRsZUhlaWdodCA9IHRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpO1xuICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICBjdXJzb3IgPSB7XG4gICAgICAgICAgICAgICAgeDogX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMubGVmdCArIHBhZGRpbmcsIHRoaXMucmlnaHQgLSBsaW5lV2lkdGhzWzBdKSxcbiAgICAgICAgICAgICAgICB5OiB0aGlzLnRvcCArIHBhZGRpbmcgKyB0aXRsZUhlaWdodCxcbiAgICAgICAgICAgICAgICBsaW5lOiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3Vyc29yID0ge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMubGVmdCArIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgeTogX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMudG9wICsgdGl0bGVIZWlnaHQgKyBwYWRkaW5nLCB0aGlzLmJvdHRvbSAtIGNvbHVtblNpemVzWzBdLmhlaWdodCksXG4gICAgICAgICAgICAgICAgbGluZTogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBvdmVycmlkZVRleHREaXJlY3Rpb24odGhpcy5jdHgsIG9wdHMudGV4dERpcmVjdGlvbik7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBpdGVtSGVpZ2h0ICsgcGFkZGluZztcbiAgICAgICAgdGhpcy5sZWdlbmRJdGVtcy5mb3JFYWNoKChsZWdlbmRJdGVtLCBpKT0+e1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbGVnZW5kSXRlbS5mb250Q29sb3I7XG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gbGVnZW5kSXRlbS5mb250Q29sb3I7XG4gICAgICAgICAgICBjb25zdCB0ZXh0V2lkdGggPSBjdHgubWVhc3VyZVRleHQobGVnZW5kSXRlbS50ZXh0KS53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHRleHRBbGlnbiA9IHJ0bEhlbHBlci50ZXh0QWxpZ24obGVnZW5kSXRlbS50ZXh0QWxpZ24gfHwgKGxlZ2VuZEl0ZW0udGV4dEFsaWduID0gbGFiZWxPcHRzLnRleHRBbGlnbikpO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBib3hXaWR0aCArIGhhbGZGb250U2l6ZSArIHRleHRXaWR0aDtcbiAgICAgICAgICAgIGxldCB4ID0gY3Vyc29yLng7XG4gICAgICAgICAgICBsZXQgeSA9IGN1cnNvci55O1xuICAgICAgICAgICAgcnRsSGVscGVyLnNldFdpZHRoKHRoaXMud2lkdGgpO1xuICAgICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiB4ICsgd2lkdGggKyBwYWRkaW5nID4gdGhpcy5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB5ID0gY3Vyc29yLnkgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmxpbmUrKztcbiAgICAgICAgICAgICAgICAgICAgeCA9IGN1cnNvci54ID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMubGVmdCArIHBhZGRpbmcsIHRoaXMucmlnaHQgLSBsaW5lV2lkdGhzW2N1cnNvci5saW5lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpID4gMCAmJiB5ICsgbGluZUhlaWdodCA+IHRoaXMuYm90dG9tKSB7XG4gICAgICAgICAgICAgICAgeCA9IGN1cnNvci54ID0geCArIGNvbHVtblNpemVzW2N1cnNvci5saW5lXS53aWR0aCArIHBhZGRpbmc7XG4gICAgICAgICAgICAgICAgY3Vyc29yLmxpbmUrKztcbiAgICAgICAgICAgICAgICB5ID0gY3Vyc29yLnkgPSBfYWxpZ25TdGFydEVuZChhbGlnbiwgdGhpcy50b3AgKyB0aXRsZUhlaWdodCArIHBhZGRpbmcsIHRoaXMuYm90dG9tIC0gY29sdW1uU2l6ZXNbY3Vyc29yLmxpbmVdLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZWFsWCA9IHJ0bEhlbHBlci54KHgpO1xuICAgICAgICAgICAgZHJhd0xlZ2VuZEJveChyZWFsWCwgeSwgbGVnZW5kSXRlbSk7XG4gICAgICAgICAgICB4ID0gX3RleHRYKHRleHRBbGlnbiwgeCArIGJveFdpZHRoICsgaGFsZkZvbnRTaXplLCBpc0hvcml6b250YWwgPyB4ICsgd2lkdGggOiB0aGlzLnJpZ2h0LCBvcHRzLnJ0bCk7XG4gICAgICAgICAgICBmaWxsVGV4dChydGxIZWxwZXIueCh4KSwgeSwgbGVnZW5kSXRlbSk7XG4gICAgICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgY3Vyc29yLnggKz0gd2lkdGggKyBwYWRkaW5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGVnZW5kSXRlbS50ZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRMaW5lSGVpZ2h0ID0gbGFiZWxGb250LmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgY3Vyc29yLnkgKz0gY2FsY3VsYXRlTGVnZW5kSXRlbUhlaWdodChsZWdlbmRJdGVtLCBmb250TGluZUhlaWdodCkgKyBwYWRkaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJzb3IueSArPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVzdG9yZVRleHREaXJlY3Rpb24odGhpcy5jdHgsIG9wdHMudGV4dERpcmVjdGlvbik7XG4gICAgfVxuIGRyYXdUaXRsZSgpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdGl0bGVPcHRzID0gb3B0cy50aXRsZTtcbiAgICAgICAgY29uc3QgdGl0bGVGb250ID0gdG9Gb250KHRpdGxlT3B0cy5mb250KTtcbiAgICAgICAgY29uc3QgdGl0bGVQYWRkaW5nID0gdG9QYWRkaW5nKHRpdGxlT3B0cy5wYWRkaW5nKTtcbiAgICAgICAgaWYgKCF0aXRsZU9wdHMuZGlzcGxheSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ0bEhlbHBlciA9IGdldFJ0bEFkYXB0ZXIob3B0cy5ydGwsIHRoaXMubGVmdCwgdGhpcy53aWR0aCk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRpdGxlT3B0cy5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgaGFsZkZvbnRTaXplID0gdGl0bGVGb250LnNpemUgLyAyO1xuICAgICAgICBjb25zdCB0b3BQYWRkaW5nUGx1c0hhbGZGb250U2l6ZSA9IHRpdGxlUGFkZGluZy50b3AgKyBoYWxmRm9udFNpemU7XG4gICAgICAgIGxldCB5O1xuICAgICAgICBsZXQgbGVmdCA9IHRoaXMubGVmdDtcbiAgICAgICAgbGV0IG1heFdpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgoLi4udGhpcy5saW5lV2lkdGhzKTtcbiAgICAgICAgICAgIHkgPSB0aGlzLnRvcCArIHRvcFBhZGRpbmdQbHVzSGFsZkZvbnRTaXplO1xuICAgICAgICAgICAgbGVmdCA9IF9hbGlnblN0YXJ0RW5kKG9wdHMuYWxpZ24sIGxlZnQsIHRoaXMucmlnaHQgLSBtYXhXaWR0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSB0aGlzLmNvbHVtblNpemVzLnJlZHVjZSgoYWNjLCBzaXplKT0+TWF0aC5tYXgoYWNjLCBzaXplLmhlaWdodCksIDApO1xuICAgICAgICAgICAgeSA9IHRvcFBhZGRpbmdQbHVzSGFsZkZvbnRTaXplICsgX2FsaWduU3RhcnRFbmQob3B0cy5hbGlnbiwgdGhpcy50b3AsIHRoaXMuYm90dG9tIC0gbWF4SGVpZ2h0IC0gb3B0cy5sYWJlbHMucGFkZGluZyAtIHRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB4ID0gX2FsaWduU3RhcnRFbmQocG9zaXRpb24sIGxlZnQsIGxlZnQgKyBtYXhXaWR0aCk7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSBydGxIZWxwZXIudGV4dEFsaWduKF90b0xlZnRSaWdodENlbnRlcihwb3NpdGlvbikpO1xuICAgICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRpdGxlT3B0cy5jb2xvcjtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHRpdGxlT3B0cy5jb2xvcjtcbiAgICAgICAgY3R4LmZvbnQgPSB0aXRsZUZvbnQuc3RyaW5nO1xuICAgICAgICByZW5kZXJUZXh0KGN0eCwgdGl0bGVPcHRzLnRleHQsIHgsIHksIHRpdGxlRm9udCk7XG4gICAgfVxuIF9jb21wdXRlVGl0bGVIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IHRpdGxlT3B0cyA9IHRoaXMub3B0aW9ucy50aXRsZTtcbiAgICAgICAgY29uc3QgdGl0bGVGb250ID0gdG9Gb250KHRpdGxlT3B0cy5mb250KTtcbiAgICAgICAgY29uc3QgdGl0bGVQYWRkaW5nID0gdG9QYWRkaW5nKHRpdGxlT3B0cy5wYWRkaW5nKTtcbiAgICAgICAgcmV0dXJuIHRpdGxlT3B0cy5kaXNwbGF5ID8gdGl0bGVGb250LmxpbmVIZWlnaHQgKyB0aXRsZVBhZGRpbmcuaGVpZ2h0IDogMDtcbiAgICB9XG4gX2dldExlZ2VuZEl0ZW1BdCh4LCB5KSB7XG4gICAgICAgIGxldCBpLCBoaXRCb3gsIGxoO1xuICAgICAgICBpZiAoX2lzQmV0d2Vlbih4LCB0aGlzLmxlZnQsIHRoaXMucmlnaHQpICYmIF9pc0JldHdlZW4oeSwgdGhpcy50b3AsIHRoaXMuYm90dG9tKSkge1xuICAgICAgICAgICAgbGggPSB0aGlzLmxlZ2VuZEhpdEJveGVzO1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGgubGVuZ3RoOyArK2kpe1xuICAgICAgICAgICAgICAgIGhpdEJveCA9IGxoW2ldO1xuICAgICAgICAgICAgICAgIGlmIChfaXNCZXR3ZWVuKHgsIGhpdEJveC5sZWZ0LCBoaXRCb3gubGVmdCArIGhpdEJveC53aWR0aCkgJiYgX2lzQmV0d2Vlbih5LCBoaXRCb3gudG9wLCBoaXRCb3gudG9wICsgaGl0Qm94LmhlaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVnZW5kSXRlbXNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiBoYW5kbGVFdmVudChlKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmICghaXNMaXN0ZW5lZChlLnR5cGUsIG9wdHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG92ZXJlZEl0ZW0gPSB0aGlzLl9nZXRMZWdlbmRJdGVtQXQoZS54LCBlLnkpO1xuICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2Vtb3ZlJyB8fCBlLnR5cGUgPT09ICdtb3VzZW91dCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5faG92ZXJlZEl0ZW07XG4gICAgICAgICAgICBjb25zdCBzYW1lSXRlbSA9IGl0ZW1zRXF1YWwocHJldmlvdXMsIGhvdmVyZWRJdGVtKTtcbiAgICAgICAgICAgIGlmIChwcmV2aW91cyAmJiAhc2FtZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhvcHRzLm9uTGVhdmUsIFtcbiAgICAgICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJdGVtID0gaG92ZXJlZEl0ZW07XG4gICAgICAgICAgICBpZiAoaG92ZXJlZEl0ZW0gJiYgIXNhbWVJdGVtKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sob3B0cy5vbkhvdmVyLCBbXG4gICAgICAgICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgICAgICAgIGhvdmVyZWRJdGVtLFxuICAgICAgICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaG92ZXJlZEl0ZW0pIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdHMub25DbGljaywgW1xuICAgICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgICAgaG92ZXJlZEl0ZW0sXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVJdGVtU2l6ZShib3hXaWR0aCwgbGFiZWxGb250LCBjdHgsIGxlZ2VuZEl0ZW0sIF9pdGVtSGVpZ2h0KSB7XG4gICAgY29uc3QgaXRlbVdpZHRoID0gY2FsY3VsYXRlSXRlbVdpZHRoKGxlZ2VuZEl0ZW0sIGJveFdpZHRoLCBsYWJlbEZvbnQsIGN0eCk7XG4gICAgY29uc3QgaXRlbUhlaWdodCA9IGNhbGN1bGF0ZUl0ZW1IZWlnaHQoX2l0ZW1IZWlnaHQsIGxlZ2VuZEl0ZW0sIGxhYmVsRm9udC5saW5lSGVpZ2h0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpdGVtV2lkdGgsXG4gICAgICAgIGl0ZW1IZWlnaHRcbiAgICB9O1xufVxuZnVuY3Rpb24gY2FsY3VsYXRlSXRlbVdpZHRoKGxlZ2VuZEl0ZW0sIGJveFdpZHRoLCBsYWJlbEZvbnQsIGN0eCkge1xuICAgIGxldCBsZWdlbmRJdGVtVGV4dCA9IGxlZ2VuZEl0ZW0udGV4dDtcbiAgICBpZiAobGVnZW5kSXRlbVRleHQgJiYgdHlwZW9mIGxlZ2VuZEl0ZW1UZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBsZWdlbmRJdGVtVGV4dCA9IGxlZ2VuZEl0ZW1UZXh0LnJlZHVjZSgoYSwgYik9PmEubGVuZ3RoID4gYi5sZW5ndGggPyBhIDogYik7XG4gICAgfVxuICAgIHJldHVybiBib3hXaWR0aCArIGxhYmVsRm9udC5zaXplIC8gMiArIGN0eC5tZWFzdXJlVGV4dChsZWdlbmRJdGVtVGV4dCkud2lkdGg7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVJdGVtSGVpZ2h0KF9pdGVtSGVpZ2h0LCBsZWdlbmRJdGVtLCBmb250TGluZUhlaWdodCkge1xuICAgIGxldCBpdGVtSGVpZ2h0ID0gX2l0ZW1IZWlnaHQ7XG4gICAgaWYgKHR5cGVvZiBsZWdlbmRJdGVtLnRleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGl0ZW1IZWlnaHQgPSBjYWxjdWxhdGVMZWdlbmRJdGVtSGVpZ2h0KGxlZ2VuZEl0ZW0sIGZvbnRMaW5lSGVpZ2h0KTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1IZWlnaHQ7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVMZWdlbmRJdGVtSGVpZ2h0KGxlZ2VuZEl0ZW0sIGZvbnRMaW5lSGVpZ2h0KSB7XG4gICAgY29uc3QgbGFiZWxIZWlnaHQgPSBsZWdlbmRJdGVtLnRleHQgPyBsZWdlbmRJdGVtLnRleHQubGVuZ3RoIDogMDtcbiAgICByZXR1cm4gZm9udExpbmVIZWlnaHQgKiBsYWJlbEhlaWdodDtcbn1cbmZ1bmN0aW9uIGlzTGlzdGVuZWQodHlwZSwgb3B0cykge1xuICAgIGlmICgodHlwZSA9PT0gJ21vdXNlbW92ZScgfHwgdHlwZSA9PT0gJ21vdXNlb3V0JykgJiYgKG9wdHMub25Ib3ZlciB8fCBvcHRzLm9uTGVhdmUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob3B0cy5vbkNsaWNrICYmICh0eXBlID09PSAnY2xpY2snIHx8IHR5cGUgPT09ICdtb3VzZXVwJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbnZhciBwbHVnaW5fbGVnZW5kID0ge1xuICAgIGlkOiAnbGVnZW5kJyxcbiBfZWxlbWVudDogTGVnZW5kLFxuICAgIHN0YXJ0IChjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbGVnZW5kID0gY2hhcnQubGVnZW5kID0gbmV3IExlZ2VuZCh7XG4gICAgICAgICAgICBjdHg6IGNoYXJ0LmN0eCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjaGFydFxuICAgICAgICB9KTtcbiAgICAgICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIGxlZ2VuZCwgb3B0aW9ucyk7XG4gICAgICAgIGxheW91dHMuYWRkQm94KGNoYXJ0LCBsZWdlbmQpO1xuICAgIH0sXG4gICAgc3RvcCAoY2hhcnQpIHtcbiAgICAgICAgbGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIGNoYXJ0LmxlZ2VuZCk7XG4gICAgICAgIGRlbGV0ZSBjaGFydC5sZWdlbmQ7XG4gICAgfSxcbiAgICBiZWZvcmVVcGRhdGUgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBsZWdlbmQgPSBjaGFydC5sZWdlbmQ7XG4gICAgICAgIGxheW91dHMuY29uZmlndXJlKGNoYXJ0LCBsZWdlbmQsIG9wdGlvbnMpO1xuICAgICAgICBsZWdlbmQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfSxcbiAgICBhZnRlclVwZGF0ZSAoY2hhcnQpIHtcbiAgICAgICAgY29uc3QgbGVnZW5kID0gY2hhcnQubGVnZW5kO1xuICAgICAgICBsZWdlbmQuYnVpbGRMYWJlbHMoKTtcbiAgICAgICAgbGVnZW5kLmFkanVzdEhpdEJveGVzKCk7XG4gICAgfSxcbiAgICBhZnRlckV2ZW50IChjaGFydCwgYXJncykge1xuICAgICAgICBpZiAoIWFyZ3MucmVwbGF5KSB7XG4gICAgICAgICAgICBjaGFydC5sZWdlbmQuaGFuZGxlRXZlbnQoYXJncy5ldmVudCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgICAgYWxpZ246ICdjZW50ZXInLFxuICAgICAgICBmdWxsU2l6ZTogdHJ1ZSxcbiAgICAgICAgcmV2ZXJzZTogZmFsc2UsXG4gICAgICAgIHdlaWdodDogMTAwMCxcbiAgICAgICAgb25DbGljayAoZSwgbGVnZW5kSXRlbSwgbGVnZW5kKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGxlZ2VuZEl0ZW0uZGF0YXNldEluZGV4O1xuICAgICAgICAgICAgY29uc3QgY2kgPSBsZWdlbmQuY2hhcnQ7XG4gICAgICAgICAgICBpZiAoY2kuaXNEYXRhc2V0VmlzaWJsZShpbmRleCkpIHtcbiAgICAgICAgICAgICAgICBjaS5oaWRlKGluZGV4KTtcbiAgICAgICAgICAgICAgICBsZWdlbmRJdGVtLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNpLnNob3coaW5kZXgpO1xuICAgICAgICAgICAgICAgIGxlZ2VuZEl0ZW0uaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uSG92ZXI6IG51bGwsXG4gICAgICAgIG9uTGVhdmU6IG51bGwsXG4gICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICAgY29sb3I6IChjdHgpPT5jdHguY2hhcnQub3B0aW9ucy5jb2xvcixcbiAgICAgICAgICAgIGJveFdpZHRoOiA0MCxcbiAgICAgICAgICAgIHBhZGRpbmc6IDEwLFxuICAgICAgICAgICAgZ2VuZXJhdGVMYWJlbHMgKGNoYXJ0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YXNldHMgPSBjaGFydC5kYXRhLmRhdGFzZXRzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IHVzZVBvaW50U3R5bGUgLCBwb2ludFN0eWxlICwgdGV4dEFsaWduICwgY29sb3IgLCB1c2VCb3JkZXJSYWRpdXMgLCBib3JkZXJSYWRpdXMgIH0gIH0gPSBjaGFydC5sZWdlbmQub3B0aW9ucztcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hhcnQuX2dldFNvcnRlZERhdGFzZXRNZXRhcygpLm1hcCgobWV0YSk9PntcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBtZXRhLmNvbnRyb2xsZXIuZ2V0U3R5bGUodXNlUG9pbnRTdHlsZSA/IDAgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRvUGFkZGluZyhzdHlsZS5ib3JkZXJXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBkYXRhc2V0c1ttZXRhLmluZGV4XS5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogc3R5bGUuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udENvbG9yOiBjb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbjogIW1ldGEudmlzaWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVDYXA6IHN0eWxlLmJvcmRlckNhcFN0eWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZURhc2g6IHN0eWxlLmJvcmRlckRhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lRGFzaE9mZnNldDogc3R5bGUuYm9yZGVyRGFzaE9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVKb2luOiBzdHlsZS5ib3JkZXJKb2luU3R5bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGg6IChib3JkZXJXaWR0aC53aWR0aCArIGJvcmRlcldpZHRoLmhlaWdodCkgLyA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlU3R5bGU6IHN0eWxlLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRTdHlsZTogcG9pbnRTdHlsZSB8fCBzdHlsZS5wb2ludFN0eWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IHN0eWxlLnJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiB0ZXh0QWxpZ24gfHwgc3R5bGUudGV4dEFsaWduLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiB1c2VCb3JkZXJSYWRpdXMgJiYgKGJvcmRlclJhZGl1cyB8fCBzdHlsZS5ib3JkZXJSYWRpdXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldEluZGV4OiBtZXRhLmluZGV4XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICBjb2xvcjogKGN0eCk9PmN0eC5jaGFydC5vcHRpb25zLmNvbG9yLFxuICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ2NlbnRlcicsXG4gICAgICAgICAgICB0ZXh0OiAnJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICBkZXNjcmlwdG9yczoge1xuICAgICAgICBfc2NyaXB0YWJsZTogKG5hbWUpPT4hbmFtZS5zdGFydHNXaXRoKCdvbicpLFxuICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAgIF9zY3JpcHRhYmxlOiAobmFtZSk9PiFbXG4gICAgICAgICAgICAgICAgICAgICdnZW5lcmF0ZUxhYmVscycsXG4gICAgICAgICAgICAgICAgICAgICdmaWx0ZXInLFxuICAgICAgICAgICAgICAgICAgICAnc29ydCdcbiAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKG5hbWUpXG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jbGFzcyBUaXRsZSBleHRlbmRzIEVsZW1lbnQge1xuIGNvbnN0cnVjdG9yKGNvbmZpZyl7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY2hhcnQgPSBjb25maWcuY2hhcnQ7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zO1xuICAgICAgICB0aGlzLmN0eCA9IGNvbmZpZy5jdHg7XG4gICAgICAgIHRoaXMuX3BhZGRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudG9wID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmJvdHRvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5sZWZ0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnJpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLndpZHRoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy53ZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZnVsbFNpemUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHVwZGF0ZShtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHRoaXMubGVmdCA9IDA7XG4gICAgICAgIHRoaXMudG9wID0gMDtcbiAgICAgICAgaWYgKCFvcHRzLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmhlaWdodCA9IHRoaXMucmlnaHQgPSB0aGlzLmJvdHRvbSA9IDA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMucmlnaHQgPSBtYXhXaWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmJvdHRvbSA9IG1heEhlaWdodDtcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gaXNBcnJheShvcHRzLnRleHQpID8gb3B0cy50ZXh0Lmxlbmd0aCA6IDE7XG4gICAgICAgIHRoaXMuX3BhZGRpbmcgPSB0b1BhZGRpbmcob3B0cy5wYWRkaW5nKTtcbiAgICAgICAgY29uc3QgdGV4dFNpemUgPSBsaW5lQ291bnQgKiB0b0ZvbnQob3B0cy5mb250KS5saW5lSGVpZ2h0ICsgdGhpcy5fcGFkZGluZy5oZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRleHRTaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRleHRTaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzSG9yaXpvbnRhbCgpIHtcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICByZXR1cm4gcG9zID09PSAndG9wJyB8fCBwb3MgPT09ICdib3R0b20nO1xuICAgIH1cbiAgICBfZHJhd0FyZ3Mob2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IHsgdG9wICwgbGVmdCAsIGJvdHRvbSAsIHJpZ2h0ICwgb3B0aW9ucyAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGFsaWduID0gb3B0aW9ucy5hbGlnbjtcbiAgICAgICAgbGV0IHJvdGF0aW9uID0gMDtcbiAgICAgICAgbGV0IG1heFdpZHRoLCB0aXRsZVgsIHRpdGxlWTtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIHRpdGxlWCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCBsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICB0aXRsZVkgPSB0b3AgKyBvZmZzZXQ7XG4gICAgICAgICAgICBtYXhXaWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICB0aXRsZVggPSBsZWZ0ICsgb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHRpdGxlWSA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCBib3R0b20sIHRvcCk7XG4gICAgICAgICAgICAgICAgcm90YXRpb24gPSBQSSAqIC0wLjU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpdGxlWCA9IHJpZ2h0IC0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHRpdGxlWSA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0b3AsIGJvdHRvbSk7XG4gICAgICAgICAgICAgICAgcm90YXRpb24gPSBQSSAqIDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFdpZHRoID0gYm90dG9tIC0gdG9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aXRsZVgsXG4gICAgICAgICAgICB0aXRsZVksXG4gICAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgICAgIHJvdGF0aW9uXG4gICAgICAgIH07XG4gICAgfVxuICAgIGRyYXcoKSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBpZiAoIW9wdHMuZGlzcGxheSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvbnRPcHRzID0gdG9Gb250KG9wdHMuZm9udCk7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBmb250T3B0cy5saW5lSGVpZ2h0O1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBsaW5lSGVpZ2h0IC8gMiArIHRoaXMuX3BhZGRpbmcudG9wO1xuICAgICAgICBjb25zdCB7IHRpdGxlWCAsIHRpdGxlWSAsIG1heFdpZHRoICwgcm90YXRpb24gIH0gPSB0aGlzLl9kcmF3QXJncyhvZmZzZXQpO1xuICAgICAgICByZW5kZXJUZXh0KGN0eCwgb3B0cy50ZXh0LCAwLCAwLCBmb250T3B0cywge1xuICAgICAgICAgICAgY29sb3I6IG9wdHMuY29sb3IsXG4gICAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgICAgIHJvdGF0aW9uLFxuICAgICAgICAgICAgdGV4dEFsaWduOiBfdG9MZWZ0UmlnaHRDZW50ZXIob3B0cy5hbGlnbiksXG4gICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgICAgICAgdHJhbnNsYXRpb246IFtcbiAgICAgICAgICAgICAgICB0aXRsZVgsXG4gICAgICAgICAgICAgICAgdGl0bGVZXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVRpdGxlKGNoYXJ0LCB0aXRsZU9wdHMpIHtcbiAgICBjb25zdCB0aXRsZSA9IG5ldyBUaXRsZSh7XG4gICAgICAgIGN0eDogY2hhcnQuY3R4LFxuICAgICAgICBvcHRpb25zOiB0aXRsZU9wdHMsXG4gICAgICAgIGNoYXJ0XG4gICAgfSk7XG4gICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlLCB0aXRsZU9wdHMpO1xuICAgIGxheW91dHMuYWRkQm94KGNoYXJ0LCB0aXRsZSk7XG4gICAgY2hhcnQudGl0bGVCbG9jayA9IHRpdGxlO1xufVxudmFyIHBsdWdpbl90aXRsZSA9IHtcbiAgICBpZDogJ3RpdGxlJyxcbiBfZWxlbWVudDogVGl0bGUsXG4gICAgc3RhcnQgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBjcmVhdGVUaXRsZShjaGFydCwgb3B0aW9ucyk7XG4gICAgfSxcbiAgICBzdG9wIChjaGFydCkge1xuICAgICAgICBjb25zdCB0aXRsZUJsb2NrID0gY2hhcnQudGl0bGVCbG9jaztcbiAgICAgICAgbGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIHRpdGxlQmxvY2spO1xuICAgICAgICBkZWxldGUgY2hhcnQudGl0bGVCbG9jaztcbiAgICB9LFxuICAgIGJlZm9yZVVwZGF0ZSAoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gY2hhcnQudGl0bGVCbG9jaztcbiAgICAgICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlLCBvcHRpb25zKTtcbiAgICAgICAgdGl0bGUub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfSxcbiAgICBkZWZhdWx0czoge1xuICAgICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICBmb250OiB7XG4gICAgICAgICAgICB3ZWlnaHQ6ICdib2xkJ1xuICAgICAgICB9LFxuICAgICAgICBmdWxsU2l6ZTogdHJ1ZSxcbiAgICAgICAgcGFkZGluZzogMTAsXG4gICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgICAgdGV4dDogJycsXG4gICAgICAgIHdlaWdodDogMjAwMFxuICAgIH0sXG4gICAgZGVmYXVsdFJvdXRlczoge1xuICAgICAgICBjb2xvcjogJ2NvbG9yJ1xuICAgIH0sXG4gICAgZGVzY3JpcHRvcnM6IHtcbiAgICAgICAgX3NjcmlwdGFibGU6IHRydWUsXG4gICAgICAgIF9pbmRleGFibGU6IGZhbHNlXG4gICAgfVxufTtcblxuY29uc3QgbWFwID0gbmV3IFdlYWtNYXAoKTtcbnZhciBwbHVnaW5fc3VidGl0bGUgPSB7XG4gICAgaWQ6ICdzdWJ0aXRsZScsXG4gICAgc3RhcnQgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB0aXRsZSA9IG5ldyBUaXRsZSh7XG4gICAgICAgICAgICBjdHg6IGNoYXJ0LmN0eCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjaGFydFxuICAgICAgICB9KTtcbiAgICAgICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlLCBvcHRpb25zKTtcbiAgICAgICAgbGF5b3V0cy5hZGRCb3goY2hhcnQsIHRpdGxlKTtcbiAgICAgICAgbWFwLnNldChjaGFydCwgdGl0bGUpO1xuICAgIH0sXG4gICAgc3RvcCAoY2hhcnQpIHtcbiAgICAgICAgbGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIG1hcC5nZXQoY2hhcnQpKTtcbiAgICAgICAgbWFwLmRlbGV0ZShjaGFydCk7XG4gICAgfSxcbiAgICBiZWZvcmVVcGRhdGUgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB0aXRsZSA9IG1hcC5nZXQoY2hhcnQpO1xuICAgICAgICBsYXlvdXRzLmNvbmZpZ3VyZShjaGFydCwgdGl0bGUsIG9wdGlvbnMpO1xuICAgICAgICB0aXRsZS5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9LFxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgIHdlaWdodDogJ25vcm1hbCdcbiAgICAgICAgfSxcbiAgICAgICAgZnVsbFNpemU6IHRydWUsXG4gICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgICAgdGV4dDogJycsXG4gICAgICAgIHdlaWdodDogMTUwMFxuICAgIH0sXG4gICAgZGVmYXVsdFJvdXRlczoge1xuICAgICAgICBjb2xvcjogJ2NvbG9yJ1xuICAgIH0sXG4gICAgZGVzY3JpcHRvcnM6IHtcbiAgICAgICAgX3NjcmlwdGFibGU6IHRydWUsXG4gICAgICAgIF9pbmRleGFibGU6IGZhbHNlXG4gICAgfVxufTtcblxuY29uc3QgcG9zaXRpb25lcnMgPSB7XG4gYXZlcmFnZSAoaXRlbXMpIHtcbiAgICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaSwgbGVuO1xuICAgICAgICBsZXQgeFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgbGV0IHkgPSAwO1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBmb3IoaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgKytpKXtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gaXRlbXNbaV0uZWxlbWVudDtcbiAgICAgICAgICAgIGlmIChlbCAmJiBlbC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zID0gZWwudG9vbHRpcFBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgeFNldC5hZGQocG9zLngpO1xuICAgICAgICAgICAgICAgIHkgKz0gcG9zLnk7XG4gICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY291bnQgPT09IDAgfHwgeFNldC5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeEF2ZXJhZ2UgPSBbXG4gICAgICAgICAgICAuLi54U2V0XG4gICAgICAgIF0ucmVkdWNlKChhLCBiKT0+YSArIGIpIC8geFNldC5zaXplO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeEF2ZXJhZ2UsXG4gICAgICAgICAgICB5OiB5IC8gY291bnRcbiAgICAgICAgfTtcbiAgICB9LFxuIG5lYXJlc3QgKGl0ZW1zLCBldmVudFBvc2l0aW9uKSB7XG4gICAgICAgIGlmICghaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHggPSBldmVudFBvc2l0aW9uLng7XG4gICAgICAgIGxldCB5ID0gZXZlbnRQb3NpdGlvbi55O1xuICAgICAgICBsZXQgbWluRGlzdGFuY2UgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGxldCBpLCBsZW4sIG5lYXJlc3RFbGVtZW50O1xuICAgICAgICBmb3IoaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgKytpKXtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gaXRlbXNbaV0uZWxlbWVudDtcbiAgICAgICAgICAgIGlmIChlbCAmJiBlbC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VudGVyID0gZWwuZ2V0Q2VudGVyUG9pbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGV2ZW50UG9zaXRpb24sIGNlbnRlcik7XG4gICAgICAgICAgICAgICAgaWYgKGQgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBtaW5EaXN0YW5jZSA9IGQ7XG4gICAgICAgICAgICAgICAgICAgIG5lYXJlc3RFbGVtZW50ID0gZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZWFyZXN0RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgdHAgPSBuZWFyZXN0RWxlbWVudC50b29sdGlwUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHggPSB0cC54O1xuICAgICAgICAgICAgeSA9IHRwLnk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5XG4gICAgICAgIH07XG4gICAgfVxufTtcbmZ1bmN0aW9uIHB1c2hPckNvbmNhdChiYXNlLCB0b1B1c2gpIHtcbiAgICBpZiAodG9QdXNoKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHRvUHVzaCkpIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGJhc2UsIHRvUHVzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXNlLnB1c2godG9QdXNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbn1cbiBmdW5jdGlvbiBzcGxpdE5ld2xpbmVzKHN0cikge1xuICAgIGlmICgodHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgc3RyIGluc3RhbmNlb2YgU3RyaW5nKSAmJiBzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gc3RyLnNwbGl0KCdcXG4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbiBmdW5jdGlvbiBjcmVhdGVUb29sdGlwSXRlbShjaGFydCwgaXRlbSkge1xuICAgIGNvbnN0IHsgZWxlbWVudCAsIGRhdGFzZXRJbmRleCAsIGluZGV4ICB9ID0gaXRlbTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KS5jb250cm9sbGVyO1xuICAgIGNvbnN0IHsgbGFiZWwgLCB2YWx1ZSAgfSA9IGNvbnRyb2xsZXIuZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhcnQsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBwYXJzZWQ6IGNvbnRyb2xsZXIuZ2V0UGFyc2VkKGluZGV4KSxcbiAgICAgICAgcmF3OiBjaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0sXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgZGF0YXNldDogY29udHJvbGxlci5nZXREYXRhc2V0KCksXG4gICAgICAgIGRhdGFJbmRleDogaW5kZXgsXG4gICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgZWxlbWVudFxuICAgIH07XG59XG4gZnVuY3Rpb24gZ2V0VG9vbHRpcFNpemUodG9vbHRpcCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGN0eCA9IHRvb2x0aXAuY2hhcnQuY3R4O1xuICAgIGNvbnN0IHsgYm9keSAsIGZvb3RlciAsIHRpdGxlICB9ID0gdG9vbHRpcDtcbiAgICBjb25zdCB7IGJveFdpZHRoICwgYm94SGVpZ2h0ICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBib2R5Rm9udCA9IHRvRm9udChvcHRpb25zLmJvZHlGb250KTtcbiAgICBjb25zdCB0aXRsZUZvbnQgPSB0b0ZvbnQob3B0aW9ucy50aXRsZUZvbnQpO1xuICAgIGNvbnN0IGZvb3RlckZvbnQgPSB0b0ZvbnQob3B0aW9ucy5mb290ZXJGb250KTtcbiAgICBjb25zdCB0aXRsZUxpbmVDb3VudCA9IHRpdGxlLmxlbmd0aDtcbiAgICBjb25zdCBmb290ZXJMaW5lQ291bnQgPSBmb290ZXIubGVuZ3RoO1xuICAgIGNvbnN0IGJvZHlMaW5lSXRlbUNvdW50ID0gYm9keS5sZW5ndGg7XG4gICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRpb25zLnBhZGRpbmcpO1xuICAgIGxldCBoZWlnaHQgPSBwYWRkaW5nLmhlaWdodDtcbiAgICBsZXQgd2lkdGggPSAwO1xuICAgIGxldCBjb21iaW5lZEJvZHlMZW5ndGggPSBib2R5LnJlZHVjZSgoY291bnQsIGJvZHlJdGVtKT0+Y291bnQgKyBib2R5SXRlbS5iZWZvcmUubGVuZ3RoICsgYm9keUl0ZW0ubGluZXMubGVuZ3RoICsgYm9keUl0ZW0uYWZ0ZXIubGVuZ3RoLCAwKTtcbiAgICBjb21iaW5lZEJvZHlMZW5ndGggKz0gdG9vbHRpcC5iZWZvcmVCb2R5Lmxlbmd0aCArIHRvb2x0aXAuYWZ0ZXJCb2R5Lmxlbmd0aDtcbiAgICBpZiAodGl0bGVMaW5lQ291bnQpIHtcbiAgICAgICAgaGVpZ2h0ICs9IHRpdGxlTGluZUNvdW50ICogdGl0bGVGb250LmxpbmVIZWlnaHQgKyAodGl0bGVMaW5lQ291bnQgLSAxKSAqIG9wdGlvbnMudGl0bGVTcGFjaW5nICsgb3B0aW9ucy50aXRsZU1hcmdpbkJvdHRvbTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkQm9keUxlbmd0aCkge1xuICAgICAgICBjb25zdCBib2R5TGluZUhlaWdodCA9IG9wdGlvbnMuZGlzcGxheUNvbG9ycyA/IE1hdGgubWF4KGJveEhlaWdodCwgYm9keUZvbnQubGluZUhlaWdodCkgOiBib2R5Rm9udC5saW5lSGVpZ2h0O1xuICAgICAgICBoZWlnaHQgKz0gYm9keUxpbmVJdGVtQ291bnQgKiBib2R5TGluZUhlaWdodCArIChjb21iaW5lZEJvZHlMZW5ndGggLSBib2R5TGluZUl0ZW1Db3VudCkgKiBib2R5Rm9udC5saW5lSGVpZ2h0ICsgKGNvbWJpbmVkQm9keUxlbmd0aCAtIDEpICogb3B0aW9ucy5ib2R5U3BhY2luZztcbiAgICB9XG4gICAgaWYgKGZvb3RlckxpbmVDb3VudCkge1xuICAgICAgICBoZWlnaHQgKz0gb3B0aW9ucy5mb290ZXJNYXJnaW5Ub3AgKyBmb290ZXJMaW5lQ291bnQgKiBmb290ZXJGb250LmxpbmVIZWlnaHQgKyAoZm9vdGVyTGluZUNvdW50IC0gMSkgKiBvcHRpb25zLmZvb3RlclNwYWNpbmc7XG4gICAgfVxuICAgIGxldCB3aWR0aFBhZGRpbmcgPSAwO1xuICAgIGNvbnN0IG1heExpbmVXaWR0aCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY3R4Lm1lYXN1cmVUZXh0KGxpbmUpLndpZHRoICsgd2lkdGhQYWRkaW5nKTtcbiAgICB9O1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LmZvbnQgPSB0aXRsZUZvbnQuc3RyaW5nO1xuICAgIGVhY2godG9vbHRpcC50aXRsZSwgbWF4TGluZVdpZHRoKTtcbiAgICBjdHguZm9udCA9IGJvZHlGb250LnN0cmluZztcbiAgICBlYWNoKHRvb2x0aXAuYmVmb3JlQm9keS5jb25jYXQodG9vbHRpcC5hZnRlckJvZHkpLCBtYXhMaW5lV2lkdGgpO1xuICAgIHdpZHRoUGFkZGluZyA9IG9wdGlvbnMuZGlzcGxheUNvbG9ycyA/IGJveFdpZHRoICsgMiArIG9wdGlvbnMuYm94UGFkZGluZyA6IDA7XG4gICAgZWFjaChib2R5LCAoYm9keUl0ZW0pPT57XG4gICAgICAgIGVhY2goYm9keUl0ZW0uYmVmb3JlLCBtYXhMaW5lV2lkdGgpO1xuICAgICAgICBlYWNoKGJvZHlJdGVtLmxpbmVzLCBtYXhMaW5lV2lkdGgpO1xuICAgICAgICBlYWNoKGJvZHlJdGVtLmFmdGVyLCBtYXhMaW5lV2lkdGgpO1xuICAgIH0pO1xuICAgIHdpZHRoUGFkZGluZyA9IDA7XG4gICAgY3R4LmZvbnQgPSBmb290ZXJGb250LnN0cmluZztcbiAgICBlYWNoKHRvb2x0aXAuZm9vdGVyLCBtYXhMaW5lV2lkdGgpO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgd2lkdGggKz0gcGFkZGluZy53aWR0aDtcbiAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGRldGVybWluZVlBbGlnbihjaGFydCwgc2l6ZSkge1xuICAgIGNvbnN0IHsgeSAsIGhlaWdodCAgfSA9IHNpemU7XG4gICAgaWYgKHkgPCBoZWlnaHQgLyAyKSB7XG4gICAgICAgIHJldHVybiAndG9wJztcbiAgICB9IGVsc2UgaWYgKHkgPiBjaGFydC5oZWlnaHQgLSBoZWlnaHQgLyAyKSB7XG4gICAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICB9XG4gICAgcmV0dXJuICdjZW50ZXInO1xufVxuZnVuY3Rpb24gZG9lc05vdEZpdFdpdGhBbGlnbih4QWxpZ24sIGNoYXJ0LCBvcHRpb25zLCBzaXplKSB7XG4gICAgY29uc3QgeyB4ICwgd2lkdGggIH0gPSBzaXplO1xuICAgIGNvbnN0IGNhcmV0ID0gb3B0aW9ucy5jYXJldFNpemUgKyBvcHRpb25zLmNhcmV0UGFkZGluZztcbiAgICBpZiAoeEFsaWduID09PSAnbGVmdCcgJiYgeCArIHdpZHRoICsgY2FyZXQgPiBjaGFydC53aWR0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHhBbGlnbiA9PT0gJ3JpZ2h0JyAmJiB4IC0gd2lkdGggLSBjYXJldCA8IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuZnVuY3Rpb24gZGV0ZXJtaW5lWEFsaWduKGNoYXJ0LCBvcHRpb25zLCBzaXplLCB5QWxpZ24pIHtcbiAgICBjb25zdCB7IHggLCB3aWR0aCAgfSA9IHNpemU7XG4gICAgY29uc3QgeyB3aWR0aDogY2hhcnRXaWR0aCAsIGNoYXJ0QXJlYTogeyBsZWZ0ICwgcmlnaHQgIH0gIH0gPSBjaGFydDtcbiAgICBsZXQgeEFsaWduID0gJ2NlbnRlcic7XG4gICAgaWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgeEFsaWduID0geCA8PSAobGVmdCArIHJpZ2h0KSAvIDIgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgIH0gZWxzZSBpZiAoeCA8PSB3aWR0aCAvIDIpIHtcbiAgICAgICAgeEFsaWduID0gJ2xlZnQnO1xuICAgIH0gZWxzZSBpZiAoeCA+PSBjaGFydFdpZHRoIC0gd2lkdGggLyAyKSB7XG4gICAgICAgIHhBbGlnbiA9ICdyaWdodCc7XG4gICAgfVxuICAgIGlmIChkb2VzTm90Rml0V2l0aEFsaWduKHhBbGlnbiwgY2hhcnQsIG9wdGlvbnMsIHNpemUpKSB7XG4gICAgICAgIHhBbGlnbiA9ICdjZW50ZXInO1xuICAgIH1cbiAgICByZXR1cm4geEFsaWduO1xufVxuIGZ1bmN0aW9uIGRldGVybWluZUFsaWdubWVudChjaGFydCwgb3B0aW9ucywgc2l6ZSkge1xuICAgIGNvbnN0IHlBbGlnbiA9IHNpemUueUFsaWduIHx8IG9wdGlvbnMueUFsaWduIHx8IGRldGVybWluZVlBbGlnbihjaGFydCwgc2l6ZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeEFsaWduOiBzaXplLnhBbGlnbiB8fCBvcHRpb25zLnhBbGlnbiB8fCBkZXRlcm1pbmVYQWxpZ24oY2hhcnQsIG9wdGlvbnMsIHNpemUsIHlBbGlnbiksXG4gICAgICAgIHlBbGlnblxuICAgIH07XG59XG5mdW5jdGlvbiBhbGlnblgoc2l6ZSwgeEFsaWduKSB7XG4gICAgbGV0IHsgeCAsIHdpZHRoICB9ID0gc2l6ZTtcbiAgICBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgIHggLT0gd2lkdGg7XG4gICAgfSBlbHNlIGlmICh4QWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgIHggLT0gd2lkdGggLyAyO1xuICAgIH1cbiAgICByZXR1cm4geDtcbn1cbmZ1bmN0aW9uIGFsaWduWShzaXplLCB5QWxpZ24sIHBhZGRpbmdBbmRTaXplKSB7XG4gICAgbGV0IHsgeSAsIGhlaWdodCAgfSA9IHNpemU7XG4gICAgaWYgKHlBbGlnbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgeSArPSBwYWRkaW5nQW5kU2l6ZTtcbiAgICB9IGVsc2UgaWYgKHlBbGlnbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgeSAtPSBoZWlnaHQgKyBwYWRkaW5nQW5kU2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB5IC09IGhlaWdodCAvIDI7XG4gICAgfVxuICAgIHJldHVybiB5O1xufVxuIGZ1bmN0aW9uIGdldEJhY2tncm91bmRQb2ludChvcHRpb25zLCBzaXplLCBhbGlnbm1lbnQsIGNoYXJ0KSB7XG4gICAgY29uc3QgeyBjYXJldFNpemUgLCBjYXJldFBhZGRpbmcgLCBjb3JuZXJSYWRpdXMgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgeEFsaWduICwgeUFsaWduICB9ID0gYWxpZ25tZW50O1xuICAgIGNvbnN0IHBhZGRpbmdBbmRTaXplID0gY2FyZXRTaXplICsgY2FyZXRQYWRkaW5nO1xuICAgIGNvbnN0IHsgdG9wTGVmdCAsIHRvcFJpZ2h0ICwgYm90dG9tTGVmdCAsIGJvdHRvbVJpZ2h0ICB9ID0gdG9UUkJMQ29ybmVycyhjb3JuZXJSYWRpdXMpO1xuICAgIGxldCB4ID0gYWxpZ25YKHNpemUsIHhBbGlnbik7XG4gICAgY29uc3QgeSA9IGFsaWduWShzaXplLCB5QWxpZ24sIHBhZGRpbmdBbmRTaXplKTtcbiAgICBpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICBpZiAoeEFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIHggKz0gcGFkZGluZ0FuZFNpemU7XG4gICAgICAgIH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB4IC09IHBhZGRpbmdBbmRTaXplO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh4QWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICB4IC09IE1hdGgubWF4KHRvcExlZnQsIGJvdHRvbUxlZnQpICsgY2FyZXRTaXplO1xuICAgIH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgIHggKz0gTWF0aC5tYXgodG9wUmlnaHQsIGJvdHRvbVJpZ2h0KSArIGNhcmV0U2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogX2xpbWl0VmFsdWUoeCwgMCwgY2hhcnQud2lkdGggLSBzaXplLndpZHRoKSxcbiAgICAgICAgeTogX2xpbWl0VmFsdWUoeSwgMCwgY2hhcnQuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQpXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldEFsaWduZWRYKHRvb2x0aXAsIGFsaWduLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRpb25zLnBhZGRpbmcpO1xuICAgIHJldHVybiBhbGlnbiA9PT0gJ2NlbnRlcicgPyB0b29sdGlwLnggKyB0b29sdGlwLndpZHRoIC8gMiA6IGFsaWduID09PSAncmlnaHQnID8gdG9vbHRpcC54ICsgdG9vbHRpcC53aWR0aCAtIHBhZGRpbmcucmlnaHQgOiB0b29sdGlwLnggKyBwYWRkaW5nLmxlZnQ7XG59XG4gZnVuY3Rpb24gZ2V0QmVmb3JlQWZ0ZXJCb2R5TGluZXMoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gcHVzaE9yQ29uY2F0KFtdLCBzcGxpdE5ld2xpbmVzKGNhbGxiYWNrKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVUb29sdGlwQ29udGV4dChwYXJlbnQsIHRvb2x0aXAsIHRvb2x0aXBJdGVtcykge1xuICAgIHJldHVybiBjcmVhdGVDb250ZXh0KHBhcmVudCwge1xuICAgICAgICB0b29sdGlwLFxuICAgICAgICB0b29sdGlwSXRlbXMsXG4gICAgICAgIHR5cGU6ICd0b29sdGlwJ1xuICAgIH0pO1xufVxuZnVuY3Rpb24gb3ZlcnJpZGVDYWxsYmFja3MoY2FsbGJhY2tzLCBjb250ZXh0KSB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSBjb250ZXh0ICYmIGNvbnRleHQuZGF0YXNldCAmJiBjb250ZXh0LmRhdGFzZXQudG9vbHRpcCAmJiBjb250ZXh0LmRhdGFzZXQudG9vbHRpcC5jYWxsYmFja3M7XG4gICAgcmV0dXJuIG92ZXJyaWRlID8gY2FsbGJhY2tzLm92ZXJyaWRlKG92ZXJyaWRlKSA6IGNhbGxiYWNrcztcbn1cbmNvbnN0IGRlZmF1bHRDYWxsYmFja3MgPSB7XG4gICAgYmVmb3JlVGl0bGU6IG5vb3AsXG4gICAgdGl0bGUgKHRvb2x0aXBJdGVtcykge1xuICAgICAgICBpZiAodG9vbHRpcEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0b29sdGlwSXRlbXNbMF07XG4gICAgICAgICAgICBjb25zdCBsYWJlbHMgPSBpdGVtLmNoYXJ0LmRhdGEubGFiZWxzO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxDb3VudCA9IGxhYmVscyA/IGxhYmVscy5sZW5ndGggOiAwO1xuICAgICAgICAgICAgaWYgKHRoaXMgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb2RlID09PSAnZGF0YXNldCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5kYXRhc2V0LmxhYmVsIHx8ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsQ291bnQgPiAwICYmIGl0ZW0uZGF0YUluZGV4IDwgbGFiZWxDb3VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbHNbaXRlbS5kYXRhSW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9LFxuICAgIGFmdGVyVGl0bGU6IG5vb3AsXG4gICAgYmVmb3JlQm9keTogbm9vcCxcbiAgICBiZWZvcmVMYWJlbDogbm9vcCxcbiAgICBsYWJlbCAodG9vbHRpcEl0ZW0pIHtcbiAgICAgICAgaWYgKHRoaXMgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb2RlID09PSAnZGF0YXNldCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0b29sdGlwSXRlbS5sYWJlbCArICc6ICcgKyB0b29sdGlwSXRlbS5mb3JtYXR0ZWRWYWx1ZSB8fCB0b29sdGlwSXRlbS5mb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGFiZWwgPSB0b29sdGlwSXRlbS5kYXRhc2V0LmxhYmVsIHx8ICcnO1xuICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgIGxhYmVsICs9ICc6ICc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0b29sdGlwSXRlbS5mb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmKHZhbHVlKSkge1xuICAgICAgICAgICAgbGFiZWwgKz0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH0sXG4gICAgbGFiZWxDb2xvciAodG9vbHRpcEl0ZW0pIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRvb2x0aXBJdGVtLmNoYXJ0LmdldERhdGFzZXRNZXRhKHRvb2x0aXBJdGVtLmRhdGFzZXRJbmRleCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBtZXRhLmNvbnRyb2xsZXIuZ2V0U3R5bGUodG9vbHRpcEl0ZW0uZGF0YUluZGV4KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgICAgICAgYm9yZGVyRGFzaDogb3B0aW9ucy5ib3JkZXJEYXNoLFxuICAgICAgICAgICAgYm9yZGVyRGFzaE9mZnNldDogb3B0aW9ucy5ib3JkZXJEYXNoT2Zmc2V0LFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBsYWJlbFRleHRDb2xvciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYm9keUNvbG9yO1xuICAgIH0sXG4gICAgbGFiZWxQb2ludFN0eWxlICh0b29sdGlwSXRlbSkge1xuICAgICAgICBjb25zdCBtZXRhID0gdG9vbHRpcEl0ZW0uY2hhcnQuZ2V0RGF0YXNldE1ldGEodG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IG1ldGEuY29udHJvbGxlci5nZXRTdHlsZSh0b29sdGlwSXRlbS5kYXRhSW5kZXgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9pbnRTdHlsZTogb3B0aW9ucy5wb2ludFN0eWxlLFxuICAgICAgICAgICAgcm90YXRpb246IG9wdGlvbnMucm90YXRpb25cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGFmdGVyTGFiZWw6IG5vb3AsXG4gICAgYWZ0ZXJCb2R5OiBub29wLFxuICAgIGJlZm9yZUZvb3Rlcjogbm9vcCxcbiAgICBmb290ZXI6IG5vb3AsXG4gICAgYWZ0ZXJGb290ZXI6IG5vb3Bcbn07XG4gZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soY2FsbGJhY2tzLCBuYW1lLCBjdHgsIGFyZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrc1tuYW1lXS5jYWxsKGN0eCwgYXJnKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRDYWxsYmFja3NbbmFtZV0uY2FsbChjdHgsIGFyZyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jbGFzcyBUb29sdGlwIGV4dGVuZHMgRWxlbWVudCB7XG4gc3RhdGljIHBvc2l0aW9uZXJzID0gcG9zaXRpb25lcnM7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcGFjaXR5ID0gMDtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gW107XG4gICAgICAgIHRoaXMuX2V2ZW50UG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3NpemUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2NhY2hlZEFuaW1hdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3Rvb2x0aXBJdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLiRhbmltYXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLiRjb250ZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNoYXJ0ID0gY29uZmlnLmNoYXJ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcub3B0aW9ucztcbiAgICAgICAgdGhpcy5kYXRhUG9pbnRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRpdGxlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmJlZm9yZUJvZHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYm9keSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5hZnRlckJvZHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZm9vdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnhBbGlnbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy55QWxpZ24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMueCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy55ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jYXJldFggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FyZXRZID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxhYmVsQ29sb3JzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxhYmVsUG9pbnRTdHlsZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubGFiZWxUZXh0Q29sb3JzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpbml0aWFsaXplKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5fY2FjaGVkQW5pbWF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gX3Jlc29sdmVBbmltYXRpb25zKCkge1xuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLl9jYWNoZWRBbmltYXRpb25zO1xuICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMuZW5hYmxlZCAmJiBjaGFydC5vcHRpb25zLmFuaW1hdGlvbiAmJiBvcHRpb25zLmFuaW1hdGlvbnM7XG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbnMgPSBuZXcgQW5pbWF0aW9ucyh0aGlzLmNoYXJ0LCBvcHRzKTtcbiAgICAgICAgaWYgKG9wdHMuX2NhY2hlYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5fY2FjaGVkQW5pbWF0aW9ucyA9IE9iamVjdC5mcmVlemUoYW5pbWF0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gICAgfVxuIGdldENvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRjb250ZXh0IHx8ICh0aGlzLiRjb250ZXh0ID0gY3JlYXRlVG9vbHRpcENvbnRleHQodGhpcy5jaGFydC5nZXRDb250ZXh0KCksIHRoaXMsIHRoaXMuX3Rvb2x0aXBJdGVtcykpO1xuICAgIH1cbiAgICBnZXRUaXRsZShjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzICB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgYmVmb3JlVGl0bGUgPSBpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhjYWxsYmFja3MsICdiZWZvcmVUaXRsZScsIHRoaXMsIGNvbnRleHQpO1xuICAgICAgICBjb25zdCB0aXRsZSA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ3RpdGxlJywgdGhpcywgY29udGV4dCk7XG4gICAgICAgIGNvbnN0IGFmdGVyVGl0bGUgPSBpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhjYWxsYmFja3MsICdhZnRlclRpdGxlJywgdGhpcywgY29udGV4dCk7XG4gICAgICAgIGxldCBsaW5lcyA9IFtdO1xuICAgICAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhiZWZvcmVUaXRsZSkpO1xuICAgICAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyh0aXRsZSkpO1xuICAgICAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhhZnRlclRpdGxlKSk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgZ2V0QmVmb3JlQm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGdldEJlZm9yZUFmdGVyQm9keUxpbmVzKGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKG9wdGlvbnMuY2FsbGJhY2tzLCAnYmVmb3JlQm9keScsIHRoaXMsIHRvb2x0aXBJdGVtcykpO1xuICAgIH1cbiAgICBnZXRCb2R5KHRvb2x0aXBJdGVtcywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcyAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGJvZHlJdGVtcyA9IFtdO1xuICAgICAgICBlYWNoKHRvb2x0aXBJdGVtcywgKGNvbnRleHQpPT57XG4gICAgICAgICAgICBjb25zdCBib2R5SXRlbSA9IHtcbiAgICAgICAgICAgICAgICBiZWZvcmU6IFtdLFxuICAgICAgICAgICAgICAgIGxpbmVzOiBbXSxcbiAgICAgICAgICAgICAgICBhZnRlcjogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzY29wZWQgPSBvdmVycmlkZUNhbGxiYWNrcyhjYWxsYmFja3MsIGNvbnRleHQpO1xuICAgICAgICAgICAgcHVzaE9yQ29uY2F0KGJvZHlJdGVtLmJlZm9yZSwgc3BsaXROZXdsaW5lcyhpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhzY29wZWQsICdiZWZvcmVMYWJlbCcsIHRoaXMsIGNvbnRleHQpKSk7XG4gICAgICAgICAgICBwdXNoT3JDb25jYXQoYm9keUl0ZW0ubGluZXMsIGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKHNjb3BlZCwgJ2xhYmVsJywgdGhpcywgY29udGV4dCkpO1xuICAgICAgICAgICAgcHVzaE9yQ29uY2F0KGJvZHlJdGVtLmFmdGVyLCBzcGxpdE5ld2xpbmVzKGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKHNjb3BlZCwgJ2FmdGVyTGFiZWwnLCB0aGlzLCBjb250ZXh0KSkpO1xuICAgICAgICAgICAgYm9keUl0ZW1zLnB1c2goYm9keUl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJvZHlJdGVtcztcbiAgICB9XG4gICAgZ2V0QWZ0ZXJCb2R5KHRvb2x0aXBJdGVtcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZ2V0QmVmb3JlQWZ0ZXJCb2R5TGluZXMoaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2sob3B0aW9ucy5jYWxsYmFja3MsICdhZnRlckJvZHknLCB0aGlzLCB0b29sdGlwSXRlbXMpKTtcbiAgICB9XG4gICAgZ2V0Rm9vdGVyKHRvb2x0aXBJdGVtcywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcyAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGJlZm9yZUZvb3RlciA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ2JlZm9yZUZvb3RlcicsIHRoaXMsIHRvb2x0aXBJdGVtcyk7XG4gICAgICAgIGNvbnN0IGZvb3RlciA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ2Zvb3RlcicsIHRoaXMsIHRvb2x0aXBJdGVtcyk7XG4gICAgICAgIGNvbnN0IGFmdGVyRm9vdGVyID0gaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soY2FsbGJhY2tzLCAnYWZ0ZXJGb290ZXInLCB0aGlzLCB0b29sdGlwSXRlbXMpO1xuICAgICAgICBsZXQgbGluZXMgPSBbXTtcbiAgICAgICAgbGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXMoYmVmb3JlRm9vdGVyKSk7XG4gICAgICAgIGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGZvb3RlcikpO1xuICAgICAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhhZnRlckZvb3RlcikpO1xuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuIF9jcmVhdGVJdGVtcyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2hhcnQuZGF0YTtcbiAgICAgICAgY29uc3QgbGFiZWxDb2xvcnMgPSBbXTtcbiAgICAgICAgY29uc3QgbGFiZWxQb2ludFN0eWxlcyA9IFtdO1xuICAgICAgICBjb25zdCBsYWJlbFRleHRDb2xvcnMgPSBbXTtcbiAgICAgICAgbGV0IHRvb2x0aXBJdGVtcyA9IFtdO1xuICAgICAgICBsZXQgaSwgbGVuO1xuICAgICAgICBmb3IoaSA9IDAsIGxlbiA9IGFjdGl2ZS5sZW5ndGg7IGkgPCBsZW47ICsraSl7XG4gICAgICAgICAgICB0b29sdGlwSXRlbXMucHVzaChjcmVhdGVUb29sdGlwSXRlbSh0aGlzLmNoYXJ0LCBhY3RpdmVbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHRvb2x0aXBJdGVtcyA9IHRvb2x0aXBJdGVtcy5maWx0ZXIoKGVsZW1lbnQsIGluZGV4LCBhcnJheSk9Pm9wdGlvbnMuZmlsdGVyKGVsZW1lbnQsIGluZGV4LCBhcnJheSwgZGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLml0ZW1Tb3J0KSB7XG4gICAgICAgICAgICB0b29sdGlwSXRlbXMgPSB0b29sdGlwSXRlbXMuc29ydCgoYSwgYik9Pm9wdGlvbnMuaXRlbVNvcnQoYSwgYiwgZGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGVhY2godG9vbHRpcEl0ZW1zLCAoY29udGV4dCk9PntcbiAgICAgICAgICAgIGNvbnN0IHNjb3BlZCA9IG92ZXJyaWRlQ2FsbGJhY2tzKG9wdGlvbnMuY2FsbGJhY2tzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGxhYmVsQ29sb3JzLnB1c2goaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soc2NvcGVkLCAnbGFiZWxDb2xvcicsIHRoaXMsIGNvbnRleHQpKTtcbiAgICAgICAgICAgIGxhYmVsUG9pbnRTdHlsZXMucHVzaChpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhzY29wZWQsICdsYWJlbFBvaW50U3R5bGUnLCB0aGlzLCBjb250ZXh0KSk7XG4gICAgICAgICAgICBsYWJlbFRleHRDb2xvcnMucHVzaChpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhzY29wZWQsICdsYWJlbFRleHRDb2xvcicsIHRoaXMsIGNvbnRleHQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGFiZWxDb2xvcnMgPSBsYWJlbENvbG9ycztcbiAgICAgICAgdGhpcy5sYWJlbFBvaW50U3R5bGVzID0gbGFiZWxQb2ludFN0eWxlcztcbiAgICAgICAgdGhpcy5sYWJlbFRleHRDb2xvcnMgPSBsYWJlbFRleHRDb2xvcnM7XG4gICAgICAgIHRoaXMuZGF0YVBvaW50cyA9IHRvb2x0aXBJdGVtcztcbiAgICAgICAgcmV0dXJuIHRvb2x0aXBJdGVtcztcbiAgICB9XG4gICAgdXBkYXRlKGNoYW5nZWQsIHJlcGxheSkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9hY3RpdmU7XG4gICAgICAgIGxldCBwcm9wZXJ0aWVzO1xuICAgICAgICBsZXQgdG9vbHRpcEl0ZW1zID0gW107XG4gICAgICAgIGlmICghYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3BhY2l0eSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBwb3NpdGlvbmVyc1tvcHRpb25zLnBvc2l0aW9uXS5jYWxsKHRoaXMsIGFjdGl2ZSwgdGhpcy5fZXZlbnRQb3NpdGlvbik7XG4gICAgICAgICAgICB0b29sdGlwSXRlbXMgPSB0aGlzLl9jcmVhdGVJdGVtcyhvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSB0aGlzLmdldFRpdGxlKHRvb2x0aXBJdGVtcywgb3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmJlZm9yZUJvZHkgPSB0aGlzLmdldEJlZm9yZUJvZHkodG9vbHRpcEl0ZW1zLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuYm9keSA9IHRoaXMuZ2V0Qm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5hZnRlckJvZHkgPSB0aGlzLmdldEFmdGVyQm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5mb290ZXIgPSB0aGlzLmdldEZvb3Rlcih0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX3NpemUgPSBnZXRUb29sdGlwU2l6ZSh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uQW5kU2l6ZSA9IE9iamVjdC5hc3NpZ24oe30sIHBvc2l0aW9uLCBzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGRldGVybWluZUFsaWdubWVudCh0aGlzLmNoYXJ0LCBvcHRpb25zLCBwb3NpdGlvbkFuZFNpemUpO1xuICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZFBvaW50ID0gZ2V0QmFja2dyb3VuZFBvaW50KG9wdGlvbnMsIHBvc2l0aW9uQW5kU2l6ZSwgYWxpZ25tZW50LCB0aGlzLmNoYXJ0KTtcbiAgICAgICAgICAgIHRoaXMueEFsaWduID0gYWxpZ25tZW50LnhBbGlnbjtcbiAgICAgICAgICAgIHRoaXMueUFsaWduID0gYWxpZ25tZW50LnlBbGlnbjtcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICB4OiBiYWNrZ3JvdW5kUG9pbnQueCxcbiAgICAgICAgICAgICAgICB5OiBiYWNrZ3JvdW5kUG9pbnQueSxcbiAgICAgICAgICAgICAgICB3aWR0aDogc2l6ZS53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHNpemUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGNhcmV0WDogcG9zaXRpb24ueCxcbiAgICAgICAgICAgICAgICBjYXJldFk6IHBvc2l0aW9uLnlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdG9vbHRpcEl0ZW1zID0gdG9vbHRpcEl0ZW1zO1xuICAgICAgICB0aGlzLiRjb250ZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoKS51cGRhdGUodGhpcywgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZWQgJiYgb3B0aW9ucy5leHRlcm5hbCkge1xuICAgICAgICAgICAgb3B0aW9ucy5leHRlcm5hbC5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBjaGFydDogdGhpcy5jaGFydCxcbiAgICAgICAgICAgICAgICB0b29sdGlwOiB0aGlzLFxuICAgICAgICAgICAgICAgIHJlcGxheVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhd0NhcmV0KHRvb2x0aXBQb2ludCwgY3R4LCBzaXplLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhcmV0UG9zaXRpb24gPSB0aGlzLmdldENhcmV0UG9zaXRpb24odG9vbHRpcFBvaW50LCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgY3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngxLCBjYXJldFBvc2l0aW9uLnkxKTtcbiAgICAgICAgY3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngyLCBjYXJldFBvc2l0aW9uLnkyKTtcbiAgICAgICAgY3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngzLCBjYXJldFBvc2l0aW9uLnkzKTtcbiAgICB9XG4gICAgZ2V0Q2FyZXRQb3NpdGlvbih0b29sdGlwUG9pbnQsIHNpemUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyB4QWxpZ24gLCB5QWxpZ24gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7IGNhcmV0U2l6ZSAsIGNvcm5lclJhZGl1cyAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHsgdG9wTGVmdCAsIHRvcFJpZ2h0ICwgYm90dG9tTGVmdCAsIGJvdHRvbVJpZ2h0ICB9ID0gdG9UUkJMQ29ybmVycyhjb3JuZXJSYWRpdXMpO1xuICAgICAgICBjb25zdCB7IHg6IHB0WCAsIHk6IHB0WSAgfSA9IHRvb2x0aXBQb2ludDtcbiAgICAgICAgY29uc3QgeyB3aWR0aCAsIGhlaWdodCAgfSA9IHNpemU7XG4gICAgICAgIGxldCB4MSwgeDIsIHgzLCB5MSwgeTIsIHkzO1xuICAgICAgICBpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgeTIgPSBwdFkgKyBoZWlnaHQgLyAyO1xuICAgICAgICAgICAgaWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgeDEgPSBwdFg7XG4gICAgICAgICAgICAgICAgeDIgPSB4MSAtIGNhcmV0U2l6ZTtcbiAgICAgICAgICAgICAgICB5MSA9IHkyICsgY2FyZXRTaXplO1xuICAgICAgICAgICAgICAgIHkzID0geTIgLSBjYXJldFNpemU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHgxID0gcHRYICsgd2lkdGg7XG4gICAgICAgICAgICAgICAgeDIgPSB4MSArIGNhcmV0U2l6ZTtcbiAgICAgICAgICAgICAgICB5MSA9IHkyIC0gY2FyZXRTaXplO1xuICAgICAgICAgICAgICAgIHkzID0geTIgKyBjYXJldFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4MyA9IHgxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgeDIgPSBwdFggKyBNYXRoLm1heCh0b3BMZWZ0LCBib3R0b21MZWZ0KSArIGNhcmV0U2l6ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgeDIgPSBwdFggKyB3aWR0aCAtIE1hdGgubWF4KHRvcFJpZ2h0LCBib3R0b21SaWdodCkgLSBjYXJldFNpemU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHgyID0gdGhpcy5jYXJldFg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeUFsaWduID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIHkxID0gcHRZO1xuICAgICAgICAgICAgICAgIHkyID0geTEgLSBjYXJldFNpemU7XG4gICAgICAgICAgICAgICAgeDEgPSB4MiAtIGNhcmV0U2l6ZTtcbiAgICAgICAgICAgICAgICB4MyA9IHgyICsgY2FyZXRTaXplO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB5MSA9IHB0WSArIGhlaWdodDtcbiAgICAgICAgICAgICAgICB5MiA9IHkxICsgY2FyZXRTaXplO1xuICAgICAgICAgICAgICAgIHgxID0geDIgKyBjYXJldFNpemU7XG4gICAgICAgICAgICAgICAgeDMgPSB4MiAtIGNhcmV0U2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHkzID0geTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHgxLFxuICAgICAgICAgICAgeDIsXG4gICAgICAgICAgICB4MyxcbiAgICAgICAgICAgIHkxLFxuICAgICAgICAgICAgeTIsXG4gICAgICAgICAgICB5M1xuICAgICAgICB9O1xuICAgIH1cbiAgICBkcmF3VGl0bGUocHQsIGN0eCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMudGl0bGU7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRpdGxlLmxlbmd0aDtcbiAgICAgICAgbGV0IHRpdGxlRm9udCwgdGl0bGVTcGFjaW5nLCBpO1xuICAgICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdGlvbnMucnRsLCB0aGlzLngsIHRoaXMud2lkdGgpO1xuICAgICAgICAgICAgcHQueCA9IGdldEFsaWduZWRYKHRoaXMsIG9wdGlvbnMudGl0bGVBbGlnbiwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjdHgudGV4dEFsaWduID0gcnRsSGVscGVyLnRleHRBbGlnbihvcHRpb25zLnRpdGxlQWxpZ24pO1xuICAgICAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgICAgICAgICAgdGl0bGVGb250ID0gdG9Gb250KG9wdGlvbnMudGl0bGVGb250KTtcbiAgICAgICAgICAgIHRpdGxlU3BhY2luZyA9IG9wdGlvbnMudGl0bGVTcGFjaW5nO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMudGl0bGVDb2xvcjtcbiAgICAgICAgICAgIGN0eC5mb250ID0gdGl0bGVGb250LnN0cmluZztcbiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGxlbmd0aDsgKytpKXtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFRleHQodGl0bGVbaV0sIHJ0bEhlbHBlci54KHB0LngpLCBwdC55ICsgdGl0bGVGb250LmxpbmVIZWlnaHQgLyAyKTtcbiAgICAgICAgICAgICAgICBwdC55ICs9IHRpdGxlRm9udC5saW5lSGVpZ2h0ICsgdGl0bGVTcGFjaW5nO1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHB0LnkgKz0gb3B0aW9ucy50aXRsZU1hcmdpbkJvdHRvbSAtIHRpdGxlU3BhY2luZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gX2RyYXdDb2xvckJveChjdHgsIHB0LCBpLCBydGxIZWxwZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbGFiZWxDb2xvciA9IHRoaXMubGFiZWxDb2xvcnNbaV07XG4gICAgICAgIGNvbnN0IGxhYmVsUG9pbnRTdHlsZSA9IHRoaXMubGFiZWxQb2ludFN0eWxlc1tpXTtcbiAgICAgICAgY29uc3QgeyBib3hIZWlnaHQgLCBib3hXaWR0aCAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGJvZHlGb250ID0gdG9Gb250KG9wdGlvbnMuYm9keUZvbnQpO1xuICAgICAgICBjb25zdCBjb2xvclggPSBnZXRBbGlnbmVkWCh0aGlzLCAnbGVmdCcsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBydGxDb2xvclggPSBydGxIZWxwZXIueChjb2xvclgpO1xuICAgICAgICBjb25zdCB5T2ZmU2V0ID0gYm94SGVpZ2h0IDwgYm9keUZvbnQubGluZUhlaWdodCA/IChib2R5Rm9udC5saW5lSGVpZ2h0IC0gYm94SGVpZ2h0KSAvIDIgOiAwO1xuICAgICAgICBjb25zdCBjb2xvclkgPSBwdC55ICsgeU9mZlNldDtcbiAgICAgICAgaWYgKG9wdGlvbnMudXNlUG9pbnRTdHlsZSkge1xuICAgICAgICAgICAgY29uc3QgZHJhd09wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgcmFkaXVzOiBNYXRoLm1pbihib3hXaWR0aCwgYm94SGVpZ2h0KSAvIDIsXG4gICAgICAgICAgICAgICAgcG9pbnRTdHlsZTogbGFiZWxQb2ludFN0eWxlLnBvaW50U3R5bGUsXG4gICAgICAgICAgICAgICAgcm90YXRpb246IGxhYmVsUG9pbnRTdHlsZS5yb3RhdGlvbixcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlclggPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxDb2xvclgsIGJveFdpZHRoKSArIGJveFdpZHRoIC8gMjtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlclkgPSBjb2xvclkgKyBib3hIZWlnaHQgLyAyO1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gb3B0aW9ucy5tdWx0aUtleUJhY2tncm91bmQ7XG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5tdWx0aUtleUJhY2tncm91bmQ7XG4gICAgICAgICAgICBkcmF3UG9pbnQoY3R4LCBkcmF3T3B0aW9ucywgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBsYWJlbENvbG9yLmJvcmRlckNvbG9yO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGxhYmVsQ29sb3IuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgZHJhd1BvaW50KGN0eCwgZHJhd09wdGlvbnMsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGlzT2JqZWN0KGxhYmVsQ29sb3IuYm9yZGVyV2lkdGgpID8gTWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhsYWJlbENvbG9yLmJvcmRlcldpZHRoKSkgOiBsYWJlbENvbG9yLmJvcmRlcldpZHRoIHx8IDE7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBsYWJlbENvbG9yLmJvcmRlckNvbG9yO1xuICAgICAgICAgICAgY3R4LnNldExpbmVEYXNoKGxhYmVsQ29sb3IuYm9yZGVyRGFzaCB8fCBbXSk7XG4gICAgICAgICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBsYWJlbENvbG9yLmJvcmRlckRhc2hPZmZzZXQgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IG91dGVyWCA9IHJ0bEhlbHBlci5sZWZ0Rm9yTHRyKHJ0bENvbG9yWCwgYm94V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgaW5uZXJYID0gcnRsSGVscGVyLmxlZnRGb3JMdHIocnRsSGVscGVyLnhQbHVzKHJ0bENvbG9yWCwgMSksIGJveFdpZHRoIC0gMik7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJSYWRpdXMgPSB0b1RSQkxDb3JuZXJzKGxhYmVsQ29sb3IuYm9yZGVyUmFkaXVzKTtcbiAgICAgICAgICAgIGlmIChPYmplY3QudmFsdWVzKGJvcmRlclJhZGl1cykuc29tZSgodik9PnYgIT09IDApKSB7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBvcHRpb25zLm11bHRpS2V5QmFja2dyb3VuZDtcbiAgICAgICAgICAgICAgICBhZGRSb3VuZGVkUmVjdFBhdGgoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIHg6IG91dGVyWCxcbiAgICAgICAgICAgICAgICAgICAgeTogY29sb3JZLFxuICAgICAgICAgICAgICAgICAgICB3OiBib3hXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaDogYm94SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICByYWRpdXM6IGJvcmRlclJhZGl1c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBsYWJlbENvbG9yLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICB4OiBpbm5lclgsXG4gICAgICAgICAgICAgICAgICAgIHk6IGNvbG9yWSArIDEsXG4gICAgICAgICAgICAgICAgICAgIHc6IGJveFdpZHRoIC0gMixcbiAgICAgICAgICAgICAgICAgICAgaDogYm94SGVpZ2h0IC0gMixcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBib3JkZXJSYWRpdXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5tdWx0aUtleUJhY2tncm91bmQ7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KG91dGVyWCwgY29sb3JZLCBib3hXaWR0aCwgYm94SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlUmVjdChvdXRlclgsIGNvbG9yWSwgYm94V2lkdGgsIGJveEhlaWdodCk7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGxhYmVsQ29sb3IuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChpbm5lclgsIGNvbG9yWSArIDEsIGJveFdpZHRoIC0gMiwgYm94SGVpZ2h0IC0gMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHRoaXMubGFiZWxUZXh0Q29sb3JzW2ldO1xuICAgIH1cbiAgICBkcmF3Qm9keShwdCwgY3R4LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgYm9keSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgYm9keVNwYWNpbmcgLCBib2R5QWxpZ24gLCBkaXNwbGF5Q29sb3JzICwgYm94SGVpZ2h0ICwgYm94V2lkdGggLCBib3hQYWRkaW5nICB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgYm9keUZvbnQgPSB0b0ZvbnQob3B0aW9ucy5ib2R5Rm9udCk7XG4gICAgICAgIGxldCBib2R5TGluZUhlaWdodCA9IGJvZHlGb250LmxpbmVIZWlnaHQ7XG4gICAgICAgIGxldCB4TGluZVBhZGRpbmcgPSAwO1xuICAgICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdGlvbnMucnRsLCB0aGlzLngsIHRoaXMud2lkdGgpO1xuICAgICAgICBjb25zdCBmaWxsTGluZU9mVGV4dCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIGN0eC5maWxsVGV4dChsaW5lLCBydGxIZWxwZXIueChwdC54ICsgeExpbmVQYWRkaW5nKSwgcHQueSArIGJvZHlMaW5lSGVpZ2h0IC8gMik7XG4gICAgICAgICAgICBwdC55ICs9IGJvZHlMaW5lSGVpZ2h0ICsgYm9keVNwYWNpbmc7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJvZHlBbGlnbkZvckNhbGN1bGF0aW9uID0gcnRsSGVscGVyLnRleHRBbGlnbihib2R5QWxpZ24pO1xuICAgICAgICBsZXQgYm9keUl0ZW0sIHRleHRDb2xvciwgbGluZXMsIGksIGosIGlsZW4sIGpsZW47XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSBib2R5QWxpZ247XG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcbiAgICAgICAgY3R4LmZvbnQgPSBib2R5Rm9udC5zdHJpbmc7XG4gICAgICAgIHB0LnggPSBnZXRBbGlnbmVkWCh0aGlzLCBib2R5QWxpZ25Gb3JDYWxjdWxhdGlvbiwgb3B0aW9ucyk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBvcHRpb25zLmJvZHlDb2xvcjtcbiAgICAgICAgZWFjaCh0aGlzLmJlZm9yZUJvZHksIGZpbGxMaW5lT2ZUZXh0KTtcbiAgICAgICAgeExpbmVQYWRkaW5nID0gZGlzcGxheUNvbG9ycyAmJiBib2R5QWxpZ25Gb3JDYWxjdWxhdGlvbiAhPT0gJ3JpZ2h0JyA/IGJvZHlBbGlnbiA9PT0gJ2NlbnRlcicgPyBib3hXaWR0aCAvIDIgKyBib3hQYWRkaW5nIDogYm94V2lkdGggKyAyICsgYm94UGFkZGluZyA6IDA7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGJvZHkubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGJvZHlJdGVtID0gYm9keVtpXTtcbiAgICAgICAgICAgIHRleHRDb2xvciA9IHRoaXMubGFiZWxUZXh0Q29sb3JzW2ldO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHRleHRDb2xvcjtcbiAgICAgICAgICAgIGVhY2goYm9keUl0ZW0uYmVmb3JlLCBmaWxsTGluZU9mVGV4dCk7XG4gICAgICAgICAgICBsaW5lcyA9IGJvZHlJdGVtLmxpbmVzO1xuICAgICAgICAgICAgaWYgKGRpc3BsYXlDb2xvcnMgJiYgbGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd0NvbG9yQm94KGN0eCwgcHQsIGksIHJ0bEhlbHBlciwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYm9keUxpbmVIZWlnaHQgPSBNYXRoLm1heChib2R5Rm9udC5saW5lSGVpZ2h0LCBib3hIZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yKGogPSAwLCBqbGVuID0gbGluZXMubGVuZ3RoOyBqIDwgamxlbjsgKytqKXtcbiAgICAgICAgICAgICAgICBmaWxsTGluZU9mVGV4dChsaW5lc1tqXSk7XG4gICAgICAgICAgICAgICAgYm9keUxpbmVIZWlnaHQgPSBib2R5Rm9udC5saW5lSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWFjaChib2R5SXRlbS5hZnRlciwgZmlsbExpbmVPZlRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHhMaW5lUGFkZGluZyA9IDA7XG4gICAgICAgIGJvZHlMaW5lSGVpZ2h0ID0gYm9keUZvbnQubGluZUhlaWdodDtcbiAgICAgICAgZWFjaCh0aGlzLmFmdGVyQm9keSwgZmlsbExpbmVPZlRleHQpO1xuICAgICAgICBwdC55IC09IGJvZHlTcGFjaW5nO1xuICAgIH1cbiAgICBkcmF3Rm9vdGVyKHB0LCBjdHgsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZm9vdGVyID0gdGhpcy5mb290ZXI7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGZvb3Rlci5sZW5ndGg7XG4gICAgICAgIGxldCBmb290ZXJGb250LCBpO1xuICAgICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdGlvbnMucnRsLCB0aGlzLngsIHRoaXMud2lkdGgpO1xuICAgICAgICAgICAgcHQueCA9IGdldEFsaWduZWRYKHRoaXMsIG9wdGlvbnMuZm9vdGVyQWxpZ24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgcHQueSArPSBvcHRpb25zLmZvb3Rlck1hcmdpblRvcDtcbiAgICAgICAgICAgIGN0eC50ZXh0QWxpZ24gPSBydGxIZWxwZXIudGV4dEFsaWduKG9wdGlvbnMuZm9vdGVyQWxpZ24pO1xuICAgICAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgICAgICAgICAgZm9vdGVyRm9udCA9IHRvRm9udChvcHRpb25zLmZvb3RlckZvbnQpO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMuZm9vdGVyQ29sb3I7XG4gICAgICAgICAgICBjdHguZm9udCA9IGZvb3RlckZvbnQuc3RyaW5nO1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpe1xuICAgICAgICAgICAgICAgIGN0eC5maWxsVGV4dChmb290ZXJbaV0sIHJ0bEhlbHBlci54KHB0LngpLCBwdC55ICsgZm9vdGVyRm9udC5saW5lSGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgcHQueSArPSBmb290ZXJGb250LmxpbmVIZWlnaHQgKyBvcHRpb25zLmZvb3RlclNwYWNpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhd0JhY2tncm91bmQocHQsIGN0eCwgdG9vbHRpcFNpemUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyB4QWxpZ24gLCB5QWxpZ24gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7IHggLCB5ICB9ID0gcHQ7XG4gICAgICAgIGNvbnN0IHsgd2lkdGggLCBoZWlnaHQgIH0gPSB0b29sdGlwU2l6ZTtcbiAgICAgICAgY29uc3QgeyB0b3BMZWZ0ICwgdG9wUmlnaHQgLCBib3R0b21MZWZ0ICwgYm90dG9tUmlnaHQgIH0gPSB0b1RSQkxDb3JuZXJzKG9wdGlvbnMuY29ybmVyUmFkaXVzKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBvcHRpb25zLmJvcmRlckNvbG9yO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gb3B0aW9ucy5ib3JkZXJXaWR0aDtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubW92ZVRvKHggKyB0b3BMZWZ0LCB5KTtcbiAgICAgICAgaWYgKHlBbGlnbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd0NhcmV0KHB0LCBjdHgsIHRvb2x0aXBTaXplLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjdHgubGluZVRvKHggKyB3aWR0aCAtIHRvcFJpZ2h0LCB5KTtcbiAgICAgICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyB0b3BSaWdodCk7XG4gICAgICAgIGlmICh5QWxpZ24gPT09ICdjZW50ZXInICYmIHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdGhpcy5kcmF3Q2FyZXQocHQsIGN0eCwgdG9vbHRpcFNpemUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0IC0gYm90dG9tUmlnaHQpO1xuICAgICAgICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHggKyB3aWR0aCAtIGJvdHRvbVJpZ2h0LCB5ICsgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHlBbGlnbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd0NhcmV0KHB0LCBjdHgsIHRvb2x0aXBTaXplLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjdHgubGluZVRvKHggKyBib3R0b21MZWZ0LCB5ICsgaGVpZ2h0KTtcbiAgICAgICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIGJvdHRvbUxlZnQpO1xuICAgICAgICBpZiAoeUFsaWduID09PSAnY2VudGVyJyAmJiB4QWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdGhpcy5kcmF3Q2FyZXQocHQsIGN0eCwgdG9vbHRpcFNpemUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5saW5lVG8oeCwgeSArIHRvcExlZnQpO1xuICAgICAgICBjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5LCB4ICsgdG9wTGVmdCwgeSk7XG4gICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gX3VwZGF0ZUFuaW1hdGlvblRhcmdldChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3QgYW5pbXMgPSB0aGlzLiRhbmltYXRpb25zO1xuICAgICAgICBjb25zdCBhbmltWCA9IGFuaW1zICYmIGFuaW1zLng7XG4gICAgICAgIGNvbnN0IGFuaW1ZID0gYW5pbXMgJiYgYW5pbXMueTtcbiAgICAgICAgaWYgKGFuaW1YIHx8IGFuaW1ZKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uZXJzW29wdGlvbnMucG9zaXRpb25dLmNhbGwodGhpcywgdGhpcy5fYWN0aXZlLCB0aGlzLl9ldmVudFBvc2l0aW9uKTtcbiAgICAgICAgICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaXplID0gdGhpcy5fc2l6ZSA9IGdldFRvb2x0aXBTaXplKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25BbmRTaXplID0gT2JqZWN0LmFzc2lnbih7fSwgcG9zaXRpb24sIHRoaXMuX3NpemUpO1xuICAgICAgICAgICAgY29uc3QgYWxpZ25tZW50ID0gZGV0ZXJtaW5lQWxpZ25tZW50KGNoYXJ0LCBvcHRpb25zLCBwb3NpdGlvbkFuZFNpemUpO1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSBnZXRCYWNrZ3JvdW5kUG9pbnQob3B0aW9ucywgcG9zaXRpb25BbmRTaXplLCBhbGlnbm1lbnQsIGNoYXJ0KTtcbiAgICAgICAgICAgIGlmIChhbmltWC5fdG8gIT09IHBvaW50LnggfHwgYW5pbVkuX3RvICE9PSBwb2ludC55KSB7XG4gICAgICAgICAgICAgICAgdGhpcy54QWxpZ24gPSBhbGlnbm1lbnQueEFsaWduO1xuICAgICAgICAgICAgICAgIHRoaXMueUFsaWduID0gYWxpZ25tZW50LnlBbGlnbjtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gc2l6ZS53aWR0aDtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHNpemUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZXRYID0gcG9zaXRpb24ueDtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmV0WSA9IHBvc2l0aW9uLnk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoKS51cGRhdGUodGhpcywgcG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuIF93aWxsUmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLm9wYWNpdHk7XG4gICAgfVxuICAgIGRyYXcoY3R4KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSk7XG4gICAgICAgIGxldCBvcGFjaXR5ID0gdGhpcy5vcGFjaXR5O1xuICAgICAgICBpZiAoIW9wYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVBbmltYXRpb25UYXJnZXQob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHRvb2x0aXBTaXplID0ge1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHB0ID0ge1xuICAgICAgICAgICAgeDogdGhpcy54LFxuICAgICAgICAgICAgeTogdGhpcy55XG4gICAgICAgIH07XG4gICAgICAgIG9wYWNpdHkgPSBNYXRoLmFicyhvcGFjaXR5KSA8IDFlLTMgPyAwIDogb3BhY2l0eTtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRpb25zLnBhZGRpbmcpO1xuICAgICAgICBjb25zdCBoYXNUb29sdGlwQ29udGVudCA9IHRoaXMudGl0bGUubGVuZ3RoIHx8IHRoaXMuYmVmb3JlQm9keS5sZW5ndGggfHwgdGhpcy5ib2R5Lmxlbmd0aCB8fCB0aGlzLmFmdGVyQm9keS5sZW5ndGggfHwgdGhpcy5mb290ZXIubGVuZ3RoO1xuICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVkICYmIGhhc1Rvb2x0aXBDb250ZW50KSB7XG4gICAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcbiAgICAgICAgICAgIHRoaXMuZHJhd0JhY2tncm91bmQocHQsIGN0eCwgdG9vbHRpcFNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgb3ZlcnJpZGVUZXh0RGlyZWN0aW9uKGN0eCwgb3B0aW9ucy50ZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHB0LnkgKz0gcGFkZGluZy50b3A7XG4gICAgICAgICAgICB0aGlzLmRyYXdUaXRsZShwdCwgY3R4LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuZHJhd0JvZHkocHQsIGN0eCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmRyYXdGb290ZXIocHQsIGN0eCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXN0b3JlVGV4dERpcmVjdGlvbihjdHgsIG9wdGlvbnMudGV4dERpcmVjdGlvbik7XG4gICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgfVxuIGdldEFjdGl2ZUVsZW1lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlIHx8IFtdO1xuICAgIH1cbiBzZXRBY3RpdmVFbGVtZW50cyhhY3RpdmVFbGVtZW50cywgZXZlbnRQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBsYXN0QWN0aXZlID0gdGhpcy5fYWN0aXZlO1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVFbGVtZW50cy5tYXAoKHsgZGF0YXNldEluZGV4ICwgaW5kZXggIH0pPT57XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBhIGRhdGFzZXQgYXQgaW5kZXggJyArIGRhdGFzZXRJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBtZXRhLmRhdGFbaW5kZXhdLFxuICAgICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9ICFfZWxlbWVudHNFcXVhbChsYXN0QWN0aXZlLCBhY3RpdmUpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbkNoYW5nZWQgPSB0aGlzLl9wb3NpdGlvbkNoYW5nZWQoYWN0aXZlLCBldmVudFBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGNoYW5nZWQgfHwgcG9zaXRpb25DaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUgPSBhY3RpdmU7XG4gICAgICAgICAgICB0aGlzLl9ldmVudFBvc2l0aW9uID0gZXZlbnRQb3NpdGlvbjtcbiAgICAgICAgICAgIHRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiBoYW5kbGVFdmVudChlLCByZXBsYXksIGluQ2hhcnRBcmVhID0gdHJ1ZSkge1xuICAgICAgICBpZiAocmVwbGF5ICYmIHRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCBsYXN0QWN0aXZlID0gdGhpcy5fYWN0aXZlIHx8IFtdO1xuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9nZXRBY3RpdmVFbGVtZW50cyhlLCBsYXN0QWN0aXZlLCByZXBsYXksIGluQ2hhcnRBcmVhKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25DaGFuZ2VkID0gdGhpcy5fcG9zaXRpb25DaGFuZ2VkKGFjdGl2ZSwgZSk7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSByZXBsYXkgfHwgIV9lbGVtZW50c0VxdWFsKGFjdGl2ZSwgbGFzdEFjdGl2ZSkgfHwgcG9zaXRpb25DaGFuZ2VkO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gYWN0aXZlO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW5hYmxlZCB8fCBvcHRpb25zLmV4dGVybmFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgeDogZS54LFxuICAgICAgICAgICAgICAgICAgICB5OiBlLnlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKHRydWUsIHJlcGxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuIF9nZXRBY3RpdmVFbGVtZW50cyhlLCBsYXN0QWN0aXZlLCByZXBsYXksIGluQ2hhcnRBcmVhKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmIChlLnR5cGUgPT09ICdtb3VzZW91dCcpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWluQ2hhcnRBcmVhKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFzdEFjdGl2ZS5maWx0ZXIoKGkpPT50aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbaS5kYXRhc2V0SW5kZXhdICYmIHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoaS5kYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIuZ2V0UGFyc2VkKGkuaW5kZXgpICE9PSB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuY2hhcnQuZ2V0RWxlbWVudHNBdEV2ZW50Rm9yTW9kZShlLCBvcHRpb25zLm1vZGUsIG9wdGlvbnMsIHJlcGxheSk7XG4gICAgICAgIGlmIChvcHRpb25zLnJldmVyc2UpIHtcbiAgICAgICAgICAgIGFjdGl2ZS5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjdGl2ZTtcbiAgICB9XG4gX3Bvc2l0aW9uQ2hhbmdlZChhY3RpdmUsIGUpIHtcbiAgICAgICAgY29uc3QgeyBjYXJldFggLCBjYXJldFkgLCBvcHRpb25zICB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBwb3NpdGlvbmVyc1tvcHRpb25zLnBvc2l0aW9uXS5jYWxsKHRoaXMsIGFjdGl2ZSwgZSk7XG4gICAgICAgIHJldHVybiBwb3NpdGlvbiAhPT0gZmFsc2UgJiYgKGNhcmV0WCAhPT0gcG9zaXRpb24ueCB8fCBjYXJldFkgIT09IHBvc2l0aW9uLnkpO1xuICAgIH1cbn1cbnZhciBwbHVnaW5fdG9vbHRpcCA9IHtcbiAgICBpZDogJ3Rvb2x0aXAnLFxuICAgIF9lbGVtZW50OiBUb29sdGlwLFxuICAgIHBvc2l0aW9uZXJzLFxuICAgIGFmdGVySW5pdCAoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBjaGFydC50b29sdGlwID0gbmV3IFRvb2x0aXAoe1xuICAgICAgICAgICAgICAgIGNoYXJ0LFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBiZWZvcmVVcGRhdGUgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBpZiAoY2hhcnQudG9vbHRpcCkge1xuICAgICAgICAgICAgY2hhcnQudG9vbHRpcC5pbml0aWFsaXplKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZXNldCAoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChjaGFydC50b29sdGlwKSB7XG4gICAgICAgICAgICBjaGFydC50b29sdGlwLmluaXRpYWxpemUob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGFmdGVyRHJhdyAoY2hhcnQpIHtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IGNoYXJ0LnRvb2x0aXA7XG4gICAgICAgIGlmICh0b29sdGlwICYmIHRvb2x0aXAuX3dpbGxSZW5kZXIoKSkge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IHtcbiAgICAgICAgICAgICAgICB0b29sdGlwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGNoYXJ0Lm5vdGlmeVBsdWdpbnMoJ2JlZm9yZVRvb2x0aXBEcmF3Jywge1xuICAgICAgICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9vbHRpcC5kcmF3KGNoYXJ0LmN0eCk7XG4gICAgICAgICAgICBjaGFydC5ub3RpZnlQbHVnaW5zKCdhZnRlclRvb2x0aXBEcmF3JywgYXJncyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGFmdGVyRXZlbnQgKGNoYXJ0LCBhcmdzKSB7XG4gICAgICAgIGlmIChjaGFydC50b29sdGlwKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VGaW5hbFBvc2l0aW9uID0gYXJncy5yZXBsYXk7XG4gICAgICAgICAgICBpZiAoY2hhcnQudG9vbHRpcC5oYW5kbGVFdmVudChhcmdzLmV2ZW50LCB1c2VGaW5hbFBvc2l0aW9uLCBhcmdzLmluQ2hhcnRBcmVhKSkge1xuICAgICAgICAgICAgICAgIGFyZ3MuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGV4dGVybmFsOiBudWxsLFxuICAgICAgICBwb3NpdGlvbjogJ2F2ZXJhZ2UnLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsMCwwLDAuOCknLFxuICAgICAgICB0aXRsZUNvbG9yOiAnI2ZmZicsXG4gICAgICAgIHRpdGxlRm9udDoge1xuICAgICAgICAgICAgd2VpZ2h0OiAnYm9sZCdcbiAgICAgICAgfSxcbiAgICAgICAgdGl0bGVTcGFjaW5nOiAyLFxuICAgICAgICB0aXRsZU1hcmdpbkJvdHRvbTogNixcbiAgICAgICAgdGl0bGVBbGlnbjogJ2xlZnQnLFxuICAgICAgICBib2R5Q29sb3I6ICcjZmZmJyxcbiAgICAgICAgYm9keVNwYWNpbmc6IDIsXG4gICAgICAgIGJvZHlGb250OiB7fSxcbiAgICAgICAgYm9keUFsaWduOiAnbGVmdCcsXG4gICAgICAgIGZvb3RlckNvbG9yOiAnI2ZmZicsXG4gICAgICAgIGZvb3RlclNwYWNpbmc6IDIsXG4gICAgICAgIGZvb3Rlck1hcmdpblRvcDogNixcbiAgICAgICAgZm9vdGVyRm9udDoge1xuICAgICAgICAgICAgd2VpZ2h0OiAnYm9sZCdcbiAgICAgICAgfSxcbiAgICAgICAgZm9vdGVyQWxpZ246ICdsZWZ0JyxcbiAgICAgICAgcGFkZGluZzogNixcbiAgICAgICAgY2FyZXRQYWRkaW5nOiAyLFxuICAgICAgICBjYXJldFNpemU6IDUsXG4gICAgICAgIGNvcm5lclJhZGl1czogNixcbiAgICAgICAgYm94SGVpZ2h0OiAoY3R4LCBvcHRzKT0+b3B0cy5ib2R5Rm9udC5zaXplLFxuICAgICAgICBib3hXaWR0aDogKGN0eCwgb3B0cyk9Pm9wdHMuYm9keUZvbnQuc2l6ZSxcbiAgICAgICAgbXVsdGlLZXlCYWNrZ3JvdW5kOiAnI2ZmZicsXG4gICAgICAgIGRpc3BsYXlDb2xvcnM6IHRydWUsXG4gICAgICAgIGJveFBhZGRpbmc6IDAsXG4gICAgICAgIGJvcmRlckNvbG9yOiAncmdiYSgwLDAsMCwwKScsXG4gICAgICAgIGJvcmRlcldpZHRoOiAwLFxuICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiA0MDAsXG4gICAgICAgICAgICBlYXNpbmc6ICdlYXNlT3V0UXVhcnQnXG4gICAgICAgIH0sXG4gICAgICAgIGFuaW1hdGlvbnM6IHtcbiAgICAgICAgICAgIG51bWJlcnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICAgICAgICAgICAgJ2NhcmV0WCcsXG4gICAgICAgICAgICAgICAgICAgICdjYXJldFknXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wYWNpdHk6IHtcbiAgICAgICAgICAgICAgICBlYXNpbmc6ICdsaW5lYXInLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAyMDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsbGJhY2tzOiBkZWZhdWx0Q2FsbGJhY2tzXG4gICAgfSxcbiAgICBkZWZhdWx0Um91dGVzOiB7XG4gICAgICAgIGJvZHlGb250OiAnZm9udCcsXG4gICAgICAgIGZvb3RlckZvbnQ6ICdmb250JyxcbiAgICAgICAgdGl0bGVGb250OiAnZm9udCdcbiAgICB9LFxuICAgIGRlc2NyaXB0b3JzOiB7XG4gICAgICAgIF9zY3JpcHRhYmxlOiAobmFtZSk9Pm5hbWUgIT09ICdmaWx0ZXInICYmIG5hbWUgIT09ICdpdGVtU29ydCcgJiYgbmFtZSAhPT0gJ2V4dGVybmFsJyxcbiAgICAgICAgX2luZGV4YWJsZTogZmFsc2UsXG4gICAgICAgIGNhbGxiYWNrczoge1xuICAgICAgICAgICAgX3NjcmlwdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgX2luZGV4YWJsZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICBfZmFsbGJhY2s6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGFuaW1hdGlvbnM6IHtcbiAgICAgICAgICAgIF9mYWxsYmFjazogJ2FuaW1hdGlvbidcbiAgICAgICAgfVxuICAgIH0sXG4gICAgYWRkaXRpb25hbE9wdGlvblNjb3BlczogW1xuICAgICAgICAnaW50ZXJhY3Rpb24nXG4gICAgXVxufTtcblxudmFyIHBsdWdpbnMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5fX3Byb3RvX186IG51bGwsXG5Db2xvcnM6IHBsdWdpbl9jb2xvcnMsXG5EZWNpbWF0aW9uOiBwbHVnaW5fZGVjaW1hdGlvbixcbkZpbGxlcjogaW5kZXgsXG5MZWdlbmQ6IHBsdWdpbl9sZWdlbmQsXG5TdWJUaXRsZTogcGx1Z2luX3N1YnRpdGxlLFxuVGl0bGU6IHBsdWdpbl90aXRsZSxcblRvb2x0aXA6IHBsdWdpbl90b29sdGlwXG59KTtcblxuY29uc3QgYWRkSWZTdHJpbmcgPSAobGFiZWxzLCByYXcsIGluZGV4LCBhZGRlZExhYmVscyk9PntcbiAgICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW5kZXggPSBsYWJlbHMucHVzaChyYXcpIC0gMTtcbiAgICAgICAgYWRkZWRMYWJlbHMudW5zaGlmdCh7XG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGxhYmVsOiByYXdcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpc05hTihyYXcpKSB7XG4gICAgICAgIGluZGV4ID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xufTtcbmZ1bmN0aW9uIGZpbmRPckFkZExhYmVsKGxhYmVscywgcmF3LCBpbmRleCwgYWRkZWRMYWJlbHMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGxhYmVscy5pbmRleE9mKHJhdyk7XG4gICAgaWYgKGZpcnN0ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gYWRkSWZTdHJpbmcobGFiZWxzLCByYXcsIGluZGV4LCBhZGRlZExhYmVscyk7XG4gICAgfVxuICAgIGNvbnN0IGxhc3QgPSBsYWJlbHMubGFzdEluZGV4T2YocmF3KTtcbiAgICByZXR1cm4gZmlyc3QgIT09IGxhc3QgPyBpbmRleCA6IGZpcnN0O1xufVxuY29uc3QgdmFsaWRJbmRleCA9IChpbmRleCwgbWF4KT0+aW5kZXggPT09IG51bGwgPyBudWxsIDogX2xpbWl0VmFsdWUoTWF0aC5yb3VuZChpbmRleCksIDAsIG1heCk7XG5mdW5jdGlvbiBfZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPCBsYWJlbHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBsYWJlbHNbdmFsdWVdO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5jbGFzcyBDYXRlZ29yeVNjYWxlIGV4dGVuZHMgU2NhbGUge1xuICAgIHN0YXRpYyBpZCA9ICdjYXRlZ29yeSc7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgY2FsbGJhY2s6IF9nZXRMYWJlbEZvclZhbHVlXG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0cnVjdG9yKGNmZyl7XG4gICAgICAgIHN1cGVyKGNmZyk7XG4gICAgICAgICB0aGlzLl9zdGFydFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl92YWx1ZVJhbmdlID0gMDtcbiAgICAgICAgdGhpcy5fYWRkZWRMYWJlbHMgPSBbXTtcbiAgICB9XG4gICAgaW5pdChzY2FsZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLl9hZGRlZExhYmVscztcbiAgICAgICAgaWYgKGFkZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBpbmRleCAsIGxhYmVsICB9IG9mIGFkZGVkKXtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWxzW2luZGV4XSA9PT0gbGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYWRkZWRMYWJlbHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5pbml0KHNjYWxlT3B0aW9ucyk7XG4gICAgfVxuICAgIHBhcnNlKHJhdywgaW5kZXgpIHtcbiAgICAgICAgaWYgKGlzTnVsbE9yVW5kZWYocmF3KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICAgICAgaW5kZXggPSBpc0Zpbml0ZShpbmRleCkgJiYgbGFiZWxzW2luZGV4XSA9PT0gcmF3ID8gaW5kZXggOiBmaW5kT3JBZGRMYWJlbChsYWJlbHMsIHJhdywgdmFsdWVPckRlZmF1bHQoaW5kZXgsIHJhdyksIHRoaXMuX2FkZGVkTGFiZWxzKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkSW5kZXgoaW5kZXgsIGxhYmVscy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZGV0ZXJtaW5lRGF0YUxpbWl0cygpIHtcbiAgICAgICAgY29uc3QgeyBtaW5EZWZpbmVkICwgbWF4RGVmaW5lZCAgfSA9IHRoaXMuZ2V0VXNlckJvdW5kcygpO1xuICAgICAgICBsZXQgeyBtaW4gLCBtYXggIH0gPSB0aGlzLmdldE1pbk1heCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ib3VuZHMgPT09ICd0aWNrcycpIHtcbiAgICAgICAgICAgIGlmICghbWluRGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1pbiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1heERlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtYXggPSB0aGlzLmdldExhYmVscygpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taW4gPSBtaW47XG4gICAgICAgIHRoaXMubWF4ID0gbWF4O1xuICAgIH1cbiAgICBidWlsZFRpY2tzKCkge1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbjtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXg7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub3B0aW9ucy5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IHRpY2tzID0gW107XG4gICAgICAgIGxldCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpO1xuICAgICAgICBsYWJlbHMgPSBtaW4gPT09IDAgJiYgbWF4ID09PSBsYWJlbHMubGVuZ3RoIC0gMSA/IGxhYmVscyA6IGxhYmVscy5zbGljZShtaW4sIG1heCArIDEpO1xuICAgICAgICB0aGlzLl92YWx1ZVJhbmdlID0gTWF0aC5tYXgobGFiZWxzLmxlbmd0aCAtIChvZmZzZXQgPyAwIDogMSksIDEpO1xuICAgICAgICB0aGlzLl9zdGFydFZhbHVlID0gdGhpcy5taW4gLSAob2Zmc2V0ID8gMC41IDogMCk7XG4gICAgICAgIGZvcihsZXQgdmFsdWUgPSBtaW47IHZhbHVlIDw9IG1heDsgdmFsdWUrKyl7XG4gICAgICAgICAgICB0aWNrcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpY2tzO1xuICAgIH1cbiAgICBnZXRMYWJlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfZ2V0TGFiZWxGb3JWYWx1ZS5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICB9XG4gY29uZmlndXJlKCkge1xuICAgICAgICBzdXBlci5jb25maWd1cmUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXZlcnNlUGl4ZWxzID0gIXRoaXMuX3JldmVyc2VQaXhlbHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyBOYU4gOiB0aGlzLmdldFBpeGVsRm9yRGVjaW1hbCgodmFsdWUgLSB0aGlzLl9zdGFydFZhbHVlKSAvIHRoaXMuX3ZhbHVlUmFuZ2UpO1xuICAgIH1cbiAgICBnZXRQaXhlbEZvclRpY2soaW5kZXgpIHtcbiAgICAgICAgY29uc3QgdGlja3MgPSB0aGlzLnRpY2tzO1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGlja3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0aWNrc1tpbmRleF0udmFsdWUpO1xuICAgIH1cbiAgICBnZXRWYWx1ZUZvclBpeGVsKHBpeGVsKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuX3N0YXJ0VmFsdWUgKyB0aGlzLmdldERlY2ltYWxGb3JQaXhlbChwaXhlbCkgKiB0aGlzLl92YWx1ZVJhbmdlKTtcbiAgICB9XG4gICAgZ2V0QmFzZVBpeGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3R0b207XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVRpY2tzJDEoZ2VuZXJhdGlvbk9wdGlvbnMsIGRhdGFSYW5nZSkge1xuICAgIGNvbnN0IHRpY2tzID0gW107XG4gICAgY29uc3QgTUlOX1NQQUNJTkcgPSAxZS0xNDtcbiAgICBjb25zdCB7IGJvdW5kcyAsIHN0ZXAgLCBtaW4gLCBtYXggLCBwcmVjaXNpb24gLCBjb3VudCAsIG1heFRpY2tzICwgbWF4RGlnaXRzICwgaW5jbHVkZUJvdW5kcyAgfSA9IGdlbmVyYXRpb25PcHRpb25zO1xuICAgIGNvbnN0IHVuaXQgPSBzdGVwIHx8IDE7XG4gICAgY29uc3QgbWF4U3BhY2VzID0gbWF4VGlja3MgLSAxO1xuICAgIGNvbnN0IHsgbWluOiBybWluICwgbWF4OiBybWF4ICB9ID0gZGF0YVJhbmdlO1xuICAgIGNvbnN0IG1pbkRlZmluZWQgPSAhaXNOdWxsT3JVbmRlZihtaW4pO1xuICAgIGNvbnN0IG1heERlZmluZWQgPSAhaXNOdWxsT3JVbmRlZihtYXgpO1xuICAgIGNvbnN0IGNvdW50RGVmaW5lZCA9ICFpc051bGxPclVuZGVmKGNvdW50KTtcbiAgICBjb25zdCBtaW5TcGFjaW5nID0gKHJtYXggLSBybWluKSAvIChtYXhEaWdpdHMgKyAxKTtcbiAgICBsZXQgc3BhY2luZyA9IG5pY2VOdW0oKHJtYXggLSBybWluKSAvIG1heFNwYWNlcyAvIHVuaXQpICogdW5pdDtcbiAgICBsZXQgZmFjdG9yLCBuaWNlTWluLCBuaWNlTWF4LCBudW1TcGFjZXM7XG4gICAgaWYgKHNwYWNpbmcgPCBNSU5fU1BBQ0lORyAmJiAhbWluRGVmaW5lZCAmJiAhbWF4RGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBybWluXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBybWF4XG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgfVxuICAgIG51bVNwYWNlcyA9IE1hdGguY2VpbChybWF4IC8gc3BhY2luZykgLSBNYXRoLmZsb29yKHJtaW4gLyBzcGFjaW5nKTtcbiAgICBpZiAobnVtU3BhY2VzID4gbWF4U3BhY2VzKSB7XG4gICAgICAgIHNwYWNpbmcgPSBuaWNlTnVtKG51bVNwYWNlcyAqIHNwYWNpbmcgLyBtYXhTcGFjZXMgLyB1bml0KSAqIHVuaXQ7XG4gICAgfVxuICAgIGlmICghaXNOdWxsT3JVbmRlZihwcmVjaXNpb24pKSB7XG4gICAgICAgIGZhY3RvciA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24pO1xuICAgICAgICBzcGFjaW5nID0gTWF0aC5jZWlsKHNwYWNpbmcgKiBmYWN0b3IpIC8gZmFjdG9yO1xuICAgIH1cbiAgICBpZiAoYm91bmRzID09PSAndGlja3MnKSB7XG4gICAgICAgIG5pY2VNaW4gPSBNYXRoLmZsb29yKHJtaW4gLyBzcGFjaW5nKSAqIHNwYWNpbmc7XG4gICAgICAgIG5pY2VNYXggPSBNYXRoLmNlaWwocm1heCAvIHNwYWNpbmcpICogc3BhY2luZztcbiAgICB9IGVsc2Uge1xuICAgICAgICBuaWNlTWluID0gcm1pbjtcbiAgICAgICAgbmljZU1heCA9IHJtYXg7XG4gICAgfVxuICAgIGlmIChtaW5EZWZpbmVkICYmIG1heERlZmluZWQgJiYgc3RlcCAmJiBhbG1vc3RXaG9sZSgobWF4IC0gbWluKSAvIHN0ZXAsIHNwYWNpbmcgLyAxMDAwKSkge1xuICAgICAgICBudW1TcGFjZXMgPSBNYXRoLnJvdW5kKE1hdGgubWluKChtYXggLSBtaW4pIC8gc3BhY2luZywgbWF4VGlja3MpKTtcbiAgICAgICAgc3BhY2luZyA9IChtYXggLSBtaW4pIC8gbnVtU3BhY2VzO1xuICAgICAgICBuaWNlTWluID0gbWluO1xuICAgICAgICBuaWNlTWF4ID0gbWF4O1xuICAgIH0gZWxzZSBpZiAoY291bnREZWZpbmVkKSB7XG4gICAgICAgIG5pY2VNaW4gPSBtaW5EZWZpbmVkID8gbWluIDogbmljZU1pbjtcbiAgICAgICAgbmljZU1heCA9IG1heERlZmluZWQgPyBtYXggOiBuaWNlTWF4O1xuICAgICAgICBudW1TcGFjZXMgPSBjb3VudCAtIDE7XG4gICAgICAgIHNwYWNpbmcgPSAobmljZU1heCAtIG5pY2VNaW4pIC8gbnVtU3BhY2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG51bVNwYWNlcyA9IChuaWNlTWF4IC0gbmljZU1pbikgLyBzcGFjaW5nO1xuICAgICAgICBpZiAoYWxtb3N0RXF1YWxzKG51bVNwYWNlcywgTWF0aC5yb3VuZChudW1TcGFjZXMpLCBzcGFjaW5nIC8gMTAwMCkpIHtcbiAgICAgICAgICAgIG51bVNwYWNlcyA9IE1hdGgucm91bmQobnVtU3BhY2VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG51bVNwYWNlcyA9IE1hdGguY2VpbChudW1TcGFjZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRlY2ltYWxQbGFjZXMgPSBNYXRoLm1heChfZGVjaW1hbFBsYWNlcyhzcGFjaW5nKSwgX2RlY2ltYWxQbGFjZXMobmljZU1pbikpO1xuICAgIGZhY3RvciA9IE1hdGgucG93KDEwLCBpc051bGxPclVuZGVmKHByZWNpc2lvbikgPyBkZWNpbWFsUGxhY2VzIDogcHJlY2lzaW9uKTtcbiAgICBuaWNlTWluID0gTWF0aC5yb3VuZChuaWNlTWluICogZmFjdG9yKSAvIGZhY3RvcjtcbiAgICBuaWNlTWF4ID0gTWF0aC5yb3VuZChuaWNlTWF4ICogZmFjdG9yKSAvIGZhY3RvcjtcbiAgICBsZXQgaiA9IDA7XG4gICAgaWYgKG1pbkRlZmluZWQpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVCb3VuZHMgJiYgbmljZU1pbiAhPT0gbWluKSB7XG4gICAgICAgICAgICB0aWNrcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbWluXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChuaWNlTWluIDwgbWluKSB7XG4gICAgICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbW9zdEVxdWFscyhNYXRoLnJvdW5kKChuaWNlTWluICsgaiAqIHNwYWNpbmcpICogZmFjdG9yKSAvIGZhY3RvciwgbWluLCByZWxhdGl2ZUxhYmVsU2l6ZShtaW4sIG1pblNwYWNpbmcsIGdlbmVyYXRpb25PcHRpb25zKSkpIHtcbiAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmljZU1pbiA8IG1pbikge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvcig7IGogPCBudW1TcGFjZXM7ICsrail7XG4gICAgICAgIGNvbnN0IHRpY2tWYWx1ZSA9IE1hdGgucm91bmQoKG5pY2VNaW4gKyBqICogc3BhY2luZykgKiBmYWN0b3IpIC8gZmFjdG9yO1xuICAgICAgICBpZiAobWF4RGVmaW5lZCAmJiB0aWNrVmFsdWUgPiBtYXgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRpY2tzLnB1c2goe1xuICAgICAgICAgICAgdmFsdWU6IHRpY2tWYWx1ZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKG1heERlZmluZWQgJiYgaW5jbHVkZUJvdW5kcyAmJiBuaWNlTWF4ICE9PSBtYXgpIHtcbiAgICAgICAgaWYgKHRpY2tzLmxlbmd0aCAmJiBhbG1vc3RFcXVhbHModGlja3NbdGlja3MubGVuZ3RoIC0gMV0udmFsdWUsIG1heCwgcmVsYXRpdmVMYWJlbFNpemUobWF4LCBtaW5TcGFjaW5nLCBnZW5lcmF0aW9uT3B0aW9ucykpKSB7XG4gICAgICAgICAgICB0aWNrc1t0aWNrcy5sZW5ndGggLSAxXS52YWx1ZSA9IG1heDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpY2tzLnB1c2goe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBtYXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICghbWF4RGVmaW5lZCB8fCBuaWNlTWF4ID09PSBtYXgpIHtcbiAgICAgICAgdGlja3MucHVzaCh7XG4gICAgICAgICAgICB2YWx1ZTogbmljZU1heFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRpY2tzO1xufVxuZnVuY3Rpb24gcmVsYXRpdmVMYWJlbFNpemUodmFsdWUsIG1pblNwYWNpbmcsIHsgaG9yaXpvbnRhbCAsIG1pblJvdGF0aW9uICB9KSB7XG4gICAgY29uc3QgcmFkID0gdG9SYWRpYW5zKG1pblJvdGF0aW9uKTtcbiAgICBjb25zdCByYXRpbyA9IChob3Jpem9udGFsID8gTWF0aC5zaW4ocmFkKSA6IE1hdGguY29zKHJhZCkpIHx8IDAuMDAxO1xuICAgIGNvbnN0IGxlbmd0aCA9IDAuNzUgKiBtaW5TcGFjaW5nICogKCcnICsgdmFsdWUpLmxlbmd0aDtcbiAgICByZXR1cm4gTWF0aC5taW4obWluU3BhY2luZyAvIHJhdGlvLCBsZW5ndGgpO1xufVxuY2xhc3MgTGluZWFyU2NhbGVCYXNlIGV4dGVuZHMgU2NhbGUge1xuICAgIGNvbnN0cnVjdG9yKGNmZyl7XG4gICAgICAgIHN1cGVyKGNmZyk7XG4gICAgICAgICB0aGlzLnN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5lbmQgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLl9zdGFydFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5fZW5kVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3ZhbHVlUmFuZ2UgPSAwO1xuICAgIH1cbiAgICBwYXJzZShyYXcsIGluZGV4KSB7XG4gICAgICAgIGlmIChpc051bGxPclVuZGVmKHJhdykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICgodHlwZW9mIHJhdyA9PT0gJ251bWJlcicgfHwgcmF3IGluc3RhbmNlb2YgTnVtYmVyKSAmJiAhaXNGaW5pdGUoK3JhdykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiArcmF3O1xuICAgIH1cbiAgICBoYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCkge1xuICAgICAgICBjb25zdCB7IGJlZ2luQXRaZXJvICB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCB7IG1pbkRlZmluZWQgLCBtYXhEZWZpbmVkICB9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG4gICAgICAgIGxldCB7IG1pbiAsIG1heCAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHNldE1pbiA9ICh2KT0+bWluID0gbWluRGVmaW5lZCA/IG1pbiA6IHY7XG4gICAgICAgIGNvbnN0IHNldE1heCA9ICh2KT0+bWF4ID0gbWF4RGVmaW5lZCA/IG1heCA6IHY7XG4gICAgICAgIGlmIChiZWdpbkF0WmVybykge1xuICAgICAgICAgICAgY29uc3QgbWluU2lnbiA9IHNpZ24obWluKTtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpZ24gPSBzaWduKG1heCk7XG4gICAgICAgICAgICBpZiAobWluU2lnbiA8IDAgJiYgbWF4U2lnbiA8IDApIHtcbiAgICAgICAgICAgICAgICBzZXRNYXgoMCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1pblNpZ24gPiAwICYmIG1heFNpZ24gPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0TWluKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaW4gPT09IG1heCkge1xuICAgICAgICAgICAgbGV0IG9mZnNldCA9IG1heCA9PT0gMCA/IDEgOiBNYXRoLmFicyhtYXggKiAwLjA1KTtcbiAgICAgICAgICAgIHNldE1heChtYXggKyBvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKCFiZWdpbkF0WmVybykge1xuICAgICAgICAgICAgICAgIHNldE1pbihtaW4gLSBvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICB9XG4gICAgZ2V0VGlja0xpbWl0KCkge1xuICAgICAgICBjb25zdCB0aWNrT3B0cyA9IHRoaXMub3B0aW9ucy50aWNrcztcbiAgICAgICAgbGV0IHsgbWF4VGlja3NMaW1pdCAsIHN0ZXBTaXplICB9ID0gdGlja09wdHM7XG4gICAgICAgIGxldCBtYXhUaWNrcztcbiAgICAgICAgaWYgKHN0ZXBTaXplKSB7XG4gICAgICAgICAgICBtYXhUaWNrcyA9IE1hdGguY2VpbCh0aGlzLm1heCAvIHN0ZXBTaXplKSAtIE1hdGguZmxvb3IodGhpcy5taW4gLyBzdGVwU2l6ZSkgKyAxO1xuICAgICAgICAgICAgaWYgKG1heFRpY2tzID4gMTAwMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2NhbGVzLiR7dGhpcy5pZH0udGlja3Muc3RlcFNpemU6ICR7c3RlcFNpemV9IHdvdWxkIHJlc3VsdCBnZW5lcmF0aW5nIHVwIHRvICR7bWF4VGlja3N9IHRpY2tzLiBMaW1pdGluZyB0byAxMDAwLmApO1xuICAgICAgICAgICAgICAgIG1heFRpY2tzID0gMTAwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1heFRpY2tzID0gdGhpcy5jb21wdXRlVGlja0xpbWl0KCk7XG4gICAgICAgICAgICBtYXhUaWNrc0xpbWl0ID0gbWF4VGlja3NMaW1pdCB8fCAxMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4VGlja3NMaW1pdCkge1xuICAgICAgICAgICAgbWF4VGlja3MgPSBNYXRoLm1pbihtYXhUaWNrc0xpbWl0LCBtYXhUaWNrcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heFRpY2tzO1xuICAgIH1cbiBjb21wdXRlVGlja0xpbWl0KCkge1xuICAgICAgICByZXR1cm4gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIH1cbiAgICBidWlsZFRpY2tzKCkge1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCB0aWNrT3B0cyA9IG9wdHMudGlja3M7XG4gICAgICAgIGxldCBtYXhUaWNrcyA9IHRoaXMuZ2V0VGlja0xpbWl0KCk7XG4gICAgICAgIG1heFRpY2tzID0gTWF0aC5tYXgoMiwgbWF4VGlja3MpO1xuICAgICAgICBjb25zdCBudW1lcmljR2VuZXJhdG9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1heFRpY2tzLFxuICAgICAgICAgICAgYm91bmRzOiBvcHRzLmJvdW5kcyxcbiAgICAgICAgICAgIG1pbjogb3B0cy5taW4sXG4gICAgICAgICAgICBtYXg6IG9wdHMubWF4LFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB0aWNrT3B0cy5wcmVjaXNpb24sXG4gICAgICAgICAgICBzdGVwOiB0aWNrT3B0cy5zdGVwU2l6ZSxcbiAgICAgICAgICAgIGNvdW50OiB0aWNrT3B0cy5jb3VudCxcbiAgICAgICAgICAgIG1heERpZ2l0czogdGhpcy5fbWF4RGlnaXRzKCksXG4gICAgICAgICAgICBob3Jpem9udGFsOiB0aGlzLmlzSG9yaXpvbnRhbCgpLFxuICAgICAgICAgICAgbWluUm90YXRpb246IHRpY2tPcHRzLm1pblJvdGF0aW9uIHx8IDAsXG4gICAgICAgICAgICBpbmNsdWRlQm91bmRzOiB0aWNrT3B0cy5pbmNsdWRlQm91bmRzICE9PSBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkYXRhUmFuZ2UgPSB0aGlzLl9yYW5nZSB8fCB0aGlzO1xuICAgICAgICBjb25zdCB0aWNrcyA9IGdlbmVyYXRlVGlja3MkMShudW1lcmljR2VuZXJhdG9yT3B0aW9ucywgZGF0YVJhbmdlKTtcbiAgICAgICAgaWYgKG9wdHMuYm91bmRzID09PSAndGlja3MnKSB7XG4gICAgICAgICAgICBfc2V0TWluQW5kTWF4QnlLZXkodGlja3MsIHRoaXMsICd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnJldmVyc2UpIHtcbiAgICAgICAgICAgIHRpY2tzLnJldmVyc2UoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnQgPSB0aGlzLm1heDtcbiAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5taW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5taW47XG4gICAgICAgICAgICB0aGlzLmVuZCA9IHRoaXMubWF4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWNrcztcbiAgICB9XG4gY29uZmlndXJlKCkge1xuICAgICAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMubWluO1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5tYXg7XG4gICAgICAgIHN1cGVyLmNvbmZpZ3VyZSgpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9mZnNldCAmJiB0aWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IChlbmQgLSBzdGFydCkgLyBNYXRoLm1heCh0aWNrcy5sZW5ndGggLSAxLCAxKSAvIDI7XG4gICAgICAgICAgICBzdGFydCAtPSBvZmZzZXQ7XG4gICAgICAgICAgICBlbmQgKz0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXJ0VmFsdWUgPSBzdGFydDtcbiAgICAgICAgdGhpcy5fZW5kVmFsdWUgPSBlbmQ7XG4gICAgICAgIHRoaXMuX3ZhbHVlUmFuZ2UgPSBlbmQgLSBzdGFydDtcbiAgICB9XG4gICAgZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0TnVtYmVyKHZhbHVlLCB0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLCB0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KTtcbiAgICB9XG59XG5cbmNsYXNzIExpbmVhclNjYWxlIGV4dGVuZHMgTGluZWFyU2NhbGVCYXNlIHtcbiAgICBzdGF0aWMgaWQgPSAnbGluZWFyJztcbiBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIHRpY2tzOiB7XG4gICAgICAgICAgICBjYWxsYmFjazogVGlja3MuZm9ybWF0dGVycy5udW1lcmljXG4gICAgICAgIH1cbiAgICB9O1xuICAgIGRldGVybWluZURhdGFMaW1pdHMoKSB7XG4gICAgICAgIGNvbnN0IHsgbWluICwgbWF4ICB9ID0gdGhpcy5nZXRNaW5NYXgodHJ1ZSk7XG4gICAgICAgIHRoaXMubWluID0gaXNOdW1iZXJGaW5pdGUobWluKSA/IG1pbiA6IDA7XG4gICAgICAgIHRoaXMubWF4ID0gaXNOdW1iZXJGaW5pdGUobWF4KSA/IG1heCA6IDE7XG4gICAgICAgIHRoaXMuaGFuZGxlVGlja1JhbmdlT3B0aW9ucygpO1xuICAgIH1cbiBjb21wdXRlVGlja0xpbWl0KCkge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsID0gdGhpcy5pc0hvcml6b250YWwoKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gaG9yaXpvbnRhbCA/IHRoaXMud2lkdGggOiB0aGlzLmhlaWdodDtcbiAgICAgICAgY29uc3QgbWluUm90YXRpb24gPSB0b1JhZGlhbnModGhpcy5vcHRpb25zLnRpY2tzLm1pblJvdGF0aW9uKTtcbiAgICAgICAgY29uc3QgcmF0aW8gPSAoaG9yaXpvbnRhbCA/IE1hdGguc2luKG1pblJvdGF0aW9uKSA6IE1hdGguY29zKG1pblJvdGF0aW9uKSkgfHwgMC4wMDE7XG4gICAgICAgIGNvbnN0IHRpY2tGb250ID0gdGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKTtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChsZW5ndGggLyBNYXRoLm1pbig0MCwgdGlja0ZvbnQubGluZUhlaWdodCAvIHJhdGlvKSk7XG4gICAgfVxuICAgIGdldFBpeGVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsID8gTmFOIDogdGhpcy5nZXRQaXhlbEZvckRlY2ltYWwoKHZhbHVlIC0gdGhpcy5fc3RhcnRWYWx1ZSkgLyB0aGlzLl92YWx1ZVJhbmdlKTtcbiAgICB9XG4gICAgZ2V0VmFsdWVGb3JQaXhlbChwaXhlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnRWYWx1ZSArIHRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKHBpeGVsKSAqIHRoaXMuX3ZhbHVlUmFuZ2U7XG4gICAgfVxufVxuXG5jb25zdCBsb2cxMEZsb29yID0gKHYpPT5NYXRoLmZsb29yKGxvZzEwKHYpKTtcbmNvbnN0IGNoYW5nZUV4cG9uZW50ID0gKHYsIG0pPT5NYXRoLnBvdygxMCwgbG9nMTBGbG9vcih2KSArIG0pO1xuZnVuY3Rpb24gaXNNYWpvcih0aWNrVmFsKSB7XG4gICAgY29uc3QgcmVtYWluID0gdGlja1ZhbCAvIE1hdGgucG93KDEwLCBsb2cxMEZsb29yKHRpY2tWYWwpKTtcbiAgICByZXR1cm4gcmVtYWluID09PSAxO1xufVxuZnVuY3Rpb24gc3RlcHMobWluLCBtYXgsIHJhbmdlRXhwKSB7XG4gICAgY29uc3QgcmFuZ2VTdGVwID0gTWF0aC5wb3coMTAsIHJhbmdlRXhwKTtcbiAgICBjb25zdCBzdGFydCA9IE1hdGguZmxvb3IobWluIC8gcmFuZ2VTdGVwKTtcbiAgICBjb25zdCBlbmQgPSBNYXRoLmNlaWwobWF4IC8gcmFuZ2VTdGVwKTtcbiAgICByZXR1cm4gZW5kIC0gc3RhcnQ7XG59XG5mdW5jdGlvbiBzdGFydEV4cChtaW4sIG1heCkge1xuICAgIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluO1xuICAgIGxldCByYW5nZUV4cCA9IGxvZzEwRmxvb3IocmFuZ2UpO1xuICAgIHdoaWxlKHN0ZXBzKG1pbiwgbWF4LCByYW5nZUV4cCkgPiAxMCl7XG4gICAgICAgIHJhbmdlRXhwKys7XG4gICAgfVxuICAgIHdoaWxlKHN0ZXBzKG1pbiwgbWF4LCByYW5nZUV4cCkgPCAxMCl7XG4gICAgICAgIHJhbmdlRXhwLS07XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1pbihyYW5nZUV4cCwgbG9nMTBGbG9vcihtaW4pKTtcbn1cbiBmdW5jdGlvbiBnZW5lcmF0ZVRpY2tzKGdlbmVyYXRpb25PcHRpb25zLCB7IG1pbiAsIG1heCAgfSkge1xuICAgIG1pbiA9IGZpbml0ZU9yRGVmYXVsdChnZW5lcmF0aW9uT3B0aW9ucy5taW4sIG1pbik7XG4gICAgY29uc3QgdGlja3MgPSBbXTtcbiAgICBjb25zdCBtaW5FeHAgPSBsb2cxMEZsb29yKG1pbik7XG4gICAgbGV0IGV4cCA9IHN0YXJ0RXhwKG1pbiwgbWF4KTtcbiAgICBsZXQgcHJlY2lzaW9uID0gZXhwIDwgMCA/IE1hdGgucG93KDEwLCBNYXRoLmFicyhleHApKSA6IDE7XG4gICAgY29uc3Qgc3RlcFNpemUgPSBNYXRoLnBvdygxMCwgZXhwKTtcbiAgICBjb25zdCBiYXNlID0gbWluRXhwID4gZXhwID8gTWF0aC5wb3coMTAsIG1pbkV4cCkgOiAwO1xuICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5yb3VuZCgobWluIC0gYmFzZSkgKiBwcmVjaXNpb24pIC8gcHJlY2lzaW9uO1xuICAgIGNvbnN0IG9mZnNldCA9IE1hdGguZmxvb3IoKG1pbiAtIGJhc2UpIC8gc3RlcFNpemUgLyAxMCkgKiBzdGVwU2l6ZSAqIDEwO1xuICAgIGxldCBzaWduaWZpY2FuZCA9IE1hdGguZmxvb3IoKHN0YXJ0IC0gb2Zmc2V0KSAvIE1hdGgucG93KDEwLCBleHApKTtcbiAgICBsZXQgdmFsdWUgPSBmaW5pdGVPckRlZmF1bHQoZ2VuZXJhdGlvbk9wdGlvbnMubWluLCBNYXRoLnJvdW5kKChiYXNlICsgb2Zmc2V0ICsgc2lnbmlmaWNhbmQgKiBNYXRoLnBvdygxMCwgZXhwKSkgKiBwcmVjaXNpb24pIC8gcHJlY2lzaW9uKTtcbiAgICB3aGlsZSh2YWx1ZSA8IG1heCl7XG4gICAgICAgIHRpY2tzLnB1c2goe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBtYWpvcjogaXNNYWpvcih2YWx1ZSksXG4gICAgICAgICAgICBzaWduaWZpY2FuZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNpZ25pZmljYW5kID49IDEwKSB7XG4gICAgICAgICAgICBzaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kIDwgMTUgPyAxNSA6IDIwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lnbmlmaWNhbmQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lnbmlmaWNhbmQgPj0gMjApIHtcbiAgICAgICAgICAgIGV4cCsrO1xuICAgICAgICAgICAgc2lnbmlmaWNhbmQgPSAyO1xuICAgICAgICAgICAgcHJlY2lzaW9uID0gZXhwID49IDAgPyAxIDogcHJlY2lzaW9uO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCgoYmFzZSArIG9mZnNldCArIHNpZ25pZmljYW5kICogTWF0aC5wb3coMTAsIGV4cCkpICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbjtcbiAgICB9XG4gICAgY29uc3QgbGFzdFRpY2sgPSBmaW5pdGVPckRlZmF1bHQoZ2VuZXJhdGlvbk9wdGlvbnMubWF4LCB2YWx1ZSk7XG4gICAgdGlja3MucHVzaCh7XG4gICAgICAgIHZhbHVlOiBsYXN0VGljayxcbiAgICAgICAgbWFqb3I6IGlzTWFqb3IobGFzdFRpY2spLFxuICAgICAgICBzaWduaWZpY2FuZFxuICAgIH0pO1xuICAgIHJldHVybiB0aWNrcztcbn1cbmNsYXNzIExvZ2FyaXRobWljU2NhbGUgZXh0ZW5kcyBTY2FsZSB7XG4gICAgc3RhdGljIGlkID0gJ2xvZ2FyaXRobWljJztcbiBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIHRpY2tzOiB7XG4gICAgICAgICAgICBjYWxsYmFjazogVGlja3MuZm9ybWF0dGVycy5sb2dhcml0aG1pYyxcbiAgICAgICAgICAgIG1ham9yOiB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdHJ1Y3RvcihjZmcpe1xuICAgICAgICBzdXBlcihjZmcpO1xuICAgICAgICAgdGhpcy5zdGFydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuZW5kID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5fc3RhcnRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdmFsdWVSYW5nZSA9IDA7XG4gICAgfVxuICAgIHBhcnNlKHJhdywgaW5kZXgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBMaW5lYXJTY2FsZUJhc2UucHJvdG90eXBlLnBhcnNlLmFwcGx5KHRoaXMsIFtcbiAgICAgICAgICAgIHJhdyxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgIF0pO1xuICAgICAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3plcm8gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNOdW1iZXJGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogbnVsbDtcbiAgICB9XG4gICAgZGV0ZXJtaW5lRGF0YUxpbWl0cygpIHtcbiAgICAgICAgY29uc3QgeyBtaW4gLCBtYXggIH0gPSB0aGlzLmdldE1pbk1heCh0cnVlKTtcbiAgICAgICAgdGhpcy5taW4gPSBpc051bWJlckZpbml0ZShtaW4pID8gTWF0aC5tYXgoMCwgbWluKSA6IG51bGw7XG4gICAgICAgIHRoaXMubWF4ID0gaXNOdW1iZXJGaW5pdGUobWF4KSA/IE1hdGgubWF4KDAsIG1heCkgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJlZ2luQXRaZXJvKSB7XG4gICAgICAgICAgICB0aGlzLl96ZXJvID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5femVybyAmJiB0aGlzLm1pbiAhPT0gdGhpcy5fc3VnZ2VzdGVkTWluICYmICFpc051bWJlckZpbml0ZSh0aGlzLl91c2VyTWluKSkge1xuICAgICAgICAgICAgdGhpcy5taW4gPSBtaW4gPT09IGNoYW5nZUV4cG9uZW50KHRoaXMubWluLCAwKSA/IGNoYW5nZUV4cG9uZW50KHRoaXMubWluLCAtMSkgOiBjaGFuZ2VFeHBvbmVudCh0aGlzLm1pbiwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCk7XG4gICAgfVxuICAgIGhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHsgbWluRGVmaW5lZCAsIG1heERlZmluZWQgIH0gPSB0aGlzLmdldFVzZXJCb3VuZHMoKTtcbiAgICAgICAgbGV0IG1pbiA9IHRoaXMubWluO1xuICAgICAgICBsZXQgbWF4ID0gdGhpcy5tYXg7XG4gICAgICAgIGNvbnN0IHNldE1pbiA9ICh2KT0+bWluID0gbWluRGVmaW5lZCA/IG1pbiA6IHY7XG4gICAgICAgIGNvbnN0IHNldE1heCA9ICh2KT0+bWF4ID0gbWF4RGVmaW5lZCA/IG1heCA6IHY7XG4gICAgICAgIGlmIChtaW4gPT09IG1heCkge1xuICAgICAgICAgICAgaWYgKG1pbiA8PSAwKSB7XG4gICAgICAgICAgICAgICAgc2V0TWluKDEpO1xuICAgICAgICAgICAgICAgIHNldE1heCgxMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldE1pbihjaGFuZ2VFeHBvbmVudChtaW4sIC0xKSk7XG4gICAgICAgICAgICAgICAgc2V0TWF4KGNoYW5nZUV4cG9uZW50KG1heCwgKzEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWluIDw9IDApIHtcbiAgICAgICAgICAgIHNldE1pbihjaGFuZ2VFeHBvbmVudChtYXgsIC0xKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heCA8PSAwKSB7XG4gICAgICAgICAgICBzZXRNYXgoY2hhbmdlRXhwb25lbnQobWluLCArMSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICB9XG4gICAgYnVpbGRUaWNrcygpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgZ2VuZXJhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtaW46IHRoaXMuX3VzZXJNaW4sXG4gICAgICAgICAgICBtYXg6IHRoaXMuX3VzZXJNYXhcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdGlja3MgPSBnZW5lcmF0ZVRpY2tzKGdlbmVyYXRpb25PcHRpb25zLCB0aGlzKTtcbiAgICAgICAgaWYgKG9wdHMuYm91bmRzID09PSAndGlja3MnKSB7XG4gICAgICAgICAgICBfc2V0TWluQW5kTWF4QnlLZXkodGlja3MsIHRoaXMsICd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnJldmVyc2UpIHtcbiAgICAgICAgICAgIHRpY2tzLnJldmVyc2UoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnQgPSB0aGlzLm1heDtcbiAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5taW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5taW47XG4gICAgICAgICAgICB0aGlzLmVuZCA9IHRoaXMubWF4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWNrcztcbiAgICB9XG4gZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/ICcwJyA6IGZvcm1hdE51bWJlcih2YWx1ZSwgdGhpcy5jaGFydC5vcHRpb25zLmxvY2FsZSwgdGhpcy5vcHRpb25zLnRpY2tzLmZvcm1hdCk7XG4gICAgfVxuIGNvbmZpZ3VyZSgpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLm1pbjtcbiAgICAgICAgc3VwZXIuY29uZmlndXJlKCk7XG4gICAgICAgIHRoaXMuX3N0YXJ0VmFsdWUgPSBsb2cxMChzdGFydCk7XG4gICAgICAgIHRoaXMuX3ZhbHVlUmFuZ2UgPSBsb2cxMCh0aGlzLm1heCkgLSBsb2cxMChzdGFydCk7XG4gICAgfVxuICAgIGdldFBpeGVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5taW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQaXhlbEZvckRlY2ltYWwodmFsdWUgPT09IHRoaXMubWluID8gMCA6IChsb2cxMCh2YWx1ZSkgLSB0aGlzLl9zdGFydFZhbHVlKSAvIHRoaXMuX3ZhbHVlUmFuZ2UpO1xuICAgIH1cbiAgICBnZXRWYWx1ZUZvclBpeGVsKHBpeGVsKSB7XG4gICAgICAgIGNvbnN0IGRlY2ltYWwgPSB0aGlzLmdldERlY2ltYWxGb3JQaXhlbChwaXhlbCk7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy5fc3RhcnRWYWx1ZSArIGRlY2ltYWwgKiB0aGlzLl92YWx1ZVJhbmdlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFRpY2tCYWNrZHJvcEhlaWdodChvcHRzKSB7XG4gICAgY29uc3QgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuICAgIGlmICh0aWNrT3B0cy5kaXNwbGF5ICYmIG9wdHMuZGlzcGxheSkge1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gdG9QYWRkaW5nKHRpY2tPcHRzLmJhY2tkcm9wUGFkZGluZyk7XG4gICAgICAgIHJldHVybiB2YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5mb250ICYmIHRpY2tPcHRzLmZvbnQuc2l6ZSwgZGVmYXVsdHMuZm9udC5zaXplKSArIHBhZGRpbmcuaGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIG1lYXN1cmVMYWJlbFNpemUoY3R4LCBmb250LCBsYWJlbCkge1xuICAgIGxhYmVsID0gaXNBcnJheShsYWJlbCkgPyBsYWJlbCA6IFtcbiAgICAgICAgbGFiZWxcbiAgICBdO1xuICAgIHJldHVybiB7XG4gICAgICAgIHc6IF9sb25nZXN0VGV4dChjdHgsIGZvbnQuc3RyaW5nLCBsYWJlbCksXG4gICAgICAgIGg6IGxhYmVsLmxlbmd0aCAqIGZvbnQubGluZUhlaWdodFxuICAgIH07XG59XG5mdW5jdGlvbiBkZXRlcm1pbmVMaW1pdHMoYW5nbGUsIHBvcywgc2l6ZSwgbWluLCBtYXgpIHtcbiAgICBpZiAoYW5nbGUgPT09IG1pbiB8fCBhbmdsZSA9PT0gbWF4KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydDogcG9zIC0gc2l6ZSAvIDIsXG4gICAgICAgICAgICBlbmQ6IHBvcyArIHNpemUgLyAyXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChhbmdsZSA8IG1pbiB8fCBhbmdsZSA+IG1heCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhcnQ6IHBvcyAtIHNpemUsXG4gICAgICAgICAgICBlbmQ6IHBvc1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogcG9zLFxuICAgICAgICBlbmQ6IHBvcyArIHNpemVcbiAgICB9O1xufVxuIGZ1bmN0aW9uIGZpdFdpdGhQb2ludExhYmVscyhzY2FsZSkge1xuICAgIGNvbnN0IG9yaWcgPSB7XG4gICAgICAgIGw6IHNjYWxlLmxlZnQgKyBzY2FsZS5fcGFkZGluZy5sZWZ0LFxuICAgICAgICByOiBzY2FsZS5yaWdodCAtIHNjYWxlLl9wYWRkaW5nLnJpZ2h0LFxuICAgICAgICB0OiBzY2FsZS50b3AgKyBzY2FsZS5fcGFkZGluZy50b3AsXG4gICAgICAgIGI6IHNjYWxlLmJvdHRvbSAtIHNjYWxlLl9wYWRkaW5nLmJvdHRvbVxuICAgIH07XG4gICAgY29uc3QgbGltaXRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3JpZyk7XG4gICAgY29uc3QgbGFiZWxTaXplcyA9IFtdO1xuICAgIGNvbnN0IHBhZGRpbmcgPSBbXTtcbiAgICBjb25zdCB2YWx1ZUNvdW50ID0gc2NhbGUuX3BvaW50TGFiZWxzLmxlbmd0aDtcbiAgICBjb25zdCBwb2ludExhYmVsT3B0cyA9IHNjYWxlLm9wdGlvbnMucG9pbnRMYWJlbHM7XG4gICAgY29uc3QgYWRkaXRpb25hbEFuZ2xlID0gcG9pbnRMYWJlbE9wdHMuY2VudGVyUG9pbnRMYWJlbHMgPyBQSSAvIHZhbHVlQ291bnQgOiAwO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspe1xuICAgICAgICBjb25zdCBvcHRzID0gcG9pbnRMYWJlbE9wdHMuc2V0Q29udGV4dChzY2FsZS5nZXRQb2ludExhYmVsQ29udGV4dChpKSk7XG4gICAgICAgIHBhZGRpbmdbaV0gPSBvcHRzLnBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHBvaW50UG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKGksIHNjYWxlLmRyYXdpbmdBcmVhICsgcGFkZGluZ1tpXSwgYWRkaXRpb25hbEFuZ2xlKTtcbiAgICAgICAgY29uc3QgcGxGb250ID0gdG9Gb250KG9wdHMuZm9udCk7XG4gICAgICAgIGNvbnN0IHRleHRTaXplID0gbWVhc3VyZUxhYmVsU2l6ZShzY2FsZS5jdHgsIHBsRm9udCwgc2NhbGUuX3BvaW50TGFiZWxzW2ldKTtcbiAgICAgICAgbGFiZWxTaXplc1tpXSA9IHRleHRTaXplO1xuICAgICAgICBjb25zdCBhbmdsZVJhZGlhbnMgPSBfbm9ybWFsaXplQW5nbGUoc2NhbGUuZ2V0SW5kZXhBbmdsZShpKSArIGFkZGl0aW9uYWxBbmdsZSk7XG4gICAgICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5yb3VuZCh0b0RlZ3JlZXMoYW5nbGVSYWRpYW5zKSk7XG4gICAgICAgIGNvbnN0IGhMaW1pdHMgPSBkZXRlcm1pbmVMaW1pdHMoYW5nbGUsIHBvaW50UG9zaXRpb24ueCwgdGV4dFNpemUudywgMCwgMTgwKTtcbiAgICAgICAgY29uc3QgdkxpbWl0cyA9IGRldGVybWluZUxpbWl0cyhhbmdsZSwgcG9pbnRQb3NpdGlvbi55LCB0ZXh0U2l6ZS5oLCA5MCwgMjcwKTtcbiAgICAgICAgdXBkYXRlTGltaXRzKGxpbWl0cywgb3JpZywgYW5nbGVSYWRpYW5zLCBoTGltaXRzLCB2TGltaXRzKTtcbiAgICB9XG4gICAgc2NhbGUuc2V0Q2VudGVyUG9pbnQob3JpZy5sIC0gbGltaXRzLmwsIGxpbWl0cy5yIC0gb3JpZy5yLCBvcmlnLnQgLSBsaW1pdHMudCwgbGltaXRzLmIgLSBvcmlnLmIpO1xuICAgIHNjYWxlLl9wb2ludExhYmVsSXRlbXMgPSBidWlsZFBvaW50TGFiZWxJdGVtcyhzY2FsZSwgbGFiZWxTaXplcywgcGFkZGluZyk7XG59XG5mdW5jdGlvbiB1cGRhdGVMaW1pdHMobGltaXRzLCBvcmlnLCBhbmdsZSwgaExpbWl0cywgdkxpbWl0cykge1xuICAgIGNvbnN0IHNpbiA9IE1hdGguYWJzKE1hdGguc2luKGFuZ2xlKSk7XG4gICAgY29uc3QgY29zID0gTWF0aC5hYnMoTWF0aC5jb3MoYW5nbGUpKTtcbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IHkgPSAwO1xuICAgIGlmIChoTGltaXRzLnN0YXJ0IDwgb3JpZy5sKSB7XG4gICAgICAgIHggPSAob3JpZy5sIC0gaExpbWl0cy5zdGFydCkgLyBzaW47XG4gICAgICAgIGxpbWl0cy5sID0gTWF0aC5taW4obGltaXRzLmwsIG9yaWcubCAtIHgpO1xuICAgIH0gZWxzZSBpZiAoaExpbWl0cy5lbmQgPiBvcmlnLnIpIHtcbiAgICAgICAgeCA9IChoTGltaXRzLmVuZCAtIG9yaWcucikgLyBzaW47XG4gICAgICAgIGxpbWl0cy5yID0gTWF0aC5tYXgobGltaXRzLnIsIG9yaWcuciArIHgpO1xuICAgIH1cbiAgICBpZiAodkxpbWl0cy5zdGFydCA8IG9yaWcudCkge1xuICAgICAgICB5ID0gKG9yaWcudCAtIHZMaW1pdHMuc3RhcnQpIC8gY29zO1xuICAgICAgICBsaW1pdHMudCA9IE1hdGgubWluKGxpbWl0cy50LCBvcmlnLnQgLSB5KTtcbiAgICB9IGVsc2UgaWYgKHZMaW1pdHMuZW5kID4gb3JpZy5iKSB7XG4gICAgICAgIHkgPSAodkxpbWl0cy5lbmQgLSBvcmlnLmIpIC8gY29zO1xuICAgICAgICBsaW1pdHMuYiA9IE1hdGgubWF4KGxpbWl0cy5iLCBvcmlnLmIgKyB5KTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVQb2ludExhYmVsSXRlbShzY2FsZSwgaW5kZXgsIGl0ZW1PcHRzKSB7XG4gICAgY29uc3Qgb3V0ZXJEaXN0YW5jZSA9IHNjYWxlLmRyYXdpbmdBcmVhO1xuICAgIGNvbnN0IHsgZXh0cmEgLCBhZGRpdGlvbmFsQW5nbGUgLCBwYWRkaW5nICwgc2l6ZSAgfSA9IGl0ZW1PcHRzO1xuICAgIGNvbnN0IHBvaW50TGFiZWxQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oaW5kZXgsIG91dGVyRGlzdGFuY2UgKyBleHRyYSArIHBhZGRpbmcsIGFkZGl0aW9uYWxBbmdsZSk7XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLnJvdW5kKHRvRGVncmVlcyhfbm9ybWFsaXplQW5nbGUocG9pbnRMYWJlbFBvc2l0aW9uLmFuZ2xlICsgSEFMRl9QSSkpKTtcbiAgICBjb25zdCB5ID0geUZvckFuZ2xlKHBvaW50TGFiZWxQb3NpdGlvbi55LCBzaXplLmgsIGFuZ2xlKTtcbiAgICBjb25zdCB0ZXh0QWxpZ24gPSBnZXRUZXh0QWxpZ25Gb3JBbmdsZShhbmdsZSk7XG4gICAgY29uc3QgbGVmdCA9IGxlZnRGb3JUZXh0QWxpZ24ocG9pbnRMYWJlbFBvc2l0aW9uLngsIHNpemUudywgdGV4dEFsaWduKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICB4OiBwb2ludExhYmVsUG9zaXRpb24ueCxcbiAgICAgICAgeSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICBsZWZ0LFxuICAgICAgICB0b3A6IHksXG4gICAgICAgIHJpZ2h0OiBsZWZ0ICsgc2l6ZS53LFxuICAgICAgICBib3R0b206IHkgKyBzaXplLmhcbiAgICB9O1xufVxuZnVuY3Rpb24gaXNOb3RPdmVybGFwcGVkKGl0ZW0sIGFyZWEpIHtcbiAgICBpZiAoIWFyZWEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHsgbGVmdCAsIHRvcCAsIHJpZ2h0ICwgYm90dG9tICB9ID0gaXRlbTtcbiAgICBjb25zdCBhcGV4ZXNJbkFyZWEgPSBfaXNQb2ludEluQXJlYSh7XG4gICAgICAgIHg6IGxlZnQsXG4gICAgICAgIHk6IHRvcFxuICAgIH0sIGFyZWEpIHx8IF9pc1BvaW50SW5BcmVhKHtcbiAgICAgICAgeDogbGVmdCxcbiAgICAgICAgeTogYm90dG9tXG4gICAgfSwgYXJlYSkgfHwgX2lzUG9pbnRJbkFyZWEoe1xuICAgICAgICB4OiByaWdodCxcbiAgICAgICAgeTogdG9wXG4gICAgfSwgYXJlYSkgfHwgX2lzUG9pbnRJbkFyZWEoe1xuICAgICAgICB4OiByaWdodCxcbiAgICAgICAgeTogYm90dG9tXG4gICAgfSwgYXJlYSk7XG4gICAgcmV0dXJuICFhcGV4ZXNJbkFyZWE7XG59XG5mdW5jdGlvbiBidWlsZFBvaW50TGFiZWxJdGVtcyhzY2FsZSwgbGFiZWxTaXplcywgcGFkZGluZykge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgY29uc3QgdmFsdWVDb3VudCA9IHNjYWxlLl9wb2ludExhYmVscy5sZW5ndGg7XG4gICAgY29uc3Qgb3B0cyA9IHNjYWxlLm9wdGlvbnM7XG4gICAgY29uc3QgeyBjZW50ZXJQb2ludExhYmVscyAsIGRpc3BsYXkgIH0gPSBvcHRzLnBvaW50TGFiZWxzO1xuICAgIGNvbnN0IGl0ZW1PcHRzID0ge1xuICAgICAgICBleHRyYTogZ2V0VGlja0JhY2tkcm9wSGVpZ2h0KG9wdHMpIC8gMixcbiAgICAgICAgYWRkaXRpb25hbEFuZ2xlOiBjZW50ZXJQb2ludExhYmVscyA/IFBJIC8gdmFsdWVDb3VudCA6IDBcbiAgICB9O1xuICAgIGxldCBhcmVhO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspe1xuICAgICAgICBpdGVtT3B0cy5wYWRkaW5nID0gcGFkZGluZ1tpXTtcbiAgICAgICAgaXRlbU9wdHMuc2l6ZSA9IGxhYmVsU2l6ZXNbaV07XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBjcmVhdGVQb2ludExhYmVsSXRlbShzY2FsZSwgaSwgaXRlbU9wdHMpO1xuICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICBpZiAoZGlzcGxheSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICBpdGVtLnZpc2libGUgPSBpc05vdE92ZXJsYXBwZWQoaXRlbSwgYXJlYSk7XG4gICAgICAgICAgICBpZiAoaXRlbS52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgYXJlYSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xufVxuZnVuY3Rpb24gZ2V0VGV4dEFsaWduRm9yQW5nbGUoYW5nbGUpIHtcbiAgICBpZiAoYW5nbGUgPT09IDAgfHwgYW5nbGUgPT09IDE4MCkge1xuICAgICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfSBlbHNlIGlmIChhbmdsZSA8IDE4MCkge1xuICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH1cbiAgICByZXR1cm4gJ3JpZ2h0Jztcbn1cbmZ1bmN0aW9uIGxlZnRGb3JUZXh0QWxpZ24oeCwgdywgYWxpZ24pIHtcbiAgICBpZiAoYWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgeCAtPSB3O1xuICAgIH0gZWxzZSBpZiAoYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgIHggLT0gdyAvIDI7XG4gICAgfVxuICAgIHJldHVybiB4O1xufVxuZnVuY3Rpb24geUZvckFuZ2xlKHksIGgsIGFuZ2xlKSB7XG4gICAgaWYgKGFuZ2xlID09PSA5MCB8fCBhbmdsZSA9PT0gMjcwKSB7XG4gICAgICAgIHkgLT0gaCAvIDI7XG4gICAgfSBlbHNlIGlmIChhbmdsZSA+IDI3MCB8fCBhbmdsZSA8IDkwKSB7XG4gICAgICAgIHkgLT0gaDtcbiAgICB9XG4gICAgcmV0dXJuIHk7XG59XG5mdW5jdGlvbiBkcmF3UG9pbnRMYWJlbEJveChjdHgsIG9wdHMsIGl0ZW0pIHtcbiAgICBjb25zdCB7IGxlZnQgLCB0b3AgLCByaWdodCAsIGJvdHRvbSAgfSA9IGl0ZW07XG4gICAgY29uc3QgeyBiYWNrZHJvcENvbG9yICB9ID0gb3B0cztcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWYoYmFja2Ryb3BDb2xvcikpIHtcbiAgICAgICAgY29uc3QgYm9yZGVyUmFkaXVzID0gdG9UUkJMQ29ybmVycyhvcHRzLmJvcmRlclJhZGl1cyk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSB0b1BhZGRpbmcob3B0cy5iYWNrZHJvcFBhZGRpbmcpO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gYmFja2Ryb3BDb2xvcjtcbiAgICAgICAgY29uc3QgYmFja2Ryb3BMZWZ0ID0gbGVmdCAtIHBhZGRpbmcubGVmdDtcbiAgICAgICAgY29uc3QgYmFja2Ryb3BUb3AgPSB0b3AgLSBwYWRkaW5nLnRvcDtcbiAgICAgICAgY29uc3QgYmFja2Ryb3BXaWR0aCA9IHJpZ2h0IC0gbGVmdCArIHBhZGRpbmcud2lkdGg7XG4gICAgICAgIGNvbnN0IGJhY2tkcm9wSGVpZ2h0ID0gYm90dG9tIC0gdG9wICsgcGFkZGluZy5oZWlnaHQ7XG4gICAgICAgIGlmIChPYmplY3QudmFsdWVzKGJvcmRlclJhZGl1cykuc29tZSgodik9PnYgIT09IDApKSB7XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICBhZGRSb3VuZGVkUmVjdFBhdGgoY3R4LCB7XG4gICAgICAgICAgICAgICAgeDogYmFja2Ryb3BMZWZ0LFxuICAgICAgICAgICAgICAgIHk6IGJhY2tkcm9wVG9wLFxuICAgICAgICAgICAgICAgIHc6IGJhY2tkcm9wV2lkdGgsXG4gICAgICAgICAgICAgICAgaDogYmFja2Ryb3BIZWlnaHQsXG4gICAgICAgICAgICAgICAgcmFkaXVzOiBib3JkZXJSYWRpdXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN0eC5maWxsUmVjdChiYWNrZHJvcExlZnQsIGJhY2tkcm9wVG9wLCBiYWNrZHJvcFdpZHRoLCBiYWNrZHJvcEhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBkcmF3UG9pbnRMYWJlbHMoc2NhbGUsIGxhYmVsQ291bnQpIHtcbiAgICBjb25zdCB7IGN0eCAsIG9wdGlvbnM6IHsgcG9pbnRMYWJlbHMgIH0gIH0gPSBzY2FsZTtcbiAgICBmb3IobGV0IGkgPSBsYWJlbENvdW50IC0gMTsgaSA+PSAwOyBpLS0pe1xuICAgICAgICBjb25zdCBpdGVtID0gc2NhbGUuX3BvaW50TGFiZWxJdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtLnZpc2libGUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdHNBdEluZGV4ID0gcG9pbnRMYWJlbHMuc2V0Q29udGV4dChzY2FsZS5nZXRQb2ludExhYmVsQ29udGV4dChpKSk7XG4gICAgICAgIGRyYXdQb2ludExhYmVsQm94KGN0eCwgb3B0c0F0SW5kZXgsIGl0ZW0pO1xuICAgICAgICBjb25zdCBwbEZvbnQgPSB0b0ZvbnQob3B0c0F0SW5kZXguZm9udCk7XG4gICAgICAgIGNvbnN0IHsgeCAsIHkgLCB0ZXh0QWxpZ24gIH0gPSBpdGVtO1xuICAgICAgICByZW5kZXJUZXh0KGN0eCwgc2NhbGUuX3BvaW50TGFiZWxzW2ldLCB4LCB5ICsgcGxGb250LmxpbmVIZWlnaHQgLyAyLCBwbEZvbnQsIHtcbiAgICAgICAgICAgIGNvbG9yOiBvcHRzQXRJbmRleC5jb2xvcixcbiAgICAgICAgICAgIHRleHRBbGlnbjogdGV4dEFsaWduLFxuICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJ1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXRoUmFkaXVzTGluZShzY2FsZSwgcmFkaXVzLCBjaXJjdWxhciwgbGFiZWxDb3VudCkge1xuICAgIGNvbnN0IHsgY3R4ICB9ID0gc2NhbGU7XG4gICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICAgIGN0eC5hcmMoc2NhbGUueENlbnRlciwgc2NhbGUueUNlbnRlciwgcmFkaXVzLCAwLCBUQVUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbigwLCByYWRpdXMpO1xuICAgICAgICBjdHgubW92ZVRvKHBvaW50UG9zaXRpb24ueCwgcG9pbnRQb3NpdGlvbi55KTtcbiAgICAgICAgZm9yKGxldCBpID0gMTsgaSA8IGxhYmVsQ291bnQ7IGkrKyl7XG4gICAgICAgICAgICBwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihpLCByYWRpdXMpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyhwb2ludFBvc2l0aW9uLngsIHBvaW50UG9zaXRpb24ueSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBkcmF3UmFkaXVzTGluZShzY2FsZSwgZ3JpZExpbmVPcHRzLCByYWRpdXMsIGxhYmVsQ291bnQsIGJvcmRlck9wdHMpIHtcbiAgICBjb25zdCBjdHggPSBzY2FsZS5jdHg7XG4gICAgY29uc3QgY2lyY3VsYXIgPSBncmlkTGluZU9wdHMuY2lyY3VsYXI7XG4gICAgY29uc3QgeyBjb2xvciAsIGxpbmVXaWR0aCAgfSA9IGdyaWRMaW5lT3B0cztcbiAgICBpZiAoIWNpcmN1bGFyICYmICFsYWJlbENvdW50IHx8ICFjb2xvciB8fCAhbGluZVdpZHRoIHx8IHJhZGl1cyA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgY3R4LnNldExpbmVEYXNoKGJvcmRlck9wdHMuZGFzaCB8fCBbXSk7XG4gICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gYm9yZGVyT3B0cy5kYXNoT2Zmc2V0O1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBwYXRoUmFkaXVzTGluZShzY2FsZSwgcmFkaXVzLCBjaXJjdWxhciwgbGFiZWxDb3VudCk7XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGN0eC5zdHJva2UoKTtcbiAgICBjdHgucmVzdG9yZSgpO1xufVxuZnVuY3Rpb24gY3JlYXRlUG9pbnRMYWJlbENvbnRleHQocGFyZW50LCBpbmRleCwgbGFiZWwpIHtcbiAgICByZXR1cm4gY3JlYXRlQ29udGV4dChwYXJlbnQsIHtcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIGluZGV4LFxuICAgICAgICB0eXBlOiAncG9pbnRMYWJlbCdcbiAgICB9KTtcbn1cbmNsYXNzIFJhZGlhbExpbmVhclNjYWxlIGV4dGVuZHMgTGluZWFyU2NhbGVCYXNlIHtcbiAgICBzdGF0aWMgaWQgPSAncmFkaWFsTGluZWFyJztcbiBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgIGFuaW1hdGU6IHRydWUsXG4gICAgICAgIHBvc2l0aW9uOiAnY2hhcnRBcmVhJyxcbiAgICAgICAgYW5nbGVMaW5lczoge1xuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgIGxpbmVXaWR0aDogMSxcbiAgICAgICAgICAgIGJvcmRlckRhc2g6IFtdLFxuICAgICAgICAgICAgYm9yZGVyRGFzaE9mZnNldDogMC4wXG4gICAgICAgIH0sXG4gICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgIGNpcmN1bGFyOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBzdGFydEFuZ2xlOiAwLFxuICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgc2hvd0xhYmVsQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgICBjYWxsYmFjazogVGlja3MuZm9ybWF0dGVycy5udW1lcmljXG4gICAgICAgIH0sXG4gICAgICAgIHBvaW50TGFiZWxzOiB7XG4gICAgICAgICAgICBiYWNrZHJvcENvbG9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBiYWNrZHJvcFBhZGRpbmc6IDIsXG4gICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgZm9udDoge1xuICAgICAgICAgICAgICAgIHNpemU6IDEwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FsbGJhY2sgKGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhZGRpbmc6IDUsXG4gICAgICAgICAgICBjZW50ZXJQb2ludExhYmVsczogZmFsc2VcbiAgICAgICAgfVxuICAgIH07XG4gICAgc3RhdGljIGRlZmF1bHRSb3V0ZXMgPSB7XG4gICAgICAgICdhbmdsZUxpbmVzLmNvbG9yJzogJ2JvcmRlckNvbG9yJyxcbiAgICAgICAgJ3BvaW50TGFiZWxzLmNvbG9yJzogJ2NvbG9yJyxcbiAgICAgICAgJ3RpY2tzLmNvbG9yJzogJ2NvbG9yJ1xuICAgIH07XG4gICAgc3RhdGljIGRlc2NyaXB0b3JzID0ge1xuICAgICAgICBhbmdsZUxpbmVzOiB7XG4gICAgICAgICAgICBfZmFsbGJhY2s6ICdncmlkJ1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdHJ1Y3RvcihjZmcpe1xuICAgICAgICBzdXBlcihjZmcpO1xuICAgICAgICAgdGhpcy54Q2VudGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy55Q2VudGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5kcmF3aW5nQXJlYSA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuX3BvaW50TGFiZWxzID0gW107XG4gICAgICAgIHRoaXMuX3BvaW50TGFiZWxJdGVtcyA9IFtdO1xuICAgIH1cbiAgICBzZXREaW1lbnNpb25zKCkge1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5fcGFkZGluZyA9IHRvUGFkZGluZyhnZXRUaWNrQmFja2Ryb3BIZWlnaHQodGhpcy5vcHRpb25zKSAvIDIpO1xuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCA9IHRoaXMubWF4V2lkdGggLSBwYWRkaW5nLndpZHRoO1xuICAgICAgICBjb25zdCBoID0gdGhpcy5oZWlnaHQgPSB0aGlzLm1heEhlaWdodCAtIHBhZGRpbmcuaGVpZ2h0O1xuICAgICAgICB0aGlzLnhDZW50ZXIgPSBNYXRoLmZsb29yKHRoaXMubGVmdCArIHcgLyAyICsgcGFkZGluZy5sZWZ0KTtcbiAgICAgICAgdGhpcy55Q2VudGVyID0gTWF0aC5mbG9vcih0aGlzLnRvcCArIGggLyAyICsgcGFkZGluZy50b3ApO1xuICAgICAgICB0aGlzLmRyYXdpbmdBcmVhID0gTWF0aC5mbG9vcihNYXRoLm1pbih3LCBoKSAvIDIpO1xuICAgIH1cbiAgICBkZXRlcm1pbmVEYXRhTGltaXRzKCkge1xuICAgICAgICBjb25zdCB7IG1pbiAsIG1heCAgfSA9IHRoaXMuZ2V0TWluTWF4KGZhbHNlKTtcbiAgICAgICAgdGhpcy5taW4gPSBpc051bWJlckZpbml0ZShtaW4pICYmICFpc05hTihtaW4pID8gbWluIDogMDtcbiAgICAgICAgdGhpcy5tYXggPSBpc051bWJlckZpbml0ZShtYXgpICYmICFpc05hTihtYXgpID8gbWF4IDogMDtcbiAgICAgICAgdGhpcy5oYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCk7XG4gICAgfVxuIGNvbXB1dGVUaWNrTGltaXQoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5kcmF3aW5nQXJlYSAvIGdldFRpY2tCYWNrZHJvcEhlaWdodCh0aGlzLm9wdGlvbnMpKTtcbiAgICB9XG4gICAgZ2VuZXJhdGVUaWNrTGFiZWxzKHRpY2tzKSB7XG4gICAgICAgIExpbmVhclNjYWxlQmFzZS5wcm90b3R5cGUuZ2VuZXJhdGVUaWNrTGFiZWxzLmNhbGwodGhpcywgdGlja3MpO1xuICAgICAgICB0aGlzLl9wb2ludExhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCkubWFwKCh2YWx1ZSwgaW5kZXgpPT57XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGNhbGxiYWNrKHRoaXMub3B0aW9ucy5wb2ludExhYmVscy5jYWxsYmFjaywgW1xuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiBsYWJlbCB8fCBsYWJlbCA9PT0gMCA/IGxhYmVsIDogJyc7XG4gICAgICAgIH0pLmZpbHRlcigodiwgaSk9PnRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaSkpO1xuICAgIH1cbiAgICBmaXQoKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmIChvcHRzLmRpc3BsYXkgJiYgb3B0cy5wb2ludExhYmVscy5kaXNwbGF5KSB7XG4gICAgICAgICAgICBmaXRXaXRoUG9pbnRMYWJlbHModGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldENlbnRlclBvaW50KDAsIDAsIDAsIDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldENlbnRlclBvaW50KGxlZnRNb3ZlbWVudCwgcmlnaHRNb3ZlbWVudCwgdG9wTW92ZW1lbnQsIGJvdHRvbU1vdmVtZW50KSB7XG4gICAgICAgIHRoaXMueENlbnRlciArPSBNYXRoLmZsb29yKChsZWZ0TW92ZW1lbnQgLSByaWdodE1vdmVtZW50KSAvIDIpO1xuICAgICAgICB0aGlzLnlDZW50ZXIgKz0gTWF0aC5mbG9vcigodG9wTW92ZW1lbnQgLSBib3R0b21Nb3ZlbWVudCkgLyAyKTtcbiAgICAgICAgdGhpcy5kcmF3aW5nQXJlYSAtPSBNYXRoLm1pbih0aGlzLmRyYXdpbmdBcmVhIC8gMiwgTWF0aC5tYXgobGVmdE1vdmVtZW50LCByaWdodE1vdmVtZW50LCB0b3BNb3ZlbWVudCwgYm90dG9tTW92ZW1lbnQpKTtcbiAgICB9XG4gICAgZ2V0SW5kZXhBbmdsZShpbmRleCkge1xuICAgICAgICBjb25zdCBhbmdsZU11bHRpcGxpZXIgPSBUQVUgLyAodGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RoIHx8IDEpO1xuICAgICAgICBjb25zdCBzdGFydEFuZ2xlID0gdGhpcy5vcHRpb25zLnN0YXJ0QW5nbGUgfHwgMDtcbiAgICAgICAgcmV0dXJuIF9ub3JtYWxpemVBbmdsZShpbmRleCAqIGFuZ2xlTXVsdGlwbGllciArIHRvUmFkaWFucyhzdGFydEFuZ2xlKSk7XG4gICAgfVxuICAgIGdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc051bGxPclVuZGVmKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY2FsaW5nRmFjdG9yID0gdGhpcy5kcmF3aW5nQXJlYSAvICh0aGlzLm1heCAtIHRoaXMubWluKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZXZlcnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMubWF4IC0gdmFsdWUpICogc2NhbGluZ0ZhY3RvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHZhbHVlIC0gdGhpcy5taW4pICogc2NhbGluZ0ZhY3RvcjtcbiAgICB9XG4gICAgZ2V0VmFsdWVGb3JEaXN0YW5jZUZyb21DZW50ZXIoZGlzdGFuY2UpIHtcbiAgICAgICAgaWYgKGlzTnVsbE9yVW5kZWYoZGlzdGFuY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjYWxlZERpc3RhbmNlID0gZGlzdGFuY2UgLyAodGhpcy5kcmF3aW5nQXJlYSAvICh0aGlzLm1heCAtIHRoaXMubWluKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMucmV2ZXJzZSA/IHRoaXMubWF4IC0gc2NhbGVkRGlzdGFuY2UgOiB0aGlzLm1pbiArIHNjYWxlZERpc3RhbmNlO1xuICAgIH1cbiAgICBnZXRQb2ludExhYmVsQ29udGV4dChpbmRleCkge1xuICAgICAgICBjb25zdCBwb2ludExhYmVscyA9IHRoaXMuX3BvaW50TGFiZWxzIHx8IFtdO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHBvaW50TGFiZWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRMYWJlbCA9IHBvaW50TGFiZWxzW2luZGV4XTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVQb2ludExhYmVsQ29udGV4dCh0aGlzLmdldENvbnRleHQoKSwgaW5kZXgsIHBvaW50TGFiZWwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFBvaW50UG9zaXRpb24oaW5kZXgsIGRpc3RhbmNlRnJvbUNlbnRlciwgYWRkaXRpb25hbEFuZ2xlID0gMCkge1xuICAgICAgICBjb25zdCBhbmdsZSA9IHRoaXMuZ2V0SW5kZXhBbmdsZShpbmRleCkgLSBIQUxGX1BJICsgYWRkaXRpb25hbEFuZ2xlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogTWF0aC5jb3MoYW5nbGUpICogZGlzdGFuY2VGcm9tQ2VudGVyICsgdGhpcy54Q2VudGVyLFxuICAgICAgICAgICAgeTogTWF0aC5zaW4oYW5nbGUpICogZGlzdGFuY2VGcm9tQ2VudGVyICsgdGhpcy55Q2VudGVyLFxuICAgICAgICAgICAgYW5nbGVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQb2ludFBvc2l0aW9uKGluZGV4LCB0aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHZhbHVlKSk7XG4gICAgfVxuICAgIGdldEJhc2VQb3NpdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUoaW5kZXggfHwgMCwgdGhpcy5nZXRCYXNlVmFsdWUoKSk7XG4gICAgfVxuICAgIGdldFBvaW50TGFiZWxQb3NpdGlvbihpbmRleCkge1xuICAgICAgICBjb25zdCB7IGxlZnQgLCB0b3AgLCByaWdodCAsIGJvdHRvbSAgfSA9IHRoaXMuX3BvaW50TGFiZWxJdGVtc1tpbmRleF07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0LFxuICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgcmlnaHQsXG4gICAgICAgICAgICBib3R0b21cbiAgICAgICAgfTtcbiAgICB9XG4gZHJhd0JhY2tncm91bmQoKSB7XG4gICAgICAgIGNvbnN0IHsgYmFja2dyb3VuZENvbG9yICwgZ3JpZDogeyBjaXJjdWxhciAgfSAgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgaWYgKGJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgcGF0aFJhZGl1c0xpbmUodGhpcywgdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0aGlzLl9lbmRWYWx1ZSksIGNpcmN1bGFyLCB0aGlzLl9wb2ludExhYmVscy5sZW5ndGgpO1xuICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgfVxuIGRyYXdHcmlkKCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgeyBhbmdsZUxpbmVzICwgZ3JpZCAsIGJvcmRlciAgfSA9IG9wdHM7XG4gICAgICAgIGNvbnN0IGxhYmVsQ291bnQgPSB0aGlzLl9wb2ludExhYmVscy5sZW5ndGg7XG4gICAgICAgIGxldCBpLCBvZmZzZXQsIHBvc2l0aW9uO1xuICAgICAgICBpZiAob3B0cy5wb2ludExhYmVscy5kaXNwbGF5KSB7XG4gICAgICAgICAgICBkcmF3UG9pbnRMYWJlbHModGhpcywgbGFiZWxDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyaWQuZGlzcGxheSkge1xuICAgICAgICAgICAgdGhpcy50aWNrcy5mb3JFYWNoKCh0aWNrLCBpbmRleCk9PntcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IDAgfHwgaW5kZXggPT09IDAgJiYgdGhpcy5taW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGljay52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRzQXRJbmRleCA9IGdyaWQuc2V0Q29udGV4dChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0c0F0SW5kZXhCb3JkZXIgPSBib3JkZXIuc2V0Q29udGV4dChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgZHJhd1JhZGl1c0xpbmUodGhpcywgb3B0c0F0SW5kZXgsIG9mZnNldCwgbGFiZWxDb3VudCwgb3B0c0F0SW5kZXhCb3JkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbmdsZUxpbmVzLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICBmb3IoaSA9IGxhYmVsQ291bnQgLSAxOyBpID49IDA7IGktLSl7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0c0F0SW5kZXggPSBhbmdsZUxpbmVzLnNldENvbnRleHQodGhpcy5nZXRQb2ludExhYmVsQ29udGV4dChpKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2xvciAsIGxpbmVXaWR0aCAgfSA9IG9wdHNBdEluZGV4O1xuICAgICAgICAgICAgICAgIGlmICghbGluZVdpZHRoIHx8ICFjb2xvcikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcbiAgICAgICAgICAgICAgICBjdHguc2V0TGluZURhc2gob3B0c0F0SW5kZXguYm9yZGVyRGFzaCk7XG4gICAgICAgICAgICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gb3B0c0F0SW5kZXguYm9yZGVyRGFzaE9mZnNldDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKG9wdHMucmV2ZXJzZSA/IHRoaXMubWluIDogdGhpcy5tYXgpO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5nZXRQb2ludFBvc2l0aW9uKGksIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8odGhpcy54Q2VudGVyLCB0aGlzLnlDZW50ZXIpO1xuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8ocG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiBkcmF3Qm9yZGVyKCkge31cbiBkcmF3TGFiZWxzKCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuICAgICAgICBpZiAoIXRpY2tPcHRzLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFydEFuZ2xlID0gdGhpcy5nZXRJbmRleEFuZ2xlKDApO1xuICAgICAgICBsZXQgb2Zmc2V0LCB3aWR0aDtcbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgY3R4LnRyYW5zbGF0ZSh0aGlzLnhDZW50ZXIsIHRoaXMueUNlbnRlcik7XG4gICAgICAgIGN0eC5yb3RhdGUoc3RhcnRBbmdsZSk7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgICAgICB0aGlzLnRpY2tzLmZvckVhY2goKHRpY2ssIGluZGV4KT0+e1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIHRoaXMubWluID49IDAgJiYgIW9wdHMucmV2ZXJzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wdHNBdEluZGV4ID0gdGlja09wdHMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoaW5kZXgpKTtcbiAgICAgICAgICAgIGNvbnN0IHRpY2tGb250ID0gdG9Gb250KG9wdHNBdEluZGV4LmZvbnQpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0aGlzLnRpY2tzW2luZGV4XS52YWx1ZSk7XG4gICAgICAgICAgICBpZiAob3B0c0F0SW5kZXguc2hvd0xhYmVsQmFja2Ryb3ApIHtcbiAgICAgICAgICAgICAgICBjdHguZm9udCA9IHRpY2tGb250LnN0cmluZztcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGN0eC5tZWFzdXJlVGV4dCh0aWNrLmxhYmVsKS53aWR0aDtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0c0F0SW5kZXguYmFja2Ryb3BDb2xvcjtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gdG9QYWRkaW5nKG9wdHNBdEluZGV4LmJhY2tkcm9wUGFkZGluZyk7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KC13aWR0aCAvIDIgLSBwYWRkaW5nLmxlZnQsIC1vZmZzZXQgLSB0aWNrRm9udC5zaXplIC8gMiAtIHBhZGRpbmcudG9wLCB3aWR0aCArIHBhZGRpbmcud2lkdGgsIHRpY2tGb250LnNpemUgKyBwYWRkaW5nLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZW5kZXJUZXh0KGN0eCwgdGljay5sYWJlbCwgMCwgLW9mZnNldCwgdGlja0ZvbnQsIHtcbiAgICAgICAgICAgICAgICBjb2xvcjogb3B0c0F0SW5kZXguY29sb3IsXG4gICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IG9wdHNBdEluZGV4LnRleHRTdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogb3B0c0F0SW5kZXgudGV4dFN0cm9rZVdpZHRoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuIGRyYXdUaXRsZSgpIHt9XG59XG5cbmNvbnN0IElOVEVSVkFMUyA9IHtcbiAgICBtaWxsaXNlY29uZDoge1xuICAgICAgICBjb21tb246IHRydWUsXG4gICAgICAgIHNpemU6IDEsXG4gICAgICAgIHN0ZXBzOiAxMDAwXG4gICAgfSxcbiAgICBzZWNvbmQ6IHtcbiAgICAgICAgY29tbW9uOiB0cnVlLFxuICAgICAgICBzaXplOiAxMDAwLFxuICAgICAgICBzdGVwczogNjBcbiAgICB9LFxuICAgIG1pbnV0ZToge1xuICAgICAgICBjb21tb246IHRydWUsXG4gICAgICAgIHNpemU6IDYwMDAwLFxuICAgICAgICBzdGVwczogNjBcbiAgICB9LFxuICAgIGhvdXI6IHtcbiAgICAgICAgY29tbW9uOiB0cnVlLFxuICAgICAgICBzaXplOiAzNjAwMDAwLFxuICAgICAgICBzdGVwczogMjRcbiAgICB9LFxuICAgIGRheToge1xuICAgICAgICBjb21tb246IHRydWUsXG4gICAgICAgIHNpemU6IDg2NDAwMDAwLFxuICAgICAgICBzdGVwczogMzBcbiAgICB9LFxuICAgIHdlZWs6IHtcbiAgICAgICAgY29tbW9uOiBmYWxzZSxcbiAgICAgICAgc2l6ZTogNjA0ODAwMDAwLFxuICAgICAgICBzdGVwczogNFxuICAgIH0sXG4gICAgbW9udGg6IHtcbiAgICAgICAgY29tbW9uOiB0cnVlLFxuICAgICAgICBzaXplOiAyLjYyOGU5LFxuICAgICAgICBzdGVwczogMTJcbiAgICB9LFxuICAgIHF1YXJ0ZXI6IHtcbiAgICAgICAgY29tbW9uOiBmYWxzZSxcbiAgICAgICAgc2l6ZTogNy44ODRlOSxcbiAgICAgICAgc3RlcHM6IDRcbiAgICB9LFxuICAgIHllYXI6IHtcbiAgICAgICAgY29tbW9uOiB0cnVlLFxuICAgICAgICBzaXplOiAzLjE1NGUxMFxuICAgIH1cbn07XG4gY29uc3QgVU5JVFMgPSAgLyogI19fUFVSRV9fICovIE9iamVjdC5rZXlzKElOVEVSVkFMUyk7XG4gZnVuY3Rpb24gc29ydGVyKGEsIGIpIHtcbiAgICByZXR1cm4gYSAtIGI7XG59XG4gZnVuY3Rpb24gcGFyc2Uoc2NhbGUsIGlucHV0KSB7XG4gICAgaWYgKGlzTnVsbE9yVW5kZWYoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBhZGFwdGVyID0gc2NhbGUuX2FkYXB0ZXI7XG4gICAgY29uc3QgeyBwYXJzZXIgLCByb3VuZCAsIGlzb1dlZWtkYXkgIH0gPSBzY2FsZS5fcGFyc2VPcHRzO1xuICAgIGxldCB2YWx1ZSA9IGlucHV0O1xuICAgIGlmICh0eXBlb2YgcGFyc2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gcGFyc2VyKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKCFpc051bWJlckZpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB0eXBlb2YgcGFyc2VyID09PSAnc3RyaW5nJyA/IGFkYXB0ZXIucGFyc2UodmFsdWUsIHBhcnNlcikgOiBhZGFwdGVyLnBhcnNlKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAocm91bmQpIHtcbiAgICAgICAgdmFsdWUgPSByb3VuZCA9PT0gJ3dlZWsnICYmIChpc051bWJlcihpc29XZWVrZGF5KSB8fCBpc29XZWVrZGF5ID09PSB0cnVlKSA/IGFkYXB0ZXIuc3RhcnRPZih2YWx1ZSwgJ2lzb1dlZWsnLCBpc29XZWVrZGF5KSA6IGFkYXB0ZXIuc3RhcnRPZih2YWx1ZSwgcm91bmQpO1xuICAgIH1cbiAgICByZXR1cm4gK3ZhbHVlO1xufVxuIGZ1bmN0aW9uIGRldGVybWluZVVuaXRGb3JBdXRvVGlja3MobWluVW5pdCwgbWluLCBtYXgsIGNhcGFjaXR5KSB7XG4gICAgY29uc3QgaWxlbiA9IFVOSVRTLmxlbmd0aDtcbiAgICBmb3IobGV0IGkgPSBVTklUUy5pbmRleE9mKG1pblVuaXQpOyBpIDwgaWxlbiAtIDE7ICsraSl7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gSU5URVJWQUxTW1VOSVRTW2ldXTtcbiAgICAgICAgY29uc3QgZmFjdG9yID0gaW50ZXJ2YWwuc3RlcHMgPyBpbnRlcnZhbC5zdGVwcyA6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICBpZiAoaW50ZXJ2YWwuY29tbW9uICYmIE1hdGguY2VpbCgobWF4IC0gbWluKSAvIChmYWN0b3IgKiBpbnRlcnZhbC5zaXplKSkgPD0gY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBVTklUU1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gVU5JVFNbaWxlbiAtIDFdO1xufVxuIGZ1bmN0aW9uIGRldGVybWluZVVuaXRGb3JGb3JtYXR0aW5nKHNjYWxlLCBudW1UaWNrcywgbWluVW5pdCwgbWluLCBtYXgpIHtcbiAgICBmb3IobGV0IGkgPSBVTklUUy5sZW5ndGggLSAxOyBpID49IFVOSVRTLmluZGV4T2YobWluVW5pdCk7IGktLSl7XG4gICAgICAgIGNvbnN0IHVuaXQgPSBVTklUU1tpXTtcbiAgICAgICAgaWYgKElOVEVSVkFMU1t1bml0XS5jb21tb24gJiYgc2NhbGUuX2FkYXB0ZXIuZGlmZihtYXgsIG1pbiwgdW5pdCkgPj0gbnVtVGlja3MgLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5pdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gVU5JVFNbbWluVW5pdCA/IFVOSVRTLmluZGV4T2YobWluVW5pdCkgOiAwXTtcbn1cbiBmdW5jdGlvbiBkZXRlcm1pbmVNYWpvclVuaXQodW5pdCkge1xuICAgIGZvcihsZXQgaSA9IFVOSVRTLmluZGV4T2YodW5pdCkgKyAxLCBpbGVuID0gVU5JVFMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgaWYgKElOVEVSVkFMU1tVTklUU1tpXV0uY29tbW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gVU5JVFNbaV07XG4gICAgICAgIH1cbiAgICB9XG59XG4gZnVuY3Rpb24gYWRkVGljayh0aWNrcywgdGltZSwgdGltZXN0YW1wcykge1xuICAgIGlmICghdGltZXN0YW1wcykge1xuICAgICAgICB0aWNrc1t0aW1lXSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB7IGxvICwgaGkgIH0gPSBfbG9va3VwKHRpbWVzdGFtcHMsIHRpbWUpO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSB0aW1lc3RhbXBzW2xvXSA+PSB0aW1lID8gdGltZXN0YW1wc1tsb10gOiB0aW1lc3RhbXBzW2hpXTtcbiAgICAgICAgdGlja3NbdGltZXN0YW1wXSA9IHRydWU7XG4gICAgfVxufVxuIGZ1bmN0aW9uIHNldE1ham9yVGlja3Moc2NhbGUsIHRpY2tzLCBtYXAsIG1ham9yVW5pdCkge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSBzY2FsZS5fYWRhcHRlcjtcbiAgICBjb25zdCBmaXJzdCA9ICthZGFwdGVyLnN0YXJ0T2YodGlja3NbMF0udmFsdWUsIG1ham9yVW5pdCk7XG4gICAgY29uc3QgbGFzdCA9IHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdLnZhbHVlO1xuICAgIGxldCBtYWpvciwgaW5kZXg7XG4gICAgZm9yKG1ham9yID0gZmlyc3Q7IG1ham9yIDw9IGxhc3Q7IG1ham9yID0gK2FkYXB0ZXIuYWRkKG1ham9yLCAxLCBtYWpvclVuaXQpKXtcbiAgICAgICAgaW5kZXggPSBtYXBbbWFqb3JdO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGlja3NbaW5kZXhdLm1ham9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGlja3M7XG59XG4gZnVuY3Rpb24gdGlja3NGcm9tVGltZXN0YW1wcyhzY2FsZSwgdmFsdWVzLCBtYWpvclVuaXQpIHtcbiAgICBjb25zdCB0aWNrcyA9IFtdO1xuICAgICBjb25zdCBtYXAgPSB7fTtcbiAgICBjb25zdCBpbGVuID0gdmFsdWVzLmxlbmd0aDtcbiAgICBsZXQgaSwgdmFsdWU7XG4gICAgZm9yKGkgPSAwOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICAgIG1hcFt2YWx1ZV0gPSBpO1xuICAgICAgICB0aWNrcy5wdXNoKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbWFqb3I6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaWxlbiA9PT0gMCB8fCAhbWFqb3JVbml0ID8gdGlja3MgOiBzZXRNYWpvclRpY2tzKHNjYWxlLCB0aWNrcywgbWFwLCBtYWpvclVuaXQpO1xufVxuY2xhc3MgVGltZVNjYWxlIGV4dGVuZHMgU2NhbGUge1xuICAgIHN0YXRpYyBpZCA9ICd0aW1lJztcbiBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gYm91bmRzOiAnZGF0YScsXG4gICAgICAgIGFkYXB0ZXJzOiB7fSxcbiAgICAgICAgdGltZToge1xuICAgICAgICAgICAgcGFyc2VyOiBmYWxzZSxcbiAgICAgICAgICAgIHVuaXQ6IGZhbHNlLFxuICAgICAgICAgICAgcm91bmQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNvV2Vla2RheTogZmFsc2UsXG4gICAgICAgICAgICBtaW5Vbml0OiAnbWlsbGlzZWNvbmQnLFxuICAgICAgICAgICAgZGlzcGxheUZvcm1hdHM6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHRpY2tzOiB7XG4gc291cmNlOiAnYXV0bycsXG4gICAgICAgICAgICBjYWxsYmFjazogZmFsc2UsXG4gICAgICAgICAgICBtYWpvcjoge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuIGNvbnN0cnVjdG9yKHByb3BzKXtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgdGhpcy5fY2FjaGUgPSB7XG4gICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgIGxhYmVsczogW10sXG4gICAgICAgICAgICBhbGw6IFtdXG4gICAgICAgIH07XG4gICAgICAgICB0aGlzLl91bml0ID0gJ2RheSc7XG4gICAgICAgICB0aGlzLl9tYWpvclVuaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX29mZnNldHMgPSB7fTtcbiAgICAgICAgdGhpcy5fbm9ybWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wYXJzZU9wdHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGluaXQoc2NhbGVPcHRzLCBvcHRzID0ge30pIHtcbiAgICAgICAgY29uc3QgdGltZSA9IHNjYWxlT3B0cy50aW1lIHx8IChzY2FsZU9wdHMudGltZSA9IHt9KTtcbiAgICAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLl9hZGFwdGVyID0gbmV3IGFkYXB0ZXJzLl9kYXRlKHNjYWxlT3B0cy5hZGFwdGVycy5kYXRlKTtcbiAgICAgICAgYWRhcHRlci5pbml0KG9wdHMpO1xuICAgICAgICBtZXJnZUlmKHRpbWUuZGlzcGxheUZvcm1hdHMsIGFkYXB0ZXIuZm9ybWF0cygpKTtcbiAgICAgICAgdGhpcy5fcGFyc2VPcHRzID0ge1xuICAgICAgICAgICAgcGFyc2VyOiB0aW1lLnBhcnNlcixcbiAgICAgICAgICAgIHJvdW5kOiB0aW1lLnJvdW5kLFxuICAgICAgICAgICAgaXNvV2Vla2RheTogdGltZS5pc29XZWVrZGF5XG4gICAgICAgIH07XG4gICAgICAgIHN1cGVyLmluaXQoc2NhbGVPcHRzKTtcbiAgICAgICAgdGhpcy5fbm9ybWFsaXplZCA9IG9wdHMubm9ybWFsaXplZDtcbiAgICB9XG4gcGFyc2UocmF3LCBpbmRleCkge1xuICAgICAgICBpZiAocmF3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZSh0aGlzLCByYXcpO1xuICAgIH1cbiAgICBiZWZvcmVMYXlvdXQoKSB7XG4gICAgICAgIHN1cGVyLmJlZm9yZUxheW91dCgpO1xuICAgICAgICB0aGlzLl9jYWNoZSA9IHtcbiAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgbGFiZWxzOiBbXSxcbiAgICAgICAgICAgIGFsbDogW11cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZGV0ZXJtaW5lRGF0YUxpbWl0cygpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuX2FkYXB0ZXI7XG4gICAgICAgIGNvbnN0IHVuaXQgPSBvcHRpb25zLnRpbWUudW5pdCB8fCAnZGF5JztcbiAgICAgICAgbGV0IHsgbWluICwgbWF4ICwgbWluRGVmaW5lZCAsIG1heERlZmluZWQgIH0gPSB0aGlzLmdldFVzZXJCb3VuZHMoKTtcbiBmdW5jdGlvbiBfYXBwbHlCb3VuZHMoYm91bmRzKSB7XG4gICAgICAgICAgICBpZiAoIW1pbkRlZmluZWQgJiYgIWlzTmFOKGJvdW5kcy5taW4pKSB7XG4gICAgICAgICAgICAgICAgbWluID0gTWF0aC5taW4obWluLCBib3VuZHMubWluKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbWF4RGVmaW5lZCAmJiAhaXNOYU4oYm91bmRzLm1heCkpIHtcbiAgICAgICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIGJvdW5kcy5tYXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbWluRGVmaW5lZCB8fCAhbWF4RGVmaW5lZCkge1xuICAgICAgICAgICAgX2FwcGx5Qm91bmRzKHRoaXMuX2dldExhYmVsQm91bmRzKCkpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYm91bmRzICE9PSAndGlja3MnIHx8IG9wdGlvbnMudGlja3Muc291cmNlICE9PSAnbGFiZWxzJykge1xuICAgICAgICAgICAgICAgIF9hcHBseUJvdW5kcyh0aGlzLmdldE1pbk1heChmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1pbiA9IGlzTnVtYmVyRmluaXRlKG1pbikgJiYgIWlzTmFOKG1pbikgPyBtaW4gOiArYWRhcHRlci5zdGFydE9mKERhdGUubm93KCksIHVuaXQpO1xuICAgICAgICBtYXggPSBpc051bWJlckZpbml0ZShtYXgpICYmICFpc05hTihtYXgpID8gbWF4IDogK2FkYXB0ZXIuZW5kT2YoRGF0ZS5ub3coKSwgdW5pdCkgKyAxO1xuICAgICAgICB0aGlzLm1pbiA9IE1hdGgubWluKG1pbiwgbWF4IC0gMSk7XG4gICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgobWluICsgMSwgbWF4KTtcbiAgICB9XG4gX2dldExhYmVsQm91bmRzKCkge1xuICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmdldExhYmVsVGltZXN0YW1wcygpO1xuICAgICAgICBsZXQgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBsZXQgbWF4ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoYXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgbWluID0gYXJyWzBdO1xuICAgICAgICAgICAgbWF4ID0gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgbWF4XG4gICAgICAgIH07XG4gICAgfVxuIGJ1aWxkVGlja3MoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHRpbWVPcHRzID0gb3B0aW9ucy50aW1lO1xuICAgICAgICBjb25zdCB0aWNrT3B0cyA9IG9wdGlvbnMudGlja3M7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcHMgPSB0aWNrT3B0cy5zb3VyY2UgPT09ICdsYWJlbHMnID8gdGhpcy5nZXRMYWJlbFRpbWVzdGFtcHMoKSA6IHRoaXMuX2dlbmVyYXRlKCk7XG4gICAgICAgIGlmIChvcHRpb25zLmJvdW5kcyA9PT0gJ3RpY2tzJyAmJiB0aW1lc3RhbXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5taW4gPSB0aGlzLl91c2VyTWluIHx8IHRpbWVzdGFtcHNbMF07XG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXMuX3VzZXJNYXggfHwgdGltZXN0YW1wc1t0aW1lc3RhbXBzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heDtcbiAgICAgICAgY29uc3QgdGlja3MgPSBfZmlsdGVyQmV0d2Vlbih0aW1lc3RhbXBzLCBtaW4sIG1heCk7XG4gICAgICAgIHRoaXMuX3VuaXQgPSB0aW1lT3B0cy51bml0IHx8ICh0aWNrT3B0cy5hdXRvU2tpcCA/IGRldGVybWluZVVuaXRGb3JBdXRvVGlja3ModGltZU9wdHMubWluVW5pdCwgdGhpcy5taW4sIHRoaXMubWF4LCB0aGlzLl9nZXRMYWJlbENhcGFjaXR5KG1pbikpIDogZGV0ZXJtaW5lVW5pdEZvckZvcm1hdHRpbmcodGhpcywgdGlja3MubGVuZ3RoLCB0aW1lT3B0cy5taW5Vbml0LCB0aGlzLm1pbiwgdGhpcy5tYXgpKTtcbiAgICAgICAgdGhpcy5fbWFqb3JVbml0ID0gIXRpY2tPcHRzLm1ham9yLmVuYWJsZWQgfHwgdGhpcy5fdW5pdCA9PT0gJ3llYXInID8gdW5kZWZpbmVkIDogZGV0ZXJtaW5lTWFqb3JVbml0KHRoaXMuX3VuaXQpO1xuICAgICAgICB0aGlzLmluaXRPZmZzZXRzKHRpbWVzdGFtcHMpO1xuICAgICAgICBpZiAob3B0aW9ucy5yZXZlcnNlKSB7XG4gICAgICAgICAgICB0aWNrcy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpY2tzRnJvbVRpbWVzdGFtcHModGhpcywgdGlja3MsIHRoaXMuX21ham9yVW5pdCk7XG4gICAgfVxuICAgIGFmdGVyQXV0b1NraXAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub2Zmc2V0QWZ0ZXJBdXRvc2tpcCkge1xuICAgICAgICAgICAgdGhpcy5pbml0T2Zmc2V0cyh0aGlzLnRpY2tzLm1hcCgodGljayk9Pit0aWNrLnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gaW5pdE9mZnNldHModGltZXN0YW1wcyA9IFtdKSB7XG4gICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgIGxldCBlbmQgPSAwO1xuICAgICAgICBsZXQgZmlyc3QsIGxhc3Q7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub2Zmc2V0ICYmIHRpbWVzdGFtcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmaXJzdCA9IHRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKHRpbWVzdGFtcHNbMF0pO1xuICAgICAgICAgICAgaWYgKHRpbWVzdGFtcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSAxIC0gZmlyc3Q7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gKHRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKHRpbWVzdGFtcHNbMV0pIC0gZmlyc3QpIC8gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3QgPSB0aGlzLmdldERlY2ltYWxGb3JWYWx1ZSh0aW1lc3RhbXBzW3RpbWVzdGFtcHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgaWYgKHRpbWVzdGFtcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gbGFzdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5kID0gKGxhc3QgLSB0aGlzLmdldERlY2ltYWxGb3JWYWx1ZSh0aW1lc3RhbXBzW3RpbWVzdGFtcHMubGVuZ3RoIC0gMl0pKSAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGltaXQgPSB0aW1lc3RhbXBzLmxlbmd0aCA8IDMgPyAwLjUgOiAwLjI1O1xuICAgICAgICBzdGFydCA9IF9saW1pdFZhbHVlKHN0YXJ0LCAwLCBsaW1pdCk7XG4gICAgICAgIGVuZCA9IF9saW1pdFZhbHVlKGVuZCwgMCwgbGltaXQpO1xuICAgICAgICB0aGlzLl9vZmZzZXRzID0ge1xuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgICAgICBmYWN0b3I6IDEgLyAoc3RhcnQgKyAxICsgZW5kKVxuICAgICAgICB9O1xuICAgIH1cbiBfZ2VuZXJhdGUoKSB7XG4gICAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLl9hZGFwdGVyO1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbjtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXg7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHRpbWVPcHRzID0gb3B0aW9ucy50aW1lO1xuICAgICAgICBjb25zdCBtaW5vciA9IHRpbWVPcHRzLnVuaXQgfHwgZGV0ZXJtaW5lVW5pdEZvckF1dG9UaWNrcyh0aW1lT3B0cy5taW5Vbml0LCBtaW4sIG1heCwgdGhpcy5fZ2V0TGFiZWxDYXBhY2l0eShtaW4pKTtcbiAgICAgICAgY29uc3Qgc3RlcFNpemUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnRpY2tzLnN0ZXBTaXplLCAxKTtcbiAgICAgICAgY29uc3Qgd2Vla2RheSA9IG1pbm9yID09PSAnd2VlaycgPyB0aW1lT3B0cy5pc29XZWVrZGF5IDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGhhc1dlZWtkYXkgPSBpc051bWJlcih3ZWVrZGF5KSB8fCB3ZWVrZGF5ID09PSB0cnVlO1xuICAgICAgICBjb25zdCB0aWNrcyA9IHt9O1xuICAgICAgICBsZXQgZmlyc3QgPSBtaW47XG4gICAgICAgIGxldCB0aW1lLCBjb3VudDtcbiAgICAgICAgaWYgKGhhc1dlZWtkYXkpIHtcbiAgICAgICAgICAgIGZpcnN0ID0gK2FkYXB0ZXIuc3RhcnRPZihmaXJzdCwgJ2lzb1dlZWsnLCB3ZWVrZGF5KTtcbiAgICAgICAgfVxuICAgICAgICBmaXJzdCA9ICthZGFwdGVyLnN0YXJ0T2YoZmlyc3QsIGhhc1dlZWtkYXkgPyAnZGF5JyA6IG1pbm9yKTtcbiAgICAgICAgaWYgKGFkYXB0ZXIuZGlmZihtYXgsIG1pbiwgbWlub3IpID4gMTAwMDAwICogc3RlcFNpemUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtaW4gKyAnIGFuZCAnICsgbWF4ICsgJyBhcmUgdG9vIGZhciBhcGFydCB3aXRoIHN0ZXBTaXplIG9mICcgKyBzdGVwU2l6ZSArICcgJyArIG1pbm9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lc3RhbXBzID0gb3B0aW9ucy50aWNrcy5zb3VyY2UgPT09ICdkYXRhJyAmJiB0aGlzLmdldERhdGFUaW1lc3RhbXBzKCk7XG4gICAgICAgIGZvcih0aW1lID0gZmlyc3QsIGNvdW50ID0gMDsgdGltZSA8IG1heDsgdGltZSA9ICthZGFwdGVyLmFkZCh0aW1lLCBzdGVwU2l6ZSwgbWlub3IpLCBjb3VudCsrKXtcbiAgICAgICAgICAgIGFkZFRpY2sodGlja3MsIHRpbWUsIHRpbWVzdGFtcHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lID09PSBtYXggfHwgb3B0aW9ucy5ib3VuZHMgPT09ICd0aWNrcycgfHwgY291bnQgPT09IDEpIHtcbiAgICAgICAgICAgIGFkZFRpY2sodGlja3MsIHRpbWUsIHRpbWVzdGFtcHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aWNrcykuc29ydChzb3J0ZXIpLm1hcCgoeCk9Pit4KTtcbiAgICB9XG4gZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5fYWRhcHRlcjtcbiAgICAgICAgY29uc3QgdGltZU9wdHMgPSB0aGlzLm9wdGlvbnMudGltZTtcbiAgICAgICAgaWYgKHRpbWVPcHRzLnRvb2x0aXBGb3JtYXQpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGFwdGVyLmZvcm1hdCh2YWx1ZSwgdGltZU9wdHMudG9vbHRpcEZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aW1lT3B0cy5kaXNwbGF5Rm9ybWF0cy5kYXRldGltZSk7XG4gICAgfVxuIGZvcm1hdCh2YWx1ZSwgZm9ybWF0KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBvcHRpb25zLnRpbWUuZGlzcGxheUZvcm1hdHM7XG4gICAgICAgIGNvbnN0IHVuaXQgPSB0aGlzLl91bml0O1xuICAgICAgICBjb25zdCBmbXQgPSBmb3JtYXQgfHwgZm9ybWF0c1t1bml0XTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZm9ybWF0KHZhbHVlLCBmbXQpO1xuICAgIH1cbiBfdGlja0Zvcm1hdEZ1bmN0aW9uKHRpbWUsIGluZGV4LCB0aWNrcywgZm9ybWF0KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG9wdGlvbnMudGlja3MuY2FsbGJhY2s7XG4gICAgICAgIGlmIChmb3JtYXR0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhmb3JtYXR0ZXIsIFtcbiAgICAgICAgICAgICAgICB0aW1lLFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIHRpY2tzXG4gICAgICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JtYXRzID0gb3B0aW9ucy50aW1lLmRpc3BsYXlGb3JtYXRzO1xuICAgICAgICBjb25zdCB1bml0ID0gdGhpcy5fdW5pdDtcbiAgICAgICAgY29uc3QgbWFqb3JVbml0ID0gdGhpcy5fbWFqb3JVbml0O1xuICAgICAgICBjb25zdCBtaW5vckZvcm1hdCA9IHVuaXQgJiYgZm9ybWF0c1t1bml0XTtcbiAgICAgICAgY29uc3QgbWFqb3JGb3JtYXQgPSBtYWpvclVuaXQgJiYgZm9ybWF0c1ttYWpvclVuaXRdO1xuICAgICAgICBjb25zdCB0aWNrID0gdGlja3NbaW5kZXhdO1xuICAgICAgICBjb25zdCBtYWpvciA9IG1ham9yVW5pdCAmJiBtYWpvckZvcm1hdCAmJiB0aWNrICYmIHRpY2subWFqb3I7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdCh0aW1lLCBmb3JtYXQgfHwgKG1ham9yID8gbWFqb3JGb3JtYXQgOiBtaW5vckZvcm1hdCkpO1xuICAgIH1cbiBnZW5lcmF0ZVRpY2tMYWJlbHModGlja3MpIHtcbiAgICAgICAgbGV0IGksIGlsZW4sIHRpY2s7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IHRpY2tzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICB0aWNrID0gdGlja3NbaV07XG4gICAgICAgICAgICB0aWNrLmxhYmVsID0gdGhpcy5fdGlja0Zvcm1hdEZ1bmN0aW9uKHRpY2sudmFsdWUsIGksIHRpY2tzKTtcbiAgICAgICAgfVxuICAgIH1cbiBnZXREZWNpbWFsRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsID8gTmFOIDogKHZhbHVlIC0gdGhpcy5taW4pIC8gKHRoaXMubWF4IC0gdGhpcy5taW4pO1xuICAgIH1cbiBnZXRQaXhlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldHMgPSB0aGlzLl9vZmZzZXRzO1xuICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmdldERlY2ltYWxGb3JWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBpeGVsRm9yRGVjaW1hbCgob2Zmc2V0cy5zdGFydCArIHBvcykgKiBvZmZzZXRzLmZhY3Rvcik7XG4gICAgfVxuIGdldFZhbHVlRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IHRoaXMuX29mZnNldHM7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKHBpeGVsKSAvIG9mZnNldHMuZmFjdG9yIC0gb2Zmc2V0cy5lbmQ7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbiArIHBvcyAqICh0aGlzLm1heCAtIHRoaXMubWluKTtcbiAgICB9XG4gX2dldExhYmVsU2l6ZShsYWJlbCkge1xuICAgICAgICBjb25zdCB0aWNrc09wdHMgPSB0aGlzLm9wdGlvbnMudGlja3M7XG4gICAgICAgIGNvbnN0IHRpY2tMYWJlbFdpZHRoID0gdGhpcy5jdHgubWVhc3VyZVRleHQobGFiZWwpLndpZHRoO1xuICAgICAgICBjb25zdCBhbmdsZSA9IHRvUmFkaWFucyh0aGlzLmlzSG9yaXpvbnRhbCgpID8gdGlja3NPcHRzLm1heFJvdGF0aW9uIDogdGlja3NPcHRzLm1pblJvdGF0aW9uKTtcbiAgICAgICAgY29uc3QgY29zUm90YXRpb24gPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIGNvbnN0IHNpblJvdGF0aW9uID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgICBjb25zdCB0aWNrRm9udFNpemUgPSB0aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKDApLnNpemU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3OiB0aWNrTGFiZWxXaWR0aCAqIGNvc1JvdGF0aW9uICsgdGlja0ZvbnRTaXplICogc2luUm90YXRpb24sXG4gICAgICAgICAgICBoOiB0aWNrTGFiZWxXaWR0aCAqIHNpblJvdGF0aW9uICsgdGlja0ZvbnRTaXplICogY29zUm90YXRpb25cbiAgICAgICAgfTtcbiAgICB9XG4gX2dldExhYmVsQ2FwYWNpdHkoZXhhbXBsZVRpbWUpIHtcbiAgICAgICAgY29uc3QgdGltZU9wdHMgPSB0aGlzLm9wdGlvbnMudGltZTtcbiAgICAgICAgY29uc3QgZGlzcGxheUZvcm1hdHMgPSB0aW1lT3B0cy5kaXNwbGF5Rm9ybWF0cztcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gZGlzcGxheUZvcm1hdHNbdGltZU9wdHMudW5pdF0gfHwgZGlzcGxheUZvcm1hdHMubWlsbGlzZWNvbmQ7XG4gICAgICAgIGNvbnN0IGV4YW1wbGVMYWJlbCA9IHRoaXMuX3RpY2tGb3JtYXRGdW5jdGlvbihleGFtcGxlVGltZSwgMCwgdGlja3NGcm9tVGltZXN0YW1wcyh0aGlzLCBbXG4gICAgICAgICAgICBleGFtcGxlVGltZVxuICAgICAgICBdLCB0aGlzLl9tYWpvclVuaXQpLCBmb3JtYXQpO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5fZ2V0TGFiZWxTaXplKGV4YW1wbGVMYWJlbCk7XG4gICAgICAgIGNvbnN0IGNhcGFjaXR5ID0gTWF0aC5mbG9vcih0aGlzLmlzSG9yaXpvbnRhbCgpID8gdGhpcy53aWR0aCAvIHNpemUudyA6IHRoaXMuaGVpZ2h0IC8gc2l6ZS5oKSAtIDE7XG4gICAgICAgIHJldHVybiBjYXBhY2l0eSA+IDAgPyBjYXBhY2l0eSA6IDE7XG4gICAgfVxuIGdldERhdGFUaW1lc3RhbXBzKCkge1xuICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHRoaXMuX2NhY2hlLmRhdGEgfHwgW107XG4gICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICBpZiAodGltZXN0YW1wcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXBzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFzID0gdGhpcy5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcygpO1xuICAgICAgICBpZiAodGhpcy5fbm9ybWFsaXplZCAmJiBtZXRhcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5kYXRhID0gbWV0YXNbMF0uY29udHJvbGxlci5nZXRBbGxQYXJzZWRWYWx1ZXModGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGkgPSAwLCBpbGVuID0gbWV0YXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIHRpbWVzdGFtcHMgPSB0aW1lc3RhbXBzLmNvbmNhdChtZXRhc1tpXS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLmRhdGEgPSB0aGlzLm5vcm1hbGl6ZSh0aW1lc3RhbXBzKTtcbiAgICB9XG4gZ2V0TGFiZWxUaW1lc3RhbXBzKCkge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXBzID0gdGhpcy5fY2FjaGUubGFiZWxzIHx8IFtdO1xuICAgICAgICBsZXQgaSwgaWxlbjtcbiAgICAgICAgaWYgKHRpbWVzdGFtcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBsYWJlbHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIHRpbWVzdGFtcHMucHVzaChwYXJzZSh0aGlzLCBsYWJlbHNbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUubGFiZWxzID0gdGhpcy5fbm9ybWFsaXplZCA/IHRpbWVzdGFtcHMgOiB0aGlzLm5vcm1hbGl6ZSh0aW1lc3RhbXBzKTtcbiAgICB9XG4gbm9ybWFsaXplKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gX2FycmF5VW5pcXVlKHZhbHVlcy5zb3J0KHNvcnRlcikpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGUodGFibGUsIHZhbCwgcmV2ZXJzZSkge1xuICAgIGxldCBsbyA9IDA7XG4gICAgbGV0IGhpID0gdGFibGUubGVuZ3RoIC0gMTtcbiAgICBsZXQgcHJldlNvdXJjZSwgbmV4dFNvdXJjZSwgcHJldlRhcmdldCwgbmV4dFRhcmdldDtcbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICBpZiAodmFsID49IHRhYmxlW2xvXS5wb3MgJiYgdmFsIDw9IHRhYmxlW2hpXS5wb3MpIHtcbiAgICAgICAgICAgICh7IGxvICwgaGkgIH0gPSBfbG9va3VwQnlLZXkodGFibGUsICdwb3MnLCB2YWwpKTtcbiAgICAgICAgfVxuICAgICAgICAoeyBwb3M6IHByZXZTb3VyY2UgLCB0aW1lOiBwcmV2VGFyZ2V0ICB9ID0gdGFibGVbbG9dKTtcbiAgICAgICAgKHsgcG9zOiBuZXh0U291cmNlICwgdGltZTogbmV4dFRhcmdldCAgfSA9IHRhYmxlW2hpXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHZhbCA+PSB0YWJsZVtsb10udGltZSAmJiB2YWwgPD0gdGFibGVbaGldLnRpbWUpIHtcbiAgICAgICAgICAgICh7IGxvICwgaGkgIH0gPSBfbG9va3VwQnlLZXkodGFibGUsICd0aW1lJywgdmFsKSk7XG4gICAgICAgIH1cbiAgICAgICAgKHsgdGltZTogcHJldlNvdXJjZSAsIHBvczogcHJldlRhcmdldCAgfSA9IHRhYmxlW2xvXSk7XG4gICAgICAgICh7IHRpbWU6IG5leHRTb3VyY2UgLCBwb3M6IG5leHRUYXJnZXQgIH0gPSB0YWJsZVtoaV0pO1xuICAgIH1cbiAgICBjb25zdCBzcGFuID0gbmV4dFNvdXJjZSAtIHByZXZTb3VyY2U7XG4gICAgcmV0dXJuIHNwYW4gPyBwcmV2VGFyZ2V0ICsgKG5leHRUYXJnZXQgLSBwcmV2VGFyZ2V0KSAqICh2YWwgLSBwcmV2U291cmNlKSAvIHNwYW4gOiBwcmV2VGFyZ2V0O1xufVxuY2xhc3MgVGltZVNlcmllc1NjYWxlIGV4dGVuZHMgVGltZVNjYWxlIHtcbiAgICBzdGF0aWMgaWQgPSAndGltZXNlcmllcyc7XG4gc3RhdGljIGRlZmF1bHRzID0gVGltZVNjYWxlLmRlZmF1bHRzO1xuIGNvbnN0cnVjdG9yKHByb3BzKXtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgdGhpcy5fdGFibGUgPSBbXTtcbiAgICAgICAgIHRoaXMuX21pblBvcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuX3RhYmxlUmFuZ2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuIGluaXRPZmZzZXRzKCkge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXBzID0gdGhpcy5fZ2V0VGltZXN0YW1wc0ZvclRhYmxlKCk7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fdGFibGUgPSB0aGlzLmJ1aWxkTG9va3VwVGFibGUodGltZXN0YW1wcyk7XG4gICAgICAgIHRoaXMuX21pblBvcyA9IGludGVycG9sYXRlKHRhYmxlLCB0aGlzLm1pbik7XG4gICAgICAgIHRoaXMuX3RhYmxlUmFuZ2UgPSBpbnRlcnBvbGF0ZSh0YWJsZSwgdGhpcy5tYXgpIC0gdGhpcy5fbWluUG9zO1xuICAgICAgICBzdXBlci5pbml0T2Zmc2V0cyh0aW1lc3RhbXBzKTtcbiAgICB9XG4gYnVpbGRMb29rdXBUYWJsZSh0aW1lc3RhbXBzKSB7XG4gICAgICAgIGNvbnN0IHsgbWluICwgbWF4ICB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgICAgY29uc3QgdGFibGUgPSBbXTtcbiAgICAgICAgbGV0IGksIGlsZW4sIHByZXYsIGN1cnIsIG5leHQ7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IHRpbWVzdGFtcHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGN1cnIgPSB0aW1lc3RhbXBzW2ldO1xuICAgICAgICAgICAgaWYgKGN1cnIgPj0gbWluICYmIGN1cnIgPD0gbWF4KSB7XG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaChjdXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IG1pbixcbiAgICAgICAgICAgICAgICAgICAgcG9zOiAwXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IG1heCxcbiAgICAgICAgICAgICAgICAgICAgcG9zOiAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBpdGVtcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgbmV4dCA9IGl0ZW1zW2kgKyAxXTtcbiAgICAgICAgICAgIHByZXYgPSBpdGVtc1tpIC0gMV07XG4gICAgICAgICAgICBjdXJyID0gaXRlbXNbaV07XG4gICAgICAgICAgICBpZiAoTWF0aC5yb3VuZCgobmV4dCArIHByZXYpIC8gMikgIT09IGN1cnIpIHtcbiAgICAgICAgICAgICAgICB0YWJsZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGltZTogY3VycixcbiAgICAgICAgICAgICAgICAgICAgcG9zOiBpIC8gKGlsZW4gLSAxKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gX2dlbmVyYXRlKCkge1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbjtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXg7XG4gICAgICAgIGxldCB0aW1lc3RhbXBzID0gc3VwZXIuZ2V0RGF0YVRpbWVzdGFtcHMoKTtcbiAgICAgICAgaWYgKCF0aW1lc3RhbXBzLmluY2x1ZGVzKG1pbikgfHwgIXRpbWVzdGFtcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aW1lc3RhbXBzLnNwbGljZSgwLCAwLCBtaW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGltZXN0YW1wcy5pbmNsdWRlcyhtYXgpIHx8IHRpbWVzdGFtcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aW1lc3RhbXBzLnB1c2gobWF4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGltZXN0YW1wcy5zb3J0KChhLCBiKT0+YSAtIGIpO1xuICAgIH1cbiBfZ2V0VGltZXN0YW1wc0ZvclRhYmxlKCkge1xuICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHRoaXMuX2NhY2hlLmFsbCB8fCBbXTtcbiAgICAgICAgaWYgKHRpbWVzdGFtcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREYXRhVGltZXN0YW1wcygpO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCAmJiBsYWJlbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRpbWVzdGFtcHMgPSB0aGlzLm5vcm1hbGl6ZShkYXRhLmNvbmNhdChsYWJlbCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGltZXN0YW1wcyA9IGRhdGEubGVuZ3RoID8gZGF0YSA6IGxhYmVsO1xuICAgICAgICB9XG4gICAgICAgIHRpbWVzdGFtcHMgPSB0aGlzLl9jYWNoZS5hbGwgPSB0aW1lc3RhbXBzO1xuICAgICAgICByZXR1cm4gdGltZXN0YW1wcztcbiAgICB9XG4gZ2V0RGVjaW1hbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAoaW50ZXJwb2xhdGUodGhpcy5fdGFibGUsIHZhbHVlKSAtIHRoaXMuX21pblBvcykgLyB0aGlzLl90YWJsZVJhbmdlO1xuICAgIH1cbiBnZXRWYWx1ZUZvclBpeGVsKHBpeGVsKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldHMgPSB0aGlzLl9vZmZzZXRzO1xuICAgICAgICBjb25zdCBkZWNpbWFsID0gdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwocGl4ZWwpIC8gb2Zmc2V0cy5mYWN0b3IgLSBvZmZzZXRzLmVuZDtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKHRoaXMuX3RhYmxlLCBkZWNpbWFsICogdGhpcy5fdGFibGVSYW5nZSArIHRoaXMuX21pblBvcywgdHJ1ZSk7XG4gICAgfVxufVxuXG52YXIgc2NhbGVzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuX19wcm90b19fOiBudWxsLFxuQ2F0ZWdvcnlTY2FsZTogQ2F0ZWdvcnlTY2FsZSxcbkxpbmVhclNjYWxlOiBMaW5lYXJTY2FsZSxcbkxvZ2FyaXRobWljU2NhbGU6IExvZ2FyaXRobWljU2NhbGUsXG5SYWRpYWxMaW5lYXJTY2FsZTogUmFkaWFsTGluZWFyU2NhbGUsXG5UaW1lU2NhbGU6IFRpbWVTY2FsZSxcblRpbWVTZXJpZXNTY2FsZTogVGltZVNlcmllc1NjYWxlXG59KTtcblxuY29uc3QgcmVnaXN0ZXJhYmxlcyA9IFtcbiAgICBjb250cm9sbGVycyxcbiAgICBlbGVtZW50cyxcbiAgICBwbHVnaW5zLFxuICAgIHNjYWxlc1xuXTtcblxuZXhwb3J0IHsgQW5pbWF0aW9uLCBBbmltYXRpb25zLCBBcmNFbGVtZW50LCBCYXJDb250cm9sbGVyLCBCYXJFbGVtZW50LCBCYXNlUGxhdGZvcm0sIEJhc2ljUGxhdGZvcm0sIEJ1YmJsZUNvbnRyb2xsZXIsIENhdGVnb3J5U2NhbGUsIENoYXJ0LCBwbHVnaW5fY29sb3JzIGFzIENvbG9ycywgRGF0YXNldENvbnRyb2xsZXIsIHBsdWdpbl9kZWNpbWF0aW9uIGFzIERlY2ltYXRpb24sIERvbVBsYXRmb3JtLCBEb3VnaG51dENvbnRyb2xsZXIsIEVsZW1lbnQsIGluZGV4IGFzIEZpbGxlciwgSW50ZXJhY3Rpb24sIHBsdWdpbl9sZWdlbmQgYXMgTGVnZW5kLCBMaW5lQ29udHJvbGxlciwgTGluZUVsZW1lbnQsIExpbmVhclNjYWxlLCBMb2dhcml0aG1pY1NjYWxlLCBQaWVDb250cm9sbGVyLCBQb2ludEVsZW1lbnQsIFBvbGFyQXJlYUNvbnRyb2xsZXIsIFJhZGFyQ29udHJvbGxlciwgUmFkaWFsTGluZWFyU2NhbGUsIFNjYWxlLCBTY2F0dGVyQ29udHJvbGxlciwgcGx1Z2luX3N1YnRpdGxlIGFzIFN1YlRpdGxlLCBUaWNrcywgVGltZVNjYWxlLCBUaW1lU2VyaWVzU2NhbGUsIHBsdWdpbl90aXRsZSBhcyBUaXRsZSwgcGx1Z2luX3Rvb2x0aXAgYXMgVG9vbHRpcCwgYWRhcHRlcnMgYXMgX2FkYXB0ZXJzLCBfZGV0ZWN0UGxhdGZvcm0sIGFuaW1hdG9yLCBjb250cm9sbGVycywgZGVmYXVsdHMsIGVsZW1lbnRzLCBsYXlvdXRzLCBwbHVnaW5zLCByZWdpc3RlcmFibGVzLCByZWdpc3RyeSwgc2NhbGVzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGFydC5qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///127\n\n}"); - -/***/ }), - -/***/ 128: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ $: () => (/* binding */ unclipArea),\n/* harmony export */ A: () => (/* binding */ _rlookupByKey),\n/* harmony export */ B: () => (/* binding */ _lookupByKey),\n/* harmony export */ C: () => (/* binding */ _isPointInArea),\n/* harmony export */ D: () => (/* binding */ getAngleFromPoint),\n/* harmony export */ E: () => (/* binding */ toPadding),\n/* harmony export */ F: () => (/* binding */ each),\n/* harmony export */ G: () => (/* binding */ getMaximumSize),\n/* harmony export */ H: () => (/* binding */ HALF_PI),\n/* harmony export */ I: () => (/* binding */ _getParentNode),\n/* harmony export */ J: () => (/* binding */ readUsedSize),\n/* harmony export */ K: () => (/* binding */ supportsEventListenerOptions),\n/* harmony export */ L: () => (/* binding */ throttled),\n/* harmony export */ M: () => (/* binding */ _isDomSupported),\n/* harmony export */ N: () => (/* binding */ _factorize),\n/* harmony export */ O: () => (/* binding */ finiteOrDefault),\n/* harmony export */ P: () => (/* binding */ PI),\n/* harmony export */ Q: () => (/* binding */ callback),\n/* harmony export */ R: () => (/* binding */ _addGrace),\n/* harmony export */ S: () => (/* binding */ _limitValue),\n/* harmony export */ T: () => (/* binding */ TAU),\n/* harmony export */ U: () => (/* binding */ toDegrees),\n/* harmony export */ V: () => (/* binding */ _measureText),\n/* harmony export */ W: () => (/* binding */ _int16Range),\n/* harmony export */ X: () => (/* binding */ _alignPixel),\n/* harmony export */ Y: () => (/* binding */ clipArea),\n/* harmony export */ Z: () => (/* binding */ renderText),\n/* harmony export */ _: () => (/* binding */ _arrayUnique),\n/* harmony export */ a: () => (/* binding */ resolve),\n/* harmony export */ a$: () => (/* binding */ getStyle),\n/* harmony export */ a0: () => (/* binding */ toFont),\n/* harmony export */ a1: () => (/* binding */ _toLeftRightCenter),\n/* harmony export */ a2: () => (/* binding */ _alignStartEnd),\n/* harmony export */ a3: () => (/* binding */ overrides),\n/* harmony export */ a4: () => (/* binding */ merge),\n/* harmony export */ a5: () => (/* binding */ _capitalize),\n/* harmony export */ a6: () => (/* binding */ descriptors),\n/* harmony export */ a7: () => (/* binding */ isFunction),\n/* harmony export */ a8: () => (/* binding */ _attachContext),\n/* harmony export */ a9: () => (/* binding */ _createResolver),\n/* harmony export */ aA: () => (/* binding */ getRtlAdapter),\n/* harmony export */ aB: () => (/* binding */ overrideTextDirection),\n/* harmony export */ aC: () => (/* binding */ _textX),\n/* harmony export */ aD: () => (/* binding */ restoreTextDirection),\n/* harmony export */ aE: () => (/* binding */ drawPointLegend),\n/* harmony export */ aF: () => (/* binding */ distanceBetweenPoints),\n/* harmony export */ aG: () => (/* binding */ noop),\n/* harmony export */ aH: () => (/* binding */ _setMinAndMaxByKey),\n/* harmony export */ aI: () => (/* binding */ niceNum),\n/* harmony export */ aJ: () => (/* binding */ almostWhole),\n/* harmony export */ aK: () => (/* binding */ almostEquals),\n/* harmony export */ aL: () => (/* binding */ _decimalPlaces),\n/* harmony export */ aM: () => (/* binding */ Ticks),\n/* harmony export */ aN: () => (/* binding */ log10),\n/* harmony export */ aO: () => (/* binding */ _longestText),\n/* harmony export */ aP: () => (/* binding */ _filterBetween),\n/* harmony export */ aQ: () => (/* binding */ _lookup),\n/* harmony export */ aR: () => (/* binding */ isPatternOrGradient),\n/* harmony export */ aS: () => (/* binding */ getHoverColor),\n/* harmony export */ aT: () => (/* binding */ clone),\n/* harmony export */ aU: () => (/* binding */ _merger),\n/* harmony export */ aV: () => (/* binding */ _mergerIf),\n/* harmony export */ aW: () => (/* binding */ _deprecated),\n/* harmony export */ aX: () => (/* binding */ _splitKey),\n/* harmony export */ aY: () => (/* binding */ toFontString),\n/* harmony export */ aZ: () => (/* binding */ splineCurve),\n/* harmony export */ a_: () => (/* binding */ splineCurveMonotone),\n/* harmony export */ aa: () => (/* binding */ _descriptors),\n/* harmony export */ ab: () => (/* binding */ mergeIf),\n/* harmony export */ ac: () => (/* binding */ uid),\n/* harmony export */ ad: () => (/* binding */ debounce),\n/* harmony export */ ae: () => (/* binding */ retinaScale),\n/* harmony export */ af: () => (/* binding */ clearCanvas),\n/* harmony export */ ag: () => (/* binding */ setsEqual),\n/* harmony export */ ah: () => (/* binding */ getDatasetClipArea),\n/* harmony export */ ai: () => (/* binding */ _elementsEqual),\n/* harmony export */ aj: () => (/* binding */ _isClickEvent),\n/* harmony export */ ak: () => (/* binding */ _isBetween),\n/* harmony export */ al: () => (/* binding */ _normalizeAngle),\n/* harmony export */ am: () => (/* binding */ _readValueToProps),\n/* harmony export */ an: () => (/* binding */ _updateBezierControlPoints),\n/* harmony export */ ao: () => (/* binding */ _computeSegments),\n/* harmony export */ ap: () => (/* binding */ _boundSegments),\n/* harmony export */ aq: () => (/* binding */ _steppedInterpolation),\n/* harmony export */ ar: () => (/* binding */ _bezierInterpolation),\n/* harmony export */ as: () => (/* binding */ _pointInLine),\n/* harmony export */ at: () => (/* binding */ _steppedLineTo),\n/* harmony export */ au: () => (/* binding */ _bezierCurveTo),\n/* harmony export */ av: () => (/* binding */ drawPoint),\n/* harmony export */ aw: () => (/* binding */ addRoundedRectPath),\n/* harmony export */ ax: () => (/* binding */ toTRBL),\n/* harmony export */ ay: () => (/* binding */ toTRBLCorners),\n/* harmony export */ az: () => (/* binding */ _boundSegment),\n/* harmony export */ b: () => (/* binding */ isArray),\n/* harmony export */ b0: () => (/* binding */ fontString),\n/* harmony export */ b1: () => (/* binding */ toLineHeight),\n/* harmony export */ b2: () => (/* binding */ PITAU),\n/* harmony export */ b3: () => (/* binding */ INFINITY),\n/* harmony export */ b4: () => (/* binding */ RAD_PER_DEG),\n/* harmony export */ b5: () => (/* binding */ QUARTER_PI),\n/* harmony export */ b6: () => (/* binding */ TWO_THIRDS_PI),\n/* harmony export */ b7: () => (/* binding */ _angleDiff),\n/* harmony export */ c: () => (/* binding */ color),\n/* harmony export */ d: () => (/* binding */ defaults),\n/* harmony export */ e: () => (/* binding */ effects),\n/* harmony export */ f: () => (/* binding */ resolveObjectKey),\n/* harmony export */ g: () => (/* binding */ isNumberFinite),\n/* harmony export */ h: () => (/* binding */ defined),\n/* harmony export */ i: () => (/* binding */ isObject),\n/* harmony export */ j: () => (/* binding */ createContext),\n/* harmony export */ k: () => (/* binding */ isNullOrUndef),\n/* harmony export */ l: () => (/* binding */ listenArrayEvents),\n/* harmony export */ m: () => (/* binding */ toPercentage),\n/* harmony export */ n: () => (/* binding */ toDimension),\n/* harmony export */ o: () => (/* binding */ formatNumber),\n/* harmony export */ p: () => (/* binding */ _angleBetween),\n/* harmony export */ q: () => (/* binding */ _getStartAndCountOfVisiblePoints),\n/* harmony export */ r: () => (/* binding */ requestAnimFrame),\n/* harmony export */ s: () => (/* binding */ sign),\n/* harmony export */ t: () => (/* binding */ toRadians),\n/* harmony export */ u: () => (/* binding */ unlistenArrayEvents),\n/* harmony export */ v: () => (/* binding */ valueOrDefault),\n/* harmony export */ w: () => (/* binding */ _scaleRangesChanged),\n/* harmony export */ x: () => (/* binding */ isNumber),\n/* harmony export */ y: () => (/* binding */ _parseObjectDataRadialScale),\n/* harmony export */ z: () => (/* binding */ getRelativePosition)\n/* harmony export */ });\n/* harmony import */ var _kurkle_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(129);\n/*!\n * Chart.js v4.5.1\n * https://www.chartjs.org\n * (c) 2025 Chart.js Contributors\n * Released under the MIT License\n */\n\n\n/**\n * @namespace Chart.helpers\n */ /**\n * An empty function that can be used, for example, for optional callback.\n */ function noop() {\n/* noop */ }\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */ const uid = (()=>{\n let id = 0;\n return ()=>id++;\n})();\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isNullOrUndef(value) {\n return value === null || value === undefined;\n}\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */ function isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */ function isNumberFinite(value) {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */ function finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */ function valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 : +value / dimension;\nconst toDimension = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 * dimension : +value;\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */ function callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for(i = len - 1; i >= 0; i--){\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */ function _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for(i = 0, ilen = a0.length; i < ilen; ++i){\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */ function clone(source) {\n if (isArray(source)) {\n return source.map(clone);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for(; k < klen; ++k){\n target[keys[k]] = clone(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return [\n '__proto__',\n 'prototype',\n 'constructor'\n ].indexOf(key) === -1;\n}\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */ function _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\nfunction merge(target, source, options) {\n const sources = isArray(source) ? source : [\n source\n ];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n let current;\n for(let i = 0; i < ilen; ++i){\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n const keys = Object.keys(current);\n for(let k = 0, klen = keys.length; k < klen; ++k){\n merger(keys[k], target, current, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {\n merger: _mergerIf\n });\n}\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */ function _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n/**\n * @private\n */ function _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous + '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': (v)=>v,\n // default resolvers\n x: (o)=>o.x,\n y: (o)=>o.y\n};\n/**\n * @private\n */ function _splitKey(key) {\n const parts = key.split('.');\n const keys = [];\n let tmp = '';\n for (const part of parts){\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\nfunction _getKeyResolver(key) {\n const keys = _splitKey(key);\n return (obj)=>{\n for (const k of keys){\n if (k === '') {\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\nfunction resolveObjectKey(obj, key) {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n/**\n * @private\n */ function _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value)=>typeof value !== 'undefined';\nconst isFunction = (value)=>typeof value === 'function';\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nconst setsEqual = (a, b)=>{\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a){\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n/**\n * @param e - The event\n * @private\n */ function _isClickEvent(e) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */ const PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */ function niceNum(range) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */ function _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for(i = 1; i < sqrt; i++){\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b)=>a - b).pop();\n return result;\n}\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */ function isNonPrimitive(n) {\n return typeof n === 'symbol' || typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n);\n}\nfunction isNumber(n) {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return rounded - epsilon <= x && rounded + epsilon >= x;\n}\n/**\n * @private\n */ function _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for(i = 0, ilen = array.length; i < ilen; i++){\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */ function _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while(Math.round(x * e) / e !== x){\n e *= 10;\n p++;\n }\n return p;\n}\n// Gets the angle from vertical upright to the point about a centre.\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < -0.5 * PI) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */ function _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */ function _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\n/**\n * @private\n */ function _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle;\n}\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */ function _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n/**\n * @param {number} value\n * @private\n */ function _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */ function _isBetween(value, start, end, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index)=>table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while(hi - lo > 1){\n mid = lo + hi >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {\n lo,\n hi\n };\n}\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */ const _lookupByKey = (table, key, value, last)=>_lookup(table, value, last ? (index)=>{\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n } : (index)=>table[index][key] < value);\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */ const _rlookupByKey = (table, key, value)=>_lookup(table, value, (index)=>table[index][key] >= value);\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */ function _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while(start < end && values[start] < min){\n start++;\n }\n while(end > start && values[end - 1] > max){\n end--;\n }\n return start > 0 || end < values.length ? values.slice(start, end) : values;\n}\nconst arrayEvents = [\n 'push',\n 'pop',\n 'shift',\n 'splice',\n 'unshift'\n];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [\n listener\n ]\n }\n });\n arrayEvents.forEach((key)=>{\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value (...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object)=>{\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key)=>{\n delete array[key];\n });\n delete array._chartjs;\n}\n/**\n * @param items\n */ function _arrayUnique(items) {\n const set = new Set(items);\n if (set.size === items.length) {\n return items;\n }\n return Array.from(set);\n}\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n/**\n* Request animation polyfill\n*/ const requestAnimFrame = function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}();\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */ function throttled(fn, thisArg) {\n let argsToUse = [];\n let ticking = false;\n return function(...args) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, ()=>{\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n/**\n * Debounces calling `fn` for `delay` ms\n */ function debounce(fn, delay) {\n let timeout;\n return function(...args) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */ const _toLeftRightCenter = (align)=>align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */ const _alignStartEnd = (align, start, end)=>align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */ const _textX = (align, left, right, rtl)=>{\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n/**\n * Return start and count of visible points.\n * @private\n */ function _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const { iScale , vScale , _parsed } = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = Math.min(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = _parsed.slice(0, start + 1).reverse().findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = _parsed.slice(end - 1).findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {\n start,\n count\n };\n}\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */ function _scaleRangesChanged(meta) {\n const { xScale , yScale , _scaleRanges } = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nconst atEdge = (t)=>t === 0 || t === 1;\nconst elasticIn = (t, s, p)=>-(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p)=>Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */ const effects = {\n linear: (t)=>t,\n easeInQuad: (t)=>t * t,\n easeOutQuad: (t)=>-t * (t - 2),\n easeInOutQuad: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),\n easeInCubic: (t)=>t * t * t,\n easeOutCubic: (t)=>(t -= 1) * t * t + 1,\n easeInOutCubic: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: (t)=>t * t * t * t,\n easeOutQuart: (t)=>-((t -= 1) * t * t * t - 1),\n easeInOutQuart: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: (t)=>t * t * t * t * t,\n easeOutQuint: (t)=>(t -= 1) * t * t * t * t + 1,\n easeInOutQuint: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: (t)=>-Math.cos(t * HALF_PI) + 1,\n easeOutSine: (t)=>Math.sin(t * HALF_PI),\n easeInOutSine: (t)=>-0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: (t)=>t === 0 ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: (t)=>t === 1 ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: (t)=>atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: (t)=>t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: (t)=>Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: (t)=>(t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: (t)=>atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: (t)=>atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic (t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack (t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack (t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack (t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n },\n easeInBounce: (t)=>1 - effects.easeOutBounce(1 - t),\n easeOutBounce (t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < 1 / d) {\n return m * t * t;\n }\n if (t < 2 / d) {\n return m * (t -= 1.5 / d) * t + 0.75;\n }\n if (t < 2.5 / d) {\n return m * (t -= 2.25 / d) * t + 0.9375;\n }\n return m * (t -= 2.625 / d) * t + 0.984375;\n },\n easeInOutBounce: (t)=>t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5\n};\n\nfunction isPatternOrGradient(value) {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n return false;\n}\nfunction color(value) {\n return isPatternOrGradient(value) ? value : new _kurkle_color__WEBPACK_IMPORTED_MODULE_0__.Color(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value) ? value : new _kurkle_color__WEBPACK_IMPORTED_MODULE_0__.Color(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst numbers = [\n 'x',\n 'y',\n 'borderWidth',\n 'radius',\n 'tension'\n];\nconst colors = [\n 'color',\n 'borderColor',\n 'backgroundColor'\n];\nfunction applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined\n });\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name)=>name !== 'onProgress' && name !== 'onComplete' && name !== 'fn'\n });\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n }\n });\n defaults.describe('animations', {\n _fallback: 'animation'\n });\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0\n }\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: (v)=>v | 0\n }\n }\n }\n });\n}\n\nfunction applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst formatters = {\n values (value) {\n return isArray(value) ? value : '' + value;\n },\n numeric (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {\n notation,\n minimumFractionDigits: numDecimal,\n maximumFractionDigits: numDecimal\n };\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue)));\n if ([\n 1,\n 2,\n 3,\n 5,\n 10,\n 15\n ].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n var Ticks = {\n formatters\n};\n\nfunction applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: 'ticks',\n clip: true,\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options)=>options.lineWidth,\n tickColor: (_ctx, options)=>options.color,\n offset: false\n },\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n title: {\n display: false,\n text: '',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2\n }\n });\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name)=>!name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name)=>name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash'\n });\n defaults.describe('scales', {\n _fallback: 'scale'\n });\n defaults.describe('scale.ticks', {\n _scriptable: (name)=>name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name)=>name !== 'backdropPadding'\n });\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\n function getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for(let i = 0, n = keys.length; i < n; ++i){\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope$1(root, scope), values);\n }\n return merge(getScope$1(root, ''), scope);\n}\n class Defaults {\n constructor(_descriptors, _appliers){\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context)=>context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options)=>getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options)=>getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options)=>getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n set(scope, values) {\n return set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n override(scope, values) {\n return set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = '_' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get () {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set (value) {\n this[privateName] = value;\n }\n }\n });\n }\n apply(appliers) {\n appliers.forEach((apply)=>apply(this));\n }\n}\nvar defaults = /* #__PURE__ */ new Defaults({\n _scriptable: (name)=>!name.startsWith('on'),\n _indexable: (name)=>name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false\n }\n}, [\n applyAnimationsDefaults,\n applyLayoutsDefaults,\n applyScaleDefaults\n]);\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */ function toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;\n}\n/**\n * @private\n */ function _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n/**\n * @private\n */ // eslint-disable-next-line complexity\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for(i = 0; i < ilen; i++){\n thing = arrayOfThings[i];\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for(j = 0, jlen = thing.length; j < jlen; j++){\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for(i = 0; i < gcLen; i++){\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */ function _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n/**\n * Clears the entire canvas.\n */ function clearCanvas(canvas, ctx) {\n if (!ctx && !canvas) {\n return;\n }\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n// eslint-disable-next-line complexity\nfunction drawPointLegend(ctx, options, x, y, w) {\n let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch(style){\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */ case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */ case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */ function _isPointInArea(point, area, margin) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\n/**\n * @private\n */ function _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n/**\n * @private\n */ function _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(flip ? previous.cp1x : previous.cp2x, flip ? previous.cp1y : previous.cp2y, flip ? target.cp2x : target.cp1x, flip ? target.cp2y : target.cp1y, target.x, target.y);\n}\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */ const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\nfunction drawBackdrop(ctx, opts) {\n const oldColor = ctx.fillStyle;\n ctx.fillStyle = opts.color;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n/**\n * Render text onto the canvas\n */ function renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [\n text\n ];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n for(i = 0; i < lines.length; ++i){\n line = lines[i];\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n y += Number(font.lineHeight);\n }\n ctx.restore();\n}\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */ function addRoundedRectPath(ctx, rect) {\n const { x , y , w , h , radius } = rect;\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n/**\n * @alias Chart.helpers.options\n * @namespace\n */ /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */ function toLineHeight(value, size) {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch(matches[3]){\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero = (v)=>+v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value) ? objProps ? (prop)=>valueOrDefault(value[prop], value[props[prop]]) : (prop)=>value[prop] : ()=>value;\n for (const prop of keys){\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */ function toTRBL(value) {\n return _readValueToProps(value, {\n top: 'y',\n right: 'x',\n bottom: 'y',\n left: 'x'\n });\n}\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */ function toTRBLCorners(value) {\n return _readValueToProps(value, [\n 'topLeft',\n 'topRight',\n 'bottomLeft',\n 'bottomRight'\n ]);\n}\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */ function toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */ function toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n font.string = toFontString(font);\n return font;\n}\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */ function resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for(i = 0, ilen = inputs.length; i < ilen; ++i){\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */ function _addGrace(minmax, grace, beginAtZero) {\n const { min , max } = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value, add)=>beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\nfunction createContext(parentContext, context) {\n return Object.assign(Object.create(parentContext), context);\n}\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */ function _createResolver(scopes, prefixes = [\n ''\n], rootScopes, fallback, getTarget = ()=>scopes[0]) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope)=>_createResolver([\n scope,\n ...scopes\n ], prefixes, finalRootScopes, fallback)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop) {\n return _cached(target, prop, ()=>_resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys (target) {\n return getKeysFromAllScopes(target);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n });\n}\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */ function _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx)=>_attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope)=>_attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop, receiver) {\n return _cached(target, prop, ()=>_resolveWithContext(target, prop, receiver));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? {\n enumerable: true,\n configurable: true\n } : undefined : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(proxy);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return Reflect.has(proxy, prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys () {\n return Reflect.ownKeys(proxy);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n });\n}\n/**\n * @private\n */ function _descriptors(proxy, defaults = {\n scriptable: true,\n indexable: true\n}) {\n const { _scriptable =defaults.scriptable , _indexable =defaults.indexable , _allKeys =defaults.allKeys } = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : ()=>_scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : ()=>_indexable\n };\n}\nconst readKey = (prefix, name)=>prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value)=>isObject(value) && prop !== 'adapters' && (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n let value = _proxy[prop]; // resolve from proxy\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, getValue, target, receiver) {\n const { _proxy , _context , _subProxy , _stack } = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter((s)=>s !== arr);\n value = [];\n for (const item of arr){\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent)=>key === true ? parent : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n for (const parent of parentScopes){\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [\n ...parentScopes,\n ...rootScopes\n ];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [\n ''\n ], rootScopes, fallback, ()=>subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n while(key){\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes){\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes){\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes){\n for (const key of Object.keys(scope).filter((k)=>!k.startsWith('_'))){\n set.add(key);\n }\n }\n return Array.from(set);\n}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n const { iScale } = meta;\n const { key ='r' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i)=>i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis)=>indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n // This function must also respect \"skipped\" points\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n/**\n * Adjust tangents to ensure monotonic properties\n */ function monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen - 1; ++i){\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */ function splineCurveMonotone(points, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i] : !pointAfter ? deltaK[i - 1] : sign(deltaK[i - 1]) !== sign(deltaK[i]) ? 0 : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for(i = 0, ilen = points.length; i < ilen; ++i){\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n/**\n * @private\n */ function _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt)=>!pt.skip);\n }\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for(i = 0, ilen = points.length; i < ilen; ++i){\n point = points[i];\n controlPoints = splineCurve(prev, point, points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen], options.tension);\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\n/**\n * @private\n */ function _isDomSupported() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n/**\n * @private\n */ function _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n}\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */ function parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst getComputedStyle = (element)=>element.ownerDocument.defaultView.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = [\n 'top',\n 'right',\n 'bottom',\n 'left'\n];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? '-' + suffix : '';\n for(let i = 0; i < 4; i++){\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target)=>(x > 0 || y > 0) && (!target || !target.shadowRoot);\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */ function getCanvasPosition(e, canvas) {\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const { offsetX , offsetY } = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {\n x,\n y,\n box\n };\n}\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */ function getRelativePosition(event, chart) {\n if ('native' in event) {\n return event;\n }\n const { canvas , currentDevicePixelRatio } = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const { x , y , box } = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let { width , height } = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = (v)=>Math.round(v * 10) / 10;\n// eslint-disable-next-line complexity\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let { width , height } = containerSize;\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n return {\n width,\n height\n };\n}\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */ function retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n chart.height = round1(chart.height);\n chart.width = round1(chart.width);\n const canvas = chart.canvas;\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */ const supportsEventListenerOptions = function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive () {\n passiveSupported = true;\n return false;\n }\n };\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}();\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */ function readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\n/**\n * @private\n */ function _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n/**\n * @private\n */ function _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y : mode === 'after' ? t < 1 ? p1.y : p2.y : t > 0 ? p2.y : p1.y\n };\n}\n/**\n * @private\n */ function _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {\n x: p1.cp2x,\n y: p1.cp2y\n };\n const cp2 = {\n x: p2.cp1x,\n y: p2.cp1y\n };\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x (x) {\n return rectX + rectX + width - x;\n },\n setWidth (w) {\n width = w;\n },\n textAlign (align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus (x, value) {\n return x - value;\n },\n leftForLtr (x, itemWidth) {\n return x - itemWidth;\n }\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x (x) {\n return x;\n },\n setWidth (w) {},\n textAlign (align) {\n return align;\n },\n xPlus (x, value) {\n return x + value;\n },\n leftForLtr (x, _itemWidth) {\n return x;\n }\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction')\n ];\n style.setProperty('direction', direction, 'important');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle\n };\n }\n return {\n between: _isBetween,\n compare: (a, b)=>a - b,\n normalize: (x)=>x\n };\n}\nfunction normalizeSegment({ start , end , count , loop , style }) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const { property , start: startBound , end: endBound } = bounds;\n const { between , normalize } = propertyFn(property);\n const count = points.length;\n let { start , end , loop } = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for(i = 0, ilen = count; i < ilen; ++i){\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {\n start,\n end,\n loop,\n style: segment.style\n };\n}\n function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [\n segment\n ];\n }\n const { property , start: startBound , end: endBound } = bounds;\n const count = points.length;\n const { compare , between , normalize } = propertyFn(property);\n const { start , end , loop , style } = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = ()=>between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = ()=>compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = ()=>inside || startIsBefore();\n const shouldStop = ()=>!inside || endIsBefore();\n for(let i = start, prev = start; i <= end; ++i){\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({\n start: subStart,\n end: i,\n loop,\n count,\n style\n }));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({\n start: subStart,\n end,\n loop,\n count,\n style\n }));\n }\n return result;\n}\n function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for(let i = 0; i < segments.length; i++){\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n function findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while(start < count && !points[start].skip){\n start++;\n }\n }\n while(start < count && points[start].skip){\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while(end > start && points[end % count].skip){\n end--;\n }\n end %= count;\n return {\n start,\n end\n };\n}\n function solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for(end = start + 1; end <= max; ++end){\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({\n start: start % count,\n end: (end - 1) % count,\n loop\n });\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({\n start: start % count,\n end: last % count,\n loop\n });\n }\n return result;\n}\n function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const { start , end } = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles(line, [\n {\n start,\n end,\n loop\n }\n ], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n function splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n function doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const { _datasetIndex: datasetIndex , options: { spanGaps } } = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n s += count;\n while(points[s % count].skip){\n s -= dir;\n }\n while(points[e % count].skip){\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({\n start: s % count,\n end: e % count,\n loop: l,\n style: st\n });\n prevStyle = st;\n start = e % count;\n }\n }\n for (const segment of segments){\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for(i = start + 1; i <= segment.end; i++){\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n\nfunction getSizeForArea(scale, chartArea, field) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\nfunction getDatasetArea(meta, chartArea) {\n const { xScale , yScale } = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\nfunction getDatasetClipArea(chart, meta) {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n\n\n//# sourceMappingURL=helpers.dataset.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI4LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFFBQVE7QUFDckM7QUFDQTtBQUNBLFVBQVU7QUFDVix1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsVUFBVTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsVUFBVTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxVQUFVO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsNkJBQTZCO0FBQzdDO0FBQ0E7QUFDQSxnQkFBZ0IsdUNBQXVDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNBO0FBQ0EsWUFBWSxrQ0FBa0M7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsZ0RBQUs7QUFDekQ7QUFDQTtBQUNBLG9EQUFvRCxnREFBSztBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLE9BQU87QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSw0Q0FBNEMsVUFBVTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDBCQUEwQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxVQUFVO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMsb0NBQW9DO0FBQ3BDO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxnQ0FBZ0M7QUFDaEM7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsWUFBWSxrR0FBa0c7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNkRBQTZEO0FBQ3pFLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSwwQ0FBMEM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZEQUE2RDtBQUN6RTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsa0JBQWtCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsYUFBYTtBQUM5QyxnQ0FBZ0MsWUFBWTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FB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Q0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtQkFBbUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFMDZFO0FBQzE2RSIsInNvdXJjZXMiOlsid2VicGFjazovL2FyY2hpdGVjdHVpLWh0bWwtZnJlZS8uL25vZGVfbW9kdWxlcy9jaGFydC5qcy9kaXN0L2NodW5rcy9oZWxwZXJzLmRhdGFzZXQuanM/MWY5NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENoYXJ0LmpzIHY0LjUuMVxuICogaHR0cHM6Ly93d3cuY2hhcnRqcy5vcmdcbiAqIChjKSAyMDI1IENoYXJ0LmpzIENvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlXG4gKi9cbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnQGt1cmtsZS9jb2xvcic7XG5cbi8qKlxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzXG4gKi8gLyoqXG4gKiBBbiBlbXB0eSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgZm9yIG9wdGlvbmFsIGNhbGxiYWNrLlxuICovIGZ1bmN0aW9uIG5vb3AoKSB7XG4vKiBub29wICovIH1cbi8qKlxuICogUmV0dXJucyBhIHVuaXF1ZSBpZCwgc2VxdWVudGlhbGx5IGdlbmVyYXRlZCBmcm9tIGEgZ2xvYmFsIHZhcmlhYmxlLlxuICovIGNvbnN0IHVpZCA9ICgoKT0+e1xuICAgIGxldCBpZCA9IDA7XG4gICAgcmV0dXJuICgpPT5pZCsrO1xufSkoKTtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgbmVpdGhlciBudWxsIG5vciB1bmRlZmluZWQsIGVsc2UgcmV0dXJucyBmYWxzZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQHNpbmNlIDIuNy4wXG4gKi8gZnVuY3Rpb24gaXNOdWxsT3JVbmRlZih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSAoaW5jbHVkaW5nIHR5cGVkIGFycmF5cyksIGVsc2UgcmV0dXJucyBmYWxzZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQGZ1bmN0aW9uXG4gKi8gZnVuY3Rpb24gaXNBcnJheSh2YWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5ICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICBpZiAodHlwZS5zbGljZSgwLCA3KSA9PT0gJ1tvYmplY3QnICYmIHR5cGUuc2xpY2UoLTYpID09PSAnQXJyYXldJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QgKGV4Y2x1ZGluZyBudWxsKSwgZWxzZSByZXR1cm5zIGZhbHNlLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAc2luY2UgMi43LjBcbiAqLyBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIHJldHVybnMgZmFsc2VcbiAqIEBwYXJhbSB2YWx1ZSAgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqLyBmdW5jdGlvbiBpc051bWJlckZpbml0ZSh2YWx1ZSkge1xuICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgJiYgaXNGaW5pdGUoK3ZhbHVlKTtcbn1cbi8qKlxuICogUmV0dXJucyBgdmFsdWVgIGlmIGZpbml0ZSwgZWxzZSByZXR1cm5zIGBkZWZhdWx0VmFsdWVgLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBkZWZpbmVkLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYHZhbHVlYCBpcyBub3QgZmluaXRlLlxuICovIGZ1bmN0aW9uIGZpbml0ZU9yRGVmYXVsdCh2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIGlzTnVtYmVyRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xufVxuLyoqXG4gKiBSZXR1cm5zIGB2YWx1ZWAgaWYgZGVmaW5lZCwgZWxzZSByZXR1cm5zIGBkZWZhdWx0VmFsdWVgLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBkZWZpbmVkLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYHZhbHVlYCBpcyB1bmRlZmluZWQuXG4gKi8gZnVuY3Rpb24gdmFsdWVPckRlZmF1bHQodmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG59XG5jb25zdCB0b1BlcmNlbnRhZ2UgPSAodmFsdWUsIGRpbWVuc2lvbik9PnR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJyUnKSA/IHBhcnNlRmxvYXQodmFsdWUpIC8gMTAwIDogK3ZhbHVlIC8gZGltZW5zaW9uO1xuY29uc3QgdG9EaW1lbnNpb24gPSAodmFsdWUsIGRpbWVuc2lvbik9PnR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJyUnKSA/IHBhcnNlRmxvYXQodmFsdWUpIC8gMTAwICogZGltZW5zaW9uIDogK3ZhbHVlO1xuLyoqXG4gKiBDYWxscyBgZm5gIHdpdGggdGhlIGdpdmVuIGBhcmdzYCBpbiB0aGUgc2NvcGUgZGVmaW5lZCBieSBgdGhpc0FyZ2AgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSByZXR1cm5lZCBieSBgZm5gLiBJZiBgZm5gIGlzIG5vdCBhIGZ1bmN0aW9uLCB0aGlzIG1ldGhvZCByZXR1cm5zIHVuZGVmaW5lZC5cbiAqIEBwYXJhbSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHdpdGggd2hpY2ggYGZuYCBzaG91bGQgYmUgY2FsbGVkLlxuICogQHBhcmFtIFt0aGlzQXJnXSAtIFRoZSB2YWx1ZSBvZiBgdGhpc2AgcHJvdmlkZWQgZm9yIHRoZSBjYWxsIHRvIGBmbmAuXG4gKi8gZnVuY3Rpb24gY2FsbGJhY2soZm4sIGFyZ3MsIHRoaXNBcmcpIHtcbiAgICBpZiAoZm4gJiYgdHlwZW9mIGZuLmNhbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVhY2gobG9vcGFibGUsIGZuLCB0aGlzQXJnLCByZXZlcnNlKSB7XG4gICAgbGV0IGksIGxlbiwga2V5cztcbiAgICBpZiAoaXNBcnJheShsb29wYWJsZSkpIHtcbiAgICAgICAgbGVuID0gbG9vcGFibGUubGVuZ3RoO1xuICAgICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICAgICAgZm9yKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSl7XG4gICAgICAgICAgICAgICAgZm4uY2FsbCh0aGlzQXJnLCBsb29wYWJsZVtpXSwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKyl7XG4gICAgICAgICAgICAgICAgZm4uY2FsbCh0aGlzQXJnLCBsb29wYWJsZVtpXSwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxvb3BhYmxlKSkge1xuICAgICAgICBrZXlzID0gT2JqZWN0LmtleXMobG9vcGFibGUpO1xuICAgICAgICBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspe1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzQXJnLCBsb29wYWJsZVtrZXlzW2ldXSwga2V5c1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYGEwYCBhbmQgYGExYCBhcnJheXMgaGF2ZSB0aGUgc2FtZSBjb250ZW50LCBlbHNlIHJldHVybnMgZmFsc2UuXG4gKiBAcGFyYW0gYTAgLSBUaGUgYXJyYXkgdG8gY29tcGFyZVxuICogQHBhcmFtIGExIC0gVGhlIGFycmF5IHRvIGNvbXBhcmVcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2VsZW1lbnRzRXF1YWwoYTAsIGExKSB7XG4gICAgbGV0IGksIGlsZW4sIHYwLCB2MTtcbiAgICBpZiAoIWEwIHx8ICFhMSB8fCBhMC5sZW5ndGggIT09IGExLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvcihpID0gMCwgaWxlbiA9IGEwLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIHYwID0gYTBbaV07XG4gICAgICAgIHYxID0gYTFbaV07XG4gICAgICAgIGlmICh2MC5kYXRhc2V0SW5kZXggIT09IHYxLmRhdGFzZXRJbmRleCB8fCB2MC5pbmRleCAhPT0gdjEuaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGRlZXAgY29weSBvZiBgc291cmNlYCB3aXRob3V0IGtlZXBpbmcgcmVmZXJlbmNlcyBvbiBvYmplY3RzIGFuZCBhcnJheXMuXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIHZhbHVlIHRvIGNsb25lLlxuICovIGZ1bmN0aW9uIGNsb25lKHNvdXJjZSkge1xuICAgIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5tYXAoY2xvbmUpO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgY29uc3Qga2xlbiA9IGtleXMubGVuZ3RoO1xuICAgICAgICBsZXQgayA9IDA7XG4gICAgICAgIGZvcig7IGsgPCBrbGVuOyArK2spe1xuICAgICAgICAgICAgdGFyZ2V0W2tleXNba11dID0gY2xvbmUoc291cmNlW2tleXNba11dKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xufVxuZnVuY3Rpb24gaXNWYWxpZEtleShrZXkpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAnX19wcm90b19fJyxcbiAgICAgICAgJ3Byb3RvdHlwZScsXG4gICAgICAgICdjb25zdHJ1Y3RvcidcbiAgICBdLmluZGV4T2Yoa2V5KSA9PT0gLTE7XG59XG4vKipcbiAqIFRoZSBkZWZhdWx0IG1lcmdlciB3aGVuIENoYXJ0LmhlbHBlcnMubWVyZ2UgaXMgY2FsbGVkIHdpdGhvdXQgbWVyZ2VyIG9wdGlvbi5cbiAqIE5vdGUoU0IpOiBhbHNvIHVzZWQgYnkgbWVyZ2VDb25maWcgYW5kIG1lcmdlU2NhbGVDb25maWcgYXMgZmFsbGJhY2suXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9tZXJnZXIoa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIGlmICghaXNWYWxpZEtleShrZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdHZhbCA9IHRhcmdldFtrZXldO1xuICAgIGNvbnN0IHN2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodHZhbCkgJiYgaXNPYmplY3Qoc3ZhbCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBtZXJnZSh0dmFsLCBzdmFsLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IGNsb25lKHN2YWwpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc291cmNlcyA9IGlzQXJyYXkoc291cmNlKSA/IHNvdXJjZSA6IFtcbiAgICAgICAgc291cmNlXG4gICAgXTtcbiAgICBjb25zdCBpbGVuID0gc291cmNlcy5sZW5ndGg7XG4gICAgaWYgKCFpc09iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IG1lcmdlciA9IG9wdGlvbnMubWVyZ2VyIHx8IF9tZXJnZXI7XG4gICAgbGV0IGN1cnJlbnQ7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGN1cnJlbnQgPSBzb3VyY2VzW2ldO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGN1cnJlbnQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY3VycmVudCk7XG4gICAgICAgIGZvcihsZXQgayA9IDAsIGtsZW4gPSBrZXlzLmxlbmd0aDsgayA8IGtsZW47ICsrayl7XG4gICAgICAgICAgICBtZXJnZXIoa2V5c1trXSwgdGFyZ2V0LCBjdXJyZW50LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gbWVyZ2VJZih0YXJnZXQsIHNvdXJjZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICByZXR1cm4gbWVyZ2UodGFyZ2V0LCBzb3VyY2UsIHtcbiAgICAgICAgbWVyZ2VyOiBfbWVyZ2VySWZcbiAgICB9KTtcbn1cbi8qKlxuICogTWVyZ2VzIHNvdXJjZVtrZXldIGluIHRhcmdldFtrZXldIG9ubHkgaWYgdGFyZ2V0W2tleV0gaXMgdW5kZWZpbmVkLlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfbWVyZ2VySWYoa2V5LCB0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmICghaXNWYWxpZEtleShrZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdHZhbCA9IHRhcmdldFtrZXldO1xuICAgIGNvbnN0IHN2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodHZhbCkgJiYgaXNPYmplY3Qoc3ZhbCkpIHtcbiAgICAgICAgbWVyZ2VJZih0dmFsLCBzdmFsKTtcbiAgICB9IGVsc2UgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gY2xvbmUoc3ZhbCk7XG4gICAgfVxufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9kZXByZWNhdGVkKHNjb3BlLCB2YWx1ZSwgcHJldmlvdXMsIGN1cnJlbnQpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oc2NvcGUgKyAnOiBcIicgKyBwcmV2aW91cyArICdcIiBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIFwiJyArIGN1cnJlbnQgKyAnXCIgaW5zdGVhZCcpO1xuICAgIH1cbn1cbi8vIHJlc29sdmVPYmplY3RLZXkgcmVzb2x2ZXIgY2FjaGVcbmNvbnN0IGtleVJlc29sdmVycyA9IHtcbiAgICAvLyBDaGFydC5oZWxwZXJzLmNvcmUgcmVzb2x2ZU9iamVjdEtleSBzaG91bGQgcmVzb2x2ZSBlbXB0eSBrZXkgdG8gcm9vdCBvYmplY3RcbiAgICAnJzogKHYpPT52LFxuICAgIC8vIGRlZmF1bHQgcmVzb2x2ZXJzXG4gICAgeDogKG8pPT5vLngsXG4gICAgeTogKG8pPT5vLnlcbn07XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX3NwbGl0S2V5KGtleSkge1xuICAgIGNvbnN0IHBhcnRzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgY29uc3Qga2V5cyA9IFtdO1xuICAgIGxldCB0bXAgPSAnJztcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpe1xuICAgICAgICB0bXAgKz0gcGFydDtcbiAgICAgICAgaWYgKHRtcC5lbmRzV2l0aCgnXFxcXCcpKSB7XG4gICAgICAgICAgICB0bXAgPSB0bXAuc2xpY2UoMCwgLTEpICsgJy4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5cy5wdXNoKHRtcCk7XG4gICAgICAgICAgICB0bXAgPSAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbn1cbmZ1bmN0aW9uIF9nZXRLZXlSZXNvbHZlcihrZXkpIHtcbiAgICBjb25zdCBrZXlzID0gX3NwbGl0S2V5KGtleSk7XG4gICAgcmV0dXJuIChvYmopPT57XG4gICAgICAgIGZvciAoY29uc3QgayBvZiBrZXlzKXtcbiAgICAgICAgICAgIGlmIChrID09PSAnJykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqID0gb2JqICYmIG9ialtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlT2JqZWN0S2V5KG9iaiwga2V5KSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSBrZXlSZXNvbHZlcnNba2V5XSB8fCAoa2V5UmVzb2x2ZXJzW2tleV0gPSBfZ2V0S2V5UmVzb2x2ZXIoa2V5KSk7XG4gICAgcmV0dXJuIHJlc29sdmVyKG9iaik7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2NhcGl0YWxpemUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn1cbmNvbnN0IGRlZmluZWQgPSAodmFsdWUpPT50eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWx1ZSk9PnR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMTEyODg1NS9jb21wYXJpbmctZWNtYTYtc2V0cy1mb3ItZXF1YWxpdHkjMzExMjkzODRcbmNvbnN0IHNldHNFcXVhbCA9IChhLCBiKT0+e1xuICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBhKXtcbiAgICAgICAgaWYgKCFiLmhhcyhpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuICogQHBhcmFtIGUgLSBUaGUgZXZlbnRcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2lzQ2xpY2tFdmVudChlKSB7XG4gICAgcmV0dXJuIGUudHlwZSA9PT0gJ21vdXNldXAnIHx8IGUudHlwZSA9PT0gJ2NsaWNrJyB8fCBlLnR5cGUgPT09ICdjb250ZXh0bWVudSc7XG59XG5cbi8qKlxuICogQGFsaWFzIENoYXJ0LmhlbHBlcnMubWF0aFxuICogQG5hbWVzcGFjZVxuICovIGNvbnN0IFBJID0gTWF0aC5QSTtcbmNvbnN0IFRBVSA9IDIgKiBQSTtcbmNvbnN0IFBJVEFVID0gVEFVICsgUEk7XG5jb25zdCBJTkZJTklUWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbmNvbnN0IFJBRF9QRVJfREVHID0gUEkgLyAxODA7XG5jb25zdCBIQUxGX1BJID0gUEkgLyAyO1xuY29uc3QgUVVBUlRFUl9QSSA9IFBJIC8gNDtcbmNvbnN0IFRXT19USElSRFNfUEkgPSBQSSAqIDIgLyAzO1xuY29uc3QgbG9nMTAgPSBNYXRoLmxvZzEwO1xuY29uc3Qgc2lnbiA9IE1hdGguc2lnbjtcbmZ1bmN0aW9uIGFsbW9zdEVxdWFscyh4LCB5LCBlcHNpbG9uKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHggLSB5KSA8IGVwc2lsb247XG59XG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBuaWNlIG51bWJlciBhbGdvcml0aG0gdXNlZCBpbiBkZXRlcm1pbmluZyB3aGVyZSBheGlzIGxhYmVscyB3aWxsIGdvXG4gKi8gZnVuY3Rpb24gbmljZU51bShyYW5nZSkge1xuICAgIGNvbnN0IHJvdW5kZWRSYW5nZSA9IE1hdGgucm91bmQocmFuZ2UpO1xuICAgIHJhbmdlID0gYWxtb3N0RXF1YWxzKHJhbmdlLCByb3VuZGVkUmFuZ2UsIHJhbmdlIC8gMTAwMCkgPyByb3VuZGVkUmFuZ2UgOiByYW5nZTtcbiAgICBjb25zdCBuaWNlUmFuZ2UgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihsb2cxMChyYW5nZSkpKTtcbiAgICBjb25zdCBmcmFjdGlvbiA9IHJhbmdlIC8gbmljZVJhbmdlO1xuICAgIGNvbnN0IG5pY2VGcmFjdGlvbiA9IGZyYWN0aW9uIDw9IDEgPyAxIDogZnJhY3Rpb24gPD0gMiA/IDIgOiBmcmFjdGlvbiA8PSA1ID8gNSA6IDEwO1xuICAgIHJldHVybiBuaWNlRnJhY3Rpb24gKiBuaWNlUmFuZ2U7XG59XG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmFjdG9ycyBzb3J0ZWQgZnJvbSAxIHRvIHNxcnQodmFsdWUpXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9mYWN0b3JpemUodmFsdWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBzcXJ0ID0gTWF0aC5zcXJ0KHZhbHVlKTtcbiAgICBsZXQgaTtcbiAgICBmb3IoaSA9IDE7IGkgPCBzcXJ0OyBpKyspe1xuICAgICAgICBpZiAodmFsdWUgJSBpID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlIC8gaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNxcnQgPT09IChzcXJ0IHwgMCkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goc3FydCk7XG4gICAgfVxuICAgIHJlc3VsdC5zb3J0KChhLCBiKT0+YSAtIGIpLnBvcCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoYXQgYXR0ZW1wdGluZyB0byBjb2VyY2UgbiB0byBzdHJpbmcgb3IgbnVtYmVyIHdvbid0IHRocm93IGEgVHlwZUVycm9yLlxuICovIGZ1bmN0aW9uIGlzTm9uUHJpbWl0aXZlKG4pIHtcbiAgICByZXR1cm4gdHlwZW9mIG4gPT09ICdzeW1ib2wnIHx8IHR5cGVvZiBuID09PSAnb2JqZWN0JyAmJiBuICE9PSBudWxsICYmICEoU3ltYm9sLnRvUHJpbWl0aXZlIGluIG4gfHwgJ3RvU3RyaW5nJyBpbiBuIHx8ICd2YWx1ZU9mJyBpbiBuKTtcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyKG4pIHtcbiAgICByZXR1cm4gIWlzTm9uUHJpbWl0aXZlKG4pICYmICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcbn1cbmZ1bmN0aW9uIGFsbW9zdFdob2xlKHgsIGVwc2lsb24pIHtcbiAgICBjb25zdCByb3VuZGVkID0gTWF0aC5yb3VuZCh4KTtcbiAgICByZXR1cm4gcm91bmRlZCAtIGVwc2lsb24gPD0geCAmJiByb3VuZGVkICsgZXBzaWxvbiA+PSB4O1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9zZXRNaW5BbmRNYXhCeUtleShhcnJheSwgdGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgIGxldCBpLCBpbGVuLCB2YWx1ZTtcbiAgICBmb3IoaSA9IDAsIGlsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBpbGVuOyBpKyspe1xuICAgICAgICB2YWx1ZSA9IGFycmF5W2ldW3Byb3BlcnR5XTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRhcmdldC5taW4gPSBNYXRoLm1pbih0YXJnZXQubWluLCB2YWx1ZSk7XG4gICAgICAgICAgICB0YXJnZXQubWF4ID0gTWF0aC5tYXgodGFyZ2V0Lm1heCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdG9SYWRpYW5zKGRlZ3JlZXMpIHtcbiAgICByZXR1cm4gZGVncmVlcyAqIChQSSAvIDE4MCk7XG59XG5mdW5jdGlvbiB0b0RlZ3JlZXMocmFkaWFucykge1xuICAgIHJldHVybiByYWRpYW5zICogKDE4MCAvIFBJKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXG4gKiBpLmUuIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LCBvZiB0aGUgdmFsdWUgb2YgdGhpcyBOdW1iZXIuXG4gKiBAcGFyYW0geCAtIEEgbnVtYmVyLlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy5cbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2RlY2ltYWxQbGFjZXMoeCkge1xuICAgIGlmICghaXNOdW1iZXJGaW5pdGUoeCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZSA9IDE7XG4gICAgbGV0IHAgPSAwO1xuICAgIHdoaWxlKE1hdGgucm91bmQoeCAqIGUpIC8gZSAhPT0geCl7XG4gICAgICAgIGUgKj0gMTA7XG4gICAgICAgIHArKztcbiAgICB9XG4gICAgcmV0dXJuIHA7XG59XG4vLyBHZXRzIHRoZSBhbmdsZSBmcm9tIHZlcnRpY2FsIHVwcmlnaHQgdG8gdGhlIHBvaW50IGFib3V0IGEgY2VudHJlLlxuZnVuY3Rpb24gZ2V0QW5nbGVGcm9tUG9pbnQoY2VudHJlUG9pbnQsIGFuZ2xlUG9pbnQpIHtcbiAgICBjb25zdCBkaXN0YW5jZUZyb21YQ2VudGVyID0gYW5nbGVQb2ludC54IC0gY2VudHJlUG9pbnQueDtcbiAgICBjb25zdCBkaXN0YW5jZUZyb21ZQ2VudGVyID0gYW5nbGVQb2ludC55IC0gY2VudHJlUG9pbnQueTtcbiAgICBjb25zdCByYWRpYWxEaXN0YW5jZUZyb21DZW50ZXIgPSBNYXRoLnNxcnQoZGlzdGFuY2VGcm9tWENlbnRlciAqIGRpc3RhbmNlRnJvbVhDZW50ZXIgKyBkaXN0YW5jZUZyb21ZQ2VudGVyICogZGlzdGFuY2VGcm9tWUNlbnRlcik7XG4gICAgbGV0IGFuZ2xlID0gTWF0aC5hdGFuMihkaXN0YW5jZUZyb21ZQ2VudGVyLCBkaXN0YW5jZUZyb21YQ2VudGVyKTtcbiAgICBpZiAoYW5nbGUgPCAtMC41ICogUEkpIHtcbiAgICAgICAgYW5nbGUgKz0gVEFVOyAvLyBtYWtlIHN1cmUgdGhlIHJldHVybmVkIGFuZ2xlIGlzIGluIHRoZSByYW5nZSBvZiAoLVBJLzIsIDNQSS8yXVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBhbmdsZSxcbiAgICAgICAgZGlzdGFuY2U6IHJhZGlhbERpc3RhbmNlRnJvbUNlbnRlclxuICAgIH07XG59XG5mdW5jdGlvbiBkaXN0YW5jZUJldHdlZW5Qb2ludHMocHQxLCBwdDIpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHB0Mi54IC0gcHQxLngsIDIpICsgTWF0aC5wb3cocHQyLnkgLSBwdDEueSwgMikpO1xufVxuLyoqXG4gKiBTaG9ydGVzdCBkaXN0YW5jZSBiZXR3ZWVuIGFuZ2xlcywgaW4gZWl0aGVyIGRpcmVjdGlvbi5cbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2FuZ2xlRGlmZihhLCBiKSB7XG4gICAgcmV0dXJuIChhIC0gYiArIFBJVEFVKSAlIFRBVSAtIFBJO1xufVxuLyoqXG4gKiBOb3JtYWxpemUgYW5nbGUgdG8gYmUgYmV0d2VlbiAwIGFuZCAyKlBJXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9ub3JtYWxpemVBbmdsZShhKSB7XG4gICAgcmV0dXJuIChhICUgVEFVICsgVEFVKSAlIFRBVTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfYW5nbGVCZXR3ZWVuKGFuZ2xlLCBzdGFydCwgZW5kLCBzYW1lQW5nbGVJc0Z1bGxDaXJjbGUpIHtcbiAgICBjb25zdCBhID0gX25vcm1hbGl6ZUFuZ2xlKGFuZ2xlKTtcbiAgICBjb25zdCBzID0gX25vcm1hbGl6ZUFuZ2xlKHN0YXJ0KTtcbiAgICBjb25zdCBlID0gX25vcm1hbGl6ZUFuZ2xlKGVuZCk7XG4gICAgY29uc3QgYW5nbGVUb1N0YXJ0ID0gX25vcm1hbGl6ZUFuZ2xlKHMgLSBhKTtcbiAgICBjb25zdCBhbmdsZVRvRW5kID0gX25vcm1hbGl6ZUFuZ2xlKGUgLSBhKTtcbiAgICBjb25zdCBzdGFydFRvQW5nbGUgPSBfbm9ybWFsaXplQW5nbGUoYSAtIHMpO1xuICAgIGNvbnN0IGVuZFRvQW5nbGUgPSBfbm9ybWFsaXplQW5nbGUoYSAtIGUpO1xuICAgIHJldHVybiBhID09PSBzIHx8IGEgPT09IGUgfHwgc2FtZUFuZ2xlSXNGdWxsQ2lyY2xlICYmIHMgPT09IGUgfHwgYW5nbGVUb1N0YXJ0ID4gYW5nbGVUb0VuZCAmJiBzdGFydFRvQW5nbGUgPCBlbmRUb0FuZ2xlO1xufVxuLyoqXG4gKiBMaW1pdCBgdmFsdWVgIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBtaW5cbiAqIEBwYXJhbSBtYXhcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2xpbWl0VmFsdWUodmFsdWUsIG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xufVxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2ludDE2UmFuZ2UodmFsdWUpIHtcbiAgICByZXR1cm4gX2xpbWl0VmFsdWUodmFsdWUsIC0zMjc2OCwgMzI3NjcpO1xufVxuLyoqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBzdGFydFxuICogQHBhcmFtIGVuZFxuICogQHBhcmFtIFtlcHNpbG9uXVxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfaXNCZXR3ZWVuKHZhbHVlLCBzdGFydCwgZW5kLCBlcHNpbG9uID0gMWUtNikge1xuICAgIHJldHVybiB2YWx1ZSA+PSBNYXRoLm1pbihzdGFydCwgZW5kKSAtIGVwc2lsb24gJiYgdmFsdWUgPD0gTWF0aC5tYXgoc3RhcnQsIGVuZCkgKyBlcHNpbG9uO1xufVxuXG5mdW5jdGlvbiBfbG9va3VwKHRhYmxlLCB2YWx1ZSwgY21wKSB7XG4gICAgY21wID0gY21wIHx8ICgoaW5kZXgpPT50YWJsZVtpbmRleF0gPCB2YWx1ZSk7XG4gICAgbGV0IGhpID0gdGFibGUubGVuZ3RoIC0gMTtcbiAgICBsZXQgbG8gPSAwO1xuICAgIGxldCBtaWQ7XG4gICAgd2hpbGUoaGkgLSBsbyA+IDEpe1xuICAgICAgICBtaWQgPSBsbyArIGhpID4+IDE7XG4gICAgICAgIGlmIChjbXAobWlkKSkge1xuICAgICAgICAgICAgbG8gPSBtaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaSA9IG1pZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBsbyxcbiAgICAgICAgaGlcbiAgICB9O1xufVxuLyoqXG4gKiBCaW5hcnkgc2VhcmNoXG4gKiBAcGFyYW0gdGFibGUgLSB0aGUgdGFibGUgc2VhcmNoLiBtdXN0IGJlIHNvcnRlZCFcbiAqIEBwYXJhbSBrZXkgLSBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgdmFsdWUgaW4gZWFjaCBlbnRyeVxuICogQHBhcmFtIHZhbHVlIC0gdmFsdWUgdG8gZmluZFxuICogQHBhcmFtIGxhc3QgLSBsb29rdXAgbGFzdCBpbmRleFxuICogQHByaXZhdGVcbiAqLyBjb25zdCBfbG9va3VwQnlLZXkgPSAodGFibGUsIGtleSwgdmFsdWUsIGxhc3QpPT5fbG9va3VwKHRhYmxlLCB2YWx1ZSwgbGFzdCA/IChpbmRleCk9PntcbiAgICAgICAgY29uc3QgdGkgPSB0YWJsZVtpbmRleF1ba2V5XTtcbiAgICAgICAgcmV0dXJuIHRpIDwgdmFsdWUgfHwgdGkgPT09IHZhbHVlICYmIHRhYmxlW2luZGV4ICsgMV1ba2V5XSA9PT0gdmFsdWU7XG4gICAgfSA6IChpbmRleCk9PnRhYmxlW2luZGV4XVtrZXldIDwgdmFsdWUpO1xuLyoqXG4gKiBSZXZlcnNlIGJpbmFyeSBzZWFyY2hcbiAqIEBwYXJhbSB0YWJsZSAtIHRoZSB0YWJsZSBzZWFyY2guIG11c3QgYmUgc29ydGVkIVxuICogQHBhcmFtIGtleSAtIHByb3BlcnR5IG5hbWUgZm9yIHRoZSB2YWx1ZSBpbiBlYWNoIGVudHJ5XG4gKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSB0byBmaW5kXG4gKiBAcHJpdmF0ZVxuICovIGNvbnN0IF9ybG9va3VwQnlLZXkgPSAodGFibGUsIGtleSwgdmFsdWUpPT5fbG9va3VwKHRhYmxlLCB2YWx1ZSwgKGluZGV4KT0+dGFibGVbaW5kZXhdW2tleV0gPj0gdmFsdWUpO1xuLyoqXG4gKiBSZXR1cm4gc3Vic2V0IG9mIGB2YWx1ZXNgIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgIGluY2x1c2l2ZS5cbiAqIFZhbHVlcyBhcmUgYXNzdW1lZCB0byBiZSBpbiBzb3J0ZWQgb3JkZXIuXG4gKiBAcGFyYW0gdmFsdWVzIC0gc29ydGVkIGFycmF5IG9mIHZhbHVlc1xuICogQHBhcmFtIG1pbiAtIG1pbiB2YWx1ZVxuICogQHBhcmFtIG1heCAtIG1heCB2YWx1ZVxuICovIGZ1bmN0aW9uIF9maWx0ZXJCZXR3ZWVuKHZhbHVlcywgbWluLCBtYXgpIHtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBlbmQgPSB2YWx1ZXMubGVuZ3RoO1xuICAgIHdoaWxlKHN0YXJ0IDwgZW5kICYmIHZhbHVlc1tzdGFydF0gPCBtaW4pe1xuICAgICAgICBzdGFydCsrO1xuICAgIH1cbiAgICB3aGlsZShlbmQgPiBzdGFydCAmJiB2YWx1ZXNbZW5kIC0gMV0gPiBtYXgpe1xuICAgICAgICBlbmQtLTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0ID4gMCB8fCBlbmQgPCB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzLnNsaWNlKHN0YXJ0LCBlbmQpIDogdmFsdWVzO1xufVxuY29uc3QgYXJyYXlFdmVudHMgPSBbXG4gICAgJ3B1c2gnLFxuICAgICdwb3AnLFxuICAgICdzaGlmdCcsXG4gICAgJ3NwbGljZScsXG4gICAgJ3Vuc2hpZnQnXG5dO1xuZnVuY3Rpb24gbGlzdGVuQXJyYXlFdmVudHMoYXJyYXksIGxpc3RlbmVyKSB7XG4gICAgaWYgKGFycmF5Ll9jaGFydGpzKSB7XG4gICAgICAgIGFycmF5Ll9jaGFydGpzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksICdfY2hhcnRqcycsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgIGxpc3RlbmVyczogW1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyXG4gICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBhcnJheUV2ZW50cy5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9ICdfb25EYXRhJyArIF9jYXBpdGFsaXplKGtleSk7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBhcnJheVtrZXldO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksIGtleSwge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZSAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGJhc2UuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgYXJyYXkuX2NoYXJ0anMubGlzdGVuZXJzLmZvckVhY2goKG9iamVjdCk9PntcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3RbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0W21ldGhvZF0oLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHVubGlzdGVuQXJyYXlFdmVudHMoYXJyYXksIGxpc3RlbmVyKSB7XG4gICAgY29uc3Qgc3R1YiA9IGFycmF5Ll9jaGFydGpzO1xuICAgIGlmICghc3R1Yikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxpc3RlbmVycyA9IHN0dWIubGlzdGVuZXJzO1xuICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFycmF5RXZlbnRzLmZvckVhY2goKGtleSk9PntcbiAgICAgICAgZGVsZXRlIGFycmF5W2tleV07XG4gICAgfSk7XG4gICAgZGVsZXRlIGFycmF5Ll9jaGFydGpzO1xufVxuLyoqXG4gKiBAcGFyYW0gaXRlbXNcbiAqLyBmdW5jdGlvbiBfYXJyYXlVbmlxdWUoaXRlbXMpIHtcbiAgICBjb25zdCBzZXQgPSBuZXcgU2V0KGl0ZW1zKTtcbiAgICBpZiAoc2V0LnNpemUgPT09IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHNldCk7XG59XG5cbmZ1bmN0aW9uIGZvbnRTdHJpbmcocGl4ZWxTaXplLCBmb250U3R5bGUsIGZvbnRGYW1pbHkpIHtcbiAgICByZXR1cm4gZm9udFN0eWxlICsgJyAnICsgcGl4ZWxTaXplICsgJ3B4ICcgKyBmb250RmFtaWx5O1xufVxuLyoqXG4qIFJlcXVlc3QgYW5pbWF0aW9uIHBvbHlmaWxsXG4qLyBjb25zdCByZXF1ZXN0QW5pbUZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xufSgpO1xuLyoqXG4gKiBUaHJvdHRsZXMgY2FsbGluZyBgZm5gIG9uY2UgcGVyIGFuaW1hdGlvbiBmcmFtZVxuICogTGF0ZXN0IGFyZ3VtZW50cyBhcmUgdXNlZCBvbiB0aGUgYWN0dWFsIGNhbGxcbiAqLyBmdW5jdGlvbiB0aHJvdHRsZWQoZm4sIHRoaXNBcmcpIHtcbiAgICBsZXQgYXJnc1RvVXNlID0gW107XG4gICAgbGV0IHRpY2tpbmcgPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICAvLyBTYXZlIHRoZSBhcmdzIGZvciB1c2UgbGF0ZXJcbiAgICAgICAgYXJnc1RvVXNlID0gYXJncztcbiAgICAgICAgaWYgKCF0aWNraW5nKSB7XG4gICAgICAgICAgICB0aWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltRnJhbWUuY2FsbCh3aW5kb3csICgpPT57XG4gICAgICAgICAgICAgICAgdGlja2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3NUb1VzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIERlYm91bmNlcyBjYWxsaW5nIGBmbmAgZm9yIGBkZWxheWAgbXNcbiAqLyBmdW5jdGlvbiBkZWJvdW5jZShmbiwgZGVsYXkpIHtcbiAgICBsZXQgdGltZW91dDtcbiAgICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZuLCBkZWxheSwgYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsYXk7XG4gICAgfTtcbn1cbi8qKlxuICogQ29udmVydHMgJ3N0YXJ0JyB0byAnbGVmdCcsICdlbmQnIHRvICdyaWdodCcgYW5kIG90aGVycyB0byAnY2VudGVyJ1xuICogQHByaXZhdGVcbiAqLyBjb25zdCBfdG9MZWZ0UmlnaHRDZW50ZXIgPSAoYWxpZ24pPT5hbGlnbiA9PT0gJ3N0YXJ0JyA/ICdsZWZ0JyA6IGFsaWduID09PSAnZW5kJyA/ICdyaWdodCcgOiAnY2VudGVyJztcbi8qKlxuICogUmV0dXJucyBgc3RhcnRgLCBgZW5kYCBvciBgKHN0YXJ0ICsgZW5kKSAvIDJgIGRlcGVuZGluZyBvbiBgYWxpZ25gLiBEZWZhdWx0cyB0byBgY2VudGVyYFxuICogQHByaXZhdGVcbiAqLyBjb25zdCBfYWxpZ25TdGFydEVuZCA9IChhbGlnbiwgc3RhcnQsIGVuZCk9PmFsaWduID09PSAnc3RhcnQnID8gc3RhcnQgOiBhbGlnbiA9PT0gJ2VuZCcgPyBlbmQgOiAoc3RhcnQgKyBlbmQpIC8gMjtcbi8qKlxuICogUmV0dXJucyBgbGVmdGAsIGByaWdodGAgb3IgYChsZWZ0ICsgcmlnaHQpIC8gMmAgZGVwZW5kaW5nIG9uIGBhbGlnbmAuIERlZmF1bHRzIHRvIGBsZWZ0YFxuICogQHByaXZhdGVcbiAqLyBjb25zdCBfdGV4dFggPSAoYWxpZ24sIGxlZnQsIHJpZ2h0LCBydGwpPT57XG4gICAgY29uc3QgY2hlY2sgPSBydGwgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgIHJldHVybiBhbGlnbiA9PT0gY2hlY2sgPyByaWdodCA6IGFsaWduID09PSAnY2VudGVyJyA/IChsZWZ0ICsgcmlnaHQpIC8gMiA6IGxlZnQ7XG59O1xuLyoqXG4gKiBSZXR1cm4gc3RhcnQgYW5kIGNvdW50IG9mIHZpc2libGUgcG9pbnRzLlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50cyhtZXRhLCBwb2ludHMsIGFuaW1hdGlvbnNEaXNhYmxlZCkge1xuICAgIGNvbnN0IHBvaW50Q291bnQgPSBwb2ludHMubGVuZ3RoO1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IGNvdW50ID0gcG9pbnRDb3VudDtcbiAgICBpZiAobWV0YS5fc29ydGVkKSB7XG4gICAgICAgIGNvbnN0IHsgaVNjYWxlICwgdlNjYWxlICwgX3BhcnNlZCAgfSA9IG1ldGE7XG4gICAgICAgIGNvbnN0IHNwYW5HYXBzID0gbWV0YS5kYXRhc2V0ID8gbWV0YS5kYXRhc2V0Lm9wdGlvbnMgPyBtZXRhLmRhdGFzZXQub3B0aW9ucy5zcGFuR2FwcyA6IG51bGwgOiBudWxsO1xuICAgICAgICBjb25zdCBheGlzID0gaVNjYWxlLmF4aXM7XG4gICAgICAgIGNvbnN0IHsgbWluICwgbWF4ICwgbWluRGVmaW5lZCAsIG1heERlZmluZWQgIH0gPSBpU2NhbGUuZ2V0VXNlckJvdW5kcygpO1xuICAgICAgICBpZiAobWluRGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhcnQgPSBNYXRoLm1pbigvLyBAdHMtZXhwZWN0LWVycm9yIE5lZWQgdG8gdHlwZSBfcGFyc2VkXG4gICAgICAgICAgICBfbG9va3VwQnlLZXkoX3BhcnNlZCwgYXhpcywgbWluKS5sbywgLy8gQHRzLWV4cGVjdC1lcnJvciBOZWVkIHRvIGZpeCB0eXBlcyBvbiBfbG9va3VwQnlLZXlcbiAgICAgICAgICAgIGFuaW1hdGlvbnNEaXNhYmxlZCA/IHBvaW50Q291bnQgOiBfbG9va3VwQnlLZXkocG9pbnRzLCBheGlzLCBpU2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShtaW4pKS5sbyk7XG4gICAgICAgICAgICBpZiAoc3BhbkdhcHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0YW5jZVRvRGVmaW5lZExvID0gX3BhcnNlZC5zbGljZSgwLCBzdGFydCArIDEpLnJldmVyc2UoKS5maW5kSW5kZXgoKHBvaW50KT0+IWlzTnVsbE9yVW5kZWYocG9pbnRbdlNjYWxlLmF4aXNdKSk7XG4gICAgICAgICAgICAgICAgc3RhcnQgLT0gTWF0aC5tYXgoMCwgZGlzdGFuY2VUb0RlZmluZWRMbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydCA9IF9saW1pdFZhbHVlKHN0YXJ0LCAwLCBwb2ludENvdW50IC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heERlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBlbmQgPSBNYXRoLm1heCgvLyBAdHMtZXhwZWN0LWVycm9yIE5lZWQgdG8gdHlwZSBfcGFyc2VkXG4gICAgICAgICAgICBfbG9va3VwQnlLZXkoX3BhcnNlZCwgaVNjYWxlLmF4aXMsIG1heCwgdHJ1ZSkuaGkgKyAxLCAvLyBAdHMtZXhwZWN0LWVycm9yIE5lZWQgdG8gZml4IHR5cGVzIG9uIF9sb29rdXBCeUtleVxuICAgICAgICAgICAgYW5pbWF0aW9uc0Rpc2FibGVkID8gMCA6IF9sb29rdXBCeUtleShwb2ludHMsIGF4aXMsIGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKG1heCksIHRydWUpLmhpICsgMSk7XG4gICAgICAgICAgICBpZiAoc3BhbkdhcHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0YW5jZVRvRGVmaW5lZEhpID0gX3BhcnNlZC5zbGljZShlbmQgLSAxKS5maW5kSW5kZXgoKHBvaW50KT0+IWlzTnVsbE9yVW5kZWYocG9pbnRbdlNjYWxlLmF4aXNdKSk7XG4gICAgICAgICAgICAgICAgZW5kICs9IE1hdGgubWF4KDAsIGRpc3RhbmNlVG9EZWZpbmVkSGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnQgPSBfbGltaXRWYWx1ZShlbmQsIHN0YXJ0LCBwb2ludENvdW50KSAtIHN0YXJ0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY291bnQgPSBwb2ludENvdW50IC0gc3RhcnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGNvdW50XG4gICAgfTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBzY2FsZSByYW5nZXMgaGF2ZSBjaGFuZ2VkLlxuICogQHBhcmFtIHtvYmplY3R9IG1ldGEgLSBkYXRhc2V0IG1ldGEuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX3NjYWxlUmFuZ2VzQ2hhbmdlZChtZXRhKSB7XG4gICAgY29uc3QgeyB4U2NhbGUgLCB5U2NhbGUgLCBfc2NhbGVSYW5nZXMgIH0gPSBtZXRhO1xuICAgIGNvbnN0IG5ld1JhbmdlcyA9IHtcbiAgICAgICAgeG1pbjogeFNjYWxlLm1pbixcbiAgICAgICAgeG1heDogeFNjYWxlLm1heCxcbiAgICAgICAgeW1pbjogeVNjYWxlLm1pbixcbiAgICAgICAgeW1heDogeVNjYWxlLm1heFxuICAgIH07XG4gICAgaWYgKCFfc2NhbGVSYW5nZXMpIHtcbiAgICAgICAgbWV0YS5fc2NhbGVSYW5nZXMgPSBuZXdSYW5nZXM7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjaGFuZ2VkID0gX3NjYWxlUmFuZ2VzLnhtaW4gIT09IHhTY2FsZS5taW4gfHwgX3NjYWxlUmFuZ2VzLnhtYXggIT09IHhTY2FsZS5tYXggfHwgX3NjYWxlUmFuZ2VzLnltaW4gIT09IHlTY2FsZS5taW4gfHwgX3NjYWxlUmFuZ2VzLnltYXggIT09IHlTY2FsZS5tYXg7XG4gICAgT2JqZWN0LmFzc2lnbihfc2NhbGVSYW5nZXMsIG5ld1Jhbmdlcyk7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG59XG5cbmNvbnN0IGF0RWRnZSA9ICh0KT0+dCA9PT0gMCB8fCB0ID09PSAxO1xuY29uc3QgZWxhc3RpY0luID0gKHQsIHMsIHApPT4tKE1hdGgucG93KDIsIDEwICogKHQgLT0gMSkpICogTWF0aC5zaW4oKHQgLSBzKSAqIFRBVSAvIHApKTtcbmNvbnN0IGVsYXN0aWNPdXQgPSAodCwgcywgcCk9Pk1hdGgucG93KDIsIC0xMCAqIHQpICogTWF0aC5zaW4oKHQgLSBzKSAqIFRBVSAvIHApICsgMTtcbi8qKlxuICogRWFzaW5nIGZ1bmN0aW9ucyBhZGFwdGVkIGZyb20gUm9iZXJ0IFBlbm5lcidzIGVhc2luZyBlcXVhdGlvbnMuXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuZWFzaW5nLmVmZmVjdHNcbiAqIEBzZWUgaHR0cDovL3d3dy5yb2JlcnRwZW5uZXIuY29tL2Vhc2luZy9cbiAqLyBjb25zdCBlZmZlY3RzID0ge1xuICAgIGxpbmVhcjogKHQpPT50LFxuICAgIGVhc2VJblF1YWQ6ICh0KT0+dCAqIHQsXG4gICAgZWFzZU91dFF1YWQ6ICh0KT0+LXQgKiAodCAtIDIpLFxuICAgIGVhc2VJbk91dFF1YWQ6ICh0KT0+KHQgLz0gMC41KSA8IDEgPyAwLjUgKiB0ICogdCA6IC0wLjUgKiAoLS10ICogKHQgLSAyKSAtIDEpLFxuICAgIGVhc2VJbkN1YmljOiAodCk9PnQgKiB0ICogdCxcbiAgICBlYXNlT3V0Q3ViaWM6ICh0KT0+KHQgLT0gMSkgKiB0ICogdCArIDEsXG4gICAgZWFzZUluT3V0Q3ViaWM6ICh0KT0+KHQgLz0gMC41KSA8IDEgPyAwLjUgKiB0ICogdCAqIHQgOiAwLjUgKiAoKHQgLT0gMikgKiB0ICogdCArIDIpLFxuICAgIGVhc2VJblF1YXJ0OiAodCk9PnQgKiB0ICogdCAqIHQsXG4gICAgZWFzZU91dFF1YXJ0OiAodCk9Pi0oKHQgLT0gMSkgKiB0ICogdCAqIHQgLSAxKSxcbiAgICBlYXNlSW5PdXRRdWFydDogKHQpPT4odCAvPSAwLjUpIDwgMSA/IDAuNSAqIHQgKiB0ICogdCAqIHQgOiAtMC41ICogKCh0IC09IDIpICogdCAqIHQgKiB0IC0gMiksXG4gICAgZWFzZUluUXVpbnQ6ICh0KT0+dCAqIHQgKiB0ICogdCAqIHQsXG4gICAgZWFzZU91dFF1aW50OiAodCk9Pih0IC09IDEpICogdCAqIHQgKiB0ICogdCArIDEsXG4gICAgZWFzZUluT3V0UXVpbnQ6ICh0KT0+KHQgLz0gMC41KSA8IDEgPyAwLjUgKiB0ICogdCAqIHQgKiB0ICogdCA6IDAuNSAqICgodCAtPSAyKSAqIHQgKiB0ICogdCAqIHQgKyAyKSxcbiAgICBlYXNlSW5TaW5lOiAodCk9Pi1NYXRoLmNvcyh0ICogSEFMRl9QSSkgKyAxLFxuICAgIGVhc2VPdXRTaW5lOiAodCk9Pk1hdGguc2luKHQgKiBIQUxGX1BJKSxcbiAgICBlYXNlSW5PdXRTaW5lOiAodCk9Pi0wLjUgKiAoTWF0aC5jb3MoUEkgKiB0KSAtIDEpLFxuICAgIGVhc2VJbkV4cG86ICh0KT0+dCA9PT0gMCA/IDAgOiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpLFxuICAgIGVhc2VPdXRFeHBvOiAodCk9PnQgPT09IDEgPyAxIDogLU1hdGgucG93KDIsIC0xMCAqIHQpICsgMSxcbiAgICBlYXNlSW5PdXRFeHBvOiAodCk9PmF0RWRnZSh0KSA/IHQgOiB0IDwgMC41ID8gMC41ICogTWF0aC5wb3coMiwgMTAgKiAodCAqIDIgLSAxKSkgOiAwLjUgKiAoLU1hdGgucG93KDIsIC0xMCAqICh0ICogMiAtIDEpKSArIDIpLFxuICAgIGVhc2VJbkNpcmM6ICh0KT0+dCA+PSAxID8gdCA6IC0oTWF0aC5zcXJ0KDEgLSB0ICogdCkgLSAxKSxcbiAgICBlYXNlT3V0Q2lyYzogKHQpPT5NYXRoLnNxcnQoMSAtICh0IC09IDEpICogdCksXG4gICAgZWFzZUluT3V0Q2lyYzogKHQpPT4odCAvPSAwLjUpIDwgMSA/IC0wLjUgKiAoTWF0aC5zcXJ0KDEgLSB0ICogdCkgLSAxKSA6IDAuNSAqIChNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKSxcbiAgICBlYXNlSW5FbGFzdGljOiAodCk9PmF0RWRnZSh0KSA/IHQgOiBlbGFzdGljSW4odCwgMC4wNzUsIDAuMyksXG4gICAgZWFzZU91dEVsYXN0aWM6ICh0KT0+YXRFZGdlKHQpID8gdCA6IGVsYXN0aWNPdXQodCwgMC4wNzUsIDAuMyksXG4gICAgZWFzZUluT3V0RWxhc3RpYyAodCkge1xuICAgICAgICBjb25zdCBzID0gMC4xMTI1O1xuICAgICAgICBjb25zdCBwID0gMC40NTtcbiAgICAgICAgcmV0dXJuIGF0RWRnZSh0KSA/IHQgOiB0IDwgMC41ID8gMC41ICogZWxhc3RpY0luKHQgKiAyLCBzLCBwKSA6IDAuNSArIDAuNSAqIGVsYXN0aWNPdXQodCAqIDIgLSAxLCBzLCBwKTtcbiAgICB9LFxuICAgIGVhc2VJbkJhY2sgKHQpIHtcbiAgICAgICAgY29uc3QgcyA9IDEuNzAxNTg7XG4gICAgICAgIHJldHVybiB0ICogdCAqICgocyArIDEpICogdCAtIHMpO1xuICAgIH0sXG4gICAgZWFzZU91dEJhY2sgKHQpIHtcbiAgICAgICAgY29uc3QgcyA9IDEuNzAxNTg7XG4gICAgICAgIHJldHVybiAodCAtPSAxKSAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDE7XG4gICAgfSxcbiAgICBlYXNlSW5PdXRCYWNrICh0KSB7XG4gICAgICAgIGxldCBzID0gMS43MDE1ODtcbiAgICAgICAgaWYgKCh0IC89IDAuNSkgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMC41ICogKHQgKiB0ICogKCgocyAqPSAxLjUyNSkgKyAxKSAqIHQgLSBzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDAuNSAqICgodCAtPSAyKSAqIHQgKiAoKChzICo9IDEuNTI1KSArIDEpICogdCArIHMpICsgMik7XG4gICAgfSxcbiAgICBlYXNlSW5Cb3VuY2U6ICh0KT0+MSAtIGVmZmVjdHMuZWFzZU91dEJvdW5jZSgxIC0gdCksXG4gICAgZWFzZU91dEJvdW5jZSAodCkge1xuICAgICAgICBjb25zdCBtID0gNy41NjI1O1xuICAgICAgICBjb25zdCBkID0gMi43NTtcbiAgICAgICAgaWYgKHQgPCAxIC8gZCkge1xuICAgICAgICAgICAgcmV0dXJuIG0gKiB0ICogdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCA8IDIgLyBkKSB7XG4gICAgICAgICAgICByZXR1cm4gbSAqICh0IC09IDEuNSAvIGQpICogdCArIDAuNzU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHQgPCAyLjUgLyBkKSB7XG4gICAgICAgICAgICByZXR1cm4gbSAqICh0IC09IDIuMjUgLyBkKSAqIHQgKyAwLjkzNzU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0gKiAodCAtPSAyLjYyNSAvIGQpICogdCArIDAuOTg0Mzc1O1xuICAgIH0sXG4gICAgZWFzZUluT3V0Qm91bmNlOiAodCk9PnQgPCAwLjUgPyBlZmZlY3RzLmVhc2VJbkJvdW5jZSh0ICogMikgKiAwLjUgOiBlZmZlY3RzLmVhc2VPdXRCb3VuY2UodCAqIDIgLSAxKSAqIDAuNSArIDAuNVxufTtcblxuZnVuY3Rpb24gaXNQYXR0ZXJuT3JHcmFkaWVudCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gdHlwZSA9PT0gJ1tvYmplY3QgQ2FudmFzUGF0dGVybl0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IENhbnZhc0dyYWRpZW50XSc7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNvbG9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzUGF0dGVybk9yR3JhZGllbnQodmFsdWUpID8gdmFsdWUgOiBuZXcgQ29sb3IodmFsdWUpO1xufVxuZnVuY3Rpb24gZ2V0SG92ZXJDb2xvcih2YWx1ZSkge1xuICAgIHJldHVybiBpc1BhdHRlcm5PckdyYWRpZW50KHZhbHVlKSA/IHZhbHVlIDogbmV3IENvbG9yKHZhbHVlKS5zYXR1cmF0ZSgwLjUpLmRhcmtlbigwLjEpLmhleFN0cmluZygpO1xufVxuXG5jb25zdCBudW1iZXJzID0gW1xuICAgICd4JyxcbiAgICAneScsXG4gICAgJ2JvcmRlcldpZHRoJyxcbiAgICAncmFkaXVzJyxcbiAgICAndGVuc2lvbidcbl07XG5jb25zdCBjb2xvcnMgPSBbXG4gICAgJ2NvbG9yJyxcbiAgICAnYm9yZGVyQ29sb3InLFxuICAgICdiYWNrZ3JvdW5kQ29sb3InXG5dO1xuZnVuY3Rpb24gYXBwbHlBbmltYXRpb25zRGVmYXVsdHMoZGVmYXVsdHMpIHtcbiAgICBkZWZhdWx0cy5zZXQoJ2FuaW1hdGlvbicsIHtcbiAgICAgICAgZGVsYXk6IHVuZGVmaW5lZCxcbiAgICAgICAgZHVyYXRpb246IDEwMDAsXG4gICAgICAgIGVhc2luZzogJ2Vhc2VPdXRRdWFydCcsXG4gICAgICAgIGZuOiB1bmRlZmluZWQsXG4gICAgICAgIGZyb206IHVuZGVmaW5lZCxcbiAgICAgICAgbG9vcDogdW5kZWZpbmVkLFxuICAgICAgICB0bzogdW5kZWZpbmVkLFxuICAgICAgICB0eXBlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICBkZWZhdWx0cy5kZXNjcmliZSgnYW5pbWF0aW9uJywge1xuICAgICAgICBfZmFsbGJhY2s6IGZhbHNlLFxuICAgICAgICBfaW5kZXhhYmxlOiBmYWxzZSxcbiAgICAgICAgX3NjcmlwdGFibGU6IChuYW1lKT0+bmFtZSAhPT0gJ29uUHJvZ3Jlc3MnICYmIG5hbWUgIT09ICdvbkNvbXBsZXRlJyAmJiBuYW1lICE9PSAnZm4nXG4gICAgfSk7XG4gICAgZGVmYXVsdHMuc2V0KCdhbmltYXRpb25zJywge1xuICAgICAgICBjb2xvcnM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdjb2xvcicsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBjb2xvcnNcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyczoge1xuICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBudW1iZXJzXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBkZWZhdWx0cy5kZXNjcmliZSgnYW5pbWF0aW9ucycsIHtcbiAgICAgICAgX2ZhbGxiYWNrOiAnYW5pbWF0aW9uJ1xuICAgIH0pO1xuICAgIGRlZmF1bHRzLnNldCgndHJhbnNpdGlvbnMnLCB7XG4gICAgICAgIGFjdGl2ZToge1xuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDQwMFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZXNpemU6IHtcbiAgICAgICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNob3c6IHtcbiAgICAgICAgICAgIGFuaW1hdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBjb2xvcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ3RyYW5zcGFyZW50J1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdmlzaWJsZToge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBoaWRlOiB7XG4gICAgICAgICAgICBhbmltYXRpb25zOiB7XG4gICAgICAgICAgICAgICAgY29sb3JzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRvOiAndHJhbnNwYXJlbnQnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgICAgICAgICAgZWFzaW5nOiAnbGluZWFyJyxcbiAgICAgICAgICAgICAgICAgICAgZm46ICh2KT0+diB8IDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlMYXlvdXRzRGVmYXVsdHMoZGVmYXVsdHMpIHtcbiAgICBkZWZhdWx0cy5zZXQoJ2xheW91dCcsIHtcbiAgICAgICAgYXV0b1BhZGRpbmc6IHRydWUsXG4gICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgICAgbGVmdDogMFxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmNvbnN0IGludGxDYWNoZSA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGdldE51bWJlckZvcm1hdChsb2NhbGUsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBjYWNoZUtleSA9IGxvY2FsZSArIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpO1xuICAgIGxldCBmb3JtYXR0ZXIgPSBpbnRsQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoIWZvcm1hdHRlcikge1xuICAgICAgICBmb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG9jYWxlLCBvcHRpb25zKTtcbiAgICAgICAgaW50bENhY2hlLnNldChjYWNoZUtleSwgZm9ybWF0dGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1hdHRlcjtcbn1cbmZ1bmN0aW9uIGZvcm1hdE51bWJlcihudW0sIGxvY2FsZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBnZXROdW1iZXJGb3JtYXQobG9jYWxlLCBvcHRpb25zKS5mb3JtYXQobnVtKTtcbn1cblxuY29uc3QgZm9ybWF0dGVycyA9IHtcbiB2YWx1ZXMgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/ICB2YWx1ZSA6ICcnICsgdmFsdWU7XG4gICAgfSxcbiBudW1lcmljICh0aWNrVmFsdWUsIGluZGV4LCB0aWNrcykge1xuICAgICAgICBpZiAodGlja1ZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJzAnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuY2hhcnQub3B0aW9ucy5sb2NhbGU7XG4gICAgICAgIGxldCBub3RhdGlvbjtcbiAgICAgICAgbGV0IGRlbHRhID0gdGlja1ZhbHVlO1xuICAgICAgICBpZiAodGlja3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgbWF4VGljayA9IE1hdGgubWF4KE1hdGguYWJzKHRpY2tzWzBdLnZhbHVlKSwgTWF0aC5hYnModGlja3NbdGlja3MubGVuZ3RoIC0gMV0udmFsdWUpKTtcbiAgICAgICAgICAgIGlmIChtYXhUaWNrIDwgMWUtNCB8fCBtYXhUaWNrID4gMWUrMTUpIHtcbiAgICAgICAgICAgICAgICBub3RhdGlvbiA9ICdzY2llbnRpZmljJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbHRhID0gY2FsY3VsYXRlRGVsdGEodGlja1ZhbHVlLCB0aWNrcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbG9nRGVsdGEgPSBsb2cxMChNYXRoLmFicyhkZWx0YSkpO1xuICAgICAgICBjb25zdCBudW1EZWNpbWFsID0gaXNOYU4obG9nRGVsdGEpID8gMSA6IE1hdGgubWF4KE1hdGgubWluKC0xICogTWF0aC5mbG9vcihsb2dEZWx0YSksIDIwKSwgMCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbnVtRGVjaW1hbCxcbiAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogbnVtRGVjaW1hbFxuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHRoaXMub3B0aW9ucy50aWNrcy5mb3JtYXQpO1xuICAgICAgICByZXR1cm4gZm9ybWF0TnVtYmVyKHRpY2tWYWx1ZSwgbG9jYWxlLCBvcHRpb25zKTtcbiAgICB9LFxuIGxvZ2FyaXRobWljICh0aWNrVmFsdWUsIGluZGV4LCB0aWNrcykge1xuICAgICAgICBpZiAodGlja1ZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJzAnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbWFpbiA9IHRpY2tzW2luZGV4XS5zaWduaWZpY2FuZCB8fCB0aWNrVmFsdWUgLyBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihsb2cxMCh0aWNrVmFsdWUpKSk7XG4gICAgICAgIGlmIChbXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICAgIDMsXG4gICAgICAgICAgICA1LFxuICAgICAgICAgICAgMTAsXG4gICAgICAgICAgICAxNVxuICAgICAgICBdLmluY2x1ZGVzKHJlbWFpbikgfHwgaW5kZXggPiAwLjggKiB0aWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZXJzLm51bWVyaWMuY2FsbCh0aGlzLCB0aWNrVmFsdWUsIGluZGV4LCB0aWNrcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjYWxjdWxhdGVEZWx0YSh0aWNrVmFsdWUsIHRpY2tzKSB7XG4gICAgbGV0IGRlbHRhID0gdGlja3MubGVuZ3RoID4gMyA/IHRpY2tzWzJdLnZhbHVlIC0gdGlja3NbMV0udmFsdWUgOiB0aWNrc1sxXS52YWx1ZSAtIHRpY2tzWzBdLnZhbHVlO1xuICAgIGlmIChNYXRoLmFicyhkZWx0YSkgPj0gMSAmJiB0aWNrVmFsdWUgIT09IE1hdGguZmxvb3IodGlja1ZhbHVlKSkge1xuICAgICAgICBkZWx0YSA9IHRpY2tWYWx1ZSAtIE1hdGguZmxvb3IodGlja1ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlbHRhO1xufVxuIHZhciBUaWNrcyA9IHtcbiAgICBmb3JtYXR0ZXJzXG59O1xuXG5mdW5jdGlvbiBhcHBseVNjYWxlRGVmYXVsdHMoZGVmYXVsdHMpIHtcbiAgICBkZWZhdWx0cy5zZXQoJ3NjYWxlJywge1xuICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICBvZmZzZXQ6IGZhbHNlLFxuICAgICAgICByZXZlcnNlOiBmYWxzZSxcbiAgICAgICAgYmVnaW5BdFplcm86IGZhbHNlLFxuIGJvdW5kczogJ3RpY2tzJyxcbiAgICAgICAgY2xpcDogdHJ1ZSxcbiBncmFjZTogMCxcbiAgICAgICAgZ3JpZDoge1xuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgIGxpbmVXaWR0aDogMSxcbiAgICAgICAgICAgIGRyYXdPbkNoYXJ0QXJlYTogdHJ1ZSxcbiAgICAgICAgICAgIGRyYXdUaWNrczogdHJ1ZSxcbiAgICAgICAgICAgIHRpY2tMZW5ndGg6IDgsXG4gICAgICAgICAgICB0aWNrV2lkdGg6IChfY3R4LCBvcHRpb25zKT0+b3B0aW9ucy5saW5lV2lkdGgsXG4gICAgICAgICAgICB0aWNrQ29sb3I6IChfY3R4LCBvcHRpb25zKT0+b3B0aW9ucy5jb2xvcixcbiAgICAgICAgICAgIG9mZnNldDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgYm9yZGVyOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgZGFzaDogW10sXG4gICAgICAgICAgICBkYXNoT2Zmc2V0OiAwLjAsXG4gICAgICAgICAgICB3aWR0aDogMVxuICAgICAgICB9LFxuICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICAgICAgICB0b3A6IDQsXG4gICAgICAgICAgICAgICAgYm90dG9tOiA0XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRpY2tzOiB7XG4gICAgICAgICAgICBtaW5Sb3RhdGlvbjogMCxcbiAgICAgICAgICAgIG1heFJvdGF0aW9uOiA1MCxcbiAgICAgICAgICAgIG1pcnJvcjogZmFsc2UsXG4gICAgICAgICAgICB0ZXh0U3Ryb2tlV2lkdGg6IDAsXG4gICAgICAgICAgICB0ZXh0U3Ryb2tlQ29sb3I6ICcnLFxuICAgICAgICAgICAgcGFkZGluZzogMyxcbiAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgICAgICBhdXRvU2tpcDogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9Ta2lwUGFkZGluZzogMyxcbiAgICAgICAgICAgIGxhYmVsT2Zmc2V0OiAwLFxuICAgICAgICAgICAgY2FsbGJhY2s6IFRpY2tzLmZvcm1hdHRlcnMudmFsdWVzLFxuICAgICAgICAgICAgbWlub3I6IHt9LFxuICAgICAgICAgICAgbWFqb3I6IHt9LFxuICAgICAgICAgICAgYWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgY3Jvc3NBbGlnbjogJ25lYXInLFxuICAgICAgICAgICAgc2hvd0xhYmVsQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgYmFja2Ryb3BDb2xvcjogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSknLFxuICAgICAgICAgICAgYmFja2Ryb3BQYWRkaW5nOiAyXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBkZWZhdWx0cy5yb3V0ZSgnc2NhbGUudGlja3MnLCAnY29sb3InLCAnJywgJ2NvbG9yJyk7XG4gICAgZGVmYXVsdHMucm91dGUoJ3NjYWxlLmdyaWQnLCAnY29sb3InLCAnJywgJ2JvcmRlckNvbG9yJyk7XG4gICAgZGVmYXVsdHMucm91dGUoJ3NjYWxlLmJvcmRlcicsICdjb2xvcicsICcnLCAnYm9yZGVyQ29sb3InKTtcbiAgICBkZWZhdWx0cy5yb3V0ZSgnc2NhbGUudGl0bGUnLCAnY29sb3InLCAnJywgJ2NvbG9yJyk7XG4gICAgZGVmYXVsdHMuZGVzY3JpYmUoJ3NjYWxlJywge1xuICAgICAgICBfZmFsbGJhY2s6IGZhbHNlLFxuICAgICAgICBfc2NyaXB0YWJsZTogKG5hbWUpPT4hbmFtZS5zdGFydHNXaXRoKCdiZWZvcmUnKSAmJiAhbmFtZS5zdGFydHNXaXRoKCdhZnRlcicpICYmIG5hbWUgIT09ICdjYWxsYmFjaycgJiYgbmFtZSAhPT0gJ3BhcnNlcicsXG4gICAgICAgIF9pbmRleGFibGU6IChuYW1lKT0+bmFtZSAhPT0gJ2JvcmRlckRhc2gnICYmIG5hbWUgIT09ICd0aWNrQm9yZGVyRGFzaCcgJiYgbmFtZSAhPT0gJ2Rhc2gnXG4gICAgfSk7XG4gICAgZGVmYXVsdHMuZGVzY3JpYmUoJ3NjYWxlcycsIHtcbiAgICAgICAgX2ZhbGxiYWNrOiAnc2NhbGUnXG4gICAgfSk7XG4gICAgZGVmYXVsdHMuZGVzY3JpYmUoJ3NjYWxlLnRpY2tzJywge1xuICAgICAgICBfc2NyaXB0YWJsZTogKG5hbWUpPT5uYW1lICE9PSAnYmFja2Ryb3BQYWRkaW5nJyAmJiBuYW1lICE9PSAnY2FsbGJhY2snLFxuICAgICAgICBfaW5kZXhhYmxlOiAobmFtZSk9Pm5hbWUgIT09ICdiYWNrZHJvcFBhZGRpbmcnXG4gICAgfSk7XG59XG5cbmNvbnN0IG92ZXJyaWRlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gZnVuY3Rpb24gZ2V0U2NvcGUkMShub2RlLCBrZXkpIHtcbiAgICBpZiAoIWtleSkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IGtleS5zcGxpdCgnLicpO1xuICAgIGZvcihsZXQgaSA9IDAsIG4gPSBrZXlzLmxlbmd0aDsgaSA8IG47ICsraSl7XG4gICAgICAgIGNvbnN0IGsgPSBrZXlzW2ldO1xuICAgICAgICBub2RlID0gbm9kZVtrXSB8fCAobm9kZVtrXSA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbn1cbmZ1bmN0aW9uIHNldChyb290LCBzY29wZSwgdmFsdWVzKSB7XG4gICAgaWYgKHR5cGVvZiBzY29wZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKGdldFNjb3BlJDEocm9vdCwgc2NvcGUpLCB2YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2UoZ2V0U2NvcGUkMShyb290LCAnJyksIHNjb3BlKTtcbn1cbiBjbGFzcyBEZWZhdWx0cyB7XG4gICAgY29uc3RydWN0b3IoX2Rlc2NyaXB0b3JzLCBfYXBwbGllcnMpe1xuICAgICAgICB0aGlzLmFuaW1hdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSAncmdiYSgwLDAsMCwwLjEpJztcbiAgICAgICAgdGhpcy5ib3JkZXJDb2xvciA9ICdyZ2JhKDAsMCwwLDAuMSknO1xuICAgICAgICB0aGlzLmNvbG9yID0gJyM2NjYnO1xuICAgICAgICB0aGlzLmRhdGFzZXRzID0ge307XG4gICAgICAgIHRoaXMuZGV2aWNlUGl4ZWxSYXRpbyA9IChjb250ZXh0KT0+Y29udGV4dC5jaGFydC5wbGF0Zm9ybS5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSB7fTtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBbXG4gICAgICAgICAgICAnbW91c2Vtb3ZlJyxcbiAgICAgICAgICAgICdtb3VzZW91dCcsXG4gICAgICAgICAgICAnY2xpY2snLFxuICAgICAgICAgICAgJ3RvdWNoc3RhcnQnLFxuICAgICAgICAgICAgJ3RvdWNobW92ZSdcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5mb250ID0ge1xuICAgICAgICAgICAgZmFtaWx5OiBcIidIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnQXJpYWwnLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICBzaXplOiAxMixcbiAgICAgICAgICAgIHN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IDEuMixcbiAgICAgICAgICAgIHdlaWdodDogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhvdmVyID0ge307XG4gICAgICAgIHRoaXMuaG92ZXJCYWNrZ3JvdW5kQ29sb3IgPSAoY3R4LCBvcHRpb25zKT0+Z2V0SG92ZXJDb2xvcihvcHRpb25zLmJhY2tncm91bmRDb2xvcik7XG4gICAgICAgIHRoaXMuaG92ZXJCb3JkZXJDb2xvciA9IChjdHgsIG9wdGlvbnMpPT5nZXRIb3ZlckNvbG9yKG9wdGlvbnMuYm9yZGVyQ29sb3IpO1xuICAgICAgICB0aGlzLmhvdmVyQ29sb3IgPSAoY3R4LCBvcHRpb25zKT0+Z2V0SG92ZXJDb2xvcihvcHRpb25zLmNvbG9yKTtcbiAgICAgICAgdGhpcy5pbmRleEF4aXMgPSAneCc7XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpb24gPSB7XG4gICAgICAgICAgICBtb2RlOiAnbmVhcmVzdCcsXG4gICAgICAgICAgICBpbnRlcnNlY3Q6IHRydWUsXG4gICAgICAgICAgICBpbmNsdWRlSW52aXNpYmxlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8gPSB0cnVlO1xuICAgICAgICB0aGlzLm9uSG92ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLm9uQ2xpY2sgPSBudWxsO1xuICAgICAgICB0aGlzLnBhcnNpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNwb25zaXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zY2FsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5zaG93TGluZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3AgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlc2NyaWJlKF9kZXNjcmlwdG9ycyk7XG4gICAgICAgIHRoaXMuYXBwbHkoX2FwcGxpZXJzKTtcbiAgICB9XG4gc2V0KHNjb3BlLCB2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIHNldCh0aGlzLCBzY29wZSwgdmFsdWVzKTtcbiAgICB9XG4gZ2V0KHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBnZXRTY29wZSQxKHRoaXMsIHNjb3BlKTtcbiAgICB9XG4gZGVzY3JpYmUoc2NvcGUsIHZhbHVlcykge1xuICAgICAgICByZXR1cm4gc2V0KGRlc2NyaXB0b3JzLCBzY29wZSwgdmFsdWVzKTtcbiAgICB9XG4gICAgb3ZlcnJpZGUoc2NvcGUsIHZhbHVlcykge1xuICAgICAgICByZXR1cm4gc2V0KG92ZXJyaWRlcywgc2NvcGUsIHZhbHVlcyk7XG4gICAgfVxuIHJvdXRlKHNjb3BlLCBuYW1lLCB0YXJnZXRTY29wZSwgdGFyZ2V0TmFtZSkge1xuICAgICAgICBjb25zdCBzY29wZU9iamVjdCA9IGdldFNjb3BlJDEodGhpcywgc2NvcGUpO1xuICAgICAgICBjb25zdCB0YXJnZXRTY29wZU9iamVjdCA9IGdldFNjb3BlJDEodGhpcywgdGFyZ2V0U2NvcGUpO1xuICAgICAgICBjb25zdCBwcml2YXRlTmFtZSA9ICdfJyArIG5hbWU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHNjb3BlT2JqZWN0LCB7XG4gICAgICAgICAgICBbcHJpdmF0ZU5hbWVdOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHNjb3BlT2JqZWN0W25hbWVdLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZXQgKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbCA9IHRoaXNbcHJpdmF0ZU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRTY29wZU9iamVjdFt0YXJnZXROYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGxvY2FsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRhcmdldCwgbG9jYWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZU9yRGVmYXVsdChsb2NhbCwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcml2YXRlTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhcHBseShhcHBsaWVycykge1xuICAgICAgICBhcHBsaWVycy5mb3JFYWNoKChhcHBseSk9PmFwcGx5KHRoaXMpKTtcbiAgICB9XG59XG52YXIgZGVmYXVsdHMgPSAvKiAjX19QVVJFX18gKi8gbmV3IERlZmF1bHRzKHtcbiAgICBfc2NyaXB0YWJsZTogKG5hbWUpPT4hbmFtZS5zdGFydHNXaXRoKCdvbicpLFxuICAgIF9pbmRleGFibGU6IChuYW1lKT0+bmFtZSAhPT0gJ2V2ZW50cycsXG4gICAgaG92ZXI6IHtcbiAgICAgICAgX2ZhbGxiYWNrOiAnaW50ZXJhY3Rpb24nXG4gICAgfSxcbiAgICBpbnRlcmFjdGlvbjoge1xuICAgICAgICBfc2NyaXB0YWJsZTogZmFsc2UsXG4gICAgICAgIF9pbmRleGFibGU6IGZhbHNlXG4gICAgfVxufSwgW1xuICAgIGFwcGx5QW5pbWF0aW9uc0RlZmF1bHRzLFxuICAgIGFwcGx5TGF5b3V0c0RlZmF1bHRzLFxuICAgIGFwcGx5U2NhbGVEZWZhdWx0c1xuXSk7XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGdpdmVuIGZvbnQgb2JqZWN0IGludG8gYSBDU1MgZm9udCBzdHJpbmcuXG4gKiBAcGFyYW0gZm9udCAtIEEgZm9udCBvYmplY3QuXG4gKiBAcmV0dXJuIFRoZSBDU1MgZm9udCBzdHJpbmcuIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZm9udFxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiB0b0ZvbnRTdHJpbmcoZm9udCkge1xuICAgIGlmICghZm9udCB8fCBpc051bGxPclVuZGVmKGZvbnQuc2l6ZSkgfHwgaXNOdWxsT3JVbmRlZihmb250LmZhbWlseSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoZm9udC5zdHlsZSA/IGZvbnQuc3R5bGUgKyAnICcgOiAnJykgKyAoZm9udC53ZWlnaHQgPyBmb250LndlaWdodCArICcgJyA6ICcnKSArIGZvbnQuc2l6ZSArICdweCAnICsgZm9udC5mYW1pbHk7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX21lYXN1cmVUZXh0KGN0eCwgZGF0YSwgZ2MsIGxvbmdlc3QsIHN0cmluZykge1xuICAgIGxldCB0ZXh0V2lkdGggPSBkYXRhW3N0cmluZ107XG4gICAgaWYgKCF0ZXh0V2lkdGgpIHtcbiAgICAgICAgdGV4dFdpZHRoID0gZGF0YVtzdHJpbmddID0gY3R4Lm1lYXN1cmVUZXh0KHN0cmluZykud2lkdGg7XG4gICAgICAgIGdjLnB1c2goc3RyaW5nKTtcbiAgICB9XG4gICAgaWYgKHRleHRXaWR0aCA+IGxvbmdlc3QpIHtcbiAgICAgICAgbG9uZ2VzdCA9IHRleHRXaWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIGxvbmdlc3Q7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIF9sb25nZXN0VGV4dChjdHgsIGZvbnQsIGFycmF5T2ZUaGluZ3MsIGNhY2hlKSB7XG4gICAgY2FjaGUgPSBjYWNoZSB8fCB7fTtcbiAgICBsZXQgZGF0YSA9IGNhY2hlLmRhdGEgPSBjYWNoZS5kYXRhIHx8IHt9O1xuICAgIGxldCBnYyA9IGNhY2hlLmdhcmJhZ2VDb2xsZWN0ID0gY2FjaGUuZ2FyYmFnZUNvbGxlY3QgfHwgW107XG4gICAgaWYgKGNhY2hlLmZvbnQgIT09IGZvbnQpIHtcbiAgICAgICAgZGF0YSA9IGNhY2hlLmRhdGEgPSB7fTtcbiAgICAgICAgZ2MgPSBjYWNoZS5nYXJiYWdlQ29sbGVjdCA9IFtdO1xuICAgICAgICBjYWNoZS5mb250ID0gZm9udDtcbiAgICB9XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguZm9udCA9IGZvbnQ7XG4gICAgbGV0IGxvbmdlc3QgPSAwO1xuICAgIGNvbnN0IGlsZW4gPSBhcnJheU9mVGhpbmdzLmxlbmd0aDtcbiAgICBsZXQgaSwgaiwgamxlbiwgdGhpbmcsIG5lc3RlZFRoaW5nO1xuICAgIGZvcihpID0gMDsgaSA8IGlsZW47IGkrKyl7XG4gICAgICAgIHRoaW5nID0gYXJyYXlPZlRoaW5nc1tpXTtcbiAgICAgICAgLy8gVW5kZWZpbmVkIHN0cmluZ3MgYW5kIGFycmF5cyBzaG91bGQgbm90IGJlIG1lYXN1cmVkXG4gICAgICAgIGlmICh0aGluZyAhPT0gdW5kZWZpbmVkICYmIHRoaW5nICE9PSBudWxsICYmICFpc0FycmF5KHRoaW5nKSkge1xuICAgICAgICAgICAgbG9uZ2VzdCA9IF9tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCB0aGluZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0aGluZykpIHtcbiAgICAgICAgICAgIC8vIGlmIGl0IGlzIGFuIGFycmF5IGxldHMgbWVhc3VyZSBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIHRvIGRvIG1heWJlIHNpbXBsaWZ5IHRoaXMgZnVuY3Rpb24gYSBiaXQgc28gd2UgY2FuIGRvIHRoaXMgbW9yZSByZWN1cnNpdmVseT9cbiAgICAgICAgICAgIGZvcihqID0gMCwgamxlbiA9IHRoaW5nLmxlbmd0aDsgaiA8IGpsZW47IGorKyl7XG4gICAgICAgICAgICAgICAgbmVzdGVkVGhpbmcgPSB0aGluZ1tqXTtcbiAgICAgICAgICAgICAgICAvLyBVbmRlZmluZWQgc3RyaW5ncyBhbmQgYXJyYXlzIHNob3VsZCBub3QgYmUgbWVhc3VyZWRcbiAgICAgICAgICAgICAgICBpZiAobmVzdGVkVGhpbmcgIT09IHVuZGVmaW5lZCAmJiBuZXN0ZWRUaGluZyAhPT0gbnVsbCAmJiAhaXNBcnJheShuZXN0ZWRUaGluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9uZ2VzdCA9IF9tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCBuZXN0ZWRUaGluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgY29uc3QgZ2NMZW4gPSBnYy5sZW5ndGggLyAyO1xuICAgIGlmIChnY0xlbiA+IGFycmF5T2ZUaGluZ3MubGVuZ3RoKSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGdjTGVuOyBpKyspe1xuICAgICAgICAgICAgZGVsZXRlIGRhdGFbZ2NbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGdjLnNwbGljZSgwLCBnY0xlbik7XG4gICAgfVxuICAgIHJldHVybiBsb25nZXN0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhbGlnbmVkIHBpeGVsIHZhbHVlIHRvIGF2b2lkIGFudGktYWxpYXNpbmcgYmx1clxuICogQHBhcmFtIGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHBpeGVsIC0gQSBwaXhlbCB2YWx1ZS5cbiAqIEBwYXJhbSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgZWxlbWVudC5cbiAqIEByZXR1cm5zIFRoZSBhbGlnbmVkIHBpeGVsIHZhbHVlLlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfYWxpZ25QaXhlbChjaGFydCwgcGl4ZWwsIHdpZHRoKSB7XG4gICAgY29uc3QgZGV2aWNlUGl4ZWxSYXRpbyA9IGNoYXJ0LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvO1xuICAgIGNvbnN0IGhhbGZXaWR0aCA9IHdpZHRoICE9PSAwID8gTWF0aC5tYXgod2lkdGggLyAyLCAwLjUpIDogMDtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgocGl4ZWwgLSBoYWxmV2lkdGgpICogZGV2aWNlUGl4ZWxSYXRpbykgLyBkZXZpY2VQaXhlbFJhdGlvICsgaGFsZldpZHRoO1xufVxuLyoqXG4gKiBDbGVhcnMgdGhlIGVudGlyZSBjYW52YXMuXG4gKi8gZnVuY3Rpb24gY2xlYXJDYW52YXMoY2FudmFzLCBjdHgpIHtcbiAgICBpZiAoIWN0eCAmJiAhY2FudmFzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3R4ID0gY3R4IHx8IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgLy8gY2FudmFzLndpZHRoIGFuZCBjYW52YXMuaGVpZ2h0IGRvIG5vdCBjb25zaWRlciB0aGUgY2FudmFzIHRyYW5zZm9ybSxcbiAgICAvLyB3aGlsZSBjbGVhclJlY3QgZG9lc1xuICAgIGN0eC5yZXNldFRyYW5zZm9ybSgpO1xuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICBjdHgucmVzdG9yZSgpO1xufVxuZnVuY3Rpb24gZHJhd1BvaW50KGN0eCwgb3B0aW9ucywgeCwgeSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICBkcmF3UG9pbnRMZWdlbmQoY3R4LCBvcHRpb25zLCB4LCB5LCBudWxsKTtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiBkcmF3UG9pbnRMZWdlbmQoY3R4LCBvcHRpb25zLCB4LCB5LCB3KSB7XG4gICAgbGV0IHR5cGUsIHhPZmZzZXQsIHlPZmZzZXQsIHNpemUsIGNvcm5lclJhZGl1cywgd2lkdGgsIHhPZmZzZXRXLCB5T2Zmc2V0VztcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMucG9pbnRTdHlsZTtcbiAgICBjb25zdCByb3RhdGlvbiA9IG9wdGlvbnMucm90YXRpb247XG4gICAgY29uc3QgcmFkaXVzID0gb3B0aW9ucy5yYWRpdXM7XG4gICAgbGV0IHJhZCA9IChyb3RhdGlvbiB8fCAwKSAqIFJBRF9QRVJfREVHO1xuICAgIGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHR5cGUgPSBzdHlsZS50b1N0cmluZygpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSFRNTEltYWdlRWxlbWVudF0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEhUTUxDYW52YXNFbGVtZW50XScpIHtcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICBjdHgudHJhbnNsYXRlKHgsIHkpO1xuICAgICAgICAgICAgY3R4LnJvdGF0ZShyYWQpO1xuICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShzdHlsZSwgLXN0eWxlLndpZHRoIC8gMiwgLXN0eWxlLmhlaWdodCAvIDIsIHN0eWxlLndpZHRoLCBzdHlsZS5oZWlnaHQpO1xuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNOYU4ocmFkaXVzKSB8fCByYWRpdXMgPD0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBzd2l0Y2goc3R5bGUpe1xuICAgICAgICAvLyBEZWZhdWx0IGluY2x1ZGVzIGNpcmNsZVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKHcpIHtcbiAgICAgICAgICAgICAgICBjdHguZWxsaXBzZSh4LCB5LCB3IC8gMiwgcmFkaXVzLCAwLCAwLCBUQVUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdHguYXJjKHgsIHksIHJhZGl1cywgMCwgVEFVKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0cmlhbmdsZSc6XG4gICAgICAgICAgICB3aWR0aCA9IHcgPyB3IC8gMiA6IHJhZGl1cztcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCArIE1hdGguc2luKHJhZCkgKiB3aWR0aCwgeSAtIE1hdGguY29zKHJhZCkgKiByYWRpdXMpO1xuICAgICAgICAgICAgcmFkICs9IFRXT19USElSRFNfUEk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHggKyBNYXRoLnNpbihyYWQpICogd2lkdGgsIHkgLSBNYXRoLmNvcyhyYWQpICogcmFkaXVzKTtcbiAgICAgICAgICAgIHJhZCArPSBUV09fVEhJUkRTX1BJO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgTWF0aC5zaW4ocmFkKSAqIHdpZHRoLCB5IC0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cyk7XG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVjdFJvdW5kZWQnOlxuICAgICAgICAgICAgLy8gTk9URTogdGhlIHJvdW5kZWQgcmVjdCBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIHRvIHVzZSBgYXJjYCBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAvLyBgcXVhZHJhdGljQ3VydmVUb2Agc2luY2UgaXQgZ2VuZXJhdGVzIGJldHRlciByZXN1bHRzIHdoZW4gcmVjdCBpc1xuICAgICAgICAgICAgLy8gYWxtb3N0IGEgY2lyY2xlLiAwLjUxNiAoaW5zdGVhZCBvZiAwLjUpIHByb2R1Y2VzIHJlc3VsdHMgd2l0aCB2aXN1YWxseVxuICAgICAgICAgICAgLy8gY2xvc2VyIHByb3BvcnRpb24gdG8gdGhlIHByZXZpb3VzIGltcGwgYW5kIGl0IGlzIGluc2NyaWJlZCBpbiB0aGVcbiAgICAgICAgICAgIC8vIGNpcmNsZSB3aXRoIGByYWRpdXNgLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIGZvbGxvd2luZyBQUnM6XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNTU5N1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzU4NThcbiAgICAgICAgICAgIGNvcm5lclJhZGl1cyA9IHJhZGl1cyAqIDAuNTE2O1xuICAgICAgICAgICAgc2l6ZSA9IHJhZGl1cyAtIGNvcm5lclJhZGl1cztcbiAgICAgICAgICAgIHhPZmZzZXQgPSBNYXRoLmNvcyhyYWQgKyBRVUFSVEVSX1BJKSAqIHNpemU7XG4gICAgICAgICAgICB4T2Zmc2V0VyA9IE1hdGguY29zKHJhZCArIFFVQVJURVJfUEkpICogKHcgPyB3IC8gMiAtIGNvcm5lclJhZGl1cyA6IHNpemUpO1xuICAgICAgICAgICAgeU9mZnNldCA9IE1hdGguc2luKHJhZCArIFFVQVJURVJfUEkpICogc2l6ZTtcbiAgICAgICAgICAgIHlPZmZzZXRXID0gTWF0aC5zaW4ocmFkICsgUVVBUlRFUl9QSSkgKiAodyA/IHcgLyAyIC0gY29ybmVyUmFkaXVzIDogc2l6ZSk7XG4gICAgICAgICAgICBjdHguYXJjKHggLSB4T2Zmc2V0VywgeSAtIHlPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkIC0gUEksIHJhZCAtIEhBTEZfUEkpO1xuICAgICAgICAgICAgY3R4LmFyYyh4ICsgeU9mZnNldFcsIHkgLSB4T2Zmc2V0LCBjb3JuZXJSYWRpdXMsIHJhZCAtIEhBTEZfUEksIHJhZCk7XG4gICAgICAgICAgICBjdHguYXJjKHggKyB4T2Zmc2V0VywgeSArIHlPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkLCByYWQgKyBIQUxGX1BJKTtcbiAgICAgICAgICAgIGN0eC5hcmMoeCAtIHlPZmZzZXRXLCB5ICsgeE9mZnNldCwgY29ybmVyUmFkaXVzLCByYWQgKyBIQUxGX1BJLCByYWQgKyBQSSk7XG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVjdCc6XG4gICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSA9IE1hdGguU1FSVDFfMiAqIHJhZGl1cztcbiAgICAgICAgICAgICAgICB3aWR0aCA9IHcgPyB3IC8gMiA6IHNpemU7XG4gICAgICAgICAgICAgICAgY3R4LnJlY3QoeCAtIHdpZHRoLCB5IC0gc2l6ZSwgMiAqIHdpZHRoLCAyICogc2l6ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByYWQgKz0gUVVBUlRFUl9QSTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLyBjYXNlICdyZWN0Um90JzpcbiAgICAgICAgICAgIHhPZmZzZXRXID0gTWF0aC5jb3MocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgICAgICAgICAgeE9mZnNldCA9IE1hdGguY29zKHJhZCkgKiByYWRpdXM7XG4gICAgICAgICAgICB5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcbiAgICAgICAgICAgIHlPZmZzZXRXID0gTWF0aC5zaW4ocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4IC0geE9mZnNldFcsIHkgLSB5T2Zmc2V0KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIHlPZmZzZXRXLCB5IC0geE9mZnNldCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHggKyB4T2Zmc2V0VywgeSArIHlPZmZzZXQpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4IC0geU9mZnNldFcsIHkgKyB4T2Zmc2V0KTtcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjcm9zc1JvdCc6XG4gICAgICAgICAgICByYWQgKz0gUVVBUlRFUl9QSTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLyBjYXNlICdjcm9zcyc6XG4gICAgICAgICAgICB4T2Zmc2V0VyA9IE1hdGguY29zKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICAgICAgICAgIHhPZmZzZXQgPSBNYXRoLmNvcyhyYWQpICogcmFkaXVzO1xuICAgICAgICAgICAgeU9mZnNldCA9IE1hdGguc2luKHJhZCkgKiByYWRpdXM7XG4gICAgICAgICAgICB5T2Zmc2V0VyA9IE1hdGguc2luKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXRXLCB5IC0geU9mZnNldCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHggKyB4T2Zmc2V0VywgeSArIHlPZmZzZXQpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4ICsgeU9mZnNldFcsIHkgLSB4T2Zmc2V0KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCAtIHlPZmZzZXRXLCB5ICsgeE9mZnNldCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3Rhcic6XG4gICAgICAgICAgICB4T2Zmc2V0VyA9IE1hdGguY29zKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICAgICAgICAgIHhPZmZzZXQgPSBNYXRoLmNvcyhyYWQpICogcmFkaXVzO1xuICAgICAgICAgICAgeU9mZnNldCA9IE1hdGguc2luKHJhZCkgKiByYWRpdXM7XG4gICAgICAgICAgICB5T2Zmc2V0VyA9IE1hdGguc2luKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXRXLCB5IC0geU9mZnNldCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHggKyB4T2Zmc2V0VywgeSArIHlPZmZzZXQpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4ICsgeU9mZnNldFcsIHkgLSB4T2Zmc2V0KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCAtIHlPZmZzZXRXLCB5ICsgeE9mZnNldCk7XG4gICAgICAgICAgICByYWQgKz0gUVVBUlRFUl9QSTtcbiAgICAgICAgICAgIHhPZmZzZXRXID0gTWF0aC5jb3MocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgICAgICAgICAgeE9mZnNldCA9IE1hdGguY29zKHJhZCkgKiByYWRpdXM7XG4gICAgICAgICAgICB5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcbiAgICAgICAgICAgIHlPZmZzZXRXID0gTWF0aC5zaW4ocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4IC0geE9mZnNldFcsIHkgLSB5T2Zmc2V0KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIHhPZmZzZXRXLCB5ICsgeU9mZnNldCk7XG4gICAgICAgICAgICBjdHgubW92ZVRvKHggKyB5T2Zmc2V0VywgeSAtIHhPZmZzZXQpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4IC0geU9mZnNldFcsIHkgKyB4T2Zmc2V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsaW5lJzpcbiAgICAgICAgICAgIHhPZmZzZXQgPSB3ID8gdyAvIDIgOiBNYXRoLmNvcyhyYWQpICogcmFkaXVzO1xuICAgICAgICAgICAgeU9mZnNldCA9IE1hdGguc2luKHJhZCkgKiByYWRpdXM7XG4gICAgICAgICAgICBjdHgubW92ZVRvKHggLSB4T2Zmc2V0LCB5IC0geU9mZnNldCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHggKyB4T2Zmc2V0LCB5ICsgeU9mZnNldCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGFzaCc6XG4gICAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgTWF0aC5jb3MocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpLCB5ICsgTWF0aC5zaW4ocmFkKSAqIHJhZGl1cyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdHguZmlsbCgpO1xuICAgIGlmIChvcHRpb25zLmJvcmRlcldpZHRoID4gMCkge1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBvaW50IGlzIGluc2lkZSB0aGUgcmVjdGFuZ2xlXG4gKiBAcGFyYW0gcG9pbnQgLSBUaGUgcG9pbnQgdG8gdGVzdFxuICogQHBhcmFtIGFyZWEgLSBUaGUgcmVjdGFuZ2xlXG4gKiBAcGFyYW0gbWFyZ2luIC0gYWxsb3dlZCBtYXJnaW5cbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2lzUG9pbnRJbkFyZWEocG9pbnQsIGFyZWEsIG1hcmdpbikge1xuICAgIG1hcmdpbiA9IG1hcmdpbiB8fCAwLjU7IC8vIG1hcmdpbiAtIGRlZmF1bHQgaXMgdG8gbWF0Y2ggcm91bmRlZCBkZWNpbWFsc1xuICAgIHJldHVybiAhYXJlYSB8fCBwb2ludCAmJiBwb2ludC54ID4gYXJlYS5sZWZ0IC0gbWFyZ2luICYmIHBvaW50LnggPCBhcmVhLnJpZ2h0ICsgbWFyZ2luICYmIHBvaW50LnkgPiBhcmVhLnRvcCAtIG1hcmdpbiAmJiBwb2ludC55IDwgYXJlYS5ib3R0b20gKyBtYXJnaW47XG59XG5mdW5jdGlvbiBjbGlwQXJlYShjdHgsIGFyZWEpIHtcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgucmVjdChhcmVhLmxlZnQsIGFyZWEudG9wLCBhcmVhLnJpZ2h0IC0gYXJlYS5sZWZ0LCBhcmVhLmJvdHRvbSAtIGFyZWEudG9wKTtcbiAgICBjdHguY2xpcCgpO1xufVxuZnVuY3Rpb24gdW5jbGlwQXJlYShjdHgpIHtcbiAgICBjdHgucmVzdG9yZSgpO1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9zdGVwcGVkTGluZVRvKGN0eCwgcHJldmlvdXMsIHRhcmdldCwgZmxpcCwgbW9kZSkge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5saW5lVG8odGFyZ2V0LngsIHRhcmdldC55KTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09ICdtaWRkbGUnKSB7XG4gICAgICAgIGNvbnN0IG1pZHBvaW50ID0gKHByZXZpb3VzLnggKyB0YXJnZXQueCkgLyAyLjA7XG4gICAgICAgIGN0eC5saW5lVG8obWlkcG9pbnQsIHByZXZpb3VzLnkpO1xuICAgICAgICBjdHgubGluZVRvKG1pZHBvaW50LCB0YXJnZXQueSk7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSAnYWZ0ZXInICE9PSAhIWZsaXApIHtcbiAgICAgICAgY3R4LmxpbmVUbyhwcmV2aW91cy54LCB0YXJnZXQueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmxpbmVUbyh0YXJnZXQueCwgcHJldmlvdXMueSk7XG4gICAgfVxuICAgIGN0eC5saW5lVG8odGFyZ2V0LngsIHRhcmdldC55KTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfYmV6aWVyQ3VydmVUbyhjdHgsIHByZXZpb3VzLCB0YXJnZXQsIGZsaXApIHtcbiAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICAgIHJldHVybiBjdHgubGluZVRvKHRhcmdldC54LCB0YXJnZXQueSk7XG4gICAgfVxuICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGZsaXAgPyBwcmV2aW91cy5jcDF4IDogcHJldmlvdXMuY3AyeCwgZmxpcCA/IHByZXZpb3VzLmNwMXkgOiBwcmV2aW91cy5jcDJ5LCBmbGlwID8gdGFyZ2V0LmNwMnggOiB0YXJnZXQuY3AxeCwgZmxpcCA/IHRhcmdldC5jcDJ5IDogdGFyZ2V0LmNwMXksIHRhcmdldC54LCB0YXJnZXQueSk7XG59XG5mdW5jdGlvbiBzZXRSZW5kZXJPcHRzKGN0eCwgb3B0cykge1xuICAgIGlmIChvcHRzLnRyYW5zbGF0aW9uKSB7XG4gICAgICAgIGN0eC50cmFuc2xhdGUob3B0cy50cmFuc2xhdGlvblswXSwgb3B0cy50cmFuc2xhdGlvblsxXSk7XG4gICAgfVxuICAgIGlmICghaXNOdWxsT3JVbmRlZihvcHRzLnJvdGF0aW9uKSkge1xuICAgICAgICBjdHgucm90YXRlKG9wdHMucm90YXRpb24pO1xuICAgIH1cbiAgICBpZiAob3B0cy5jb2xvcikge1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0cy5jb2xvcjtcbiAgICB9XG4gICAgaWYgKG9wdHMudGV4dEFsaWduKSB7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSBvcHRzLnRleHRBbGlnbjtcbiAgICB9XG4gICAgaWYgKG9wdHMudGV4dEJhc2VsaW5lKSB7XG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSBvcHRzLnRleHRCYXNlbGluZTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZWNvcmF0ZVRleHQoY3R4LCB4LCB5LCBsaW5lLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMuc3RyaWtldGhyb3VnaCB8fCBvcHRzLnVuZGVybGluZSkge1xuICAgICAgICAvKipcbiAgICAgKiBOb3cgdGhhdCBJRTExIHN1cHBvcnQgaGFzIGJlZW4gZHJvcHBlZCwgd2UgY2FuIHVzZSBtb3JlXG4gICAgICogb2YgdGhlIFRleHRNZXRyaWNzIG9iamVjdC4gVGhlIGFjdHVhbCBib3VuZGluZyBib3hlc1xuICAgICAqIGFyZSB1bmZsYWdnZWQgaW4gQ2hyb21lLCBGaXJlZm94LCBFZGdlLCBhbmQgU2FmYXJpIHNvIHRoZXlcbiAgICAgKiBjYW4gYmUgc2FmZWx5IHVzZWQuXG4gICAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UZXh0TWV0cmljcyNCcm93c2VyX2NvbXBhdGliaWxpdHlcbiAgICAgKi8gY29uc3QgbWV0cmljcyA9IGN0eC5tZWFzdXJlVGV4dChsaW5lKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IHggLSBtZXRyaWNzLmFjdHVhbEJvdW5kaW5nQm94TGVmdDtcbiAgICAgICAgY29uc3QgcmlnaHQgPSB4ICsgbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveFJpZ2h0O1xuICAgICAgICBjb25zdCB0b3AgPSB5IC0gbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveEFzY2VudDtcbiAgICAgICAgY29uc3QgYm90dG9tID0geSArIG1ldHJpY3MuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50O1xuICAgICAgICBjb25zdCB5RGVjb3JhdGlvbiA9IG9wdHMuc3RyaWtldGhyb3VnaCA/ICh0b3AgKyBib3R0b20pIC8gMiA6IGJvdHRvbTtcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gb3B0cy5kZWNvcmF0aW9uV2lkdGggfHwgMjtcbiAgICAgICAgY3R4Lm1vdmVUbyhsZWZ0LCB5RGVjb3JhdGlvbik7XG4gICAgICAgIGN0eC5saW5lVG8ocmlnaHQsIHlEZWNvcmF0aW9uKTtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRyYXdCYWNrZHJvcChjdHgsIG9wdHMpIHtcbiAgICBjb25zdCBvbGRDb2xvciA9IGN0eC5maWxsU3R5bGU7XG4gICAgY3R4LmZpbGxTdHlsZSA9IG9wdHMuY29sb3I7XG4gICAgY3R4LmZpbGxSZWN0KG9wdHMubGVmdCwgb3B0cy50b3AsIG9wdHMud2lkdGgsIG9wdHMuaGVpZ2h0KTtcbiAgICBjdHguZmlsbFN0eWxlID0gb2xkQ29sb3I7XG59XG4vKipcbiAqIFJlbmRlciB0ZXh0IG9udG8gdGhlIGNhbnZhc1xuICovIGZ1bmN0aW9uIHJlbmRlclRleHQoY3R4LCB0ZXh0LCB4LCB5LCBmb250LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBsaW5lcyA9IGlzQXJyYXkodGV4dCkgPyB0ZXh0IDogW1xuICAgICAgICB0ZXh0XG4gICAgXTtcbiAgICBjb25zdCBzdHJva2UgPSBvcHRzLnN0cm9rZVdpZHRoID4gMCAmJiBvcHRzLnN0cm9rZUNvbG9yICE9PSAnJztcbiAgICBsZXQgaSwgbGluZTtcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5mb250ID0gZm9udC5zdHJpbmc7XG4gICAgc2V0UmVuZGVyT3B0cyhjdHgsIG9wdHMpO1xuICAgIGZvcihpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKXtcbiAgICAgICAgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICBpZiAob3B0cy5iYWNrZHJvcCkge1xuICAgICAgICAgICAgZHJhd0JhY2tkcm9wKGN0eCwgb3B0cy5iYWNrZHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cm9rZSkge1xuICAgICAgICAgICAgaWYgKG9wdHMuc3Ryb2tlQ29sb3IpIHtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBvcHRzLnN0cm9rZUNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmKG9wdHMuc3Ryb2tlV2lkdGgpKSB7XG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHguc3Ryb2tlVGV4dChsaW5lLCB4LCB5LCBvcHRzLm1heFdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBjdHguZmlsbFRleHQobGluZSwgeCwgeSwgb3B0cy5tYXhXaWR0aCk7XG4gICAgICAgIGRlY29yYXRlVGV4dChjdHgsIHgsIHksIGxpbmUsIG9wdHMpO1xuICAgICAgICB5ICs9IE51bWJlcihmb250LmxpbmVIZWlnaHQpO1xuICAgIH1cbiAgICBjdHgucmVzdG9yZSgpO1xufVxuLyoqXG4gKiBBZGQgYSBwYXRoIG9mIGEgcmVjdGFuZ2xlIHdpdGggcm91bmRlZCBjb3JuZXJzIHRvIHRoZSBjdXJyZW50IHN1Yi1wYXRoXG4gKiBAcGFyYW0gY3R4IC0gQ29udGV4dFxuICogQHBhcmFtIHJlY3QgLSBCb3VuZGluZyByZWN0XG4gKi8gZnVuY3Rpb24gYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwgcmVjdCkge1xuICAgIGNvbnN0IHsgeCAsIHkgLCB3ICwgaCAsIHJhZGl1cyAgfSA9IHJlY3Q7XG4gICAgLy8gdG9wIGxlZnQgYXJjXG4gICAgY3R4LmFyYyh4ICsgcmFkaXVzLnRvcExlZnQsIHkgKyByYWRpdXMudG9wTGVmdCwgcmFkaXVzLnRvcExlZnQsIDEuNSAqIFBJLCBQSSwgdHJ1ZSk7XG4gICAgLy8gbGluZSBmcm9tIHRvcCBsZWZ0IHRvIGJvdHRvbSBsZWZ0XG4gICAgY3R4LmxpbmVUbyh4LCB5ICsgaCAtIHJhZGl1cy5ib3R0b21MZWZ0KTtcbiAgICAvLyBib3R0b20gbGVmdCBhcmNcbiAgICBjdHguYXJjKHggKyByYWRpdXMuYm90dG9tTGVmdCwgeSArIGggLSByYWRpdXMuYm90dG9tTGVmdCwgcmFkaXVzLmJvdHRvbUxlZnQsIFBJLCBIQUxGX1BJLCB0cnVlKTtcbiAgICAvLyBsaW5lIGZyb20gYm90dG9tIGxlZnQgdG8gYm90dG9tIHJpZ2h0XG4gICAgY3R4LmxpbmVUbyh4ICsgdyAtIHJhZGl1cy5ib3R0b21SaWdodCwgeSArIGgpO1xuICAgIC8vIGJvdHRvbSByaWdodCBhcmNcbiAgICBjdHguYXJjKHggKyB3IC0gcmFkaXVzLmJvdHRvbVJpZ2h0LCB5ICsgaCAtIHJhZGl1cy5ib3R0b21SaWdodCwgcmFkaXVzLmJvdHRvbVJpZ2h0LCBIQUxGX1BJLCAwLCB0cnVlKTtcbiAgICAvLyBsaW5lIGZyb20gYm90dG9tIHJpZ2h0IHRvIHRvcCByaWdodFxuICAgIGN0eC5saW5lVG8oeCArIHcsIHkgKyByYWRpdXMudG9wUmlnaHQpO1xuICAgIC8vIHRvcCByaWdodCBhcmNcbiAgICBjdHguYXJjKHggKyB3IC0gcmFkaXVzLnRvcFJpZ2h0LCB5ICsgcmFkaXVzLnRvcFJpZ2h0LCByYWRpdXMudG9wUmlnaHQsIDAsIC1IQUxGX1BJLCB0cnVlKTtcbiAgICAvLyBsaW5lIGZyb20gdG9wIHJpZ2h0IHRvIHRvcCBsZWZ0XG4gICAgY3R4LmxpbmVUbyh4ICsgcmFkaXVzLnRvcExlZnQsIHkpO1xufVxuXG5jb25zdCBMSU5FX0hFSUdIVCA9IC9eKG5vcm1hbHwoXFxkKyg/OlxcLlxcZCspPykocHh8ZW18JSk/KSQvO1xuY29uc3QgRk9OVF9TVFlMRSA9IC9eKG5vcm1hbHxpdGFsaWN8aW5pdGlhbHxpbmhlcml0fHVuc2V0fChvYmxpcXVlKCAtP1swLTldP1swLTldZGVnKT8pKSQvO1xuLyoqXG4gKiBAYWxpYXMgQ2hhcnQuaGVscGVycy5vcHRpb25zXG4gKiBAbmFtZXNwYWNlXG4gKi8gLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gbGluZSBoZWlnaHQgYHZhbHVlYCBpbiBwaXhlbHMgZm9yIGEgc3BlY2lmaWMgZm9udCBgc2l6ZWAuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgbGluZUhlaWdodCB0byBwYXJzZSAoZWcuIDEuNiwgJzE0cHgnLCAnNzUlJywgJzEuNmVtJykuXG4gKiBAcGFyYW0gc2l6ZSAtIFRoZSBmb250IHNpemUgKGluIHBpeGVscykgdXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIGB2YWx1ZWAuXG4gKiBAcmV0dXJucyBUaGUgZWZmZWN0aXZlIGxpbmUgaGVpZ2h0IGluIHBpeGVscyAoc2l6ZSAqIDEuMiBpZiB2YWx1ZSBpcyBpbnZhbGlkKS5cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2xpbmUtaGVpZ2h0XG4gKiBAc2luY2UgMi43LjBcbiAqLyBmdW5jdGlvbiB0b0xpbmVIZWlnaHQodmFsdWUsIHNpemUpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gKCcnICsgdmFsdWUpLm1hdGNoKExJTkVfSEVJR0hUKTtcbiAgICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlc1sxXSA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgcmV0dXJuIHNpemUgKiAxLjI7XG4gICAgfVxuICAgIHZhbHVlID0gK21hdGNoZXNbMl07XG4gICAgc3dpdGNoKG1hdGNoZXNbM10pe1xuICAgICAgICBjYXNlICdweCc6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgdmFsdWUgLz0gMTAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBzaXplICogdmFsdWU7XG59XG5jb25zdCBudW1iZXJPclplcm8gPSAodik9Pit2IHx8IDA7XG5mdW5jdGlvbiBfcmVhZFZhbHVlVG9Qcm9wcyh2YWx1ZSwgcHJvcHMpIHtcbiAgICBjb25zdCByZXQgPSB7fTtcbiAgICBjb25zdCBvYmpQcm9wcyA9IGlzT2JqZWN0KHByb3BzKTtcbiAgICBjb25zdCBrZXlzID0gb2JqUHJvcHMgPyBPYmplY3Qua2V5cyhwcm9wcykgOiBwcm9wcztcbiAgICBjb25zdCByZWFkID0gaXNPYmplY3QodmFsdWUpID8gb2JqUHJvcHMgPyAocHJvcCk9PnZhbHVlT3JEZWZhdWx0KHZhbHVlW3Byb3BdLCB2YWx1ZVtwcm9wc1twcm9wXV0pIDogKHByb3ApPT52YWx1ZVtwcm9wXSA6ICgpPT52YWx1ZTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Yga2V5cyl7XG4gICAgICAgIHJldFtwcm9wXSA9IG51bWJlck9yWmVybyhyZWFkKHByb3ApKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8qKlxuICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYSBUUkJMIG9iamVjdC5cbiAqIEBwYXJhbSB2YWx1ZSAtIElmIGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIGFsbCBUUkJMIGNvbXBvbmVudCxcbiAqICBlbHNlLCBpZiBhbiBvYmplY3QsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHNldHMgdW5kZWZpbmVkIG9uZXMgdG8gMC5cbiAqICB4IC8geSBhcmUgc2hvcnRoYW5kcyBmb3Igc2FtZSB2YWx1ZSBmb3IgbGVmdC9yaWdodCBhbmQgdG9wL2JvdHRvbS5cbiAqIEByZXR1cm5zIFRoZSBwYWRkaW5nIHZhbHVlcyAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0KVxuICogQHNpbmNlIDMuMC4wXG4gKi8gZnVuY3Rpb24gdG9UUkJMKHZhbHVlKSB7XG4gICAgcmV0dXJuIF9yZWFkVmFsdWVUb1Byb3BzKHZhbHVlLCB7XG4gICAgICAgIHRvcDogJ3knLFxuICAgICAgICByaWdodDogJ3gnLFxuICAgICAgICBib3R0b206ICd5JyxcbiAgICAgICAgbGVmdDogJ3gnXG4gICAgfSk7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGEgVFJCTCBjb3JuZXJzIG9iamVjdCAoc2ltaWxhciB3aXRoIGNzcyBib3JkZXItcmFkaXVzKS5cbiAqIEBwYXJhbSB2YWx1ZSAtIElmIGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIGFsbCBUUkJMIGNvcm5lciBjb21wb25lbnRzLFxuICogIGVsc2UsIGlmIGFuIG9iamVjdCwgdXNlIGRlZmluZWQgcHJvcGVydGllcyBhbmQgc2V0cyB1bmRlZmluZWQgb25lcyB0byAwLlxuICogQHJldHVybnMgVGhlIFRSQkwgY29ybmVyIHZhbHVlcyAodG9wTGVmdCwgdG9wUmlnaHQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KVxuICogQHNpbmNlIDMuMC4wXG4gKi8gZnVuY3Rpb24gdG9UUkJMQ29ybmVycyh2YWx1ZSkge1xuICAgIHJldHVybiBfcmVhZFZhbHVlVG9Qcm9wcyh2YWx1ZSwgW1xuICAgICAgICAndG9wTGVmdCcsXG4gICAgICAgICd0b3BSaWdodCcsXG4gICAgICAgICdib3R0b21MZWZ0JyxcbiAgICAgICAgJ2JvdHRvbVJpZ2h0J1xuICAgIF0pO1xufVxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIHBhZGRpbmcgb2JqZWN0IHdpdGggcHJlLWNvbXB1dGVkIHdpZHRoL2hlaWdodC5cbiAqIEBwYXJhbSB2YWx1ZSAtIElmIGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIGFsbCBUUkJMIGNvbXBvbmVudCxcbiAqICBlbHNlLCBpZiBhbiBvYmplY3QsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHNldHMgdW5kZWZpbmVkIG9uZXMgdG8gMC5cbiAqICB4IC8geSBhcmUgc2hvcnRoYW5kcyBmb3Igc2FtZSB2YWx1ZSBmb3IgbGVmdC9yaWdodCBhbmQgdG9wL2JvdHRvbS5cbiAqIEByZXR1cm5zIFRoZSBwYWRkaW5nIHZhbHVlcyAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KVxuICogQHNpbmNlIDIuNy4wXG4gKi8gZnVuY3Rpb24gdG9QYWRkaW5nKHZhbHVlKSB7XG4gICAgY29uc3Qgb2JqID0gdG9UUkJMKHZhbHVlKTtcbiAgICBvYmoud2lkdGggPSBvYmoubGVmdCArIG9iai5yaWdodDtcbiAgICBvYmouaGVpZ2h0ID0gb2JqLnRvcCArIG9iai5ib3R0b207XG4gICAgcmV0dXJuIG9iajtcbn1cbi8qKlxuICogUGFyc2VzIGZvbnQgb3B0aW9ucyBhbmQgcmV0dXJucyB0aGUgZm9udCBvYmplY3QuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEEgb2JqZWN0IHRoYXQgY29udGFpbnMgZm9udCBvcHRpb25zIHRvIGJlIHBhcnNlZC5cbiAqIEBwYXJhbSBmYWxsYmFjayAtIEEgb2JqZWN0IHRoYXQgY29udGFpbnMgZmFsbGJhY2sgZm9udCBvcHRpb25zLlxuICogQHJldHVybiBUaGUgZm9udCBvYmplY3QuXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIHRvRm9udChvcHRpb25zLCBmYWxsYmFjaykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGZhbGxiYWNrID0gZmFsbGJhY2sgfHwgZGVmYXVsdHMuZm9udDtcbiAgICBsZXQgc2l6ZSA9IHZhbHVlT3JEZWZhdWx0KG9wdGlvbnMuc2l6ZSwgZmFsbGJhY2suc2l6ZSk7XG4gICAgaWYgKHR5cGVvZiBzaXplID09PSAnc3RyaW5nJykge1xuICAgICAgICBzaXplID0gcGFyc2VJbnQoc2l6ZSwgMTApO1xuICAgIH1cbiAgICBsZXQgc3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnN0eWxlLCBmYWxsYmFjay5zdHlsZSk7XG4gICAgaWYgKHN0eWxlICYmICEoJycgKyBzdHlsZSkubWF0Y2goRk9OVF9TVFlMRSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGZvbnQgc3R5bGUgc3BlY2lmaWVkOiBcIicgKyBzdHlsZSArICdcIicpO1xuICAgICAgICBzdHlsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZm9udCA9IHtcbiAgICAgICAgZmFtaWx5OiB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmZhbWlseSwgZmFsbGJhY2suZmFtaWx5KSxcbiAgICAgICAgbGluZUhlaWdodDogdG9MaW5lSGVpZ2h0KHZhbHVlT3JEZWZhdWx0KG9wdGlvbnMubGluZUhlaWdodCwgZmFsbGJhY2subGluZUhlaWdodCksIHNpemUpLFxuICAgICAgICBzaXplLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgd2VpZ2h0OiB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLndlaWdodCwgZmFsbGJhY2sud2VpZ2h0KSxcbiAgICAgICAgc3RyaW5nOiAnJ1xuICAgIH07XG4gICAgZm9udC5zdHJpbmcgPSB0b0ZvbnRTdHJpbmcoZm9udCk7XG4gICAgcmV0dXJuIGZvbnQ7XG59XG4vKipcbiAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gYGlucHV0c2Agc2VxdWVudGlhbGx5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBkZWZpbmVkIHZhbHVlLlxuICogQHBhcmFtIGlucHV0cyAtIEFuIGFycmF5IG9mIHZhbHVlcywgZmFsbGluZyBiYWNrIHRvIHRoZSBsYXN0IHZhbHVlLlxuICogQHBhcmFtIGNvbnRleHQgLSBJZiBkZWZpbmVkIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCB0aGUgdmFsdWVcbiAqIGlzIGNhbGxlZCB3aXRoIGBjb250ZXh0YCBhcyBmaXJzdCBhcmd1bWVudCBhbmQgdGhlIHJlc3VsdCBiZWNvbWVzIHRoZSBuZXcgaW5wdXQuXG4gKiBAcGFyYW0gaW5kZXggLSBJZiBkZWZpbmVkIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlIHZhbHVlXG4gKiBhdCBgaW5kZXhgIGJlY29tZSB0aGUgbmV3IGlucHV0LlxuICogQHBhcmFtIGluZm8gLSBvYmplY3QgdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHJlc29sdXRpb24gaW5cbiAqIEBwYXJhbSBpbmZvLmNhY2hlYWJsZSAtIFdpbGwgYmUgc2V0IHRvIGBmYWxzZWAgaWYgb3B0aW9uIGlzIG5vdCBjYWNoZWFibGUuXG4gKiBAc2luY2UgMi43LjBcbiAqLyBmdW5jdGlvbiByZXNvbHZlKGlucHV0cywgY29udGV4dCwgaW5kZXgsIGluZm8pIHtcbiAgICBsZXQgY2FjaGVhYmxlID0gdHJ1ZTtcbiAgICBsZXQgaSwgaWxlbiwgdmFsdWU7XG4gICAgZm9yKGkgPSAwLCBpbGVuID0gaW5wdXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIHZhbHVlID0gaW5wdXRzW2ldO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUoY29udGV4dCk7XG4gICAgICAgICAgICBjYWNoZWFibGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVtpbmRleCAlIHZhbHVlLmxlbmd0aF07XG4gICAgICAgICAgICBjYWNoZWFibGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGluZm8gJiYgIWNhY2hlYWJsZSkge1xuICAgICAgICAgICAgICAgIGluZm8uY2FjaGVhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEBwYXJhbSBtaW5tYXhcbiAqIEBwYXJhbSBncmFjZVxuICogQHBhcmFtIGJlZ2luQXRaZXJvXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9hZGRHcmFjZShtaW5tYXgsIGdyYWNlLCBiZWdpbkF0WmVybykge1xuICAgIGNvbnN0IHsgbWluICwgbWF4ICB9ID0gbWlubWF4O1xuICAgIGNvbnN0IGNoYW5nZSA9IHRvRGltZW5zaW9uKGdyYWNlLCAobWF4IC0gbWluKSAvIDIpO1xuICAgIGNvbnN0IGtlZXBaZXJvID0gKHZhbHVlLCBhZGQpPT5iZWdpbkF0WmVybyAmJiB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSArIGFkZDtcbiAgICByZXR1cm4ge1xuICAgICAgICBtaW46IGtlZXBaZXJvKG1pbiwgLU1hdGguYWJzKGNoYW5nZSkpLFxuICAgICAgICBtYXg6IGtlZXBaZXJvKG1heCwgY2hhbmdlKVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KHBhcmVudENvbnRleHQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHBhcmVudENvbnRleHQpLCBjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJveHkgZm9yIHJlc29sdmluZyByYXcgdmFsdWVzIGZvciBvcHRpb25zLlxuICogQHBhcmFtIHNjb3BlcyAtIFRoZSBvcHRpb24gc2NvcGVzIHRvIGxvb2sgZm9yIHZhbHVlcywgaW4gcmVzb2x1dGlvbiBvcmRlclxuICogQHBhcmFtIHByZWZpeGVzIC0gVGhlIHByZWZpeGVzIGZvciB2YWx1ZXMsIGluIHJlc29sdXRpb24gb3JkZXIuXG4gKiBAcGFyYW0gcm9vdFNjb3BlcyAtIFRoZSByb290IG9wdGlvbiBzY29wZXNcbiAqIEBwYXJhbSBmYWxsYmFjayAtIFBhcmVudCBzY29wZXMgZmFsbGJhY2tcbiAqIEBwYXJhbSBnZXRUYXJnZXQgLSBjYWxsYmFjayBmb3IgZ2V0dGluZyB0aGUgdGFyZ2V0IGZvciBjaGFuZ2VkIHZhbHVlc1xuICogQHJldHVybnMgUHJveHlcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2NyZWF0ZVJlc29sdmVyKHNjb3BlcywgcHJlZml4ZXMgPSBbXG4gICAgJydcbl0sIHJvb3RTY29wZXMsIGZhbGxiYWNrLCBnZXRUYXJnZXQgPSAoKT0+c2NvcGVzWzBdKSB7XG4gICAgY29uc3QgZmluYWxSb290U2NvcGVzID0gcm9vdFNjb3BlcyB8fCBzY29wZXM7XG4gICAgaWYgKHR5cGVvZiBmYWxsYmFjayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZmFsbGJhY2sgPSBfcmVzb2x2ZSgnX2ZhbGxiYWNrJywgc2NvcGVzKTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSB7XG4gICAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiAnT2JqZWN0JyxcbiAgICAgICAgX2NhY2hlYWJsZTogdHJ1ZSxcbiAgICAgICAgX3Njb3Blczogc2NvcGVzLFxuICAgICAgICBfcm9vdFNjb3BlczogZmluYWxSb290U2NvcGVzLFxuICAgICAgICBfZmFsbGJhY2s6IGZhbGxiYWNrLFxuICAgICAgICBfZ2V0VGFyZ2V0OiBnZXRUYXJnZXQsXG4gICAgICAgIG92ZXJyaWRlOiAoc2NvcGUpPT5fY3JlYXRlUmVzb2x2ZXIoW1xuICAgICAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgICAgIC4uLnNjb3Blc1xuICAgICAgICAgICAgXSwgcHJlZml4ZXMsIGZpbmFsUm9vdFNjb3BlcywgZmFsbGJhY2spXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb3h5KGNhY2hlLCB7XG4gICAgICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgdGhlIGRlbGV0ZSBvcGVyYXRvci5cbiAgICAgKi8gZGVsZXRlUHJvcGVydHkgKHRhcmdldCwgcHJvcCkge1xuICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtwcm9wXTsgLy8gcmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXQuX2tleXM7IC8vIHJlbW92ZSBjYWNoZWQga2V5c1xuICAgICAgICAgICAgZGVsZXRlIHNjb3Blc1swXVtwcm9wXTsgLy8gcmVtb3ZlIGZyb20gdG9wIGxldmVsIHNjb3BlXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICogQSB0cmFwIGZvciBnZXR0aW5nIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKi8gZ2V0ICh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBfY2FjaGVkKHRhcmdldCwgcHJvcCwgKCk9Pl9yZXNvbHZlV2l0aFByZWZpeGVzKHByb3AsIHByZWZpeGVzLCBzY29wZXMsIHRhcmdldCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuXG4gICAgICogQWxzbyB1c2VkIGJ5IE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5cbiAgICAgKi8gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQuX3Njb3Blc1swXSwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mLlxuICAgICAqLyBnZXRQcm90b3R5cGVPZiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRQcm90b3R5cGVPZihzY29wZXNbMF0pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIHRoZSBpbiBvcGVyYXRvci5cbiAgICAgKi8gaGFzICh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRLZXlzRnJvbUFsbFNjb3Blcyh0YXJnZXQpLmluY2x1ZGVzKHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIGFuZCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLlxuICAgICAqLyBvd25LZXlzICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRLZXlzRnJvbUFsbFNjb3Blcyh0YXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIHNldHRpbmcgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqLyBzZXQgKHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2UgPSB0YXJnZXQuX3N0b3JhZ2UgfHwgKHRhcmdldC5fc3RvcmFnZSA9IGdldFRhcmdldCgpKTtcbiAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHN0b3JhZ2VbcHJvcF0gPSB2YWx1ZTsgLy8gc2V0IHRvIHRvcCBsZXZlbCBzY29wZSArIGNhY2hlXG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0Ll9rZXlzOyAvLyByZW1vdmUgY2FjaGVkIGtleXNcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIFJldHVybnMgYW4gUHJveHkgZm9yIHJlc29sdmluZyBvcHRpb24gdmFsdWVzIHdpdGggY29udGV4dC5cbiAqIEBwYXJhbSBwcm94eSAtIFRoZSBQcm94eSByZXR1cm5lZCBieSBgX2NyZWF0ZVJlc29sdmVyYFxuICogQHBhcmFtIGNvbnRleHQgLSBDb250ZXh0IG9iamVjdCBmb3Igc2NyaXB0YWJsZS9pbmRleGFibGUgb3B0aW9uc1xuICogQHBhcmFtIHN1YlByb3h5IC0gVGhlIHByb3h5IHByb3ZpZGVkIGZvciBzY3JpcHRhYmxlIG9wdGlvbnNcbiAqIEBwYXJhbSBkZXNjcmlwdG9yRGVmYXVsdHMgLSBEZWZhdWx0cyBmb3IgZGVzY3JpcHRvcnNcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2F0dGFjaENvbnRleHQocHJveHksIGNvbnRleHQsIHN1YlByb3h5LCBkZXNjcmlwdG9yRGVmYXVsdHMpIHtcbiAgICBjb25zdCBjYWNoZSA9IHtcbiAgICAgICAgX2NhY2hlYWJsZTogZmFsc2UsXG4gICAgICAgIF9wcm94eTogcHJveHksXG4gICAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgICBfc3ViUHJveHk6IHN1YlByb3h5LFxuICAgICAgICBfc3RhY2s6IG5ldyBTZXQoKSxcbiAgICAgICAgX2Rlc2NyaXB0b3JzOiBfZGVzY3JpcHRvcnMocHJveHksIGRlc2NyaXB0b3JEZWZhdWx0cyksXG4gICAgICAgIHNldENvbnRleHQ6IChjdHgpPT5fYXR0YWNoQ29udGV4dChwcm94eSwgY3R4LCBzdWJQcm94eSwgZGVzY3JpcHRvckRlZmF1bHRzKSxcbiAgICAgICAgb3ZlcnJpZGU6IChzY29wZSk9Pl9hdHRhY2hDb250ZXh0KHByb3h5Lm92ZXJyaWRlKHNjb3BlKSwgY29udGV4dCwgc3ViUHJveHksIGRlc2NyaXB0b3JEZWZhdWx0cylcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJveHkoY2FjaGUsIHtcbiAgICAgICAgLyoqXG4gICAgICogQSB0cmFwIGZvciB0aGUgZGVsZXRlIG9wZXJhdG9yLlxuICAgICAqLyBkZWxldGVQcm9wZXJ0eSAodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0W3Byb3BdOyAvLyByZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgICAgICAgZGVsZXRlIHByb3h5W3Byb3BdOyAvLyByZW1vdmUgZnJvbSBwcm94eVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgZ2V0dGluZyBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICovIGdldCAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9jYWNoZWQodGFyZ2V0LCBwcm9wLCAoKT0+X3Jlc29sdmVXaXRoQ29udGV4dCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5cbiAgICAgKiBBbHNvIHVzZWQgYnkgT2JqZWN0Lmhhc093blByb3BlcnR5LlxuICAgICAqLyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgKHRhcmdldCwgcHJvcCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5fZGVzY3JpcHRvcnMuYWxsS2V5cyA/IFJlZmxlY3QuaGFzKHByb3h5LCBwcm9wKSA/IHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCA6IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3h5LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICogQSB0cmFwIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YuXG4gICAgICovIGdldFByb3RvdHlwZU9mICgpIHtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHByb3h5KTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICogQSB0cmFwIGZvciB0aGUgaW4gb3BlcmF0b3IuXG4gICAgICovIGhhcyAodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXMocHJveHksIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIGFuZCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLlxuICAgICAqLyBvd25LZXlzICgpIHtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMocHJveHkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIHNldHRpbmcgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqLyBzZXQgKHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgICAgIHByb3h5W3Byb3BdID0gdmFsdWU7IC8vIHNldCB0byBwcm94eVxuICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtwcm9wXTsgLy8gcmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2Rlc2NyaXB0b3JzKHByb3h5LCBkZWZhdWx0cyA9IHtcbiAgICBzY3JpcHRhYmxlOiB0cnVlLFxuICAgIGluZGV4YWJsZTogdHJ1ZVxufSkge1xuICAgIGNvbnN0IHsgX3NjcmlwdGFibGUgPWRlZmF1bHRzLnNjcmlwdGFibGUgLCBfaW5kZXhhYmxlID1kZWZhdWx0cy5pbmRleGFibGUgLCBfYWxsS2V5cyA9ZGVmYXVsdHMuYWxsS2V5cyAgfSA9IHByb3h5O1xuICAgIHJldHVybiB7XG4gICAgICAgIGFsbEtleXM6IF9hbGxLZXlzLFxuICAgICAgICBzY3JpcHRhYmxlOiBfc2NyaXB0YWJsZSxcbiAgICAgICAgaW5kZXhhYmxlOiBfaW5kZXhhYmxlLFxuICAgICAgICBpc1NjcmlwdGFibGU6IGlzRnVuY3Rpb24oX3NjcmlwdGFibGUpID8gX3NjcmlwdGFibGUgOiAoKT0+X3NjcmlwdGFibGUsXG4gICAgICAgIGlzSW5kZXhhYmxlOiBpc0Z1bmN0aW9uKF9pbmRleGFibGUpID8gX2luZGV4YWJsZSA6ICgpPT5faW5kZXhhYmxlXG4gICAgfTtcbn1cbmNvbnN0IHJlYWRLZXkgPSAocHJlZml4LCBuYW1lKT0+cHJlZml4ID8gcHJlZml4ICsgX2NhcGl0YWxpemUobmFtZSkgOiBuYW1lO1xuY29uc3QgbmVlZHNTdWJSZXNvbHZlciA9IChwcm9wLCB2YWx1ZSk9PmlzT2JqZWN0KHZhbHVlKSAmJiBwcm9wICE9PSAnYWRhcHRlcnMnICYmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBudWxsIHx8IHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpO1xuZnVuY3Rpb24gX2NhY2hlZCh0YXJnZXQsIHByb3AsIHJlc29sdmUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgcHJvcCkgfHwgcHJvcCA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHJlc29sdmUoKTtcbiAgICAvLyBjYWNoZSB0aGUgcmVzb2x2ZWQgdmFsdWVcbiAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBfcmVzb2x2ZVdpdGhDb250ZXh0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICBjb25zdCB7IF9wcm94eSAsIF9jb250ZXh0ICwgX3N1YlByb3h5ICwgX2Rlc2NyaXB0b3JzOiBkZXNjcmlwdG9ycyAgfSA9IHRhcmdldDtcbiAgICBsZXQgdmFsdWUgPSBfcHJveHlbcHJvcF07IC8vIHJlc29sdmUgZnJvbSBwcm94eVxuICAgIC8vIHJlc29sdmUgd2l0aCBjb250ZXh0XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpICYmIGRlc2NyaXB0b3JzLmlzU2NyaXB0YWJsZShwcm9wKSkge1xuICAgICAgICB2YWx1ZSA9IF9yZXNvbHZlU2NyaXB0YWJsZShwcm9wLCB2YWx1ZSwgdGFyZ2V0LCByZWNlaXZlcik7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWUgPSBfcmVzb2x2ZUFycmF5KHByb3AsIHZhbHVlLCB0YXJnZXQsIGRlc2NyaXB0b3JzLmlzSW5kZXhhYmxlKTtcbiAgICB9XG4gICAgaWYgKG5lZWRzU3ViUmVzb2x2ZXIocHJvcCwgdmFsdWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcyBhbiBvYmplY3QsIGNyZWF0ZSBhIHN1YiByZXNvbHZlciBmb3IgaXRcbiAgICAgICAgdmFsdWUgPSBfYXR0YWNoQ29udGV4dCh2YWx1ZSwgX2NvbnRleHQsIF9zdWJQcm94eSAmJiBfc3ViUHJveHlbcHJvcF0sIGRlc2NyaXB0b3JzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gX3Jlc29sdmVTY3JpcHRhYmxlKHByb3AsIGdldFZhbHVlLCB0YXJnZXQsIHJlY2VpdmVyKSB7XG4gICAgY29uc3QgeyBfcHJveHkgLCBfY29udGV4dCAsIF9zdWJQcm94eSAsIF9zdGFjayAgfSA9IHRhcmdldDtcbiAgICBpZiAoX3N0YWNrLmhhcyhwcm9wKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY3Vyc2lvbiBkZXRlY3RlZDogJyArIEFycmF5LmZyb20oX3N0YWNrKS5qb2luKCctPicpICsgJy0+JyArIHByb3ApO1xuICAgIH1cbiAgICBfc3RhY2suYWRkKHByb3ApO1xuICAgIGxldCB2YWx1ZSA9IGdldFZhbHVlKF9jb250ZXh0LCBfc3ViUHJveHkgfHwgcmVjZWl2ZXIpO1xuICAgIF9zdGFjay5kZWxldGUocHJvcCk7XG4gICAgaWYgKG5lZWRzU3ViUmVzb2x2ZXIocHJvcCwgdmFsdWUpKSB7XG4gICAgICAgIC8vIFdoZW4gc2NyaXB0YWJsZSBvcHRpb24gcmV0dXJucyBhbiBvYmplY3QsIGNyZWF0ZSBhIHJlc29sdmVyIG9uIHRoYXQuXG4gICAgICAgIHZhbHVlID0gY3JlYXRlU3ViUmVzb2x2ZXIoX3Byb3h5Ll9zY29wZXMsIF9wcm94eSwgcHJvcCwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBfcmVzb2x2ZUFycmF5KHByb3AsIHZhbHVlLCB0YXJnZXQsIGlzSW5kZXhhYmxlKSB7XG4gICAgY29uc3QgeyBfcHJveHkgLCBfY29udGV4dCAsIF9zdWJQcm94eSAsIF9kZXNjcmlwdG9yczogZGVzY3JpcHRvcnMgIH0gPSB0YXJnZXQ7XG4gICAgaWYgKHR5cGVvZiBfY29udGV4dC5pbmRleCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNJbmRleGFibGUocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlW19jb250ZXh0LmluZGV4ICUgdmFsdWUubGVuZ3RoXTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlWzBdKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBvYmplY3RzLCByZXR1cm4gYXJyYXkgb3IgcmVzb2x2ZXJzXG4gICAgICAgIGNvbnN0IGFyciA9IHZhbHVlO1xuICAgICAgICBjb25zdCBzY29wZXMgPSBfcHJveHkuX3Njb3Blcy5maWx0ZXIoKHMpPT5zICE9PSBhcnIpO1xuICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyKXtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVyID0gY3JlYXRlU3ViUmVzb2x2ZXIoc2NvcGVzLCBfcHJveHksIHByb3AsIGl0ZW0pO1xuICAgICAgICAgICAgdmFsdWUucHVzaChfYXR0YWNoQ29udGV4dChyZXNvbHZlciwgX2NvbnRleHQsIF9zdWJQcm94eSAmJiBfc3ViUHJveHlbcHJvcF0sIGRlc2NyaXB0b3JzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUZhbGxiYWNrKGZhbGxiYWNrLCBwcm9wLCB2YWx1ZSkge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKGZhbGxiYWNrKSA/IGZhbGxiYWNrKHByb3AsIHZhbHVlKSA6IGZhbGxiYWNrO1xufVxuY29uc3QgZ2V0U2NvcGUgPSAoa2V5LCBwYXJlbnQpPT5rZXkgPT09IHRydWUgPyBwYXJlbnQgOiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyA/IHJlc29sdmVPYmplY3RLZXkocGFyZW50LCBrZXkpIDogdW5kZWZpbmVkO1xuZnVuY3Rpb24gYWRkU2NvcGVzKHNldCwgcGFyZW50U2NvcGVzLCBrZXksIHBhcmVudEZhbGxiYWNrLCB2YWx1ZSkge1xuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudFNjb3Blcyl7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gZ2V0U2NvcGUoa2V5LCBwYXJlbnQpO1xuICAgICAgICBpZiAoc2NvcGUpIHtcbiAgICAgICAgICAgIHNldC5hZGQoc2NvcGUpO1xuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2sgPSByZXNvbHZlRmFsbGJhY2soc2NvcGUuX2ZhbGxiYWNrLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmFsbGJhY2sgIT09ICd1bmRlZmluZWQnICYmIGZhbGxiYWNrICE9PSBrZXkgJiYgZmFsbGJhY2sgIT09IHBhcmVudEZhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSByZWFjaCB0aGUgZGVzY3JpcHRvciB0aGF0IGRlZmluZXMgYSBuZXcgX2ZhbGxiYWNrLCByZXR1cm4gdGhhdC5cbiAgICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgd2lsbCByZXN1bWUgdG8gdGhhdCBuZXcgc2NvcGUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlID09PSBmYWxzZSAmJiB0eXBlb2YgcGFyZW50RmFsbGJhY2sgIT09ICd1bmRlZmluZWQnICYmIGtleSAhPT0gcGFyZW50RmFsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGBmYWxzZWAgcmVzdWx0cyB0byBgZmFsc2VgLCB3aGVuIGZhbGxpbmcgYmFjayB0byBkaWZmZXJlbnQga2V5LlxuICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUgYGludGVyYWN0aW9uYCBmcm9tIGBob3ZlcmAgb3IgYHBsdWdpbnMudG9vbHRpcGAgYW5kIGBhbmltYXRpb25gIGZyb20gYGFuaW1hdGlvbnNgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjcmVhdGVTdWJSZXNvbHZlcihwYXJlbnRTY29wZXMsIHJlc29sdmVyLCBwcm9wLCB2YWx1ZSkge1xuICAgIGNvbnN0IHJvb3RTY29wZXMgPSByZXNvbHZlci5fcm9vdFNjb3BlcztcbiAgICBjb25zdCBmYWxsYmFjayA9IHJlc29sdmVGYWxsYmFjayhyZXNvbHZlci5fZmFsbGJhY2ssIHByb3AsIHZhbHVlKTtcbiAgICBjb25zdCBhbGxTY29wZXMgPSBbXG4gICAgICAgIC4uLnBhcmVudFNjb3BlcyxcbiAgICAgICAgLi4ucm9vdFNjb3Blc1xuICAgIF07XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCgpO1xuICAgIHNldC5hZGQodmFsdWUpO1xuICAgIGxldCBrZXkgPSBhZGRTY29wZXNGcm9tS2V5KHNldCwgYWxsU2NvcGVzLCBwcm9wLCBmYWxsYmFjayB8fCBwcm9wLCB2YWx1ZSk7XG4gICAgaWYgKGtleSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZmFsbGJhY2sgIT09ICd1bmRlZmluZWQnICYmIGZhbGxiYWNrICE9PSBwcm9wKSB7XG4gICAgICAgIGtleSA9IGFkZFNjb3Blc0Zyb21LZXkoc2V0LCBhbGxTY29wZXMsIGZhbGxiYWNrLCBrZXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfY3JlYXRlUmVzb2x2ZXIoQXJyYXkuZnJvbShzZXQpLCBbXG4gICAgICAgICcnXG4gICAgXSwgcm9vdFNjb3BlcywgZmFsbGJhY2ssICgpPT5zdWJHZXRUYXJnZXQocmVzb2x2ZXIsIHByb3AsIHZhbHVlKSk7XG59XG5mdW5jdGlvbiBhZGRTY29wZXNGcm9tS2V5KHNldCwgYWxsU2NvcGVzLCBrZXksIGZhbGxiYWNrLCBpdGVtKSB7XG4gICAgd2hpbGUoa2V5KXtcbiAgICAgICAga2V5ID0gYWRkU2NvcGVzKHNldCwgYWxsU2NvcGVzLCBrZXksIGZhbGxiYWNrLCBpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIHN1YkdldFRhcmdldChyZXNvbHZlciwgcHJvcCwgdmFsdWUpIHtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5fZ2V0VGFyZ2V0KCk7XG4gICAgaWYgKCEocHJvcCBpbiBwYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudFtwcm9wXSA9IHt9O1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBwYXJlbnRbcHJvcF07XG4gICAgaWYgKGlzQXJyYXkodGFyZ2V0KSAmJiBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgLy8gRm9yIGFycmF5IG9mIG9iamVjdHMsIHRoZSBvYmplY3QgaXMgdXNlZCB0byBzdG9yZSB1cGRhdGVkIHZhbHVlc1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQgfHwge307XG59XG5mdW5jdGlvbiBfcmVzb2x2ZVdpdGhQcmVmaXhlcyhwcm9wLCBwcmVmaXhlcywgc2NvcGVzLCBwcm94eSkge1xuICAgIGxldCB2YWx1ZTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBwcmVmaXhlcyl7XG4gICAgICAgIHZhbHVlID0gX3Jlc29sdmUocmVhZEtleShwcmVmaXgsIHByb3ApLCBzY29wZXMpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIG5lZWRzU3ViUmVzb2x2ZXIocHJvcCwgdmFsdWUpID8gY3JlYXRlU3ViUmVzb2x2ZXIoc2NvcGVzLCBwcm94eSwgcHJvcCwgdmFsdWUpIDogdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBfcmVzb2x2ZShrZXksIHNjb3Blcykge1xuICAgIGZvciAoY29uc3Qgc2NvcGUgb2Ygc2NvcGVzKXtcbiAgICAgICAgaWYgKCFzY29wZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBzY29wZVtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0S2V5c0Zyb21BbGxTY29wZXModGFyZ2V0KSB7XG4gICAgbGV0IGtleXMgPSB0YXJnZXQuX2tleXM7XG4gICAgaWYgKCFrZXlzKSB7XG4gICAgICAgIGtleXMgPSB0YXJnZXQuX2tleXMgPSByZXNvbHZlS2V5c0Zyb21BbGxTY29wZXModGFyZ2V0Ll9zY29wZXMpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbn1cbmZ1bmN0aW9uIHJlc29sdmVLZXlzRnJvbUFsbFNjb3BlcyhzY29wZXMpIHtcbiAgICBjb25zdCBzZXQgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBzY29wZSBvZiBzY29wZXMpe1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY29wZSkuZmlsdGVyKChrKT0+IWsuc3RhcnRzV2l0aCgnXycpKSl7XG4gICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2V0KTtcbn1cbmZ1bmN0aW9uIF9wYXJzZU9iamVjdERhdGFSYWRpYWxTY2FsZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCB7IGlTY2FsZSAgfSA9IG1ldGE7XG4gICAgY29uc3QgeyBrZXkgPSdyJyAgfSA9IHRoaXMuX3BhcnNpbmc7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICBsZXQgaSwgaWxlbiwgaW5kZXgsIGl0ZW07XG4gICAgZm9yKGkgPSAwLCBpbGVuID0gY291bnQ7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICBpbmRleCA9IGkgKyBzdGFydDtcbiAgICAgICAgaXRlbSA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBwYXJzZWRbaV0gPSB7XG4gICAgICAgICAgICByOiBpU2NhbGUucGFyc2UocmVzb2x2ZU9iamVjdEtleShpdGVtLCBrZXkpLCBpbmRleClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbn1cblxuY29uc3QgRVBTSUxPTiA9IE51bWJlci5FUFNJTE9OIHx8IDFlLTE0O1xuY29uc3QgZ2V0UG9pbnQgPSAocG9pbnRzLCBpKT0+aSA8IHBvaW50cy5sZW5ndGggJiYgIXBvaW50c1tpXS5za2lwICYmIHBvaW50c1tpXTtcbmNvbnN0IGdldFZhbHVlQXhpcyA9IChpbmRleEF4aXMpPT5pbmRleEF4aXMgPT09ICd4JyA/ICd5JyA6ICd4JztcbmZ1bmN0aW9uIHNwbGluZUN1cnZlKGZpcnN0UG9pbnQsIG1pZGRsZVBvaW50LCBhZnRlclBvaW50LCB0KSB7XG4gICAgLy8gUHJvcHMgdG8gUm9iIFNwZW5jZXIgYXQgc2NhbGVkIGlubm92YXRpb24gZm9yIGhpcyBwb3N0IG9uIHNwbGluaW5nIGJldHdlZW4gcG9pbnRzXG4gICAgLy8gaHR0cDovL3NjYWxlZGlubm92YXRpb24uY29tL2FuYWx5dGljcy9zcGxpbmVzL2Fib3V0U3BsaW5lcy5odG1sXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGFsc28gcmVzcGVjdCBcInNraXBwZWRcIiBwb2ludHNcbiAgICBjb25zdCBwcmV2aW91cyA9IGZpcnN0UG9pbnQuc2tpcCA/IG1pZGRsZVBvaW50IDogZmlyc3RQb2ludDtcbiAgICBjb25zdCBjdXJyZW50ID0gbWlkZGxlUG9pbnQ7XG4gICAgY29uc3QgbmV4dCA9IGFmdGVyUG9pbnQuc2tpcCA/IG1pZGRsZVBvaW50IDogYWZ0ZXJQb2ludDtcbiAgICBjb25zdCBkMDEgPSBkaXN0YW5jZUJldHdlZW5Qb2ludHMoY3VycmVudCwgcHJldmlvdXMpO1xuICAgIGNvbnN0IGQxMiA9IGRpc3RhbmNlQmV0d2VlblBvaW50cyhuZXh0LCBjdXJyZW50KTtcbiAgICBsZXQgczAxID0gZDAxIC8gKGQwMSArIGQxMik7XG4gICAgbGV0IHMxMiA9IGQxMiAvIChkMDEgKyBkMTIpO1xuICAgIC8vIElmIGFsbCBwb2ludHMgYXJlIHRoZSBzYW1lLCBzMDEgJiBzMDIgd2lsbCBiZSBpbmZcbiAgICBzMDEgPSBpc05hTihzMDEpID8gMCA6IHMwMTtcbiAgICBzMTIgPSBpc05hTihzMTIpID8gMCA6IHMxMjtcbiAgICBjb25zdCBmYSA9IHQgKiBzMDE7IC8vIHNjYWxpbmcgZmFjdG9yIGZvciB0cmlhbmdsZSBUYVxuICAgIGNvbnN0IGZiID0gdCAqIHMxMjtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcmV2aW91czoge1xuICAgICAgICAgICAgeDogY3VycmVudC54IC0gZmEgKiAobmV4dC54IC0gcHJldmlvdXMueCksXG4gICAgICAgICAgICB5OiBjdXJyZW50LnkgLSBmYSAqIChuZXh0LnkgLSBwcmV2aW91cy55KVxuICAgICAgICB9LFxuICAgICAgICBuZXh0OiB7XG4gICAgICAgICAgICB4OiBjdXJyZW50LnggKyBmYiAqIChuZXh0LnggLSBwcmV2aW91cy54KSxcbiAgICAgICAgICAgIHk6IGN1cnJlbnQueSArIGZiICogKG5leHQueSAtIHByZXZpb3VzLnkpXG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG4gKiBBZGp1c3QgdGFuZ2VudHMgdG8gZW5zdXJlIG1vbm90b25pYyBwcm9wZXJ0aWVzXG4gKi8gZnVuY3Rpb24gbW9ub3RvbmVBZGp1c3QocG9pbnRzLCBkZWx0YUssIG1LKSB7XG4gICAgY29uc3QgcG9pbnRzTGVuID0gcG9pbnRzLmxlbmd0aDtcbiAgICBsZXQgYWxwaGFLLCBiZXRhSywgdGF1Sywgc3F1YXJlZE1hZ25pdHVkZSwgcG9pbnRDdXJyZW50O1xuICAgIGxldCBwb2ludEFmdGVyID0gZ2V0UG9pbnQocG9pbnRzLCAwKTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgcG9pbnRzTGVuIC0gMTsgKytpKXtcbiAgICAgICAgcG9pbnRDdXJyZW50ID0gcG9pbnRBZnRlcjtcbiAgICAgICAgcG9pbnRBZnRlciA9IGdldFBvaW50KHBvaW50cywgaSArIDEpO1xuICAgICAgICBpZiAoIXBvaW50Q3VycmVudCB8fCAhcG9pbnRBZnRlcikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbW9zdEVxdWFscyhkZWx0YUtbaV0sIDAsIEVQU0lMT04pKSB7XG4gICAgICAgICAgICBtS1tpXSA9IG1LW2kgKyAxXSA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhbHBoYUsgPSBtS1tpXSAvIGRlbHRhS1tpXTtcbiAgICAgICAgYmV0YUsgPSBtS1tpICsgMV0gLyBkZWx0YUtbaV07XG4gICAgICAgIHNxdWFyZWRNYWduaXR1ZGUgPSBNYXRoLnBvdyhhbHBoYUssIDIpICsgTWF0aC5wb3coYmV0YUssIDIpO1xuICAgICAgICBpZiAoc3F1YXJlZE1hZ25pdHVkZSA8PSA5KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXVLID0gMyAvIE1hdGguc3FydChzcXVhcmVkTWFnbml0dWRlKTtcbiAgICAgICAgbUtbaV0gPSBhbHBoYUsgKiB0YXVLICogZGVsdGFLW2ldO1xuICAgICAgICBtS1tpICsgMV0gPSBiZXRhSyAqIHRhdUsgKiBkZWx0YUtbaV07XG4gICAgfVxufVxuZnVuY3Rpb24gbW9ub3RvbmVDb21wdXRlKHBvaW50cywgbUssIGluZGV4QXhpcyA9ICd4Jykge1xuICAgIGNvbnN0IHZhbHVlQXhpcyA9IGdldFZhbHVlQXhpcyhpbmRleEF4aXMpO1xuICAgIGNvbnN0IHBvaW50c0xlbiA9IHBvaW50cy5sZW5ndGg7XG4gICAgbGV0IGRlbHRhLCBwb2ludEJlZm9yZSwgcG9pbnRDdXJyZW50O1xuICAgIGxldCBwb2ludEFmdGVyID0gZ2V0UG9pbnQocG9pbnRzLCAwKTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgcG9pbnRzTGVuOyArK2kpe1xuICAgICAgICBwb2ludEJlZm9yZSA9IHBvaW50Q3VycmVudDtcbiAgICAgICAgcG9pbnRDdXJyZW50ID0gcG9pbnRBZnRlcjtcbiAgICAgICAgcG9pbnRBZnRlciA9IGdldFBvaW50KHBvaW50cywgaSArIDEpO1xuICAgICAgICBpZiAoIXBvaW50Q3VycmVudCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaVBpeGVsID0gcG9pbnRDdXJyZW50W2luZGV4QXhpc107XG4gICAgICAgIGNvbnN0IHZQaXhlbCA9IHBvaW50Q3VycmVudFt2YWx1ZUF4aXNdO1xuICAgICAgICBpZiAocG9pbnRCZWZvcmUpIHtcbiAgICAgICAgICAgIGRlbHRhID0gKGlQaXhlbCAtIHBvaW50QmVmb3JlW2luZGV4QXhpc10pIC8gMztcbiAgICAgICAgICAgIHBvaW50Q3VycmVudFtgY3AxJHtpbmRleEF4aXN9YF0gPSBpUGl4ZWwgLSBkZWx0YTtcbiAgICAgICAgICAgIHBvaW50Q3VycmVudFtgY3AxJHt2YWx1ZUF4aXN9YF0gPSB2UGl4ZWwgLSBkZWx0YSAqIG1LW2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb2ludEFmdGVyKSB7XG4gICAgICAgICAgICBkZWx0YSA9IChwb2ludEFmdGVyW2luZGV4QXhpc10gLSBpUGl4ZWwpIC8gMztcbiAgICAgICAgICAgIHBvaW50Q3VycmVudFtgY3AyJHtpbmRleEF4aXN9YF0gPSBpUGl4ZWwgKyBkZWx0YTtcbiAgICAgICAgICAgIHBvaW50Q3VycmVudFtgY3AyJHt2YWx1ZUF4aXN9YF0gPSB2UGl4ZWwgKyBkZWx0YSAqIG1LW2ldO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgQsOpemllciBjb250cm9sIHBvaW50cyBpbiBhIHNpbWlsYXIgd2F5IHRoYW4gfHNwbGluZUN1cnZlfCxcbiAqIGJ1dCBwcmVzZXJ2ZXMgbW9ub3RvbmljaXR5IG9mIHRoZSBwcm92aWRlZCBkYXRhIGFuZCBlbnN1cmVzIG5vIGxvY2FsIGV4dHJlbXVtcyBhcmUgYWRkZWRcbiAqIGJldHdlZW4gdGhlIGRhdGFzZXQgZGlzY3JldGUgcG9pbnRzIGR1ZSB0byB0aGUgaW50ZXJwb2xhdGlvbi5cbiAqIFNlZSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vbm90b25lX2N1YmljX2ludGVycG9sYXRpb25cbiAqLyBmdW5jdGlvbiBzcGxpbmVDdXJ2ZU1vbm90b25lKHBvaW50cywgaW5kZXhBeGlzID0gJ3gnKSB7XG4gICAgY29uc3QgdmFsdWVBeGlzID0gZ2V0VmFsdWVBeGlzKGluZGV4QXhpcyk7XG4gICAgY29uc3QgcG9pbnRzTGVuID0gcG9pbnRzLmxlbmd0aDtcbiAgICBjb25zdCBkZWx0YUsgPSBBcnJheShwb2ludHNMZW4pLmZpbGwoMCk7XG4gICAgY29uc3QgbUsgPSBBcnJheShwb2ludHNMZW4pO1xuICAgIC8vIENhbGN1bGF0ZSBzbG9wZXMgKGRlbHRhSykgYW5kIGluaXRpYWxpemUgdGFuZ2VudHMgKG1LKVxuICAgIGxldCBpLCBwb2ludEJlZm9yZSwgcG9pbnRDdXJyZW50O1xuICAgIGxldCBwb2ludEFmdGVyID0gZ2V0UG9pbnQocG9pbnRzLCAwKTtcbiAgICBmb3IoaSA9IDA7IGkgPCBwb2ludHNMZW47ICsraSl7XG4gICAgICAgIHBvaW50QmVmb3JlID0gcG9pbnRDdXJyZW50O1xuICAgICAgICBwb2ludEN1cnJlbnQgPSBwb2ludEFmdGVyO1xuICAgICAgICBwb2ludEFmdGVyID0gZ2V0UG9pbnQocG9pbnRzLCBpICsgMSk7XG4gICAgICAgIGlmICghcG9pbnRDdXJyZW50KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9pbnRBZnRlcikge1xuICAgICAgICAgICAgY29uc3Qgc2xvcGVEZWx0YSA9IHBvaW50QWZ0ZXJbaW5kZXhBeGlzXSAtIHBvaW50Q3VycmVudFtpbmRleEF4aXNdO1xuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgdHdvIHBvaW50cyB0aGF0IGFwcGVhciBhdCB0aGUgc2FtZSB4IHBpeGVsLCBzbG9wZURlbHRhWCBpcyAwXG4gICAgICAgICAgICBkZWx0YUtbaV0gPSBzbG9wZURlbHRhICE9PSAwID8gKHBvaW50QWZ0ZXJbdmFsdWVBeGlzXSAtIHBvaW50Q3VycmVudFt2YWx1ZUF4aXNdKSAvIHNsb3BlRGVsdGEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIG1LW2ldID0gIXBvaW50QmVmb3JlID8gZGVsdGFLW2ldIDogIXBvaW50QWZ0ZXIgPyBkZWx0YUtbaSAtIDFdIDogc2lnbihkZWx0YUtbaSAtIDFdKSAhPT0gc2lnbihkZWx0YUtbaV0pID8gMCA6IChkZWx0YUtbaSAtIDFdICsgZGVsdGFLW2ldKSAvIDI7XG4gICAgfVxuICAgIG1vbm90b25lQWRqdXN0KHBvaW50cywgZGVsdGFLLCBtSyk7XG4gICAgbW9ub3RvbmVDb21wdXRlKHBvaW50cywgbUssIGluZGV4QXhpcyk7XG59XG5mdW5jdGlvbiBjYXBDb250cm9sUG9pbnQocHQsIG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHB0LCBtYXgpLCBtaW4pO1xufVxuZnVuY3Rpb24gY2FwQmV6aWVyUG9pbnRzKHBvaW50cywgYXJlYSkge1xuICAgIGxldCBpLCBpbGVuLCBwb2ludCwgaW5BcmVhLCBpbkFyZWFQcmV2O1xuICAgIGxldCBpbkFyZWFOZXh0ID0gX2lzUG9pbnRJbkFyZWEocG9pbnRzWzBdLCBhcmVhKTtcbiAgICBmb3IoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgaW5BcmVhUHJldiA9IGluQXJlYTtcbiAgICAgICAgaW5BcmVhID0gaW5BcmVhTmV4dDtcbiAgICAgICAgaW5BcmVhTmV4dCA9IGkgPCBpbGVuIC0gMSAmJiBfaXNQb2ludEluQXJlYShwb2ludHNbaSArIDFdLCBhcmVhKTtcbiAgICAgICAgaWYgKCFpbkFyZWEpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICBpZiAoaW5BcmVhUHJldikge1xuICAgICAgICAgICAgcG9pbnQuY3AxeCA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDF4LCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xuICAgICAgICAgICAgcG9pbnQuY3AxeSA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDF5LCBhcmVhLnRvcCwgYXJlYS5ib3R0b20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbkFyZWFOZXh0KSB7XG4gICAgICAgICAgICBwb2ludC5jcDJ4ID0gY2FwQ29udHJvbFBvaW50KHBvaW50LmNwMngsIGFyZWEubGVmdCwgYXJlYS5yaWdodCk7XG4gICAgICAgICAgICBwb2ludC5jcDJ5ID0gY2FwQ29udHJvbFBvaW50KHBvaW50LmNwMnksIGFyZWEudG9wLCBhcmVhLmJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX3VwZGF0ZUJlemllckNvbnRyb2xQb2ludHMocG9pbnRzLCBvcHRpb25zLCBhcmVhLCBsb29wLCBpbmRleEF4aXMpIHtcbiAgICBsZXQgaSwgaWxlbiwgcG9pbnQsIGNvbnRyb2xQb2ludHM7XG4gICAgLy8gT25seSBjb25zaWRlciBwb2ludHMgdGhhdCBhcmUgZHJhd24gaW4gY2FzZSB0aGUgc3BhbkdhcHMgb3B0aW9uIGlzIHVzZWRcbiAgICBpZiAob3B0aW9ucy5zcGFuR2Fwcykge1xuICAgICAgICBwb2ludHMgPSBwb2ludHMuZmlsdGVyKChwdCk9PiFwdC5za2lwKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA9PT0gJ21vbm90b25lJykge1xuICAgICAgICBzcGxpbmVDdXJ2ZU1vbm90b25lKHBvaW50cywgaW5kZXhBeGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJldiA9IGxvb3AgPyBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdIDogcG9pbnRzWzBdO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29udHJvbFBvaW50cyA9IHNwbGluZUN1cnZlKHByZXYsIHBvaW50LCBwb2ludHNbTWF0aC5taW4oaSArIDEsIGlsZW4gLSAobG9vcCA/IDAgOiAxKSkgJSBpbGVuXSwgb3B0aW9ucy50ZW5zaW9uKTtcbiAgICAgICAgICAgIHBvaW50LmNwMXggPSBjb250cm9sUG9pbnRzLnByZXZpb3VzLng7XG4gICAgICAgICAgICBwb2ludC5jcDF5ID0gY29udHJvbFBvaW50cy5wcmV2aW91cy55O1xuICAgICAgICAgICAgcG9pbnQuY3AyeCA9IGNvbnRyb2xQb2ludHMubmV4dC54O1xuICAgICAgICAgICAgcG9pbnQuY3AyeSA9IGNvbnRyb2xQb2ludHMubmV4dC55O1xuICAgICAgICAgICAgcHJldiA9IHBvaW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmNhcEJlemllclBvaW50cykge1xuICAgICAgICBjYXBCZXppZXJQb2ludHMocG9pbnRzLCBhcmVhKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfaXNEb21TdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2dldFBhcmVudE5vZGUoZG9tTm9kZSkge1xuICAgIGxldCBwYXJlbnQgPSBkb21Ob2RlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgU2hhZG93Um9vdF0nKSB7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5ob3N0O1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50O1xufVxuLyoqXG4gKiBjb252ZXJ0IG1heC13aWR0aC9tYXgtaGVpZ2h0IHZhbHVlcyB0aGF0IG1heSBiZSBwZXJjZW50YWdlcyBpbnRvIGEgbnVtYmVyXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIHBhcnNlTWF4U3R5bGUoc3R5bGVWYWx1ZSwgbm9kZSwgcGFyZW50UHJvcGVydHkpIHtcbiAgICBsZXQgdmFsdWVJblBpeGVscztcbiAgICBpZiAodHlwZW9mIHN0eWxlVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhbHVlSW5QaXhlbHMgPSBwYXJzZUludChzdHlsZVZhbHVlLCAxMCk7XG4gICAgICAgIGlmIChzdHlsZVZhbHVlLmluZGV4T2YoJyUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIHBlcmNlbnRhZ2UgKiBzaXplIGluIGRpbWVuc2lvblxuICAgICAgICAgICAgdmFsdWVJblBpeGVscyA9IHZhbHVlSW5QaXhlbHMgLyAxMDAgKiBub2RlLnBhcmVudE5vZGVbcGFyZW50UHJvcGVydHldO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVJblBpeGVscyA9IHN0eWxlVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZUluUGl4ZWxzO1xufVxuY29uc3QgZ2V0Q29tcHV0ZWRTdHlsZSA9IChlbGVtZW50KT0+ZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG5mdW5jdGlvbiBnZXRTdHlsZShlbCwgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSk7XG59XG5jb25zdCBwb3NpdGlvbnMgPSBbXG4gICAgJ3RvcCcsXG4gICAgJ3JpZ2h0JyxcbiAgICAnYm90dG9tJyxcbiAgICAnbGVmdCdcbl07XG5mdW5jdGlvbiBnZXRQb3NpdGlvbmVkU3R5bGUoc3R5bGVzLCBzdHlsZSwgc3VmZml4KSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgc3VmZml4ID0gc3VmZml4ID8gJy0nICsgc3VmZml4IDogJyc7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IDQ7IGkrKyl7XG4gICAgICAgIGNvbnN0IHBvcyA9IHBvc2l0aW9uc1tpXTtcbiAgICAgICAgcmVzdWx0W3Bvc10gPSBwYXJzZUZsb2F0KHN0eWxlc1tzdHlsZSArICctJyArIHBvcyArIHN1ZmZpeF0pIHx8IDA7XG4gICAgfVxuICAgIHJlc3VsdC53aWR0aCA9IHJlc3VsdC5sZWZ0ICsgcmVzdWx0LnJpZ2h0O1xuICAgIHJlc3VsdC5oZWlnaHQgPSByZXN1bHQudG9wICsgcmVzdWx0LmJvdHRvbTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgdXNlT2Zmc2V0UG9zID0gKHgsIHksIHRhcmdldCk9Pih4ID4gMCB8fCB5ID4gMCkgJiYgKCF0YXJnZXQgfHwgIXRhcmdldC5zaGFkb3dSb290KTtcbi8qKlxuICogQHBhcmFtIGVcbiAqIEBwYXJhbSBjYW52YXNcbiAqIEByZXR1cm5zIENhbnZhcyBwb3NpdGlvblxuICovIGZ1bmN0aW9uIGdldENhbnZhc1Bvc2l0aW9uKGUsIGNhbnZhcykge1xuICAgIGNvbnN0IHRvdWNoZXMgPSBlLnRvdWNoZXM7XG4gICAgY29uc3Qgc291cmNlID0gdG91Y2hlcyAmJiB0b3VjaGVzLmxlbmd0aCA/IHRvdWNoZXNbMF0gOiBlO1xuICAgIGNvbnN0IHsgb2Zmc2V0WCAsIG9mZnNldFkgIH0gPSBzb3VyY2U7XG4gICAgbGV0IGJveCA9IGZhbHNlO1xuICAgIGxldCB4LCB5O1xuICAgIGlmICh1c2VPZmZzZXRQb3Mob2Zmc2V0WCwgb2Zmc2V0WSwgZS50YXJnZXQpKSB7XG4gICAgICAgIHggPSBvZmZzZXRYO1xuICAgICAgICB5ID0gb2Zmc2V0WTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB4ID0gc291cmNlLmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgICAgIHkgPSBzb3VyY2UuY2xpZW50WSAtIHJlY3QudG9wO1xuICAgICAgICBib3ggPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBib3hcbiAgICB9O1xufVxuLyoqXG4gKiBHZXRzIGFuIGV2ZW50J3MgeCwgeSBjb29yZGluYXRlcywgcmVsYXRpdmUgdG8gdGhlIGNoYXJ0IGFyZWFcbiAqIEBwYXJhbSBldmVudFxuICogQHBhcmFtIGNoYXJ0XG4gKiBAcmV0dXJucyB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIHRoZSBldmVudFxuICovIGZ1bmN0aW9uIGdldFJlbGF0aXZlUG9zaXRpb24oZXZlbnQsIGNoYXJ0KSB7XG4gICAgaWYgKCduYXRpdmUnIGluIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG4gICAgY29uc3QgeyBjYW52YXMgLCBjdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyAgfSA9IGNoYXJ0O1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjYW52YXMpO1xuICAgIGNvbnN0IGJvcmRlckJveCA9IHN0eWxlLmJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnO1xuICAgIGNvbnN0IHBhZGRpbmdzID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAncGFkZGluZycpO1xuICAgIGNvbnN0IGJvcmRlcnMgPSBnZXRQb3NpdGlvbmVkU3R5bGUoc3R5bGUsICdib3JkZXInLCAnd2lkdGgnKTtcbiAgICBjb25zdCB7IHggLCB5ICwgYm94ICB9ID0gZ2V0Q2FudmFzUG9zaXRpb24oZXZlbnQsIGNhbnZhcyk7XG4gICAgY29uc3QgeE9mZnNldCA9IHBhZGRpbmdzLmxlZnQgKyAoYm94ICYmIGJvcmRlcnMubGVmdCk7XG4gICAgY29uc3QgeU9mZnNldCA9IHBhZGRpbmdzLnRvcCArIChib3ggJiYgYm9yZGVycy50b3ApO1xuICAgIGxldCB7IHdpZHRoICwgaGVpZ2h0ICB9ID0gY2hhcnQ7XG4gICAgaWYgKGJvcmRlckJveCkge1xuICAgICAgICB3aWR0aCAtPSBwYWRkaW5ncy53aWR0aCArIGJvcmRlcnMud2lkdGg7XG4gICAgICAgIGhlaWdodCAtPSBwYWRkaW5ncy5oZWlnaHQgKyBib3JkZXJzLmhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogTWF0aC5yb3VuZCgoeCAtIHhPZmZzZXQpIC8gd2lkdGggKiBjYW52YXMud2lkdGggLyBjdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyksXG4gICAgICAgIHk6IE1hdGgucm91bmQoKHkgLSB5T2Zmc2V0KSAvIGhlaWdodCAqIGNhbnZhcy5oZWlnaHQgLyBjdXJyZW50RGV2aWNlUGl4ZWxSYXRpbylcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyU2l6ZShjYW52YXMsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBsZXQgbWF4V2lkdGgsIG1heEhlaWdodDtcbiAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCB8fCBoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBjYW52YXMgJiYgX2dldFBhcmVudE5vZGUoY2FudmFzKTtcbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIHdpZHRoID0gY2FudmFzLmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgaGVpZ2h0ID0gY2FudmFzLmNsaWVudEhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIHRoaXMgaXMgdGhlIGJvcmRlciBib3ggb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJCb3JkZXIgPSBnZXRQb3NpdGlvbmVkU3R5bGUoY29udGFpbmVyU3R5bGUsICdib3JkZXInLCAnd2lkdGgnKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclBhZGRpbmcgPSBnZXRQb3NpdGlvbmVkU3R5bGUoY29udGFpbmVyU3R5bGUsICdwYWRkaW5nJyk7XG4gICAgICAgICAgICB3aWR0aCA9IHJlY3Qud2lkdGggLSBjb250YWluZXJQYWRkaW5nLndpZHRoIC0gY29udGFpbmVyQm9yZGVyLndpZHRoO1xuICAgICAgICAgICAgaGVpZ2h0ID0gcmVjdC5oZWlnaHQgLSBjb250YWluZXJQYWRkaW5nLmhlaWdodCAtIGNvbnRhaW5lckJvcmRlci5oZWlnaHQ7XG4gICAgICAgICAgICBtYXhXaWR0aCA9IHBhcnNlTWF4U3R5bGUoY29udGFpbmVyU3R5bGUubWF4V2lkdGgsIGNvbnRhaW5lciwgJ2NsaWVudFdpZHRoJyk7XG4gICAgICAgICAgICBtYXhIZWlnaHQgPSBwYXJzZU1heFN0eWxlKGNvbnRhaW5lclN0eWxlLm1heEhlaWdodCwgY29udGFpbmVyLCAnY2xpZW50SGVpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbWF4V2lkdGg6IG1heFdpZHRoIHx8IElORklOSVRZLFxuICAgICAgICBtYXhIZWlnaHQ6IG1heEhlaWdodCB8fCBJTkZJTklUWVxuICAgIH07XG59XG5jb25zdCByb3VuZDEgPSAodik9Pk1hdGgucm91bmQodiAqIDEwKSAvIDEwO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIGdldE1heGltdW1TaXplKGNhbnZhcywgYmJXaWR0aCwgYmJIZWlnaHQsIGFzcGVjdFJhdGlvKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGNhbnZhcyk7XG4gICAgY29uc3QgbWFyZ2lucyA9IGdldFBvc2l0aW9uZWRTdHlsZShzdHlsZSwgJ21hcmdpbicpO1xuICAgIGNvbnN0IG1heFdpZHRoID0gcGFyc2VNYXhTdHlsZShzdHlsZS5tYXhXaWR0aCwgY2FudmFzLCAnY2xpZW50V2lkdGgnKSB8fCBJTkZJTklUWTtcbiAgICBjb25zdCBtYXhIZWlnaHQgPSBwYXJzZU1heFN0eWxlKHN0eWxlLm1heEhlaWdodCwgY2FudmFzLCAnY2xpZW50SGVpZ2h0JykgfHwgSU5GSU5JVFk7XG4gICAgY29uc3QgY29udGFpbmVyU2l6ZSA9IGdldENvbnRhaW5lclNpemUoY2FudmFzLCBiYldpZHRoLCBiYkhlaWdodCk7XG4gICAgbGV0IHsgd2lkdGggLCBoZWlnaHQgIH0gPSBjb250YWluZXJTaXplO1xuICAgIGlmIChzdHlsZS5ib3hTaXppbmcgPT09ICdjb250ZW50LWJveCcpIHtcbiAgICAgICAgY29uc3QgYm9yZGVycyA9IGdldFBvc2l0aW9uZWRTdHlsZShzdHlsZSwgJ2JvcmRlcicsICd3aWR0aCcpO1xuICAgICAgICBjb25zdCBwYWRkaW5ncyA9IGdldFBvc2l0aW9uZWRTdHlsZShzdHlsZSwgJ3BhZGRpbmcnKTtcbiAgICAgICAgd2lkdGggLT0gcGFkZGluZ3Mud2lkdGggKyBib3JkZXJzLndpZHRoO1xuICAgICAgICBoZWlnaHQgLT0gcGFkZGluZ3MuaGVpZ2h0ICsgYm9yZGVycy5oZWlnaHQ7XG4gICAgfVxuICAgIHdpZHRoID0gTWF0aC5tYXgoMCwgd2lkdGggLSBtYXJnaW5zLndpZHRoKTtcbiAgICBoZWlnaHQgPSBNYXRoLm1heCgwLCBhc3BlY3RSYXRpbyA/IHdpZHRoIC8gYXNwZWN0UmF0aW8gOiBoZWlnaHQgLSBtYXJnaW5zLmhlaWdodCk7XG4gICAgd2lkdGggPSByb3VuZDEoTWF0aC5taW4od2lkdGgsIG1heFdpZHRoLCBjb250YWluZXJTaXplLm1heFdpZHRoKSk7XG4gICAgaGVpZ2h0ID0gcm91bmQxKE1hdGgubWluKGhlaWdodCwgbWF4SGVpZ2h0LCBjb250YWluZXJTaXplLm1heEhlaWdodCkpO1xuICAgIGlmICh3aWR0aCAmJiAhaGVpZ2h0KSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy80NjU5XG4gICAgICAgIC8vIElmIHRoZSBjYW52YXMgaGFzIHdpZHRoLCBidXQgbm8gaGVpZ2h0LCBkZWZhdWx0IHRvIGFzcGVjdFJhdGlvIG9mIDIgKGNhbnZhcyBkZWZhdWx0KVxuICAgICAgICBoZWlnaHQgPSByb3VuZDEod2lkdGggLyAyKTtcbiAgICB9XG4gICAgY29uc3QgbWFpbnRhaW5IZWlnaHQgPSBiYldpZHRoICE9PSB1bmRlZmluZWQgfHwgYmJIZWlnaHQgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAobWFpbnRhaW5IZWlnaHQgJiYgYXNwZWN0UmF0aW8gJiYgY29udGFpbmVyU2l6ZS5oZWlnaHQgJiYgaGVpZ2h0ID4gY29udGFpbmVyU2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgaGVpZ2h0ID0gY29udGFpbmVyU2l6ZS5oZWlnaHQ7XG4gICAgICAgIHdpZHRoID0gcm91bmQxKE1hdGguZmxvb3IoaGVpZ2h0ICogYXNwZWN0UmF0aW8pKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgIH07XG59XG4vKipcbiAqIEBwYXJhbSBjaGFydFxuICogQHBhcmFtIGZvcmNlUmF0aW9cbiAqIEBwYXJhbSBmb3JjZVN0eWxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjYW52YXMgY29udGV4dCBzaXplIG9yIHRyYW5zZm9ybWF0aW9uIGhhcyBjaGFuZ2VkLlxuICovIGZ1bmN0aW9uIHJldGluYVNjYWxlKGNoYXJ0LCBmb3JjZVJhdGlvLCBmb3JjZVN0eWxlKSB7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IGZvcmNlUmF0aW8gfHwgMTtcbiAgICBjb25zdCBkZXZpY2VIZWlnaHQgPSByb3VuZDEoY2hhcnQuaGVpZ2h0ICogcGl4ZWxSYXRpbyk7XG4gICAgY29uc3QgZGV2aWNlV2lkdGggPSByb3VuZDEoY2hhcnQud2lkdGggKiBwaXhlbFJhdGlvKTtcbiAgICBjaGFydC5oZWlnaHQgPSByb3VuZDEoY2hhcnQuaGVpZ2h0KTtcbiAgICBjaGFydC53aWR0aCA9IHJvdW5kMShjaGFydC53aWR0aCk7XG4gICAgY29uc3QgY2FudmFzID0gY2hhcnQuY2FudmFzO1xuICAgIC8vIElmIG5vIHN0eWxlIGhhcyBiZWVuIHNldCBvbiB0aGUgY2FudmFzLCB0aGUgcmVuZGVyIHNpemUgaXMgdXNlZCBhcyBkaXNwbGF5IHNpemUsXG4gICAgLy8gbWFraW5nIHRoZSBjaGFydCB2aXN1YWxseSBiaWdnZXIsIHNvIGxldCdzIGVuZm9yY2UgaXQgdG8gdGhlIFwiY29ycmVjdFwiIHZhbHVlcy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzM1NzVcbiAgICBpZiAoY2FudmFzLnN0eWxlICYmIChmb3JjZVN0eWxlIHx8ICFjYW52YXMuc3R5bGUuaGVpZ2h0ICYmICFjYW52YXMuc3R5bGUud2lkdGgpKSB7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtjaGFydC5oZWlnaHR9cHhgO1xuICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHtjaGFydC53aWR0aH1weGA7XG4gICAgfVxuICAgIGlmIChjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyAhPT0gcGl4ZWxSYXRpbyB8fCBjYW52YXMuaGVpZ2h0ICE9PSBkZXZpY2VIZWlnaHQgfHwgY2FudmFzLndpZHRoICE9PSBkZXZpY2VXaWR0aCkge1xuICAgICAgICBjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBkZXZpY2VIZWlnaHQ7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGRldmljZVdpZHRoO1xuICAgICAgICBjaGFydC5jdHguc2V0VHJhbnNmb3JtKHBpeGVsUmF0aW8sIDAsIDAsIHBpeGVsUmF0aW8sIDAsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBEZXRlY3RzIHN1cHBvcnQgZm9yIG9wdGlvbnMgb2JqZWN0IGFyZ3VtZW50IGluIGFkZEV2ZW50TGlzdGVuZXIuXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG4gKiBAcHJpdmF0ZVxuICovIGNvbnN0IHN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBsZXQgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBnZXQgcGFzc2l2ZSAoKSB7XG4gICAgICAgICAgICAgICAgcGFzc2l2ZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoX2lzRG9tU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgICB9XG4gICAgcmV0dXJuIHBhc3NpdmVTdXBwb3J0ZWQ7XG59KCk7XG4vKipcbiAqIFRoZSBcInVzZWRcIiBzaXplIGlzIHRoZSBmaW5hbCB2YWx1ZSBvZiBhIGRpbWVuc2lvbiBwcm9wZXJ0eSBhZnRlciBhbGwgY2FsY3VsYXRpb25zIGhhdmVcbiAqIGJlZW4gcGVyZm9ybWVkLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBjb21wdXRlZCBzdHlsZSBvZiBgZWxlbWVudGAgYnV0IHJldHVybnMgdW5kZWZpbmVkXG4gKiBpZiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgbm90IGV4cHJlc3NlZCBpbiBwaXhlbHMuIFRoYXQgY2FuIGhhcHBlbiBpbiBzb21lIGNhc2VzIHdoZXJlXG4gKiBgZWxlbWVudGAgaGFzIGEgc2l6ZSByZWxhdGl2ZSB0byBpdHMgcGFyZW50IGFuZCB0aGlzIGxhc3Qgb25lIGlzIG5vdCB5ZXQgZGlzcGxheWVkLFxuICogZm9yIGV4YW1wbGUgYmVjYXVzZSBvZiBgZGlzcGxheTogbm9uZWAgb24gYSBwYXJlbnQgbm9kZS5cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3VzZWRfdmFsdWVcbiAqIEByZXR1cm5zIFNpemUgaW4gcGl4ZWxzIG9yIHVuZGVmaW5lZCBpZiB1bmtub3duLlxuICovIGZ1bmN0aW9uIHJlYWRVc2VkU2l6ZShlbGVtZW50LCBwcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0U3R5bGUoZWxlbWVudCwgcHJvcGVydHkpO1xuICAgIGNvbnN0IG1hdGNoZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCgvXihcXGQrKShcXC5cXGQrKT9weCQvKTtcbiAgICByZXR1cm4gbWF0Y2hlcyA/ICttYXRjaGVzWzFdIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX3BvaW50SW5MaW5lKHAxLCBwMiwgdCwgbW9kZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHAxLnggKyB0ICogKHAyLnggLSBwMS54KSxcbiAgICAgICAgeTogcDEueSArIHQgKiAocDIueSAtIHAxLnkpXG4gICAgfTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfc3RlcHBlZEludGVycG9sYXRpb24ocDEsIHAyLCB0LCBtb2RlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcDEueCArIHQgKiAocDIueCAtIHAxLngpLFxuICAgICAgICB5OiBtb2RlID09PSAnbWlkZGxlJyA/IHQgPCAwLjUgPyBwMS55IDogcDIueSA6IG1vZGUgPT09ICdhZnRlcicgPyB0IDwgMSA/IHAxLnkgOiBwMi55IDogdCA+IDAgPyBwMi55IDogcDEueVxuICAgIH07XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2JlemllckludGVycG9sYXRpb24ocDEsIHAyLCB0LCBtb2RlKSB7XG4gICAgY29uc3QgY3AxID0ge1xuICAgICAgICB4OiBwMS5jcDJ4LFxuICAgICAgICB5OiBwMS5jcDJ5XG4gICAgfTtcbiAgICBjb25zdCBjcDIgPSB7XG4gICAgICAgIHg6IHAyLmNwMXgsXG4gICAgICAgIHk6IHAyLmNwMXlcbiAgICB9O1xuICAgIGNvbnN0IGEgPSBfcG9pbnRJbkxpbmUocDEsIGNwMSwgdCk7XG4gICAgY29uc3QgYiA9IF9wb2ludEluTGluZShjcDEsIGNwMiwgdCk7XG4gICAgY29uc3QgYyA9IF9wb2ludEluTGluZShjcDIsIHAyLCB0KTtcbiAgICBjb25zdCBkID0gX3BvaW50SW5MaW5lKGEsIGIsIHQpO1xuICAgIGNvbnN0IGUgPSBfcG9pbnRJbkxpbmUoYiwgYywgdCk7XG4gICAgcmV0dXJuIF9wb2ludEluTGluZShkLCBlLCB0KTtcbn1cblxuY29uc3QgZ2V0UmlnaHRUb0xlZnRBZGFwdGVyID0gZnVuY3Rpb24ocmVjdFgsIHdpZHRoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlY3RYICsgcmVjdFggKyB3aWR0aCAtIHg7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFdpZHRoICh3KSB7XG4gICAgICAgICAgICB3aWR0aCA9IHc7XG4gICAgICAgIH0sXG4gICAgICAgIHRleHRBbGlnbiAoYWxpZ24pIHtcbiAgICAgICAgICAgIGlmIChhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWxpZ24gPT09ICdyaWdodCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgICAgICB9LFxuICAgICAgICB4UGx1cyAoeCwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB4IC0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGxlZnRGb3JMdHIgKHgsIGl0ZW1XaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHggLSBpdGVtV2lkdGg7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbmNvbnN0IGdldExlZnRUb1JpZ2h0QWRhcHRlciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9LFxuICAgICAgICBzZXRXaWR0aCAodykge30sXG4gICAgICAgIHRleHRBbGlnbiAoYWxpZ24pIHtcbiAgICAgICAgICAgIHJldHVybiBhbGlnbjtcbiAgICAgICAgfSxcbiAgICAgICAgeFBsdXMgKHgsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4geCArIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBsZWZ0Rm9yTHRyICh4LCBfaXRlbVdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfVxuICAgIH07XG59O1xuZnVuY3Rpb24gZ2V0UnRsQWRhcHRlcihydGwsIHJlY3RYLCB3aWR0aCkge1xuICAgIHJldHVybiBydGwgPyBnZXRSaWdodFRvTGVmdEFkYXB0ZXIocmVjdFgsIHdpZHRoKSA6IGdldExlZnRUb1JpZ2h0QWRhcHRlcigpO1xufVxuZnVuY3Rpb24gb3ZlcnJpZGVUZXh0RGlyZWN0aW9uKGN0eCwgZGlyZWN0aW9uKSB7XG4gICAgbGV0IHN0eWxlLCBvcmlnaW5hbDtcbiAgICBpZiAoZGlyZWN0aW9uID09PSAnbHRyJyB8fCBkaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICAgIHN0eWxlID0gY3R4LmNhbnZhcy5zdHlsZTtcbiAgICAgICAgb3JpZ2luYWwgPSBbXG4gICAgICAgICAgICBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdkaXJlY3Rpb24nKSxcbiAgICAgICAgICAgIHN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoJ2RpcmVjdGlvbicpXG4gICAgICAgIF07XG4gICAgICAgIHN0eWxlLnNldFByb3BlcnR5KCdkaXJlY3Rpb24nLCBkaXJlY3Rpb24sICdpbXBvcnRhbnQnKTtcbiAgICAgICAgY3R4LnByZXZUZXh0RGlyZWN0aW9uID0gb3JpZ2luYWw7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZVRleHREaXJlY3Rpb24oY3R4LCBvcmlnaW5hbCkge1xuICAgIGlmIChvcmlnaW5hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBjdHgucHJldlRleHREaXJlY3Rpb247XG4gICAgICAgIGN0eC5jYW52YXMuc3R5bGUuc2V0UHJvcGVydHkoJ2RpcmVjdGlvbicsIG9yaWdpbmFsWzBdLCBvcmlnaW5hbFsxXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUZuKHByb3BlcnR5KSB7XG4gICAgaWYgKHByb3BlcnR5ID09PSAnYW5nbGUnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZXR3ZWVuOiBfYW5nbGVCZXR3ZWVuLFxuICAgICAgICAgICAgY29tcGFyZTogX2FuZ2xlRGlmZixcbiAgICAgICAgICAgIG5vcm1hbGl6ZTogX25vcm1hbGl6ZUFuZ2xlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJldHdlZW46IF9pc0JldHdlZW4sXG4gICAgICAgIGNvbXBhcmU6IChhLCBiKT0+YSAtIGIsXG4gICAgICAgIG5vcm1hbGl6ZTogKHgpPT54XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlZ21lbnQoeyBzdGFydCAsIGVuZCAsIGNvdW50ICwgbG9vcCAsIHN0eWxlICB9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IHN0YXJ0ICUgY291bnQsXG4gICAgICAgIGVuZDogZW5kICUgY291bnQsXG4gICAgICAgIGxvb3A6IGxvb3AgJiYgKGVuZCAtIHN0YXJ0ICsgMSkgJSBjb3VudCA9PT0gMCxcbiAgICAgICAgc3R5bGVcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0U2VnbWVudChzZWdtZW50LCBwb2ludHMsIGJvdW5kcykge1xuICAgIGNvbnN0IHsgcHJvcGVydHkgLCBzdGFydDogc3RhcnRCb3VuZCAsIGVuZDogZW5kQm91bmQgIH0gPSBib3VuZHM7XG4gICAgY29uc3QgeyBiZXR3ZWVuICwgbm9ybWFsaXplICB9ID0gcHJvcGVydHlGbihwcm9wZXJ0eSk7XG4gICAgY29uc3QgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuICAgIGxldCB7IHN0YXJ0ICwgZW5kICwgbG9vcCAgfSA9IHNlZ21lbnQ7XG4gICAgbGV0IGksIGlsZW47XG4gICAgaWYgKGxvb3ApIHtcbiAgICAgICAgc3RhcnQgKz0gY291bnQ7XG4gICAgICAgIGVuZCArPSBjb3VudDtcbiAgICAgICAgZm9yKGkgPSAwLCBpbGVuID0gY291bnQ7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgaWYgKCFiZXR3ZWVuKG5vcm1hbGl6ZShwb2ludHNbc3RhcnQgJSBjb3VudF1bcHJvcGVydHldKSwgc3RhcnRCb3VuZCwgZW5kQm91bmQpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydC0tO1xuICAgICAgICAgICAgZW5kLS07XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgJT0gY291bnQ7XG4gICAgICAgIGVuZCAlPSBjb3VudDtcbiAgICB9XG4gICAgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgICAgIGVuZCArPSBjb3VudDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGVuZCxcbiAgICAgICAgbG9vcCxcbiAgICAgICAgc3R5bGU6IHNlZ21lbnQuc3R5bGVcbiAgICB9O1xufVxuIGZ1bmN0aW9uIF9ib3VuZFNlZ21lbnQoc2VnbWVudCwgcG9pbnRzLCBib3VuZHMpIHtcbiAgICBpZiAoIWJvdW5kcykge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgc2VnbWVudFxuICAgICAgICBdO1xuICAgIH1cbiAgICBjb25zdCB7IHByb3BlcnR5ICwgc3RhcnQ6IHN0YXJ0Qm91bmQgLCBlbmQ6IGVuZEJvdW5kICB9ID0gYm91bmRzO1xuICAgIGNvbnN0IGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICBjb25zdCB7IGNvbXBhcmUgLCBiZXR3ZWVuICwgbm9ybWFsaXplICB9ID0gcHJvcGVydHlGbihwcm9wZXJ0eSk7XG4gICAgY29uc3QgeyBzdGFydCAsIGVuZCAsIGxvb3AgLCBzdHlsZSAgfSA9IGdldFNlZ21lbnQoc2VnbWVudCwgcG9pbnRzLCBib3VuZHMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGxldCBpbnNpZGUgPSBmYWxzZTtcbiAgICBsZXQgc3ViU3RhcnQgPSBudWxsO1xuICAgIGxldCB2YWx1ZSwgcG9pbnQsIHByZXZWYWx1ZTtcbiAgICBjb25zdCBzdGFydElzQmVmb3JlID0gKCk9PmJldHdlZW4oc3RhcnRCb3VuZCwgcHJldlZhbHVlLCB2YWx1ZSkgJiYgY29tcGFyZShzdGFydEJvdW5kLCBwcmV2VmFsdWUpICE9PSAwO1xuICAgIGNvbnN0IGVuZElzQmVmb3JlID0gKCk9PmNvbXBhcmUoZW5kQm91bmQsIHZhbHVlKSA9PT0gMCB8fCBiZXR3ZWVuKGVuZEJvdW5kLCBwcmV2VmFsdWUsIHZhbHVlKTtcbiAgICBjb25zdCBzaG91bGRTdGFydCA9ICgpPT5pbnNpZGUgfHwgc3RhcnRJc0JlZm9yZSgpO1xuICAgIGNvbnN0IHNob3VsZFN0b3AgPSAoKT0+IWluc2lkZSB8fCBlbmRJc0JlZm9yZSgpO1xuICAgIGZvcihsZXQgaSA9IHN0YXJ0LCBwcmV2ID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpe1xuICAgICAgICBwb2ludCA9IHBvaW50c1tpICUgY291bnRdO1xuICAgICAgICBpZiAocG9pbnQuc2tpcCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBub3JtYWxpemUocG9pbnRbcHJvcGVydHldKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBwcmV2VmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluc2lkZSA9IGJldHdlZW4odmFsdWUsIHN0YXJ0Qm91bmQsIGVuZEJvdW5kKTtcbiAgICAgICAgaWYgKHN1YlN0YXJ0ID09PSBudWxsICYmIHNob3VsZFN0YXJ0KCkpIHtcbiAgICAgICAgICAgIHN1YlN0YXJ0ID0gY29tcGFyZSh2YWx1ZSwgc3RhcnRCb3VuZCkgPT09IDAgPyBpIDogcHJldjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3ViU3RhcnQgIT09IG51bGwgJiYgc2hvdWxkU3RvcCgpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChub3JtYWxpemVTZWdtZW50KHtcbiAgICAgICAgICAgICAgICBzdGFydDogc3ViU3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiBpLFxuICAgICAgICAgICAgICAgIGxvb3AsXG4gICAgICAgICAgICAgICAgY291bnQsXG4gICAgICAgICAgICAgICAgc3R5bGVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHN1YlN0YXJ0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBwcmV2ID0gaTtcbiAgICAgICAgcHJldlZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGlmIChzdWJTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQucHVzaChub3JtYWxpemVTZWdtZW50KHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdWJTdGFydCxcbiAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgIGxvb3AsXG4gICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgIHN0eWxlXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiBmdW5jdGlvbiBfYm91bmRTZWdtZW50cyhsaW5lLCBib3VuZHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBzZWdtZW50cyA9IGxpbmUuc2VnbWVudHM7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY29uc3Qgc3ViID0gX2JvdW5kU2VnbWVudChzZWdtZW50c1tpXSwgbGluZS5wb2ludHMsIGJvdW5kcyk7XG4gICAgICAgIGlmIChzdWIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi5zdWIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4gZnVuY3Rpb24gZmluZFN0YXJ0QW5kRW5kKHBvaW50cywgY291bnQsIGxvb3AsIHNwYW5HYXBzKSB7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgZW5kID0gY291bnQgLSAxO1xuICAgIGlmIChsb29wICYmICFzcGFuR2Fwcykge1xuICAgICAgICB3aGlsZShzdGFydCA8IGNvdW50ICYmICFwb2ludHNbc3RhcnRdLnNraXApe1xuICAgICAgICAgICAgc3RhcnQrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZShzdGFydCA8IGNvdW50ICYmIHBvaW50c1tzdGFydF0uc2tpcCl7XG4gICAgICAgIHN0YXJ0Kys7XG4gICAgfVxuICAgIHN0YXJ0ICU9IGNvdW50O1xuICAgIGlmIChsb29wKSB7XG4gICAgICAgIGVuZCArPSBzdGFydDtcbiAgICB9XG4gICAgd2hpbGUoZW5kID4gc3RhcnQgJiYgcG9pbnRzW2VuZCAlIGNvdW50XS5za2lwKXtcbiAgICAgICAgZW5kLS07XG4gICAgfVxuICAgIGVuZCAlPSBjb3VudDtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydCxcbiAgICAgICAgZW5kXG4gICAgfTtcbn1cbiBmdW5jdGlvbiBzb2xpZFNlZ21lbnRzKHBvaW50cywgc3RhcnQsIG1heCwgbG9vcCkge1xuICAgIGNvbnN0IGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBsZXQgbGFzdCA9IHN0YXJ0O1xuICAgIGxldCBwcmV2ID0gcG9pbnRzW3N0YXJ0XTtcbiAgICBsZXQgZW5kO1xuICAgIGZvcihlbmQgPSBzdGFydCArIDE7IGVuZCA8PSBtYXg7ICsrZW5kKXtcbiAgICAgICAgY29uc3QgY3VyID0gcG9pbnRzW2VuZCAlIGNvdW50XTtcbiAgICAgICAgaWYgKGN1ci5za2lwIHx8IGN1ci5zdG9wKSB7XG4gICAgICAgICAgICBpZiAoIXByZXYuc2tpcCkge1xuICAgICAgICAgICAgICAgIGxvb3AgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCAlIGNvdW50LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IChlbmQgLSAxKSAlIGNvdW50LFxuICAgICAgICAgICAgICAgICAgICBsb29wXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBsYXN0ID0gY3VyLnN0b3AgPyBlbmQgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdCA9IGVuZDtcbiAgICAgICAgICAgIGlmIChwcmV2LnNraXApIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IGVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcmV2ID0gY3VyO1xuICAgIH1cbiAgICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogc3RhcnQgJSBjb3VudCxcbiAgICAgICAgICAgIGVuZDogbGFzdCAlIGNvdW50LFxuICAgICAgICAgICAgbG9vcFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiBmdW5jdGlvbiBfY29tcHV0ZVNlZ21lbnRzKGxpbmUsIHNlZ21lbnRPcHRpb25zKSB7XG4gICAgY29uc3QgcG9pbnRzID0gbGluZS5wb2ludHM7XG4gICAgY29uc3Qgc3BhbkdhcHMgPSBsaW5lLm9wdGlvbnMuc3BhbkdhcHM7XG4gICAgY29uc3QgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuICAgIGlmICghY291bnQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBsb29wID0gISFsaW5lLl9sb29wO1xuICAgIGNvbnN0IHsgc3RhcnQgLCBlbmQgIH0gPSBmaW5kU3RhcnRBbmRFbmQocG9pbnRzLCBjb3VudCwgbG9vcCwgc3BhbkdhcHMpO1xuICAgIGlmIChzcGFuR2FwcyA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gc3BsaXRCeVN0eWxlcyhsaW5lLCBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgICAgIGxvb3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSwgcG9pbnRzLCBzZWdtZW50T3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IG1heCA9IGVuZCA8IHN0YXJ0ID8gZW5kICsgY291bnQgOiBlbmQ7XG4gICAgY29uc3QgY29tcGxldGVMb29wID0gISFsaW5lLl9mdWxsTG9vcCAmJiBzdGFydCA9PT0gMCAmJiBlbmQgPT09IGNvdW50IC0gMTtcbiAgICByZXR1cm4gc3BsaXRCeVN0eWxlcyhsaW5lLCBzb2xpZFNlZ21lbnRzKHBvaW50cywgc3RhcnQsIG1heCwgY29tcGxldGVMb29wKSwgcG9pbnRzLCBzZWdtZW50T3B0aW9ucyk7XG59XG4gZnVuY3Rpb24gc3BsaXRCeVN0eWxlcyhsaW5lLCBzZWdtZW50cywgcG9pbnRzLCBzZWdtZW50T3B0aW9ucykge1xuICAgIGlmICghc2VnbWVudE9wdGlvbnMgfHwgIXNlZ21lbnRPcHRpb25zLnNldENvbnRleHQgfHwgIXBvaW50cykge1xuICAgICAgICByZXR1cm4gc2VnbWVudHM7XG4gICAgfVxuICAgIHJldHVybiBkb1NwbGl0QnlTdHlsZXMobGluZSwgc2VnbWVudHMsIHBvaW50cywgc2VnbWVudE9wdGlvbnMpO1xufVxuIGZ1bmN0aW9uIGRvU3BsaXRCeVN0eWxlcyhsaW5lLCBzZWdtZW50cywgcG9pbnRzLCBzZWdtZW50T3B0aW9ucykge1xuICAgIGNvbnN0IGNoYXJ0Q29udGV4dCA9IGxpbmUuX2NoYXJ0LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBiYXNlU3R5bGUgPSByZWFkU3R5bGUobGluZS5vcHRpb25zKTtcbiAgICBjb25zdCB7IF9kYXRhc2V0SW5kZXg6IGRhdGFzZXRJbmRleCAsIG9wdGlvbnM6IHsgc3BhbkdhcHMgIH0gIH0gPSBsaW5lO1xuICAgIGNvbnN0IGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBsZXQgcHJldlN0eWxlID0gYmFzZVN0eWxlO1xuICAgIGxldCBzdGFydCA9IHNlZ21lbnRzWzBdLnN0YXJ0O1xuICAgIGxldCBpID0gc3RhcnQ7XG4gICAgZnVuY3Rpb24gYWRkU3R5bGUocywgZSwgbCwgc3QpIHtcbiAgICAgICAgY29uc3QgZGlyID0gc3BhbkdhcHMgPyAtMSA6IDE7XG4gICAgICAgIGlmIChzID09PSBlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcyArPSBjb3VudDtcbiAgICAgICAgd2hpbGUocG9pbnRzW3MgJSBjb3VudF0uc2tpcCl7XG4gICAgICAgICAgICBzIC09IGRpcjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZShwb2ludHNbZSAlIGNvdW50XS5za2lwKXtcbiAgICAgICAgICAgIGUgKz0gZGlyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzICUgY291bnQgIT09IGUgJSBjb3VudCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBzICUgY291bnQsXG4gICAgICAgICAgICAgICAgZW5kOiBlICUgY291bnQsXG4gICAgICAgICAgICAgICAgbG9vcDogbCxcbiAgICAgICAgICAgICAgICBzdHlsZTogc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJldlN0eWxlID0gc3Q7XG4gICAgICAgICAgICBzdGFydCA9IGUgJSBjb3VudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpe1xuICAgICAgICBzdGFydCA9IHNwYW5HYXBzID8gc3RhcnQgOiBzZWdtZW50LnN0YXJ0O1xuICAgICAgICBsZXQgcHJldiA9IHBvaW50c1tzdGFydCAlIGNvdW50XTtcbiAgICAgICAgbGV0IHN0eWxlO1xuICAgICAgICBmb3IoaSA9IHN0YXJ0ICsgMTsgaSA8PSBzZWdtZW50LmVuZDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHB0ID0gcG9pbnRzW2kgJSBjb3VudF07XG4gICAgICAgICAgICBzdHlsZSA9IHJlYWRTdHlsZShzZWdtZW50T3B0aW9ucy5zZXRDb250ZXh0KGNyZWF0ZUNvbnRleHQoY2hhcnRDb250ZXh0LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3NlZ21lbnQnLFxuICAgICAgICAgICAgICAgIHAwOiBwcmV2LFxuICAgICAgICAgICAgICAgIHAxOiBwdCxcbiAgICAgICAgICAgICAgICBwMERhdGFJbmRleDogKGkgLSAxKSAlIGNvdW50LFxuICAgICAgICAgICAgICAgIHAxRGF0YUluZGV4OiBpICUgY291bnQsXG4gICAgICAgICAgICAgICAgZGF0YXNldEluZGV4XG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgaWYgKHN0eWxlQ2hhbmdlZChzdHlsZSwgcHJldlN0eWxlKSkge1xuICAgICAgICAgICAgICAgIGFkZFN0eWxlKHN0YXJ0LCBpIC0gMSwgc2VnbWVudC5sb29wLCBwcmV2U3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldiA9IHB0O1xuICAgICAgICAgICAgcHJldlN0eWxlID0gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0IDwgaSAtIDEpIHtcbiAgICAgICAgICAgIGFkZFN0eWxlKHN0YXJ0LCBpIC0gMSwgc2VnbWVudC5sb29wLCBwcmV2U3R5bGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiByZWFkU3R5bGUob3B0aW9ucykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGJvcmRlckNhcFN0eWxlOiBvcHRpb25zLmJvcmRlckNhcFN0eWxlLFxuICAgICAgICBib3JkZXJEYXNoOiBvcHRpb25zLmJvcmRlckRhc2gsXG4gICAgICAgIGJvcmRlckRhc2hPZmZzZXQ6IG9wdGlvbnMuYm9yZGVyRGFzaE9mZnNldCxcbiAgICAgICAgYm9yZGVySm9pblN0eWxlOiBvcHRpb25zLmJvcmRlckpvaW5TdHlsZSxcbiAgICAgICAgYm9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHN0eWxlQ2hhbmdlZChzdHlsZSwgcHJldlN0eWxlKSB7XG4gICAgaWYgKCFwcmV2U3R5bGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IFtdO1xuICAgIGNvbnN0IHJlcGxhY2VyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzUGF0dGVybk9yR3JhZGllbnQodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjYWNoZS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNhY2hlLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZS5pbmRleE9mKHZhbHVlKTtcbiAgICB9O1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdHlsZSwgcmVwbGFjZXIpICE9PSBKU09OLnN0cmluZ2lmeShwcmV2U3R5bGUsIHJlcGxhY2VyKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2l6ZUZvckFyZWEoc2NhbGUsIGNoYXJ0QXJlYSwgZmllbGQpIHtcbiAgICByZXR1cm4gc2NhbGUub3B0aW9ucy5jbGlwID8gc2NhbGVbZmllbGRdIDogY2hhcnRBcmVhW2ZpZWxkXTtcbn1cbmZ1bmN0aW9uIGdldERhdGFzZXRBcmVhKG1ldGEsIGNoYXJ0QXJlYSkge1xuICAgIGNvbnN0IHsgeFNjYWxlICwgeVNjYWxlICB9ID0gbWV0YTtcbiAgICBpZiAoeFNjYWxlICYmIHlTY2FsZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdDogZ2V0U2l6ZUZvckFyZWEoeFNjYWxlLCBjaGFydEFyZWEsICdsZWZ0JyksXG4gICAgICAgICAgICByaWdodDogZ2V0U2l6ZUZvckFyZWEoeFNjYWxlLCBjaGFydEFyZWEsICdyaWdodCcpLFxuICAgICAgICAgICAgdG9wOiBnZXRTaXplRm9yQXJlYSh5U2NhbGUsIGNoYXJ0QXJlYSwgJ3RvcCcpLFxuICAgICAgICAgICAgYm90dG9tOiBnZXRTaXplRm9yQXJlYSh5U2NhbGUsIGNoYXJ0QXJlYSwgJ2JvdHRvbScpXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjaGFydEFyZWE7XG59XG5mdW5jdGlvbiBnZXREYXRhc2V0Q2xpcEFyZWEoY2hhcnQsIG1ldGEpIHtcbiAgICBjb25zdCBjbGlwID0gbWV0YS5fY2xpcDtcbiAgICBpZiAoY2xpcC5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGFyZWEgPSBnZXREYXRhc2V0QXJlYShtZXRhLCBjaGFydC5jaGFydEFyZWEpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IGNsaXAubGVmdCA9PT0gZmFsc2UgPyAwIDogYXJlYS5sZWZ0IC0gKGNsaXAubGVmdCA9PT0gdHJ1ZSA/IDAgOiBjbGlwLmxlZnQpLFxuICAgICAgICByaWdodDogY2xpcC5yaWdodCA9PT0gZmFsc2UgPyBjaGFydC53aWR0aCA6IGFyZWEucmlnaHQgKyAoY2xpcC5yaWdodCA9PT0gdHJ1ZSA/IDAgOiBjbGlwLnJpZ2h0KSxcbiAgICAgICAgdG9wOiBjbGlwLnRvcCA9PT0gZmFsc2UgPyAwIDogYXJlYS50b3AgLSAoY2xpcC50b3AgPT09IHRydWUgPyAwIDogY2xpcC50b3ApLFxuICAgICAgICBib3R0b206IGNsaXAuYm90dG9tID09PSBmYWxzZSA/IGNoYXJ0LmhlaWdodCA6IGFyZWEuYm90dG9tICsgKGNsaXAuYm90dG9tID09PSB0cnVlID8gMCA6IGNsaXAuYm90dG9tKVxuICAgIH07XG59XG5cbmV4cG9ydCB7IHVuY2xpcEFyZWEgYXMgJCwgX3Jsb29rdXBCeUtleSBhcyBBLCBfbG9va3VwQnlLZXkgYXMgQiwgX2lzUG9pbnRJbkFyZWEgYXMgQywgZ2V0QW5nbGVGcm9tUG9pbnQgYXMgRCwgdG9QYWRkaW5nIGFzIEUsIGVhY2ggYXMgRiwgZ2V0TWF4aW11bVNpemUgYXMgRywgSEFMRl9QSSBhcyBILCBfZ2V0UGFyZW50Tm9kZSBhcyBJLCByZWFkVXNlZFNpemUgYXMgSiwgc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyBhcyBLLCB0aHJvdHRsZWQgYXMgTCwgX2lzRG9tU3VwcG9ydGVkIGFzIE0sIF9mYWN0b3JpemUgYXMgTiwgZmluaXRlT3JEZWZhdWx0IGFzIE8sIFBJIGFzIFAsIGNhbGxiYWNrIGFzIFEsIF9hZGRHcmFjZSBhcyBSLCBfbGltaXRWYWx1ZSBhcyBTLCBUQVUgYXMgVCwgdG9EZWdyZWVzIGFzIFUsIF9tZWFzdXJlVGV4dCBhcyBWLCBfaW50MTZSYW5nZSBhcyBXLCBfYWxpZ25QaXhlbCBhcyBYLCBjbGlwQXJlYSBhcyBZLCByZW5kZXJUZXh0IGFzIFosIF9hcnJheVVuaXF1ZSBhcyBfLCByZXNvbHZlIGFzIGEsIGdldFN0eWxlIGFzIGEkLCB0b0ZvbnQgYXMgYTAsIF90b0xlZnRSaWdodENlbnRlciBhcyBhMSwgX2FsaWduU3RhcnRFbmQgYXMgYTIsIG92ZXJyaWRlcyBhcyBhMywgbWVyZ2UgYXMgYTQsIF9jYXBpdGFsaXplIGFzIGE1LCBkZXNjcmlwdG9ycyBhcyBhNiwgaXNGdW5jdGlvbiBhcyBhNywgX2F0dGFjaENvbnRleHQgYXMgYTgsIF9jcmVhdGVSZXNvbHZlciBhcyBhOSwgZ2V0UnRsQWRhcHRlciBhcyBhQSwgb3ZlcnJpZGVUZXh0RGlyZWN0aW9uIGFzIGFCLCBfdGV4dFggYXMgYUMsIHJlc3RvcmVUZXh0RGlyZWN0aW9uIGFzIGFELCBkcmF3UG9pbnRMZWdlbmQgYXMgYUUsIGRpc3RhbmNlQmV0d2VlblBvaW50cyBhcyBhRiwgbm9vcCBhcyBhRywgX3NldE1pbkFuZE1heEJ5S2V5IGFzIGFILCBuaWNlTnVtIGFzIGFJLCBhbG1vc3RXaG9sZSBhcyBhSiwgYWxtb3N0RXF1YWxzIGFzIGFLLCBfZGVjaW1hbFBsYWNlcyBhcyBhTCwgVGlja3MgYXMgYU0sIGxvZzEwIGFzIGFOLCBfbG9uZ2VzdFRleHQgYXMgYU8sIF9maWx0ZXJCZXR3ZWVuIGFzIGFQLCBfbG9va3VwIGFzIGFRLCBpc1BhdHRlcm5PckdyYWRpZW50IGFzIGFSLCBnZXRIb3ZlckNvbG9yIGFzIGFTLCBjbG9uZSBhcyBhVCwgX21lcmdlciBhcyBhVSwgX21lcmdlcklmIGFzIGFWLCBfZGVwcmVjYXRlZCBhcyBhVywgX3NwbGl0S2V5IGFzIGFYLCB0b0ZvbnRTdHJpbmcgYXMgYVksIHNwbGluZUN1cnZlIGFzIGFaLCBzcGxpbmVDdXJ2ZU1vbm90b25lIGFzIGFfLCBfZGVzY3JpcHRvcnMgYXMgYWEsIG1lcmdlSWYgYXMgYWIsIHVpZCBhcyBhYywgZGVib3VuY2UgYXMgYWQsIHJldGluYVNjYWxlIGFzIGFlLCBjbGVhckNhbnZhcyBhcyBhZiwgc2V0c0VxdWFsIGFzIGFnLCBnZXREYXRhc2V0Q2xpcEFyZWEgYXMgYWgsIF9lbGVtZW50c0VxdWFsIGFzIGFpLCBfaXNDbGlja0V2ZW50IGFzIGFqLCBfaXNCZXR3ZWVuIGFzIGFrLCBfbm9ybWFsaXplQW5nbGUgYXMgYWwsIF9yZWFkVmFsdWVUb1Byb3BzIGFzIGFtLCBfdXBkYXRlQmV6aWVyQ29udHJvbFBvaW50cyBhcyBhbiwgX2NvbXB1dGVTZWdtZW50cyBhcyBhbywgX2JvdW5kU2VnbWVudHMgYXMgYXAsIF9zdGVwcGVkSW50ZXJwb2xhdGlvbiBhcyBhcSwgX2JlemllckludGVycG9sYXRpb24gYXMgYXIsIF9wb2ludEluTGluZSBhcyBhcywgX3N0ZXBwZWRMaW5lVG8gYXMgYXQsIF9iZXppZXJDdXJ2ZVRvIGFzIGF1LCBkcmF3UG9pbnQgYXMgYXYsIGFkZFJvdW5kZWRSZWN0UGF0aCBhcyBhdywgdG9UUkJMIGFzIGF4LCB0b1RSQkxDb3JuZXJzIGFzIGF5LCBfYm91bmRTZWdtZW50IGFzIGF6LCBpc0FycmF5IGFzIGIsIGZvbnRTdHJpbmcgYXMgYjAsIHRvTGluZUhlaWdodCBhcyBiMSwgUElUQVUgYXMgYjIsIElORklOSVRZIGFzIGIzLCBSQURfUEVSX0RFRyBhcyBiNCwgUVVBUlRFUl9QSSBhcyBiNSwgVFdPX1RISVJEU19QSSBhcyBiNiwgX2FuZ2xlRGlmZiBhcyBiNywgY29sb3IgYXMgYywgZGVmYXVsdHMgYXMgZCwgZWZmZWN0cyBhcyBlLCByZXNvbHZlT2JqZWN0S2V5IGFzIGYsIGlzTnVtYmVyRmluaXRlIGFzIGcsIGRlZmluZWQgYXMgaCwgaXNPYmplY3QgYXMgaSwgY3JlYXRlQ29udGV4dCBhcyBqLCBpc051bGxPclVuZGVmIGFzIGssIGxpc3RlbkFycmF5RXZlbnRzIGFzIGwsIHRvUGVyY2VudGFnZSBhcyBtLCB0b0RpbWVuc2lvbiBhcyBuLCBmb3JtYXROdW1iZXIgYXMgbywgX2FuZ2xlQmV0d2VlbiBhcyBwLCBfZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50cyBhcyBxLCByZXF1ZXN0QW5pbUZyYW1lIGFzIHIsIHNpZ24gYXMgcywgdG9SYWRpYW5zIGFzIHQsIHVubGlzdGVuQXJyYXlFdmVudHMgYXMgdSwgdmFsdWVPckRlZmF1bHQgYXMgdiwgX3NjYWxlUmFuZ2VzQ2hhbmdlZCBhcyB3LCBpc051bWJlciBhcyB4LCBfcGFyc2VPYmplY3REYXRhUmFkaWFsU2NhbGUgYXMgeSwgZ2V0UmVsYXRpdmVQb3NpdGlvbiBhcyB6IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXJzLmRhdGFzZXQuanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///128\n\n}"); - -/***/ }), - -/***/ 129: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Color: () => (/* binding */ Color),\n/* harmony export */ b2n: () => (/* binding */ b2n),\n/* harmony export */ b2p: () => (/* binding */ b2p),\n/* harmony export */ \"default\": () => (/* binding */ index_esm),\n/* harmony export */ hexParse: () => (/* binding */ hexParse),\n/* harmony export */ hexString: () => (/* binding */ hexString),\n/* harmony export */ hsl2rgb: () => (/* binding */ hsl2rgb),\n/* harmony export */ hslString: () => (/* binding */ hslString),\n/* harmony export */ hsv2rgb: () => (/* binding */ hsv2rgb),\n/* harmony export */ hueParse: () => (/* binding */ hueParse),\n/* harmony export */ hwb2rgb: () => (/* binding */ hwb2rgb),\n/* harmony export */ lim: () => (/* binding */ lim),\n/* harmony export */ n2b: () => (/* binding */ n2b),\n/* harmony export */ n2p: () => (/* binding */ n2p),\n/* harmony export */ nameParse: () => (/* binding */ nameParse),\n/* harmony export */ p2b: () => (/* binding */ p2b),\n/* harmony export */ rgb2hsl: () => (/* binding */ rgb2hsl),\n/* harmony export */ rgbParse: () => (/* binding */ rgbParse),\n/* harmony export */ rgbString: () => (/* binding */ rgbString),\n/* harmony export */ rotate: () => (/* binding */ rotate),\n/* harmony export */ round: () => (/* binding */ round)\n/* harmony export */ });\n/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLFNBQVM7QUFDM0MsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDNUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQjtBQUNBLGdCQUFnQixrQkFBa0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLFNBQVM7QUFDakQsZUFBZSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixzQkFBc0IsdUJBQXVCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRWtNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXJjaGl0ZWN0dWktaHRtbC1mcmVlLy4vbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL25vZGVfbW9kdWxlcy9Aa3Vya2xlL2NvbG9yL2Rpc3QvY29sb3IuZXNtLmpzPzlmYzgiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAa3Vya2xlL2NvbG9yIHYwLjMuNFxuICogaHR0cHM6Ly9naXRodWIuY29tL2t1cmtsZS9jb2xvciNyZWFkbWVcbiAqIChjKSAyMDI0IEp1a2thIEt1cmtlbGFcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5mdW5jdGlvbiByb3VuZCh2KSB7XG4gIHJldHVybiB2ICsgMC41IHwgMDtcbn1cbmNvbnN0IGxpbSA9ICh2LCBsLCBoKSA9PiBNYXRoLm1heChNYXRoLm1pbih2LCBoKSwgbCk7XG5mdW5jdGlvbiBwMmIodikge1xuICByZXR1cm4gbGltKHJvdW5kKHYgKiAyLjU1KSwgMCwgMjU1KTtcbn1cbmZ1bmN0aW9uIGIycCh2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAvIDIuNTUpLCAwLCAxMDApO1xufVxuZnVuY3Rpb24gbjJiKHYpIHtcbiAgcmV0dXJuIGxpbShyb3VuZCh2ICogMjU1KSwgMCwgMjU1KTtcbn1cbmZ1bmN0aW9uIGIybih2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAvIDIuNTUpIC8gMTAwLCAwLCAxKTtcbn1cbmZ1bmN0aW9uIG4ycCh2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAqIDEwMCksIDAsIDEwMCk7XG59XG5cbmNvbnN0IG1hcCQxID0gezA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDgsIDk6IDksIEE6IDEwLCBCOiAxMSwgQzogMTIsIEQ6IDEzLCBFOiAxNCwgRjogMTUsIGE6IDEwLCBiOiAxMSwgYzogMTIsIGQ6IDEzLCBlOiAxNCwgZjogMTV9O1xuY29uc3QgaGV4ID0gWy4uLicwMTIzNDU2Nzg5QUJDREVGJ107XG5jb25zdCBoMSA9IGIgPT4gaGV4W2IgJiAweEZdO1xuY29uc3QgaDIgPSBiID0+IGhleFsoYiAmIDB4RjApID4+IDRdICsgaGV4W2IgJiAweEZdO1xuY29uc3QgZXEgPSBiID0+ICgoYiAmIDB4RjApID4+IDQpID09PSAoYiAmIDB4Rik7XG5jb25zdCBpc1Nob3J0ID0gdiA9PiBlcSh2LnIpICYmIGVxKHYuZykgJiYgZXEodi5iKSAmJiBlcSh2LmEpO1xuZnVuY3Rpb24gaGV4UGFyc2Uoc3RyKSB7XG4gIHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuICB2YXIgcmV0O1xuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAobGVuID09PSA0IHx8IGxlbiA9PT0gNSkge1xuICAgICAgcmV0ID0ge1xuICAgICAgICByOiAyNTUgJiBtYXAkMVtzdHJbMV1dICogMTcsXG4gICAgICAgIGc6IDI1NSAmIG1hcCQxW3N0clsyXV0gKiAxNyxcbiAgICAgICAgYjogMjU1ICYgbWFwJDFbc3RyWzNdXSAqIDE3LFxuICAgICAgICBhOiBsZW4gPT09IDUgPyBtYXAkMVtzdHJbNF1dICogMTcgOiAyNTVcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChsZW4gPT09IDcgfHwgbGVuID09PSA5KSB7XG4gICAgICByZXQgPSB7XG4gICAgICAgIHI6IG1hcCQxW3N0clsxXV0gPDwgNCB8IG1hcCQxW3N0clsyXV0sXG4gICAgICAgIGc6IG1hcCQxW3N0clszXV0gPDwgNCB8IG1hcCQxW3N0cls0XV0sXG4gICAgICAgIGI6IG1hcCQxW3N0cls1XV0gPDwgNCB8IG1hcCQxW3N0cls2XV0sXG4gICAgICAgIGE6IGxlbiA9PT0gOSA/IChtYXAkMVtzdHJbN11dIDw8IDQgfCBtYXAkMVtzdHJbOF1dKSA6IDI1NVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmNvbnN0IGFscGhhID0gKGEsIGYpID0+IGEgPCAyNTUgPyBmKGEpIDogJyc7XG5mdW5jdGlvbiBoZXhTdHJpbmcodikge1xuICB2YXIgZiA9IGlzU2hvcnQodikgPyBoMSA6IGgyO1xuICByZXR1cm4gdlxuICAgID8gJyMnICsgZih2LnIpICsgZih2LmcpICsgZih2LmIpICsgYWxwaGEodi5hLCBmKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCBIVUVfUkUgPSAvXihoc2xhP3xod2J8aHN2KVxcKFxccyooWy0rLmVcXGRdKykoPzpkZWcpP1tcXHMsXSsoWy0rLmVcXGRdKyklW1xccyxdKyhbLSsuZVxcZF0rKSUoPzpbXFxzLF0rKFstKy5lXFxkXSspKCUpPyk/XFxzKlxcKSQvO1xuZnVuY3Rpb24gaHNsMnJnYm4oaCwgcywgbCkge1xuICBjb25zdCBhID0gcyAqIE1hdGgubWluKGwsIDEgLSBsKTtcbiAgY29uc3QgZiA9IChuLCBrID0gKG4gKyBoIC8gMzApICUgMTIpID0+IGwgLSBhICogTWF0aC5tYXgoTWF0aC5taW4oayAtIDMsIDkgLSBrLCAxKSwgLTEpO1xuICByZXR1cm4gW2YoMCksIGYoOCksIGYoNCldO1xufVxuZnVuY3Rpb24gaHN2MnJnYm4oaCwgcywgdikge1xuICBjb25zdCBmID0gKG4sIGsgPSAobiArIGggLyA2MCkgJSA2KSA9PiB2IC0gdiAqIHMgKiBNYXRoLm1heChNYXRoLm1pbihrLCA0IC0gaywgMSksIDApO1xuICByZXR1cm4gW2YoNSksIGYoMyksIGYoMSldO1xufVxuZnVuY3Rpb24gaHdiMnJnYm4oaCwgdywgYikge1xuICBjb25zdCByZ2IgPSBoc2wycmdibihoLCAxLCAwLjUpO1xuICBsZXQgaTtcbiAgaWYgKHcgKyBiID4gMSkge1xuICAgIGkgPSAxIC8gKHcgKyBiKTtcbiAgICB3ICo9IGk7XG4gICAgYiAqPSBpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICByZ2JbaV0gKj0gMSAtIHcgLSBiO1xuICAgIHJnYltpXSArPSB3O1xuICB9XG4gIHJldHVybiByZ2I7XG59XG5mdW5jdGlvbiBodWVWYWx1ZShyLCBnLCBiLCBkLCBtYXgpIHtcbiAgaWYgKHIgPT09IG1heCkge1xuICAgIHJldHVybiAoKGcgLSBiKSAvIGQpICsgKGcgPCBiID8gNiA6IDApO1xuICB9XG4gIGlmIChnID09PSBtYXgpIHtcbiAgICByZXR1cm4gKGIgLSByKSAvIGQgKyAyO1xuICB9XG4gIHJldHVybiAociAtIGcpIC8gZCArIDQ7XG59XG5mdW5jdGlvbiByZ2IyaHNsKHYpIHtcbiAgY29uc3QgcmFuZ2UgPSAyNTU7XG4gIGNvbnN0IHIgPSB2LnIgLyByYW5nZTtcbiAgY29uc3QgZyA9IHYuZyAvIHJhbmdlO1xuICBjb25zdCBiID0gdi5iIC8gcmFuZ2U7XG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgY29uc3QgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgbGV0IGgsIHMsIGQ7XG4gIGlmIChtYXggIT09IG1pbikge1xuICAgIGQgPSBtYXggLSBtaW47XG4gICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pO1xuICAgIGggPSBodWVWYWx1ZShyLCBnLCBiLCBkLCBtYXgpO1xuICAgIGggPSBoICogNjAgKyAwLjU7XG4gIH1cbiAgcmV0dXJuIFtoIHwgMCwgcyB8fCAwLCBsXTtcbn1cbmZ1bmN0aW9uIGNhbGxuKGYsIGEsIGIsIGMpIHtcbiAgcmV0dXJuIChcbiAgICBBcnJheS5pc0FycmF5KGEpXG4gICAgICA/IGYoYVswXSwgYVsxXSwgYVsyXSlcbiAgICAgIDogZihhLCBiLCBjKVxuICApLm1hcChuMmIpO1xufVxuZnVuY3Rpb24gaHNsMnJnYihoLCBzLCBsKSB7XG4gIHJldHVybiBjYWxsbihoc2wycmdibiwgaCwgcywgbCk7XG59XG5mdW5jdGlvbiBod2IycmdiKGgsIHcsIGIpIHtcbiAgcmV0dXJuIGNhbGxuKGh3YjJyZ2JuLCBoLCB3LCBiKTtcbn1cbmZ1bmN0aW9uIGhzdjJyZ2IoaCwgcywgdikge1xuICByZXR1cm4gY2FsbG4oaHN2MnJnYm4sIGgsIHMsIHYpO1xufVxuZnVuY3Rpb24gaHVlKGgpIHtcbiAgcmV0dXJuIChoICUgMzYwICsgMzYwKSAlIDM2MDtcbn1cbmZ1bmN0aW9uIGh1ZVBhcnNlKHN0cikge1xuICBjb25zdCBtID0gSFVFX1JFLmV4ZWMoc3RyKTtcbiAgbGV0IGEgPSAyNTU7XG4gIGxldCB2O1xuICBpZiAoIW0pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1bNV0gIT09IHYpIHtcbiAgICBhID0gbVs2XSA/IHAyYigrbVs1XSkgOiBuMmIoK21bNV0pO1xuICB9XG4gIGNvbnN0IGggPSBodWUoK21bMl0pO1xuICBjb25zdCBwMSA9ICttWzNdIC8gMTAwO1xuICBjb25zdCBwMiA9ICttWzRdIC8gMTAwO1xuICBpZiAobVsxXSA9PT0gJ2h3YicpIHtcbiAgICB2ID0gaHdiMnJnYihoLCBwMSwgcDIpO1xuICB9IGVsc2UgaWYgKG1bMV0gPT09ICdoc3YnKSB7XG4gICAgdiA9IGhzdjJyZ2IoaCwgcDEsIHAyKTtcbiAgfSBlbHNlIHtcbiAgICB2ID0gaHNsMnJnYihoLCBwMSwgcDIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcjogdlswXSxcbiAgICBnOiB2WzFdLFxuICAgIGI6IHZbMl0sXG4gICAgYTogYVxuICB9O1xufVxuZnVuY3Rpb24gcm90YXRlKHYsIGRlZykge1xuICB2YXIgaCA9IHJnYjJoc2wodik7XG4gIGhbMF0gPSBodWUoaFswXSArIGRlZyk7XG4gIGggPSBoc2wycmdiKGgpO1xuICB2LnIgPSBoWzBdO1xuICB2LmcgPSBoWzFdO1xuICB2LmIgPSBoWzJdO1xufVxuZnVuY3Rpb24gaHNsU3RyaW5nKHYpIHtcbiAgaWYgKCF2KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGEgPSByZ2IyaHNsKHYpO1xuICBjb25zdCBoID0gYVswXTtcbiAgY29uc3QgcyA9IG4ycChhWzFdKTtcbiAgY29uc3QgbCA9IG4ycChhWzJdKTtcbiAgcmV0dXJuIHYuYSA8IDI1NVxuICAgID8gYGhzbGEoJHtofSwgJHtzfSUsICR7bH0lLCAke2Iybih2LmEpfSlgXG4gICAgOiBgaHNsKCR7aH0sICR7c30lLCAke2x9JSlgO1xufVxuXG5jb25zdCBtYXAgPSB7XG5cdHg6ICdkYXJrJyxcblx0WjogJ2xpZ2h0Jyxcblx0WTogJ3JlJyxcblx0WDogJ2JsdScsXG5cdFc6ICdncicsXG5cdFY6ICdtZWRpdW0nLFxuXHRVOiAnc2xhdGUnLFxuXHRBOiAnZWUnLFxuXHRUOiAnb2wnLFxuXHRTOiAnb3InLFxuXHRCOiAncmEnLFxuXHRDOiAnbGF0ZWcnLFxuXHREOiAnaWdodHMnLFxuXHRSOiAnaW4nLFxuXHRROiAndHVycXVvaXMnLFxuXHRFOiAnaGknLFxuXHRQOiAncm8nLFxuXHRPOiAnYWwnLFxuXHROOiAnbGUnLFxuXHRNOiAnZGUnLFxuXHRMOiAneWVsbG8nLFxuXHRGOiAnZW4nLFxuXHRLOiAnY2gnLFxuXHRHOiAnYXJrcycsXG5cdEg6ICdlYScsXG5cdEk6ICdpZ2h0ZycsXG5cdEo6ICd3aCdcbn07XG5jb25zdCBuYW1lcyQxID0ge1xuXHRPaWNlWGU6ICdmMGY4ZmYnLFxuXHRhbnRpcXVld0V0ZTogJ2ZhZWJkNycsXG5cdGFxdWE6ICdmZmZmJyxcblx0YXF1YW1hclJlOiAnN2ZmZmQ0Jyxcblx0YXp1WTogJ2YwZmZmZicsXG5cdGJlaWdlOiAnZjVmNWRjJyxcblx0YmlzcXVlOiAnZmZlNGM0Jyxcblx0YmxhY2s6ICcwJyxcblx0YmxhbktlZE9tb25kOiAnZmZlYmNkJyxcblx0WGU6ICdmZicsXG5cdFhldmlUZXQ6ICc4YTJiZTInLFxuXHRiUHduOiAnYTUyYTJhJyxcblx0YnVybHl3b29kOiAnZGViODg3Jyxcblx0Y2FNdFhlOiAnNWY5ZWEwJyxcblx0S2FydFl1c2U6ICc3ZmZmMDAnLFxuXHRLb2NUYXRlOiAnZDI2OTFlJyxcblx0Y1NPOiAnZmY3ZjUwJyxcblx0Y1NuZmxvd2VyWGU6ICc2NDk1ZWQnLFxuXHRjU25zaWxrOiAnZmZmOGRjJyxcblx0Y3JpbXNvbjogJ2RjMTQzYycsXG5cdGN5YW46ICdmZmZmJyxcblx0eFhlOiAnOGInLFxuXHR4Y3lhbjogJzhiOGInLFxuXHR4Z1RNblBkOiAnYjg4NjBiJyxcblx0eFdheTogJ2E5YTlhOScsXG5cdHhnWUY6ICc2NDAwJyxcblx0eGdZeTogJ2E5YTlhOScsXG5cdHhraGFraTogJ2JkYjc2YicsXG5cdHhtYWdGdGE6ICc4YjAwOGInLFxuXHR4VGl2ZWdZRjogJzU1NmIyZicsXG5cdHhTYW5nZTogJ2ZmOGMwMCcsXG5cdHhTY0VkOiAnOTkzMmNjJyxcblx0eFlkOiAnOGIwMDAwJyxcblx0eHNPbW9uOiAnZTk5NjdhJyxcblx0eHNIZ1lGOiAnOGZiYzhmJyxcblx0eFVYZTogJzQ4M2Q4YicsXG5cdHhVV2F5OiAnMmY0ZjRmJyxcblx0eFVnWXk6ICcyZjRmNGYnLFxuXHR4UWU6ICdjZWQxJyxcblx0eHZpVGV0OiAnOTQwMGQzJyxcblx0ZEFwcFJrOiAnZmYxNDkzJyxcblx0ZEFwc2t5WGU6ICdiZmZmJyxcblx0ZGltV2F5OiAnNjk2OTY5Jyxcblx0ZGltZ1l5OiAnNjk2OTY5Jyxcblx0ZG9kZ2VyWGU6ICcxZTkwZmYnLFxuXHRmaVlicmljazogJ2IyMjIyMicsXG5cdGZsU093RXRlOiAnZmZmYWYwJyxcblx0Zm9Zc3RXQW46ICcyMjhiMjInLFxuXHRmdUtzaWE6ICdmZjAwZmYnLFxuXHRnYVJzYlNvOiAnZGNkY2RjJyxcblx0Z2hvc3R3RXRlOiAnZjhmOGZmJyxcblx0Z1RkOiAnZmZkNzAwJyxcblx0Z1RNblBkOiAnZGFhNTIwJyxcblx0V2F5OiAnODA4MDgwJyxcblx0Z1lGOiAnODAwMCcsXG5cdGdZRkx3OiAnYWRmZjJmJyxcblx0Z1l5OiAnODA4MDgwJyxcblx0aG9uZXlNdzogJ2YwZmZmMCcsXG5cdGhvdHBSazogJ2ZmNjliNCcsXG5cdFJkaWFuWWQ6ICdjZDVjNWMnLFxuXHRSZGlnbzogJzRiMDA4MicsXG5cdGl2U3k6ICdmZmZmZjAnLFxuXHRraGFraTogJ2YwZTY4YycsXG5cdGxhdkZNcjogJ2U2ZTZmYScsXG5cdGxhdkZNclhzaDogJ2ZmZjBmNScsXG5cdGxhd25nWUY6ICc3Y2ZjMDAnLFxuXHRObW9uY0VmZm9uOiAnZmZmYWNkJyxcblx0WlhlOiAnYWRkOGU2Jyxcblx0WmNTTzogJ2YwODA4MCcsXG5cdFpjeWFuOiAnZTBmZmZmJyxcblx0WmdUTW5QZEx3OiAnZmFmYWQyJyxcblx0WldheTogJ2QzZDNkMycsXG5cdFpnWUY6ICc5MGVlOTAnLFxuXHRaZ1l5OiAnZDNkM2QzJyxcblx0WnBSazogJ2ZmYjZjMScsXG5cdFpzT21vbjogJ2ZmYTA3YScsXG5cdFpzSGdZRjogJzIwYjJhYScsXG5cdFpza3lYZTogJzg3Y2VmYScsXG5cdFpVV2F5OiAnNzc4ODk5Jyxcblx0WlVnWXk6ICc3Nzg4OTknLFxuXHRac3RBbFhlOiAnYjBjNGRlJyxcblx0Wkx3OiAnZmZmZmUwJyxcblx0bGltZTogJ2ZmMDAnLFxuXHRsaW1lZ1lGOiAnMzJjZDMyJyxcblx0bFJGOiAnZmFmMGU2Jyxcblx0bWFnRnRhOiAnZmYwMGZmJyxcblx0bWFQb246ICc4MDAwMDAnLFxuXHRWYXF1YW1hclJlOiAnNjZjZGFhJyxcblx0VlhlOiAnY2QnLFxuXHRWU2NFZDogJ2JhNTVkMycsXG5cdFZwdXJwTjogJzkzNzBkYicsXG5cdFZzSGdZRjogJzNjYjM3MScsXG5cdFZVWGU6ICc3YjY4ZWUnLFxuXHRWc3ByUmdnWUY6ICdmYTlhJyxcblx0VlFlOiAnNDhkMWNjJyxcblx0VnZpVGV0WWQ6ICdjNzE1ODUnLFxuXHRtaWRuaWdodFhlOiAnMTkxOTcwJyxcblx0bVJ0Y1lhbTogJ2Y1ZmZmYScsXG5cdG1pc3R5UHNlOiAnZmZlNGUxJyxcblx0bW9jY2FzUjogJ2ZmZTRiNScsXG5cdG5hdmFqb3dFdGU6ICdmZmRlYWQnLFxuXHRuYXZ5OiAnODAnLFxuXHRUZGxhY2U6ICdmZGY1ZTYnLFxuXHRUaXZlOiAnODA4MDAwJyxcblx0VGl2ZWRCYjogJzZiOGUyMycsXG5cdFNhbmdlOiAnZmZhNTAwJyxcblx0U2FuZ2VZZDogJ2ZmNDUwMCcsXG5cdFNjRWQ6ICdkYTcwZDYnLFxuXHRwT2VnVE1uUGQ6ICdlZWU4YWEnLFxuXHRwT2VnWUY6ICc5OGZiOTgnLFxuXHRwT2VRZTogJ2FmZWVlZScsXG5cdHBPZXZpVGV0WWQ6ICdkYjcwOTMnLFxuXHRwYXBheWF3RXA6ICdmZmVmZDUnLFxuXHRwSEtwdWZmOiAnZmZkYWI5Jyxcblx0cGVydTogJ2NkODUzZicsXG5cdHBSazogJ2ZmYzBjYicsXG5cdHBsdW06ICdkZGEwZGQnLFxuXHRwb3dNclhlOiAnYjBlMGU2Jyxcblx0cHVycE46ICc4MDAwODAnLFxuXHRZYmVjY2FwdXJwTjogJzY2MzM5OScsXG5cdFlkOiAnZmYwMDAwJyxcblx0UHN5YnJvd246ICdiYzhmOGYnLFxuXHRQeU9YZTogJzQxNjllMScsXG5cdHNhZGROYlB3bjogJzhiNDUxMycsXG5cdHNPbW9uOiAnZmE4MDcyJyxcblx0c2FuZHliUHduOiAnZjRhNDYwJyxcblx0c0hnWUY6ICcyZThiNTcnLFxuXHRzSHNoZWxsOiAnZmZmNWVlJyxcblx0c2lGbmE6ICdhMDUyMmQnLFxuXHRzaWx2ZXI6ICdjMGMwYzAnLFxuXHRza3lYZTogJzg3Y2VlYicsXG5cdFVYZTogJzZhNWFjZCcsXG5cdFVXYXk6ICc3MDgwOTAnLFxuXHRVZ1l5OiAnNzA4MDkwJyxcblx0c25vdzogJ2ZmZmFmYScsXG5cdHNwclJnZ1lGOiAnZmY3ZicsXG5cdHN0QWxYZTogJzQ2ODJiNCcsXG5cdHRhbjogJ2QyYjQ4YycsXG5cdHRlTzogJzgwODAnLFxuXHR0RXN0TjogJ2Q4YmZkOCcsXG5cdHRvbWF0bzogJ2ZmNjM0NycsXG5cdFFlOiAnNDBlMGQwJyxcblx0dmlUZXQ6ICdlZTgyZWUnLFxuXHRKSHQ6ICdmNWRlYjMnLFxuXHR3RXRlOiAnZmZmZmZmJyxcblx0d0V0ZXNtb2tlOiAnZjVmNWY1Jyxcblx0THc6ICdmZmZmMDAnLFxuXHRMd2dZRjogJzlhY2QzMidcbn07XG5mdW5jdGlvbiB1bnBhY2soKSB7XG4gIGNvbnN0IHVucGFja2VkID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhuYW1lcyQxKTtcbiAgY29uc3QgdGtleXMgPSBPYmplY3Qua2V5cyhtYXApO1xuICBsZXQgaSwgaiwgaywgb2ssIG5rO1xuICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIG9rID0gbmsgPSBrZXlzW2ldO1xuICAgIGZvciAoaiA9IDA7IGogPCB0a2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgayA9IHRrZXlzW2pdO1xuICAgICAgbmsgPSBuay5yZXBsYWNlKGssIG1hcFtrXSk7XG4gICAgfVxuICAgIGsgPSBwYXJzZUludChuYW1lcyQxW29rXSwgMTYpO1xuICAgIHVucGFja2VkW25rXSA9IFtrID4+IDE2ICYgMHhGRiwgayA+PiA4ICYgMHhGRiwgayAmIDB4RkZdO1xuICB9XG4gIHJldHVybiB1bnBhY2tlZDtcbn1cblxubGV0IG5hbWVzO1xuZnVuY3Rpb24gbmFtZVBhcnNlKHN0cikge1xuICBpZiAoIW5hbWVzKSB7XG4gICAgbmFtZXMgPSB1bnBhY2soKTtcbiAgICBuYW1lcy50cmFuc3BhcmVudCA9IFswLCAwLCAwLCAwXTtcbiAgfVxuICBjb25zdCBhID0gbmFtZXNbc3RyLnRvTG93ZXJDYXNlKCldO1xuICByZXR1cm4gYSAmJiB7XG4gICAgcjogYVswXSxcbiAgICBnOiBhWzFdLFxuICAgIGI6IGFbMl0sXG4gICAgYTogYS5sZW5ndGggPT09IDQgPyBhWzNdIDogMjU1XG4gIH07XG59XG5cbmNvbnN0IFJHQl9SRSA9IC9ecmdiYT9cXChcXHMqKFstKy5cXGRdKykoJSk/W1xccyxdKyhbLSsuZVxcZF0rKSglKT9bXFxzLF0rKFstKy5lXFxkXSspKCUpPyg/OltcXHMsL10rKFstKy5lXFxkXSspKCUpPyk/XFxzKlxcKSQvO1xuZnVuY3Rpb24gcmdiUGFyc2Uoc3RyKSB7XG4gIGNvbnN0IG0gPSBSR0JfUkUuZXhlYyhzdHIpO1xuICBsZXQgYSA9IDI1NTtcbiAgbGV0IHIsIGcsIGI7XG4gIGlmICghbSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobVs3XSAhPT0gcikge1xuICAgIGNvbnN0IHYgPSArbVs3XTtcbiAgICBhID0gbVs4XSA/IHAyYih2KSA6IGxpbSh2ICogMjU1LCAwLCAyNTUpO1xuICB9XG4gIHIgPSArbVsxXTtcbiAgZyA9ICttWzNdO1xuICBiID0gK21bNV07XG4gIHIgPSAyNTUgJiAobVsyXSA/IHAyYihyKSA6IGxpbShyLCAwLCAyNTUpKTtcbiAgZyA9IDI1NSAmIChtWzRdID8gcDJiKGcpIDogbGltKGcsIDAsIDI1NSkpO1xuICBiID0gMjU1ICYgKG1bNl0gPyBwMmIoYikgOiBsaW0oYiwgMCwgMjU1KSk7XG4gIHJldHVybiB7XG4gICAgcjogcixcbiAgICBnOiBnLFxuICAgIGI6IGIsXG4gICAgYTogYVxuICB9O1xufVxuZnVuY3Rpb24gcmdiU3RyaW5nKHYpIHtcbiAgcmV0dXJuIHYgJiYgKFxuICAgIHYuYSA8IDI1NVxuICAgICAgPyBgcmdiYSgke3Yucn0sICR7di5nfSwgJHt2LmJ9LCAke2Iybih2LmEpfSlgXG4gICAgICA6IGByZ2IoJHt2LnJ9LCAke3YuZ30sICR7di5ifSlgXG4gICk7XG59XG5cbmNvbnN0IHRvID0gdiA9PiB2IDw9IDAuMDAzMTMwOCA/IHYgKiAxMi45MiA6IE1hdGgucG93KHYsIDEuMCAvIDIuNCkgKiAxLjA1NSAtIDAuMDU1O1xuY29uc3QgZnJvbSA9IHYgPT4gdiA8PSAwLjA0MDQ1ID8gdiAvIDEyLjkyIDogTWF0aC5wb3coKHYgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbmZ1bmN0aW9uIGludGVycG9sYXRlKHJnYjEsIHJnYjIsIHQpIHtcbiAgY29uc3QgciA9IGZyb20oYjJuKHJnYjEucikpO1xuICBjb25zdCBnID0gZnJvbShiMm4ocmdiMS5nKSk7XG4gIGNvbnN0IGIgPSBmcm9tKGIybihyZ2IxLmIpKTtcbiAgcmV0dXJuIHtcbiAgICByOiBuMmIodG8ociArIHQgKiAoZnJvbShiMm4ocmdiMi5yKSkgLSByKSkpLFxuICAgIGc6IG4yYih0byhnICsgdCAqIChmcm9tKGIybihyZ2IyLmcpKSAtIGcpKSksXG4gICAgYjogbjJiKHRvKGIgKyB0ICogKGZyb20oYjJuKHJnYjIuYikpIC0gYikpKSxcbiAgICBhOiByZ2IxLmEgKyB0ICogKHJnYjIuYSAtIHJnYjEuYSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gbW9kSFNMKHYsIGksIHJhdGlvKSB7XG4gIGlmICh2KSB7XG4gICAgbGV0IHRtcCA9IHJnYjJoc2wodik7XG4gICAgdG1wW2ldID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odG1wW2ldICsgdG1wW2ldICogcmF0aW8sIGkgPT09IDAgPyAzNjAgOiAxKSk7XG4gICAgdG1wID0gaHNsMnJnYih0bXApO1xuICAgIHYuciA9IHRtcFswXTtcbiAgICB2LmcgPSB0bXBbMV07XG4gICAgdi5iID0gdG1wWzJdO1xuICB9XG59XG5mdW5jdGlvbiBjbG9uZSh2LCBwcm90bykge1xuICByZXR1cm4gdiA/IE9iamVjdC5hc3NpZ24ocHJvdG8gfHwge30sIHYpIDogdjtcbn1cbmZ1bmN0aW9uIGZyb21PYmplY3QoaW5wdXQpIHtcbiAgdmFyIHYgPSB7cjogMCwgZzogMCwgYjogMCwgYTogMjU1fTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgaWYgKGlucHV0Lmxlbmd0aCA+PSAzKSB7XG4gICAgICB2ID0ge3I6IGlucHV0WzBdLCBnOiBpbnB1dFsxXSwgYjogaW5wdXRbMl0sIGE6IDI1NX07XG4gICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMykge1xuICAgICAgICB2LmEgPSBuMmIoaW5wdXRbM10pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2ID0gY2xvbmUoaW5wdXQsIHtyOiAwLCBnOiAwLCBiOiAwLCBhOiAxfSk7XG4gICAgdi5hID0gbjJiKHYuYSk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5mdW5jdGlvbiBmdW5jdGlvblBhcnNlKHN0cikge1xuICBpZiAoc3RyLmNoYXJBdCgwKSA9PT0gJ3InKSB7XG4gICAgcmV0dXJuIHJnYlBhcnNlKHN0cik7XG4gIH1cbiAgcmV0dXJuIGh1ZVBhcnNlKHN0cik7XG59XG5jbGFzcyBDb2xvciB7XG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBpbnB1dDtcbiAgICBsZXQgdjtcbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHYgPSBmcm9tT2JqZWN0KGlucHV0KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2ID0gaGV4UGFyc2UoaW5wdXQpIHx8IG5hbWVQYXJzZShpbnB1dCkgfHwgZnVuY3Rpb25QYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHRoaXMuX3JnYiA9IHY7XG4gICAgdGhpcy5fdmFsaWQgPSAhIXY7XG4gIH1cbiAgZ2V0IHZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLl92YWxpZDtcbiAgfVxuICBnZXQgcmdiKCkge1xuICAgIHZhciB2ID0gY2xvbmUodGhpcy5fcmdiKTtcbiAgICBpZiAodikge1xuICAgICAgdi5hID0gYjJuKHYuYSk7XG4gICAgfVxuICAgIHJldHVybiB2O1xuICB9XG4gIHNldCByZ2Iob2JqKSB7XG4gICAgdGhpcy5fcmdiID0gZnJvbU9iamVjdChvYmopO1xuICB9XG4gIHJnYlN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWQgPyByZ2JTdHJpbmcodGhpcy5fcmdiKSA6IHVuZGVmaW5lZDtcbiAgfVxuICBoZXhTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkID8gaGV4U3RyaW5nKHRoaXMuX3JnYikgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaHNsU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl92YWxpZCA/IGhzbFN0cmluZyh0aGlzLl9yZ2IpIDogdW5kZWZpbmVkO1xuICB9XG4gIG1peChjb2xvciwgd2VpZ2h0KSB7XG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICBjb25zdCBjMSA9IHRoaXMucmdiO1xuICAgICAgY29uc3QgYzIgPSBjb2xvci5yZ2I7XG4gICAgICBsZXQgdzI7XG4gICAgICBjb25zdCBwID0gd2VpZ2h0ID09PSB3MiA/IDAuNSA6IHdlaWdodDtcbiAgICAgIGNvbnN0IHcgPSAyICogcCAtIDE7XG4gICAgICBjb25zdCBhID0gYzEuYSAtIGMyLmE7XG4gICAgICBjb25zdCB3MSA9ICgodyAqIGEgPT09IC0xID8gdyA6ICh3ICsgYSkgLyAoMSArIHcgKiBhKSkgKyAxKSAvIDIuMDtcbiAgICAgIHcyID0gMSAtIHcxO1xuICAgICAgYzEuciA9IDB4RkYgJiB3MSAqIGMxLnIgKyB3MiAqIGMyLnIgKyAwLjU7XG4gICAgICBjMS5nID0gMHhGRiAmIHcxICogYzEuZyArIHcyICogYzIuZyArIDAuNTtcbiAgICAgIGMxLmIgPSAweEZGICYgdzEgKiBjMS5iICsgdzIgKiBjMi5iICsgMC41O1xuICAgICAgYzEuYSA9IHAgKiBjMS5hICsgKDEgLSBwKSAqIGMyLmE7XG4gICAgICB0aGlzLnJnYiA9IGMxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpbnRlcnBvbGF0ZShjb2xvciwgdCkge1xuICAgIGlmIChjb2xvcikge1xuICAgICAgdGhpcy5fcmdiID0gaW50ZXJwb2xhdGUodGhpcy5fcmdiLCBjb2xvci5fcmdiLCB0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBDb2xvcih0aGlzLnJnYik7XG4gIH1cbiAgYWxwaGEoYSkge1xuICAgIHRoaXMuX3JnYi5hID0gbjJiKGEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGNsZWFyZXIocmF0aW8pIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgcmdiLmEgKj0gMSAtIHJhdGlvO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdyZXlzY2FsZSgpIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgY29uc3QgdmFsID0gcm91bmQocmdiLnIgKiAwLjMgKyByZ2IuZyAqIDAuNTkgKyByZ2IuYiAqIDAuMTEpO1xuICAgIHJnYi5yID0gcmdiLmcgPSByZ2IuYiA9IHZhbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcGFxdWVyKHJhdGlvKSB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5fcmdiO1xuICAgIHJnYi5hICo9IDEgKyByYXRpbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBuZWdhdGUoKSB7XG4gICAgY29uc3QgdiA9IHRoaXMuX3JnYjtcbiAgICB2LnIgPSAyNTUgLSB2LnI7XG4gICAgdi5nID0gMjU1IC0gdi5nO1xuICAgIHYuYiA9IDI1NSAtIHYuYjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBsaWdodGVuKHJhdGlvKSB7XG4gICAgbW9kSFNMKHRoaXMuX3JnYiwgMiwgcmF0aW8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGRhcmtlbihyYXRpbykge1xuICAgIG1vZEhTTCh0aGlzLl9yZ2IsIDIsIC1yYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgc2F0dXJhdGUocmF0aW8pIHtcbiAgICBtb2RIU0wodGhpcy5fcmdiLCAxLCByYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZGVzYXR1cmF0ZShyYXRpbykge1xuICAgIG1vZEhTTCh0aGlzLl9yZ2IsIDEsIC1yYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcm90YXRlKGRlZykge1xuICAgIHJvdGF0ZSh0aGlzLl9yZ2IsIGRlZyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhfZXNtKGlucHV0KSB7XG4gIHJldHVybiBuZXcgQ29sb3IoaW5wdXQpO1xufVxuXG5leHBvcnQgeyBDb2xvciwgYjJuLCBiMnAsIGluZGV4X2VzbSBhcyBkZWZhdWx0LCBoZXhQYXJzZSwgaGV4U3RyaW5nLCBoc2wycmdiLCBoc2xTdHJpbmcsIGhzdjJyZ2IsIGh1ZVBhcnNlLCBod2IycmdiLCBsaW0sIG4yYiwgbjJwLCBuYW1lUGFyc2UsIHAyYiwgcmdiMmhzbCwgcmdiUGFyc2UsIHJnYlN0cmluZywgcm90YXRlLCByb3VuZCB9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///129\n\n}"); - -/***/ }), - -/***/ 130: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Color: () => (/* binding */ Color),\n/* harmony export */ b2n: () => (/* binding */ b2n),\n/* harmony export */ b2p: () => (/* binding */ b2p),\n/* harmony export */ \"default\": () => (/* binding */ index_esm),\n/* harmony export */ hexParse: () => (/* binding */ hexParse),\n/* harmony export */ hexString: () => (/* binding */ hexString),\n/* harmony export */ hsl2rgb: () => (/* binding */ hsl2rgb),\n/* harmony export */ hslString: () => (/* binding */ hslString),\n/* harmony export */ hsv2rgb: () => (/* binding */ hsv2rgb),\n/* harmony export */ hueParse: () => (/* binding */ hueParse),\n/* harmony export */ hwb2rgb: () => (/* binding */ hwb2rgb),\n/* harmony export */ lim: () => (/* binding */ lim),\n/* harmony export */ n2b: () => (/* binding */ n2b),\n/* harmony export */ n2p: () => (/* binding */ n2p),\n/* harmony export */ nameParse: () => (/* binding */ nameParse),\n/* harmony export */ p2b: () => (/* binding */ p2b),\n/* harmony export */ rgb2hsl: () => (/* binding */ rgb2hsl),\n/* harmony export */ rgbParse: () => (/* binding */ rgbParse),\n/* harmony export */ rgbString: () => (/* binding */ rgbString),\n/* harmony export */ rotate: () => (/* binding */ rotate),\n/* harmony export */ round: () => (/* binding */ round)\n/* harmony export */ });\n/*!\n * @kurkle/color v0.4.0\n * https://github.com/kurkle/color#readme\n * (c) 2025 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nconst COMMENT_REGEXP = /\\/\\*[^]*?\\*\\//g;\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n const clean = input.replace(COMMENT_REGEXP, '');\n v = hexParse(clean) || nameParse(clean) || functionParse(clean);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMwLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLFNBQVM7QUFDM0MsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDNUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQjtBQUNBLGdCQUFnQixrQkFBa0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLFNBQVM7QUFDakQsZUFBZSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLHNCQUFzQix1QkFBdUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVrTSIsInNvdXJjZXMiOlsid2VicGFjazovL2FyY2hpdGVjdHVpLWh0bWwtZnJlZS8uL25vZGVfbW9kdWxlcy9Aa3Vya2xlL2NvbG9yL2Rpc3QvY29sb3IuZXNtLmpzPzJhNDQiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAa3Vya2xlL2NvbG9yIHYwLjQuMFxuICogaHR0cHM6Ly9naXRodWIuY29tL2t1cmtsZS9jb2xvciNyZWFkbWVcbiAqIChjKSAyMDI1IEp1a2thIEt1cmtlbGFcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5mdW5jdGlvbiByb3VuZCh2KSB7XG4gIHJldHVybiB2ICsgMC41IHwgMDtcbn1cbmNvbnN0IGxpbSA9ICh2LCBsLCBoKSA9PiBNYXRoLm1heChNYXRoLm1pbih2LCBoKSwgbCk7XG5mdW5jdGlvbiBwMmIodikge1xuICByZXR1cm4gbGltKHJvdW5kKHYgKiAyLjU1KSwgMCwgMjU1KTtcbn1cbmZ1bmN0aW9uIGIycCh2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAvIDIuNTUpLCAwLCAxMDApO1xufVxuZnVuY3Rpb24gbjJiKHYpIHtcbiAgcmV0dXJuIGxpbShyb3VuZCh2ICogMjU1KSwgMCwgMjU1KTtcbn1cbmZ1bmN0aW9uIGIybih2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAvIDIuNTUpIC8gMTAwLCAwLCAxKTtcbn1cbmZ1bmN0aW9uIG4ycCh2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAqIDEwMCksIDAsIDEwMCk7XG59XG5cbmNvbnN0IG1hcCQxID0gezA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDgsIDk6IDksIEE6IDEwLCBCOiAxMSwgQzogMTIsIEQ6IDEzLCBFOiAxNCwgRjogMTUsIGE6IDEwLCBiOiAxMSwgYzogMTIsIGQ6IDEzLCBlOiAxNCwgZjogMTV9O1xuY29uc3QgaGV4ID0gWy4uLicwMTIzNDU2Nzg5QUJDREVGJ107XG5jb25zdCBoMSA9IGIgPT4gaGV4W2IgJiAweEZdO1xuY29uc3QgaDIgPSBiID0+IGhleFsoYiAmIDB4RjApID4+IDRdICsgaGV4W2IgJiAweEZdO1xuY29uc3QgZXEgPSBiID0+ICgoYiAmIDB4RjApID4+IDQpID09PSAoYiAmIDB4Rik7XG5jb25zdCBpc1Nob3J0ID0gdiA9PiBlcSh2LnIpICYmIGVxKHYuZykgJiYgZXEodi5iKSAmJiBlcSh2LmEpO1xuZnVuY3Rpb24gaGV4UGFyc2Uoc3RyKSB7XG4gIHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuICB2YXIgcmV0O1xuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAobGVuID09PSA0IHx8IGxlbiA9PT0gNSkge1xuICAgICAgcmV0ID0ge1xuICAgICAgICByOiAyNTUgJiBtYXAkMVtzdHJbMV1dICogMTcsXG4gICAgICAgIGc6IDI1NSAmIG1hcCQxW3N0clsyXV0gKiAxNyxcbiAgICAgICAgYjogMjU1ICYgbWFwJDFbc3RyWzNdXSAqIDE3LFxuICAgICAgICBhOiBsZW4gPT09IDUgPyBtYXAkMVtzdHJbNF1dICogMTcgOiAyNTVcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChsZW4gPT09IDcgfHwgbGVuID09PSA5KSB7XG4gICAgICByZXQgPSB7XG4gICAgICAgIHI6IG1hcCQxW3N0clsxXV0gPDwgNCB8IG1hcCQxW3N0clsyXV0sXG4gICAgICAgIGc6IG1hcCQxW3N0clszXV0gPDwgNCB8IG1hcCQxW3N0cls0XV0sXG4gICAgICAgIGI6IG1hcCQxW3N0cls1XV0gPDwgNCB8IG1hcCQxW3N0cls2XV0sXG4gICAgICAgIGE6IGxlbiA9PT0gOSA/IChtYXAkMVtzdHJbN11dIDw8IDQgfCBtYXAkMVtzdHJbOF1dKSA6IDI1NVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmNvbnN0IGFscGhhID0gKGEsIGYpID0+IGEgPCAyNTUgPyBmKGEpIDogJyc7XG5mdW5jdGlvbiBoZXhTdHJpbmcodikge1xuICB2YXIgZiA9IGlzU2hvcnQodikgPyBoMSA6IGgyO1xuICByZXR1cm4gdlxuICAgID8gJyMnICsgZih2LnIpICsgZih2LmcpICsgZih2LmIpICsgYWxwaGEodi5hLCBmKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCBIVUVfUkUgPSAvXihoc2xhP3xod2J8aHN2KVxcKFxccyooWy0rLmVcXGRdKykoPzpkZWcpP1tcXHMsXSsoWy0rLmVcXGRdKyklW1xccyxdKyhbLSsuZVxcZF0rKSUoPzpbXFxzLF0rKFstKy5lXFxkXSspKCUpPyk/XFxzKlxcKSQvO1xuZnVuY3Rpb24gaHNsMnJnYm4oaCwgcywgbCkge1xuICBjb25zdCBhID0gcyAqIE1hdGgubWluKGwsIDEgLSBsKTtcbiAgY29uc3QgZiA9IChuLCBrID0gKG4gKyBoIC8gMzApICUgMTIpID0+IGwgLSBhICogTWF0aC5tYXgoTWF0aC5taW4oayAtIDMsIDkgLSBrLCAxKSwgLTEpO1xuICByZXR1cm4gW2YoMCksIGYoOCksIGYoNCldO1xufVxuZnVuY3Rpb24gaHN2MnJnYm4oaCwgcywgdikge1xuICBjb25zdCBmID0gKG4sIGsgPSAobiArIGggLyA2MCkgJSA2KSA9PiB2IC0gdiAqIHMgKiBNYXRoLm1heChNYXRoLm1pbihrLCA0IC0gaywgMSksIDApO1xuICByZXR1cm4gW2YoNSksIGYoMyksIGYoMSldO1xufVxuZnVuY3Rpb24gaHdiMnJnYm4oaCwgdywgYikge1xuICBjb25zdCByZ2IgPSBoc2wycmdibihoLCAxLCAwLjUpO1xuICBsZXQgaTtcbiAgaWYgKHcgKyBiID4gMSkge1xuICAgIGkgPSAxIC8gKHcgKyBiKTtcbiAgICB3ICo9IGk7XG4gICAgYiAqPSBpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICByZ2JbaV0gKj0gMSAtIHcgLSBiO1xuICAgIHJnYltpXSArPSB3O1xuICB9XG4gIHJldHVybiByZ2I7XG59XG5mdW5jdGlvbiBodWVWYWx1ZShyLCBnLCBiLCBkLCBtYXgpIHtcbiAgaWYgKHIgPT09IG1heCkge1xuICAgIHJldHVybiAoKGcgLSBiKSAvIGQpICsgKGcgPCBiID8gNiA6IDApO1xuICB9XG4gIGlmIChnID09PSBtYXgpIHtcbiAgICByZXR1cm4gKGIgLSByKSAvIGQgKyAyO1xuICB9XG4gIHJldHVybiAociAtIGcpIC8gZCArIDQ7XG59XG5mdW5jdGlvbiByZ2IyaHNsKHYpIHtcbiAgY29uc3QgcmFuZ2UgPSAyNTU7XG4gIGNvbnN0IHIgPSB2LnIgLyByYW5nZTtcbiAgY29uc3QgZyA9IHYuZyAvIHJhbmdlO1xuICBjb25zdCBiID0gdi5iIC8gcmFuZ2U7XG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgY29uc3QgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgbGV0IGgsIHMsIGQ7XG4gIGlmIChtYXggIT09IG1pbikge1xuICAgIGQgPSBtYXggLSBtaW47XG4gICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pO1xuICAgIGggPSBodWVWYWx1ZShyLCBnLCBiLCBkLCBtYXgpO1xuICAgIGggPSBoICogNjAgKyAwLjU7XG4gIH1cbiAgcmV0dXJuIFtoIHwgMCwgcyB8fCAwLCBsXTtcbn1cbmZ1bmN0aW9uIGNhbGxuKGYsIGEsIGIsIGMpIHtcbiAgcmV0dXJuIChcbiAgICBBcnJheS5pc0FycmF5KGEpXG4gICAgICA/IGYoYVswXSwgYVsxXSwgYVsyXSlcbiAgICAgIDogZihhLCBiLCBjKVxuICApLm1hcChuMmIpO1xufVxuZnVuY3Rpb24gaHNsMnJnYihoLCBzLCBsKSB7XG4gIHJldHVybiBjYWxsbihoc2wycmdibiwgaCwgcywgbCk7XG59XG5mdW5jdGlvbiBod2IycmdiKGgsIHcsIGIpIHtcbiAgcmV0dXJuIGNhbGxuKGh3YjJyZ2JuLCBoLCB3LCBiKTtcbn1cbmZ1bmN0aW9uIGhzdjJyZ2IoaCwgcywgdikge1xuICByZXR1cm4gY2FsbG4oaHN2MnJnYm4sIGgsIHMsIHYpO1xufVxuZnVuY3Rpb24gaHVlKGgpIHtcbiAgcmV0dXJuIChoICUgMzYwICsgMzYwKSAlIDM2MDtcbn1cbmZ1bmN0aW9uIGh1ZVBhcnNlKHN0cikge1xuICBjb25zdCBtID0gSFVFX1JFLmV4ZWMoc3RyKTtcbiAgbGV0IGEgPSAyNTU7XG4gIGxldCB2O1xuICBpZiAoIW0pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1bNV0gIT09IHYpIHtcbiAgICBhID0gbVs2XSA/IHAyYigrbVs1XSkgOiBuMmIoK21bNV0pO1xuICB9XG4gIGNvbnN0IGggPSBodWUoK21bMl0pO1xuICBjb25zdCBwMSA9ICttWzNdIC8gMTAwO1xuICBjb25zdCBwMiA9ICttWzRdIC8gMTAwO1xuICBpZiAobVsxXSA9PT0gJ2h3YicpIHtcbiAgICB2ID0gaHdiMnJnYihoLCBwMSwgcDIpO1xuICB9IGVsc2UgaWYgKG1bMV0gPT09ICdoc3YnKSB7XG4gICAgdiA9IGhzdjJyZ2IoaCwgcDEsIHAyKTtcbiAgfSBlbHNlIHtcbiAgICB2ID0gaHNsMnJnYihoLCBwMSwgcDIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcjogdlswXSxcbiAgICBnOiB2WzFdLFxuICAgIGI6IHZbMl0sXG4gICAgYTogYVxuICB9O1xufVxuZnVuY3Rpb24gcm90YXRlKHYsIGRlZykge1xuICB2YXIgaCA9IHJnYjJoc2wodik7XG4gIGhbMF0gPSBodWUoaFswXSArIGRlZyk7XG4gIGggPSBoc2wycmdiKGgpO1xuICB2LnIgPSBoWzBdO1xuICB2LmcgPSBoWzFdO1xuICB2LmIgPSBoWzJdO1xufVxuZnVuY3Rpb24gaHNsU3RyaW5nKHYpIHtcbiAgaWYgKCF2KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGEgPSByZ2IyaHNsKHYpO1xuICBjb25zdCBoID0gYVswXTtcbiAgY29uc3QgcyA9IG4ycChhWzFdKTtcbiAgY29uc3QgbCA9IG4ycChhWzJdKTtcbiAgcmV0dXJuIHYuYSA8IDI1NVxuICAgID8gYGhzbGEoJHtofSwgJHtzfSUsICR7bH0lLCAke2Iybih2LmEpfSlgXG4gICAgOiBgaHNsKCR7aH0sICR7c30lLCAke2x9JSlgO1xufVxuXG5jb25zdCBtYXAgPSB7XG5cdHg6ICdkYXJrJyxcblx0WjogJ2xpZ2h0Jyxcblx0WTogJ3JlJyxcblx0WDogJ2JsdScsXG5cdFc6ICdncicsXG5cdFY6ICdtZWRpdW0nLFxuXHRVOiAnc2xhdGUnLFxuXHRBOiAnZWUnLFxuXHRUOiAnb2wnLFxuXHRTOiAnb3InLFxuXHRCOiAncmEnLFxuXHRDOiAnbGF0ZWcnLFxuXHREOiAnaWdodHMnLFxuXHRSOiAnaW4nLFxuXHRROiAndHVycXVvaXMnLFxuXHRFOiAnaGknLFxuXHRQOiAncm8nLFxuXHRPOiAnYWwnLFxuXHROOiAnbGUnLFxuXHRNOiAnZGUnLFxuXHRMOiAneWVsbG8nLFxuXHRGOiAnZW4nLFxuXHRLOiAnY2gnLFxuXHRHOiAnYXJrcycsXG5cdEg6ICdlYScsXG5cdEk6ICdpZ2h0ZycsXG5cdEo6ICd3aCdcbn07XG5jb25zdCBuYW1lcyQxID0ge1xuXHRPaWNlWGU6ICdmMGY4ZmYnLFxuXHRhbnRpcXVld0V0ZTogJ2ZhZWJkNycsXG5cdGFxdWE6ICdmZmZmJyxcblx0YXF1YW1hclJlOiAnN2ZmZmQ0Jyxcblx0YXp1WTogJ2YwZmZmZicsXG5cdGJlaWdlOiAnZjVmNWRjJyxcblx0YmlzcXVlOiAnZmZlNGM0Jyxcblx0YmxhY2s6ICcwJyxcblx0YmxhbktlZE9tb25kOiAnZmZlYmNkJyxcblx0WGU6ICdmZicsXG5cdFhldmlUZXQ6ICc4YTJiZTInLFxuXHRiUHduOiAnYTUyYTJhJyxcblx0YnVybHl3b29kOiAnZGViODg3Jyxcblx0Y2FNdFhlOiAnNWY5ZWEwJyxcblx0S2FydFl1c2U6ICc3ZmZmMDAnLFxuXHRLb2NUYXRlOiAnZDI2OTFlJyxcblx0Y1NPOiAnZmY3ZjUwJyxcblx0Y1NuZmxvd2VyWGU6ICc2NDk1ZWQnLFxuXHRjU25zaWxrOiAnZmZmOGRjJyxcblx0Y3JpbXNvbjogJ2RjMTQzYycsXG5cdGN5YW46ICdmZmZmJyxcblx0eFhlOiAnOGInLFxuXHR4Y3lhbjogJzhiOGInLFxuXHR4Z1RNblBkOiAnYjg4NjBiJyxcblx0eFdheTogJ2E5YTlhOScsXG5cdHhnWUY6ICc2NDAwJyxcblx0eGdZeTogJ2E5YTlhOScsXG5cdHhraGFraTogJ2JkYjc2YicsXG5cdHhtYWdGdGE6ICc4YjAwOGInLFxuXHR4VGl2ZWdZRjogJzU1NmIyZicsXG5cdHhTYW5nZTogJ2ZmOGMwMCcsXG5cdHhTY0VkOiAnOTkzMmNjJyxcblx0eFlkOiAnOGIwMDAwJyxcblx0eHNPbW9uOiAnZTk5NjdhJyxcblx0eHNIZ1lGOiAnOGZiYzhmJyxcblx0eFVYZTogJzQ4M2Q4YicsXG5cdHhVV2F5OiAnMmY0ZjRmJyxcblx0eFVnWXk6ICcyZjRmNGYnLFxuXHR4UWU6ICdjZWQxJyxcblx0eHZpVGV0OiAnOTQwMGQzJyxcblx0ZEFwcFJrOiAnZmYxNDkzJyxcblx0ZEFwc2t5WGU6ICdiZmZmJyxcblx0ZGltV2F5OiAnNjk2OTY5Jyxcblx0ZGltZ1l5OiAnNjk2OTY5Jyxcblx0ZG9kZ2VyWGU6ICcxZTkwZmYnLFxuXHRmaVlicmljazogJ2IyMjIyMicsXG5cdGZsU093RXRlOiAnZmZmYWYwJyxcblx0Zm9Zc3RXQW46ICcyMjhiMjInLFxuXHRmdUtzaWE6ICdmZjAwZmYnLFxuXHRnYVJzYlNvOiAnZGNkY2RjJyxcblx0Z2hvc3R3RXRlOiAnZjhmOGZmJyxcblx0Z1RkOiAnZmZkNzAwJyxcblx0Z1RNblBkOiAnZGFhNTIwJyxcblx0V2F5OiAnODA4MDgwJyxcblx0Z1lGOiAnODAwMCcsXG5cdGdZRkx3OiAnYWRmZjJmJyxcblx0Z1l5OiAnODA4MDgwJyxcblx0aG9uZXlNdzogJ2YwZmZmMCcsXG5cdGhvdHBSazogJ2ZmNjliNCcsXG5cdFJkaWFuWWQ6ICdjZDVjNWMnLFxuXHRSZGlnbzogJzRiMDA4MicsXG5cdGl2U3k6ICdmZmZmZjAnLFxuXHRraGFraTogJ2YwZTY4YycsXG5cdGxhdkZNcjogJ2U2ZTZmYScsXG5cdGxhdkZNclhzaDogJ2ZmZjBmNScsXG5cdGxhd25nWUY6ICc3Y2ZjMDAnLFxuXHRObW9uY0VmZm9uOiAnZmZmYWNkJyxcblx0WlhlOiAnYWRkOGU2Jyxcblx0WmNTTzogJ2YwODA4MCcsXG5cdFpjeWFuOiAnZTBmZmZmJyxcblx0WmdUTW5QZEx3OiAnZmFmYWQyJyxcblx0WldheTogJ2QzZDNkMycsXG5cdFpnWUY6ICc5MGVlOTAnLFxuXHRaZ1l5OiAnZDNkM2QzJyxcblx0WnBSazogJ2ZmYjZjMScsXG5cdFpzT21vbjogJ2ZmYTA3YScsXG5cdFpzSGdZRjogJzIwYjJhYScsXG5cdFpza3lYZTogJzg3Y2VmYScsXG5cdFpVV2F5OiAnNzc4ODk5Jyxcblx0WlVnWXk6ICc3Nzg4OTknLFxuXHRac3RBbFhlOiAnYjBjNGRlJyxcblx0Wkx3OiAnZmZmZmUwJyxcblx0bGltZTogJ2ZmMDAnLFxuXHRsaW1lZ1lGOiAnMzJjZDMyJyxcblx0bFJGOiAnZmFmMGU2Jyxcblx0bWFnRnRhOiAnZmYwMGZmJyxcblx0bWFQb246ICc4MDAwMDAnLFxuXHRWYXF1YW1hclJlOiAnNjZjZGFhJyxcblx0VlhlOiAnY2QnLFxuXHRWU2NFZDogJ2JhNTVkMycsXG5cdFZwdXJwTjogJzkzNzBkYicsXG5cdFZzSGdZRjogJzNjYjM3MScsXG5cdFZVWGU6ICc3YjY4ZWUnLFxuXHRWc3ByUmdnWUY6ICdmYTlhJyxcblx0VlFlOiAnNDhkMWNjJyxcblx0VnZpVGV0WWQ6ICdjNzE1ODUnLFxuXHRtaWRuaWdodFhlOiAnMTkxOTcwJyxcblx0bVJ0Y1lhbTogJ2Y1ZmZmYScsXG5cdG1pc3R5UHNlOiAnZmZlNGUxJyxcblx0bW9jY2FzUjogJ2ZmZTRiNScsXG5cdG5hdmFqb3dFdGU6ICdmZmRlYWQnLFxuXHRuYXZ5OiAnODAnLFxuXHRUZGxhY2U6ICdmZGY1ZTYnLFxuXHRUaXZlOiAnODA4MDAwJyxcblx0VGl2ZWRCYjogJzZiOGUyMycsXG5cdFNhbmdlOiAnZmZhNTAwJyxcblx0U2FuZ2VZZDogJ2ZmNDUwMCcsXG5cdFNjRWQ6ICdkYTcwZDYnLFxuXHRwT2VnVE1uUGQ6ICdlZWU4YWEnLFxuXHRwT2VnWUY6ICc5OGZiOTgnLFxuXHRwT2VRZTogJ2FmZWVlZScsXG5cdHBPZXZpVGV0WWQ6ICdkYjcwOTMnLFxuXHRwYXBheWF3RXA6ICdmZmVmZDUnLFxuXHRwSEtwdWZmOiAnZmZkYWI5Jyxcblx0cGVydTogJ2NkODUzZicsXG5cdHBSazogJ2ZmYzBjYicsXG5cdHBsdW06ICdkZGEwZGQnLFxuXHRwb3dNclhlOiAnYjBlMGU2Jyxcblx0cHVycE46ICc4MDAwODAnLFxuXHRZYmVjY2FwdXJwTjogJzY2MzM5OScsXG5cdFlkOiAnZmYwMDAwJyxcblx0UHN5YnJvd246ICdiYzhmOGYnLFxuXHRQeU9YZTogJzQxNjllMScsXG5cdHNhZGROYlB3bjogJzhiNDUxMycsXG5cdHNPbW9uOiAnZmE4MDcyJyxcblx0c2FuZHliUHduOiAnZjRhNDYwJyxcblx0c0hnWUY6ICcyZThiNTcnLFxuXHRzSHNoZWxsOiAnZmZmNWVlJyxcblx0c2lGbmE6ICdhMDUyMmQnLFxuXHRzaWx2ZXI6ICdjMGMwYzAnLFxuXHRza3lYZTogJzg3Y2VlYicsXG5cdFVYZTogJzZhNWFjZCcsXG5cdFVXYXk6ICc3MDgwOTAnLFxuXHRVZ1l5OiAnNzA4MDkwJyxcblx0c25vdzogJ2ZmZmFmYScsXG5cdHNwclJnZ1lGOiAnZmY3ZicsXG5cdHN0QWxYZTogJzQ2ODJiNCcsXG5cdHRhbjogJ2QyYjQ4YycsXG5cdHRlTzogJzgwODAnLFxuXHR0RXN0TjogJ2Q4YmZkOCcsXG5cdHRvbWF0bzogJ2ZmNjM0NycsXG5cdFFlOiAnNDBlMGQwJyxcblx0dmlUZXQ6ICdlZTgyZWUnLFxuXHRKSHQ6ICdmNWRlYjMnLFxuXHR3RXRlOiAnZmZmZmZmJyxcblx0d0V0ZXNtb2tlOiAnZjVmNWY1Jyxcblx0THc6ICdmZmZmMDAnLFxuXHRMd2dZRjogJzlhY2QzMidcbn07XG5mdW5jdGlvbiB1bnBhY2soKSB7XG4gIGNvbnN0IHVucGFja2VkID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhuYW1lcyQxKTtcbiAgY29uc3QgdGtleXMgPSBPYmplY3Qua2V5cyhtYXApO1xuICBsZXQgaSwgaiwgaywgb2ssIG5rO1xuICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIG9rID0gbmsgPSBrZXlzW2ldO1xuICAgIGZvciAoaiA9IDA7IGogPCB0a2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgayA9IHRrZXlzW2pdO1xuICAgICAgbmsgPSBuay5yZXBsYWNlKGssIG1hcFtrXSk7XG4gICAgfVxuICAgIGsgPSBwYXJzZUludChuYW1lcyQxW29rXSwgMTYpO1xuICAgIHVucGFja2VkW25rXSA9IFtrID4+IDE2ICYgMHhGRiwgayA+PiA4ICYgMHhGRiwgayAmIDB4RkZdO1xuICB9XG4gIHJldHVybiB1bnBhY2tlZDtcbn1cblxubGV0IG5hbWVzO1xuZnVuY3Rpb24gbmFtZVBhcnNlKHN0cikge1xuICBpZiAoIW5hbWVzKSB7XG4gICAgbmFtZXMgPSB1bnBhY2soKTtcbiAgICBuYW1lcy50cmFuc3BhcmVudCA9IFswLCAwLCAwLCAwXTtcbiAgfVxuICBjb25zdCBhID0gbmFtZXNbc3RyLnRvTG93ZXJDYXNlKCldO1xuICByZXR1cm4gYSAmJiB7XG4gICAgcjogYVswXSxcbiAgICBnOiBhWzFdLFxuICAgIGI6IGFbMl0sXG4gICAgYTogYS5sZW5ndGggPT09IDQgPyBhWzNdIDogMjU1XG4gIH07XG59XG5cbmNvbnN0IFJHQl9SRSA9IC9ecmdiYT9cXChcXHMqKFstKy5cXGRdKykoJSk/W1xccyxdKyhbLSsuZVxcZF0rKSglKT9bXFxzLF0rKFstKy5lXFxkXSspKCUpPyg/OltcXHMsL10rKFstKy5lXFxkXSspKCUpPyk/XFxzKlxcKSQvO1xuZnVuY3Rpb24gcmdiUGFyc2Uoc3RyKSB7XG4gIGNvbnN0IG0gPSBSR0JfUkUuZXhlYyhzdHIpO1xuICBsZXQgYSA9IDI1NTtcbiAgbGV0IHIsIGcsIGI7XG4gIGlmICghbSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobVs3XSAhPT0gcikge1xuICAgIGNvbnN0IHYgPSArbVs3XTtcbiAgICBhID0gbVs4XSA/IHAyYih2KSA6IGxpbSh2ICogMjU1LCAwLCAyNTUpO1xuICB9XG4gIHIgPSArbVsxXTtcbiAgZyA9ICttWzNdO1xuICBiID0gK21bNV07XG4gIHIgPSAyNTUgJiAobVsyXSA/IHAyYihyKSA6IGxpbShyLCAwLCAyNTUpKTtcbiAgZyA9IDI1NSAmIChtWzRdID8gcDJiKGcpIDogbGltKGcsIDAsIDI1NSkpO1xuICBiID0gMjU1ICYgKG1bNl0gPyBwMmIoYikgOiBsaW0oYiwgMCwgMjU1KSk7XG4gIHJldHVybiB7XG4gICAgcjogcixcbiAgICBnOiBnLFxuICAgIGI6IGIsXG4gICAgYTogYVxuICB9O1xufVxuZnVuY3Rpb24gcmdiU3RyaW5nKHYpIHtcbiAgcmV0dXJuIHYgJiYgKFxuICAgIHYuYSA8IDI1NVxuICAgICAgPyBgcmdiYSgke3Yucn0sICR7di5nfSwgJHt2LmJ9LCAke2Iybih2LmEpfSlgXG4gICAgICA6IGByZ2IoJHt2LnJ9LCAke3YuZ30sICR7di5ifSlgXG4gICk7XG59XG5cbmNvbnN0IHRvID0gdiA9PiB2IDw9IDAuMDAzMTMwOCA/IHYgKiAxMi45MiA6IE1hdGgucG93KHYsIDEuMCAvIDIuNCkgKiAxLjA1NSAtIDAuMDU1O1xuY29uc3QgZnJvbSA9IHYgPT4gdiA8PSAwLjA0MDQ1ID8gdiAvIDEyLjkyIDogTWF0aC5wb3coKHYgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbmZ1bmN0aW9uIGludGVycG9sYXRlKHJnYjEsIHJnYjIsIHQpIHtcbiAgY29uc3QgciA9IGZyb20oYjJuKHJnYjEucikpO1xuICBjb25zdCBnID0gZnJvbShiMm4ocmdiMS5nKSk7XG4gIGNvbnN0IGIgPSBmcm9tKGIybihyZ2IxLmIpKTtcbiAgcmV0dXJuIHtcbiAgICByOiBuMmIodG8ociArIHQgKiAoZnJvbShiMm4ocmdiMi5yKSkgLSByKSkpLFxuICAgIGc6IG4yYih0byhnICsgdCAqIChmcm9tKGIybihyZ2IyLmcpKSAtIGcpKSksXG4gICAgYjogbjJiKHRvKGIgKyB0ICogKGZyb20oYjJuKHJnYjIuYikpIC0gYikpKSxcbiAgICBhOiByZ2IxLmEgKyB0ICogKHJnYjIuYSAtIHJnYjEuYSlcbiAgfTtcbn1cblxuY29uc3QgQ09NTUVOVF9SRUdFWFAgPSAvXFwvXFwqW15dKj9cXCpcXC8vZztcbmZ1bmN0aW9uIG1vZEhTTCh2LCBpLCByYXRpbykge1xuICBpZiAodikge1xuICAgIGxldCB0bXAgPSByZ2IyaHNsKHYpO1xuICAgIHRtcFtpXSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRtcFtpXSArIHRtcFtpXSAqIHJhdGlvLCBpID09PSAwID8gMzYwIDogMSkpO1xuICAgIHRtcCA9IGhzbDJyZ2IodG1wKTtcbiAgICB2LnIgPSB0bXBbMF07XG4gICAgdi5nID0gdG1wWzFdO1xuICAgIHYuYiA9IHRtcFsyXTtcbiAgfVxufVxuZnVuY3Rpb24gY2xvbmUodiwgcHJvdG8pIHtcbiAgcmV0dXJuIHYgPyBPYmplY3QuYXNzaWduKHByb3RvIHx8IHt9LCB2KSA6IHY7XG59XG5mdW5jdGlvbiBmcm9tT2JqZWN0KGlucHV0KSB7XG4gIHZhciB2ID0ge3I6IDAsIGc6IDAsIGI6IDAsIGE6IDI1NX07XG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPj0gMykge1xuICAgICAgdiA9IHtyOiBpbnB1dFswXSwgZzogaW5wdXRbMV0sIGI6IGlucHV0WzJdLCBhOiAyNTV9O1xuICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDMpIHtcbiAgICAgICAgdi5hID0gbjJiKGlucHV0WzNdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdiA9IGNsb25lKGlucHV0LCB7cjogMCwgZzogMCwgYjogMCwgYTogMX0pO1xuICAgIHYuYSA9IG4yYih2LmEpO1xuICB9XG4gIHJldHVybiB2O1xufVxuZnVuY3Rpb24gZnVuY3Rpb25QYXJzZShzdHIpIHtcbiAgaWYgKHN0ci5jaGFyQXQoMCkgPT09ICdyJykge1xuICAgIHJldHVybiByZ2JQYXJzZShzdHIpO1xuICB9XG4gIHJldHVybiBodWVQYXJzZShzdHIpO1xufVxuY2xhc3MgQ29sb3Ige1xuICBjb25zdHJ1Y3RvcihpbnB1dCkge1xuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgaW5wdXQ7XG4gICAgbGV0IHY7XG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2ID0gZnJvbU9iamVjdChpbnB1dCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgY2xlYW4gPSBpbnB1dC5yZXBsYWNlKENPTU1FTlRfUkVHRVhQLCAnJyk7XG4gICAgICB2ID0gaGV4UGFyc2UoY2xlYW4pIHx8IG5hbWVQYXJzZShjbGVhbikgfHwgZnVuY3Rpb25QYXJzZShjbGVhbik7XG4gICAgfVxuICAgIHRoaXMuX3JnYiA9IHY7XG4gICAgdGhpcy5fdmFsaWQgPSAhIXY7XG4gIH1cbiAgZ2V0IHZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLl92YWxpZDtcbiAgfVxuICBnZXQgcmdiKCkge1xuICAgIHZhciB2ID0gY2xvbmUodGhpcy5fcmdiKTtcbiAgICBpZiAodikge1xuICAgICAgdi5hID0gYjJuKHYuYSk7XG4gICAgfVxuICAgIHJldHVybiB2O1xuICB9XG4gIHNldCByZ2Iob2JqKSB7XG4gICAgdGhpcy5fcmdiID0gZnJvbU9iamVjdChvYmopO1xuICB9XG4gIHJnYlN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWQgPyByZ2JTdHJpbmcodGhpcy5fcmdiKSA6IHVuZGVmaW5lZDtcbiAgfVxuICBoZXhTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkID8gaGV4U3RyaW5nKHRoaXMuX3JnYikgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaHNsU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl92YWxpZCA/IGhzbFN0cmluZyh0aGlzLl9yZ2IpIDogdW5kZWZpbmVkO1xuICB9XG4gIG1peChjb2xvciwgd2VpZ2h0KSB7XG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICBjb25zdCBjMSA9IHRoaXMucmdiO1xuICAgICAgY29uc3QgYzIgPSBjb2xvci5yZ2I7XG4gICAgICBsZXQgdzI7XG4gICAgICBjb25zdCBwID0gd2VpZ2h0ID09PSB3MiA/IDAuNSA6IHdlaWdodDtcbiAgICAgIGNvbnN0IHcgPSAyICogcCAtIDE7XG4gICAgICBjb25zdCBhID0gYzEuYSAtIGMyLmE7XG4gICAgICBjb25zdCB3MSA9ICgodyAqIGEgPT09IC0xID8gdyA6ICh3ICsgYSkgLyAoMSArIHcgKiBhKSkgKyAxKSAvIDIuMDtcbiAgICAgIHcyID0gMSAtIHcxO1xuICAgICAgYzEuciA9IDB4RkYgJiB3MSAqIGMxLnIgKyB3MiAqIGMyLnIgKyAwLjU7XG4gICAgICBjMS5nID0gMHhGRiAmIHcxICogYzEuZyArIHcyICogYzIuZyArIDAuNTtcbiAgICAgIGMxLmIgPSAweEZGICYgdzEgKiBjMS5iICsgdzIgKiBjMi5iICsgMC41O1xuICAgICAgYzEuYSA9IHAgKiBjMS5hICsgKDEgLSBwKSAqIGMyLmE7XG4gICAgICB0aGlzLnJnYiA9IGMxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpbnRlcnBvbGF0ZShjb2xvciwgdCkge1xuICAgIGlmIChjb2xvcikge1xuICAgICAgdGhpcy5fcmdiID0gaW50ZXJwb2xhdGUodGhpcy5fcmdiLCBjb2xvci5fcmdiLCB0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBDb2xvcih0aGlzLnJnYik7XG4gIH1cbiAgYWxwaGEoYSkge1xuICAgIHRoaXMuX3JnYi5hID0gbjJiKGEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGNsZWFyZXIocmF0aW8pIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgcmdiLmEgKj0gMSAtIHJhdGlvO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdyZXlzY2FsZSgpIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgY29uc3QgdmFsID0gcm91bmQocmdiLnIgKiAwLjMgKyByZ2IuZyAqIDAuNTkgKyByZ2IuYiAqIDAuMTEpO1xuICAgIHJnYi5yID0gcmdiLmcgPSByZ2IuYiA9IHZhbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcGFxdWVyKHJhdGlvKSB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5fcmdiO1xuICAgIHJnYi5hICo9IDEgKyByYXRpbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBuZWdhdGUoKSB7XG4gICAgY29uc3QgdiA9IHRoaXMuX3JnYjtcbiAgICB2LnIgPSAyNTUgLSB2LnI7XG4gICAgdi5nID0gMjU1IC0gdi5nO1xuICAgIHYuYiA9IDI1NSAtIHYuYjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBsaWdodGVuKHJhdGlvKSB7XG4gICAgbW9kSFNMKHRoaXMuX3JnYiwgMiwgcmF0aW8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGRhcmtlbihyYXRpbykge1xuICAgIG1vZEhTTCh0aGlzLl9yZ2IsIDIsIC1yYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgc2F0dXJhdGUocmF0aW8pIHtcbiAgICBtb2RIU0wodGhpcy5fcmdiLCAxLCByYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZGVzYXR1cmF0ZShyYXRpbykge1xuICAgIG1vZEhTTCh0aGlzLl9yZ2IsIDEsIC1yYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcm90YXRlKGRlZykge1xuICAgIHJvdGF0ZSh0aGlzLl9yZ2IsIGRlZyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhfZXNtKGlucHV0KSB7XG4gIHJldHVybiBuZXcgQ29sb3IoaW5wdXQpO1xufVxuXG5leHBvcnQgeyBDb2xvciwgYjJuLCBiMnAsIGluZGV4X2VzbSBhcyBkZWZhdWx0LCBoZXhQYXJzZSwgaGV4U3RyaW5nLCBoc2wycmdiLCBoc2xTdHJpbmcsIGhzdjJyZ2IsIGh1ZVBhcnNlLCBod2IycmdiLCBsaW0sIG4yYiwgbjJwLCBuYW1lUGFyc2UsIHAyYiwgcmdiMmhzbCwgcmdiUGFyc2UsIHJnYlN0cmluZywgcm90YXRlLCByb3VuZCB9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///130\n\n}"); - -/***/ }), - -/***/ 131: -/***/ (function() { - -eval("{\n\nwindow.chartColors = {\n red: \"#dc3545\",\n orange: \"#fd7e14\",\n yellow: \"#ffc107\",\n green: \"#28a745\",\n blue: \"#007bff\",\n purple: \"#6f42c1\",\n grey: \"#6c757d\"\n};\n(function (global) {\n var Months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n var COLORS = [\"#4dc9f6\", \"#f67019\", \"#f53794\", \"#537bc4\", \"#acc236\", \"#166a8f\", \"#00a950\", \"#58595b\", \"#8549ba\"];\n var Samples = global.Samples || (global.Samples = {});\n var Color = global.Color;\n Samples.utils = {\n // Adapted from http://indiegamr.com/generate-repeatable-random-numbers-in-js/\n srand: function srand(seed) {\n this._seed = seed;\n },\n rand: function rand(min, max) {\n var seed = this._seed;\n min = min === undefined ? 0 : min;\n max = max === undefined ? 1 : max;\n this._seed = (seed * 9301 + 49297) % 233280;\n return min + this._seed / 233280 * (max - min);\n },\n numbers: function numbers(config) {\n var cfg = config || {};\n var min = cfg.min || 0;\n var max = cfg.max || 1;\n var from = cfg.from || [];\n var count = cfg.count || 8;\n var decimals = cfg.decimals || 8;\n var continuity = cfg.continuity || 1;\n var dfactor = Math.pow(10, decimals) || 0;\n var data = [];\n var i, value;\n for (i = 0; i < count; ++i) {\n value = (from[i] || 0) + this.rand(min, max);\n if (this.rand() <= continuity) {\n data.push(Math.round(dfactor * value) / dfactor);\n } else {\n data.push(null);\n }\n }\n return data;\n },\n labels: function labels(config) {\n var cfg = config || {};\n var min = cfg.min || 0;\n var max = cfg.max || 100;\n var count = cfg.count || 8;\n var step = (max - min) / count;\n var decimals = cfg.decimals || 8;\n var dfactor = Math.pow(10, decimals) || 0;\n var prefix = cfg.prefix || \"\";\n var values = [];\n var i;\n for (i = min; i < max; i += step) {\n values.push(prefix + Math.round(dfactor * i) / dfactor);\n }\n return values;\n },\n months: function months(config) {\n var cfg = config || {};\n var count = cfg.count || 12;\n var section = cfg.section;\n var values = [];\n var i, value;\n for (i = 0; i < count; ++i) {\n value = Months[Math.ceil(i) % 12];\n values.push(value.substring(0, section));\n }\n return values;\n },\n color: function color(index) {\n return COLORS[index % COLORS.length];\n },\n transparentize: function transparentize(color, opacity) {\n var alpha = opacity === undefined ? 0.5 : 1 - opacity;\n return Color(color).alpha(alpha).rgbString();\n }\n };\n\n // DEPRECATED\n window.randomScalingFactor = function () {\n return Math.round(Samples.utils.rand(-100, 100));\n };\n\n // INITIALIZATION\n\n Samples.utils.srand(Date.now());\n\n // Google Analytics\n /* eslint-disable */\n if (document.location.hostname.match(/^(www\\.)?chartjs\\.org$/)) {\n (function (i, s, o, g, r, a, m) {\n i[\"GoogleAnalyticsObject\"] = r;\n i[r] = i[r] || function () {\n (i[r].q = i[r].q || []).push(arguments);\n }, i[r].l = 1 * new Date();\n a = s.createElement(o), m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, \"script\", \"//www.google-analytics.com/analytics.js\", \"ga\");\n ga(\"create\", \"UA-28909194-3\", \"auto\");\n ga(\"send\", \"pageview\");\n }\n /* eslint-enable */\n})(this);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFVLENBQUNDLFlBQVksQ0FBQ1YsQ0FBQyxFQUFFQyxDQUFDLENBQUM7SUFDakMsQ0FBQyxFQUNDaEUsTUFBTSxFQUNOdUQsUUFBUSxFQUNSLFFBQVEsRUFDUix5Q0FBeUMsRUFDekMsSUFDRixDQUFDO0lBQ0RtQixFQUFFLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUM7SUFDckNBLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO0VBQ3hCO0VBQ0E7QUFDRixDQUFDLEVBQUUsSUFBSSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXJjaGl0ZWN0dWktaHRtbC1mcmVlLy4vc3JjL3NjcmlwdHMtaW5pdC9jaGFydHMvY2hhcnRzanMtdXRpbHMuanM/ZGYzYyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxud2luZG93LmNoYXJ0Q29sb3JzID0ge1xuICByZWQ6IFwiI2RjMzU0NVwiLFxuICBvcmFuZ2U6IFwiI2ZkN2UxNFwiLFxuICB5ZWxsb3c6IFwiI2ZmYzEwN1wiLFxuICBncmVlbjogXCIjMjhhNzQ1XCIsXG4gIGJsdWU6IFwiIzAwN2JmZlwiLFxuICBwdXJwbGU6IFwiIzZmNDJjMVwiLFxuICBncmV5OiBcIiM2Yzc1N2RcIixcbn07XG5cbihmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciBNb250aHMgPSBbXG4gICAgXCJKYW51YXJ5XCIsXG4gICAgXCJGZWJydWFyeVwiLFxuICAgIFwiTWFyY2hcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1bmVcIixcbiAgICBcIkp1bHlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPY3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGVjZW1iZXJcIixcbiAgXTtcblxuICB2YXIgQ09MT1JTID0gW1xuICAgIFwiIzRkYzlmNlwiLFxuICAgIFwiI2Y2NzAxOVwiLFxuICAgIFwiI2Y1Mzc5NFwiLFxuICAgIFwiIzUzN2JjNFwiLFxuICAgIFwiI2FjYzIzNlwiLFxuICAgIFwiIzE2NmE4ZlwiLFxuICAgIFwiIzAwYTk1MFwiLFxuICAgIFwiIzU4NTk1YlwiLFxuICAgIFwiIzg1NDliYVwiLFxuICBdO1xuXG4gIHZhciBTYW1wbGVzID0gZ2xvYmFsLlNhbXBsZXMgfHwgKGdsb2JhbC5TYW1wbGVzID0ge30pO1xuICB2YXIgQ29sb3IgPSBnbG9iYWwuQ29sb3I7XG5cbiAgU2FtcGxlcy51dGlscyA9IHtcbiAgICAvLyBBZGFwdGVkIGZyb20gaHR0cDovL2luZGllZ2Ftci5jb20vZ2VuZXJhdGUtcmVwZWF0YWJsZS1yYW5kb20tbnVtYmVycy1pbi1qcy9cbiAgICBzcmFuZDogZnVuY3Rpb24gKHNlZWQpIHtcbiAgICAgIHRoaXMuX3NlZWQgPSBzZWVkO1xuICAgIH0sXG5cbiAgICByYW5kOiBmdW5jdGlvbiAobWluLCBtYXgpIHtcbiAgICAgIHZhciBzZWVkID0gdGhpcy5fc2VlZDtcbiAgICAgIG1pbiA9IG1pbiA9PT0gdW5kZWZpbmVkID8gMCA6IG1pbjtcbiAgICAgIG1heCA9IG1heCA9PT0gdW5kZWZpbmVkID8gMSA6IG1heDtcbiAgICAgIHRoaXMuX3NlZWQgPSAoc2VlZCAqIDkzMDEgKyA0OTI5NykgJSAyMzMyODA7XG4gICAgICByZXR1cm4gbWluICsgKHRoaXMuX3NlZWQgLyAyMzMyODApICogKG1heCAtIG1pbik7XG4gICAgfSxcblxuICAgIG51bWJlcnM6IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIHZhciBjZmcgPSBjb25maWcgfHwge307XG4gICAgICB2YXIgbWluID0gY2ZnLm1pbiB8fCAwO1xuICAgICAgdmFyIG1heCA9IGNmZy5tYXggfHwgMTtcbiAgICAgIHZhciBmcm9tID0gY2ZnLmZyb20gfHwgW107XG4gICAgICB2YXIgY291bnQgPSBjZmcuY291bnQgfHwgODtcbiAgICAgIHZhciBkZWNpbWFscyA9IGNmZy5kZWNpbWFscyB8fCA4O1xuICAgICAgdmFyIGNvbnRpbnVpdHkgPSBjZmcuY29udGludWl0eSB8fCAxO1xuICAgICAgdmFyIGRmYWN0b3IgPSBNYXRoLnBvdygxMCwgZGVjaW1hbHMpIHx8IDA7XG4gICAgICB2YXIgZGF0YSA9IFtdO1xuICAgICAgdmFyIGksIHZhbHVlO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgICB2YWx1ZSA9IChmcm9tW2ldIHx8IDApICsgdGhpcy5yYW5kKG1pbiwgbWF4KTtcbiAgICAgICAgaWYgKHRoaXMucmFuZCgpIDw9IGNvbnRpbnVpdHkpIHtcbiAgICAgICAgICBkYXRhLnB1c2goTWF0aC5yb3VuZChkZmFjdG9yICogdmFsdWUpIC8gZGZhY3Rvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YS5wdXNoKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG5cbiAgICBsYWJlbHM6IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIHZhciBjZmcgPSBjb25maWcgfHwge307XG4gICAgICB2YXIgbWluID0gY2ZnLm1pbiB8fCAwO1xuICAgICAgdmFyIG1heCA9IGNmZy5tYXggfHwgMTAwO1xuICAgICAgdmFyIGNvdW50ID0gY2ZnLmNvdW50IHx8IDg7XG4gICAgICB2YXIgc3RlcCA9IChtYXggLSBtaW4pIC8gY291bnQ7XG4gICAgICB2YXIgZGVjaW1hbHMgPSBjZmcuZGVjaW1hbHMgfHwgODtcbiAgICAgIHZhciBkZmFjdG9yID0gTWF0aC5wb3coMTAsIGRlY2ltYWxzKSB8fCAwO1xuICAgICAgdmFyIHByZWZpeCA9IGNmZy5wcmVmaXggfHwgXCJcIjtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBpO1xuXG4gICAgICBmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkgKz0gc3RlcCkge1xuICAgICAgICB2YWx1ZXMucHVzaChwcmVmaXggKyBNYXRoLnJvdW5kKGRmYWN0b3IgKiBpKSAvIGRmYWN0b3IpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH0sXG5cbiAgICBtb250aHM6IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIHZhciBjZmcgPSBjb25maWcgfHwge307XG4gICAgICB2YXIgY291bnQgPSBjZmcuY291bnQgfHwgMTI7XG4gICAgICB2YXIgc2VjdGlvbiA9IGNmZy5zZWN0aW9uO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGksIHZhbHVlO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgICB2YWx1ZSA9IE1vbnRoc1tNYXRoLmNlaWwoaSkgJSAxMl07XG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlLnN1YnN0cmluZygwLCBzZWN0aW9uKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfSxcblxuICAgIGNvbG9yOiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIHJldHVybiBDT0xPUlNbaW5kZXggJSBDT0xPUlMubGVuZ3RoXTtcbiAgICB9LFxuXG4gICAgdHJhbnNwYXJlbnRpemU6IGZ1bmN0aW9uIChjb2xvciwgb3BhY2l0eSkge1xuICAgICAgdmFyIGFscGhhID0gb3BhY2l0eSA9PT0gdW5kZWZpbmVkID8gMC41IDogMSAtIG9wYWNpdHk7XG4gICAgICByZXR1cm4gQ29sb3IoY29sb3IpLmFscGhhKGFscGhhKS5yZ2JTdHJpbmcoKTtcbiAgICB9LFxuICB9O1xuXG4gIC8vIERFUFJFQ0FURURcbiAgd2luZG93LnJhbmRvbVNjYWxpbmdGYWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoU2FtcGxlcy51dGlscy5yYW5kKC0xMDAsIDEwMCkpO1xuICB9O1xuXG4gIC8vIElOSVRJQUxJWkFUSU9OXG5cbiAgU2FtcGxlcy51dGlscy5zcmFuZChEYXRlLm5vdygpKTtcblxuICAvLyBHb29nbGUgQW5hbHl0aWNzXG4gIC8qIGVzbGludC1kaXNhYmxlICovXG4gIGlmIChkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZS5tYXRjaCgvXih3d3dcXC4pP2NoYXJ0anNcXC5vcmckLykpIHtcbiAgICAoZnVuY3Rpb24gKGksIHMsIG8sIGcsIHIsIGEsIG0pIHtcbiAgICAgIGlbXCJHb29nbGVBbmFseXRpY3NPYmplY3RcIl0gPSByO1xuICAgICAgKGlbcl0gPVxuICAgICAgICBpW3JdIHx8XG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAoaVtyXS5xID0gaVtyXS5xIHx8IFtdKS5wdXNoKGFyZ3VtZW50cyk7XG4gICAgICAgIH0pLFxuICAgICAgICAoaVtyXS5sID0gMSAqIG5ldyBEYXRlKCkpO1xuICAgICAgKGEgPSBzLmNyZWF0ZUVsZW1lbnQobykpLCAobSA9IHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUobylbMF0pO1xuICAgICAgYS5hc3luYyA9IDE7XG4gICAgICBhLnNyYyA9IGc7XG4gICAgICBtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsIG0pO1xuICAgIH0pKFxuICAgICAgd2luZG93LFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBcInNjcmlwdFwiLFxuICAgICAgXCIvL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9hbmFseXRpY3MuanNcIixcbiAgICAgIFwiZ2FcIlxuICAgICk7XG4gICAgZ2EoXCJjcmVhdGVcIiwgXCJVQS0yODkwOTE5NC0zXCIsIFwiYXV0b1wiKTtcbiAgICBnYShcInNlbmRcIiwgXCJwYWdldmlld1wiKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlICovXG59KSh0aGlzKTtcbiJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJjaGFydENvbG9ycyIsInJlZCIsIm9yYW5nZSIsInllbGxvdyIsImdyZWVuIiwiYmx1ZSIsInB1cnBsZSIsImdyZXkiLCJnbG9iYWwiLCJNb250aHMiLCJDT0xPUlMiLCJTYW1wbGVzIiwiQ29sb3IiLCJ1dGlscyIsInNyYW5kIiwic2VlZCIsIl9zZWVkIiwicmFuZCIsIm1pbiIsIm1heCIsInVuZGVmaW5lZCIsIm51bWJlcnMiLCJjb25maWciLCJjZmciLCJmcm9tIiwiY291bnQiLCJkZWNpbWFscyIsImNvbnRpbnVpdHkiLCJkZmFjdG9yIiwiTWF0aCIsInBvdyIsImRhdGEiLCJpIiwidmFsdWUiLCJwdXNoIiwicm91bmQiLCJsYWJlbHMiLCJzdGVwIiwicHJlZml4IiwidmFsdWVzIiwibW9udGhzIiwic2VjdGlvbiIsImNlaWwiLCJzdWJzdHJpbmciLCJjb2xvciIsImluZGV4IiwibGVuZ3RoIiwidHJhbnNwYXJlbnRpemUiLCJvcGFjaXR5IiwiYWxwaGEiLCJyZ2JTdHJpbmciLCJyYW5kb21TY2FsaW5nRmFjdG9yIiwiRGF0ZSIsIm5vdyIsImRvY3VtZW50IiwibG9jYXRpb24iLCJob3N0bmFtZSIsIm1hdGNoIiwicyIsIm8iLCJnIiwiciIsImEiLCJtIiwicSIsImFyZ3VtZW50cyIsImwiLCJjcmVhdGVFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJhc3luYyIsInNyYyIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJnYSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///131\n\n}"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ if (cachedModule.error !== undefined) throw cachedModule.error; -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ try { -/******/ var execOptions = { id: moduleId, module: module, factory: __webpack_modules__[moduleId], require: __webpack_require__ }; -/******/ __webpack_require__.i.forEach(function(handler) { handler(execOptions); }); -/******/ module = execOptions.module; -/******/ execOptions.factory.call(module.exports, module, module.exports, execOptions.require); -/******/ } catch(e) { -/******/ module.error = e; -/******/ throw e; -/******/ } -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = __webpack_modules__; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = __webpack_module_cache__; -/******/ -/******/ // expose the module execution interceptor -/******/ __webpack_require__.i = []; -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/get javascript update chunk filename */ -/******/ (() => { -/******/ // This function allow to reference all chunks -/******/ __webpack_require__.hu = (chunkId) => { -/******/ // return url for filenames based on template -/******/ return "" + chunkId + "." + __webpack_require__.h() + ".hot-update.js"; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/get update manifest filename */ -/******/ (() => { -/******/ __webpack_require__.hmrF = () => ("chart_js." + __webpack_require__.h() + ".hot-update.json"); -/******/ })(); -/******/ -/******/ /* webpack/runtime/getFullHash */ -/******/ (() => { -/******/ __webpack_require__.h = () => ("80c182c72d717043613b") -/******/ })(); -/******/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/load script */ -/******/ (() => { -/******/ var inProgress = {}; -/******/ var dataWebpackPrefix = "architectui-html-free:"; -/******/ // loadScript function to load a script via script tag -/******/ __webpack_require__.l = (url, done, key, chunkId) => { -/******/ if(inProgress[url]) { inProgress[url].push(done); return; } -/******/ var script, needAttach; -/******/ if(key !== undefined) { -/******/ var scripts = document.getElementsByTagName("script"); -/******/ for(var i = 0; i < scripts.length; i++) { -/******/ var s = scripts[i]; -/******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; } -/******/ } -/******/ } -/******/ if(!script) { -/******/ needAttach = true; -/******/ script = document.createElement('script'); -/******/ -/******/ script.charset = 'utf-8'; -/******/ if (__webpack_require__.nc) { -/******/ script.setAttribute("nonce", __webpack_require__.nc); -/******/ } -/******/ script.setAttribute("data-webpack", dataWebpackPrefix + key); -/******/ -/******/ script.src = url; -/******/ } -/******/ inProgress[url] = [done]; -/******/ var onScriptComplete = (prev, event) => { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var doneFns = inProgress[url]; -/******/ delete inProgress[url]; -/******/ script.parentNode && script.parentNode.removeChild(script); -/******/ doneFns && doneFns.forEach((fn) => (fn(event))); -/******/ if(prev) return prev(event); -/******/ } -/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); -/******/ script.onerror = onScriptComplete.bind(null, script.onerror); -/******/ script.onload = onScriptComplete.bind(null, script.onload); -/******/ needAttach && document.head.appendChild(script); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hot module replacement */ -/******/ (() => { -/******/ var currentModuleData = {}; -/******/ var installedModules = __webpack_require__.c; -/******/ -/******/ // module and require creation -/******/ var currentChildModule; -/******/ var currentParents = []; -/******/ -/******/ // status -/******/ var registeredStatusHandlers = []; -/******/ var currentStatus = "idle"; -/******/ -/******/ // while downloading -/******/ var blockingPromises = 0; -/******/ var blockingPromisesWaiting = []; -/******/ -/******/ // The update info -/******/ var currentUpdateApplyHandlers; -/******/ var queuedInvalidatedModules; -/******/ -/******/ __webpack_require__.hmrD = currentModuleData; -/******/ -/******/ __webpack_require__.i.push(function (options) { -/******/ var module = options.module; -/******/ var require = createRequire(options.require, options.id); -/******/ module.hot = createModuleHotObject(options.id, module); -/******/ module.parents = currentParents; -/******/ module.children = []; -/******/ currentParents = []; -/******/ options.require = require; -/******/ }); -/******/ -/******/ __webpack_require__.hmrC = {}; -/******/ __webpack_require__.hmrI = {}; -/******/ -/******/ function createRequire(require, moduleId) { -/******/ var me = installedModules[moduleId]; -/******/ if (!me) return require; -/******/ var fn = function (request) { -/******/ if (me.hot.active) { -/******/ if (installedModules[request]) { -/******/ var parents = installedModules[request].parents; -/******/ if (parents.indexOf(moduleId) === -1) { -/******/ parents.push(moduleId); -/******/ } -/******/ } else { -/******/ currentParents = [moduleId]; -/******/ currentChildModule = request; -/******/ } -/******/ if (me.children.indexOf(request) === -1) { -/******/ me.children.push(request); -/******/ } -/******/ } else { -/******/ console.warn( -/******/ "[HMR] unexpected require(" + -/******/ request + -/******/ ") from disposed module " + -/******/ moduleId -/******/ ); -/******/ currentParents = []; -/******/ } -/******/ return require(request); -/******/ }; -/******/ var createPropertyDescriptor = function (name) { -/******/ return { -/******/ configurable: true, -/******/ enumerable: true, -/******/ get: function () { -/******/ return require[name]; -/******/ }, -/******/ set: function (value) { -/******/ require[name] = value; -/******/ } -/******/ }; -/******/ }; -/******/ for (var name in require) { -/******/ if (Object.prototype.hasOwnProperty.call(require, name) && name !== "e") { -/******/ Object.defineProperty(fn, name, createPropertyDescriptor(name)); -/******/ } -/******/ } -/******/ fn.e = function (chunkId, fetchPriority) { -/******/ return trackBlockingPromise(require.e(chunkId, fetchPriority)); -/******/ }; -/******/ return fn; -/******/ } -/******/ -/******/ function createModuleHotObject(moduleId, me) { -/******/ var _main = currentChildModule !== moduleId; -/******/ var hot = { -/******/ // private stuff -/******/ _acceptedDependencies: {}, -/******/ _acceptedErrorHandlers: {}, -/******/ _declinedDependencies: {}, -/******/ _selfAccepted: false, -/******/ _selfDeclined: false, -/******/ _selfInvalidated: false, -/******/ _disposeHandlers: [], -/******/ _main: _main, -/******/ _requireSelf: function () { -/******/ currentParents = me.parents.slice(); -/******/ currentChildModule = _main ? undefined : moduleId; -/******/ __webpack_require__(moduleId); -/******/ }, -/******/ -/******/ // Module API -/******/ active: true, -/******/ accept: function (dep, callback, errorHandler) { -/******/ if (dep === undefined) hot._selfAccepted = true; -/******/ else if (typeof dep === "function") hot._selfAccepted = dep; -/******/ else if (typeof dep === "object" && dep !== null) { -/******/ for (var i = 0; i < dep.length; i++) { -/******/ hot._acceptedDependencies[dep[i]] = callback || function () {}; -/******/ hot._acceptedErrorHandlers[dep[i]] = errorHandler; -/******/ } -/******/ } else { -/******/ hot._acceptedDependencies[dep] = callback || function () {}; -/******/ hot._acceptedErrorHandlers[dep] = errorHandler; -/******/ } -/******/ }, -/******/ decline: function (dep) { -/******/ if (dep === undefined) hot._selfDeclined = true; -/******/ else if (typeof dep === "object" && dep !== null) -/******/ for (var i = 0; i < dep.length; i++) -/******/ hot._declinedDependencies[dep[i]] = true; -/******/ else hot._declinedDependencies[dep] = true; -/******/ }, -/******/ dispose: function (callback) { -/******/ hot._disposeHandlers.push(callback); -/******/ }, -/******/ addDisposeHandler: function (callback) { -/******/ hot._disposeHandlers.push(callback); -/******/ }, -/******/ removeDisposeHandler: function (callback) { -/******/ var idx = hot._disposeHandlers.indexOf(callback); -/******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1); -/******/ }, -/******/ invalidate: function () { -/******/ this._selfInvalidated = true; -/******/ switch (currentStatus) { -/******/ case "idle": -/******/ currentUpdateApplyHandlers = []; -/******/ Object.keys(__webpack_require__.hmrI).forEach(function (key) { -/******/ __webpack_require__.hmrI[key]( -/******/ moduleId, -/******/ currentUpdateApplyHandlers -/******/ ); -/******/ }); -/******/ setStatus("ready"); -/******/ break; -/******/ case "ready": -/******/ Object.keys(__webpack_require__.hmrI).forEach(function (key) { -/******/ __webpack_require__.hmrI[key]( -/******/ moduleId, -/******/ currentUpdateApplyHandlers -/******/ ); -/******/ }); -/******/ break; -/******/ case "prepare": -/******/ case "check": -/******/ case "dispose": -/******/ case "apply": -/******/ (queuedInvalidatedModules = queuedInvalidatedModules || []).push( -/******/ moduleId -/******/ ); -/******/ break; -/******/ default: -/******/ // ignore requests in error states -/******/ break; -/******/ } -/******/ }, -/******/ -/******/ // Management API -/******/ check: hotCheck, -/******/ apply: hotApply, -/******/ status: function (l) { -/******/ if (!l) return currentStatus; -/******/ registeredStatusHandlers.push(l); -/******/ }, -/******/ addStatusHandler: function (l) { -/******/ registeredStatusHandlers.push(l); -/******/ }, -/******/ removeStatusHandler: function (l) { -/******/ var idx = registeredStatusHandlers.indexOf(l); -/******/ if (idx >= 0) registeredStatusHandlers.splice(idx, 1); -/******/ }, -/******/ -/******/ // inherit from previous dispose call -/******/ data: currentModuleData[moduleId] -/******/ }; -/******/ currentChildModule = undefined; -/******/ return hot; -/******/ } -/******/ -/******/ function setStatus(newStatus) { -/******/ currentStatus = newStatus; -/******/ var results = []; -/******/ -/******/ for (var i = 0; i < registeredStatusHandlers.length; i++) -/******/ results[i] = registeredStatusHandlers[i].call(null, newStatus); -/******/ -/******/ return Promise.all(results).then(function () {}); -/******/ } -/******/ -/******/ function unblock() { -/******/ if (--blockingPromises === 0) { -/******/ setStatus("ready").then(function () { -/******/ if (blockingPromises === 0) { -/******/ var list = blockingPromisesWaiting; -/******/ blockingPromisesWaiting = []; -/******/ for (var i = 0; i < list.length; i++) { -/******/ list[i](); -/******/ } -/******/ } -/******/ }); -/******/ } -/******/ } -/******/ -/******/ function trackBlockingPromise(promise) { -/******/ switch (currentStatus) { -/******/ case "ready": -/******/ setStatus("prepare"); -/******/ /* fallthrough */ -/******/ case "prepare": -/******/ blockingPromises++; -/******/ promise.then(unblock, unblock); -/******/ return promise; -/******/ default: -/******/ return promise; -/******/ } -/******/ } -/******/ -/******/ function waitForBlockingPromises(fn) { -/******/ if (blockingPromises === 0) return fn(); -/******/ return new Promise(function (resolve) { -/******/ blockingPromisesWaiting.push(function () { -/******/ resolve(fn()); -/******/ }); -/******/ }); -/******/ } -/******/ -/******/ function hotCheck(applyOnUpdate) { -/******/ if (currentStatus !== "idle") { -/******/ throw new Error("check() is only allowed in idle status"); -/******/ } -/******/ return setStatus("check") -/******/ .then(__webpack_require__.hmrM) -/******/ .then(function (update) { -/******/ if (!update) { -/******/ return setStatus(applyInvalidatedModules() ? "ready" : "idle").then( -/******/ function () { -/******/ return null; -/******/ } -/******/ ); -/******/ } -/******/ -/******/ return setStatus("prepare").then(function () { -/******/ var updatedModules = []; -/******/ currentUpdateApplyHandlers = []; -/******/ -/******/ return Promise.all( -/******/ Object.keys(__webpack_require__.hmrC).reduce(function ( -/******/ promises, -/******/ key -/******/ ) { -/******/ __webpack_require__.hmrC[key]( -/******/ update.c, -/******/ update.r, -/******/ update.m, -/******/ promises, -/******/ currentUpdateApplyHandlers, -/******/ updatedModules -/******/ ); -/******/ return promises; -/******/ }, []) -/******/ ).then(function () { -/******/ return waitForBlockingPromises(function () { -/******/ if (applyOnUpdate) { -/******/ return internalApply(applyOnUpdate); -/******/ } -/******/ return setStatus("ready").then(function () { -/******/ return updatedModules; -/******/ }); -/******/ }); -/******/ }); -/******/ }); -/******/ }); -/******/ } -/******/ -/******/ function hotApply(options) { -/******/ if (currentStatus !== "ready") { -/******/ return Promise.resolve().then(function () { -/******/ throw new Error( -/******/ "apply() is only allowed in ready status (state: " + -/******/ currentStatus + -/******/ ")" -/******/ ); -/******/ }); -/******/ } -/******/ return internalApply(options); -/******/ } -/******/ -/******/ function internalApply(options) { -/******/ options = options || {}; -/******/ -/******/ applyInvalidatedModules(); -/******/ -/******/ var results = currentUpdateApplyHandlers.map(function (handler) { -/******/ return handler(options); -/******/ }); -/******/ currentUpdateApplyHandlers = undefined; -/******/ -/******/ var errors = results -/******/ .map(function (r) { -/******/ return r.error; -/******/ }) -/******/ .filter(Boolean); -/******/ -/******/ if (errors.length > 0) { -/******/ return setStatus("abort").then(function () { -/******/ throw errors[0]; -/******/ }); -/******/ } -/******/ -/******/ // Now in "dispose" phase -/******/ var disposePromise = setStatus("dispose"); -/******/ -/******/ results.forEach(function (result) { -/******/ if (result.dispose) result.dispose(); -/******/ }); -/******/ -/******/ // Now in "apply" phase -/******/ var applyPromise = setStatus("apply"); -/******/ -/******/ var error; -/******/ var reportError = function (err) { -/******/ if (!error) error = err; -/******/ }; -/******/ -/******/ var outdatedModules = []; -/******/ -/******/ var onAccepted = function () { -/******/ return Promise.all([disposePromise, applyPromise]).then(function () { -/******/ // handle errors in accept handlers and self accepted module load -/******/ if (error) { -/******/ return setStatus("fail").then(function () { -/******/ throw error; -/******/ }); -/******/ } -/******/ -/******/ if (queuedInvalidatedModules) { -/******/ return internalApply(options).then(function (list) { -/******/ outdatedModules.forEach(function (moduleId) { -/******/ if (list.indexOf(moduleId) < 0) list.push(moduleId); -/******/ }); -/******/ return list; -/******/ }); -/******/ } -/******/ -/******/ return setStatus("idle").then(function () { -/******/ return outdatedModules; -/******/ }); -/******/ }); -/******/ }; -/******/ -/******/ return Promise.all( -/******/ results -/******/ .filter(function (result) { -/******/ return result.apply; -/******/ }) -/******/ .map(function (result) { -/******/ return result.apply(reportError); -/******/ }) -/******/ ) -/******/ .then(function (applyResults) { -/******/ applyResults.forEach(function (modules) { -/******/ if (modules) { -/******/ for (var i = 0; i < modules.length; i++) { -/******/ outdatedModules.push(modules[i]); -/******/ } -/******/ } -/******/ }); -/******/ }) -/******/ .then(onAccepted); -/******/ } -/******/ -/******/ function applyInvalidatedModules() { -/******/ if (queuedInvalidatedModules) { -/******/ if (!currentUpdateApplyHandlers) currentUpdateApplyHandlers = []; -/******/ Object.keys(__webpack_require__.hmrI).forEach(function (key) { -/******/ queuedInvalidatedModules.forEach(function (moduleId) { -/******/ __webpack_require__.hmrI[key]( -/******/ moduleId, -/******/ currentUpdateApplyHandlers -/******/ ); -/******/ }); -/******/ }); -/******/ queuedInvalidatedModules = undefined; -/******/ return true; -/******/ } -/******/ } -/******/ })(); -/******/ -/******/ /* webpack/runtime/publicPath */ -/******/ (() => { -/******/ var scriptUrl; -/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; -/******/ var document = __webpack_require__.g.document; -/******/ if (!scriptUrl && document) { -/******/ if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') -/******/ scriptUrl = document.currentScript.src; -/******/ if (!scriptUrl) { -/******/ var scripts = document.getElementsByTagName("script"); -/******/ if(scripts.length) { -/******/ var i = scripts.length - 1; -/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src; -/******/ } -/******/ } -/******/ } -/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration -/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. -/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); -/******/ scriptUrl = scriptUrl.replace(/^blob:/, "").replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); -/******/ __webpack_require__.p = scriptUrl + "../../"; -/******/ })(); -/******/ -/******/ /* webpack/runtime/jsonp chunk loading */ -/******/ (() => { -/******/ // no baseURI -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded -/******/ var installedChunks = __webpack_require__.hmrS_jsonp = __webpack_require__.hmrS_jsonp || { -/******/ 0: 0 -/******/ }; -/******/ -/******/ // no chunk on demand loading -/******/ -/******/ // no prefetching -/******/ -/******/ // no preloaded -/******/ -/******/ var currentUpdatedModulesList; -/******/ var waitingUpdateResolves = {}; -/******/ function loadUpdateChunk(chunkId, updatedModulesList) { -/******/ currentUpdatedModulesList = updatedModulesList; -/******/ return new Promise((resolve, reject) => { -/******/ waitingUpdateResolves[chunkId] = resolve; -/******/ // start update chunk loading -/******/ var url = __webpack_require__.p + __webpack_require__.hu(chunkId); -/******/ // create error before stack unwound to get useful stacktrace later -/******/ var error = new Error(); -/******/ var loadingEnded = (event) => { -/******/ if(waitingUpdateResolves[chunkId]) { -/******/ waitingUpdateResolves[chunkId] = undefined -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ error.message = 'Loading hot update chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; -/******/ error.name = 'ChunkLoadError'; -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ reject(error); -/******/ } -/******/ }; -/******/ __webpack_require__.l(url, loadingEnded); -/******/ }); -/******/ } -/******/ -/******/ self["webpackHotUpdatearchitectui_html_free"] = (chunkId, moreModules, runtime) => { -/******/ for(var moduleId in moreModules) { -/******/ if(__webpack_require__.o(moreModules, moduleId)) { -/******/ currentUpdate[moduleId] = moreModules[moduleId]; -/******/ if(currentUpdatedModulesList) currentUpdatedModulesList.push(moduleId); -/******/ } -/******/ } -/******/ if(runtime) currentUpdateRuntime.push(runtime); -/******/ if(waitingUpdateResolves[chunkId]) { -/******/ waitingUpdateResolves[chunkId](); -/******/ waitingUpdateResolves[chunkId] = undefined; -/******/ } -/******/ }; -/******/ -/******/ var currentUpdateChunks; -/******/ var currentUpdate; -/******/ var currentUpdateRemovedChunks; -/******/ var currentUpdateRuntime; -/******/ function applyHandler(options) { -/******/ if (__webpack_require__.f) delete __webpack_require__.f.jsonpHmr; -/******/ currentUpdateChunks = undefined; -/******/ function getAffectedModuleEffects(updateModuleId) { -/******/ var outdatedModules = [updateModuleId]; -/******/ var outdatedDependencies = {}; -/******/ -/******/ var queue = outdatedModules.map(function (id) { -/******/ return { -/******/ chain: [id], -/******/ id: id -/******/ }; -/******/ }); -/******/ while (queue.length > 0) { -/******/ var queueItem = queue.pop(); -/******/ var moduleId = queueItem.id; -/******/ var chain = queueItem.chain; -/******/ var module = __webpack_require__.c[moduleId]; -/******/ if ( -/******/ !module || -/******/ (module.hot._selfAccepted && !module.hot._selfInvalidated) -/******/ ) -/******/ continue; -/******/ if (module.hot._selfDeclined) { -/******/ return { -/******/ type: "self-declined", -/******/ chain: chain, -/******/ moduleId: moduleId -/******/ }; -/******/ } -/******/ if (module.hot._main) { -/******/ return { -/******/ type: "unaccepted", -/******/ chain: chain, -/******/ moduleId: moduleId -/******/ }; -/******/ } -/******/ for (var i = 0; i < module.parents.length; i++) { -/******/ var parentId = module.parents[i]; -/******/ var parent = __webpack_require__.c[parentId]; -/******/ if (!parent) continue; -/******/ if (parent.hot._declinedDependencies[moduleId]) { -/******/ return { -/******/ type: "declined", -/******/ chain: chain.concat([parentId]), -/******/ moduleId: moduleId, -/******/ parentId: parentId -/******/ }; -/******/ } -/******/ if (outdatedModules.indexOf(parentId) !== -1) continue; -/******/ if (parent.hot._acceptedDependencies[moduleId]) { -/******/ if (!outdatedDependencies[parentId]) -/******/ outdatedDependencies[parentId] = []; -/******/ addAllToSet(outdatedDependencies[parentId], [moduleId]); -/******/ continue; -/******/ } -/******/ delete outdatedDependencies[parentId]; -/******/ outdatedModules.push(parentId); -/******/ queue.push({ -/******/ chain: chain.concat([parentId]), -/******/ id: parentId -/******/ }); -/******/ } -/******/ } -/******/ -/******/ return { -/******/ type: "accepted", -/******/ moduleId: updateModuleId, -/******/ outdatedModules: outdatedModules, -/******/ outdatedDependencies: outdatedDependencies -/******/ }; -/******/ } -/******/ -/******/ function addAllToSet(a, b) { -/******/ for (var i = 0; i < b.length; i++) { -/******/ var item = b[i]; -/******/ if (a.indexOf(item) === -1) a.push(item); -/******/ } -/******/ } -/******/ -/******/ // at begin all updates modules are outdated -/******/ // the "outdated" status can propagate to parents if they don't accept the children -/******/ var outdatedDependencies = {}; -/******/ var outdatedModules = []; -/******/ var appliedUpdate = {}; -/******/ -/******/ var warnUnexpectedRequire = function warnUnexpectedRequire(module) { -/******/ console.warn( -/******/ "[HMR] unexpected require(" + module.id + ") to disposed module" -/******/ ); -/******/ }; -/******/ -/******/ for (var moduleId in currentUpdate) { -/******/ if (__webpack_require__.o(currentUpdate, moduleId)) { -/******/ var newModuleFactory = currentUpdate[moduleId]; -/******/ var result = newModuleFactory -/******/ ? getAffectedModuleEffects(moduleId) -/******/ : { -/******/ type: "disposed", -/******/ moduleId: moduleId -/******/ }; -/******/ /** @type {Error|false} */ -/******/ var abortError = false; -/******/ var doApply = false; -/******/ var doDispose = false; -/******/ var chainInfo = ""; -/******/ if (result.chain) { -/******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> "); -/******/ } -/******/ switch (result.type) { -/******/ case "self-declined": -/******/ if (options.onDeclined) options.onDeclined(result); -/******/ if (!options.ignoreDeclined) -/******/ abortError = new Error( -/******/ "Aborted because of self decline: " + -/******/ result.moduleId + -/******/ chainInfo -/******/ ); -/******/ break; -/******/ case "declined": -/******/ if (options.onDeclined) options.onDeclined(result); -/******/ if (!options.ignoreDeclined) -/******/ abortError = new Error( -/******/ "Aborted because of declined dependency: " + -/******/ result.moduleId + -/******/ " in " + -/******/ result.parentId + -/******/ chainInfo -/******/ ); -/******/ break; -/******/ case "unaccepted": -/******/ if (options.onUnaccepted) options.onUnaccepted(result); -/******/ if (!options.ignoreUnaccepted) -/******/ abortError = new Error( -/******/ "Aborted because " + moduleId + " is not accepted" + chainInfo -/******/ ); -/******/ break; -/******/ case "accepted": -/******/ if (options.onAccepted) options.onAccepted(result); -/******/ doApply = true; -/******/ break; -/******/ case "disposed": -/******/ if (options.onDisposed) options.onDisposed(result); -/******/ doDispose = true; -/******/ break; -/******/ default: -/******/ throw new Error("Unexception type " + result.type); -/******/ } -/******/ if (abortError) { -/******/ return { -/******/ error: abortError -/******/ }; -/******/ } -/******/ if (doApply) { -/******/ appliedUpdate[moduleId] = newModuleFactory; -/******/ addAllToSet(outdatedModules, result.outdatedModules); -/******/ for (moduleId in result.outdatedDependencies) { -/******/ if (__webpack_require__.o(result.outdatedDependencies, moduleId)) { -/******/ if (!outdatedDependencies[moduleId]) -/******/ outdatedDependencies[moduleId] = []; -/******/ addAllToSet( -/******/ outdatedDependencies[moduleId], -/******/ result.outdatedDependencies[moduleId] -/******/ ); -/******/ } -/******/ } -/******/ } -/******/ if (doDispose) { -/******/ addAllToSet(outdatedModules, [result.moduleId]); -/******/ appliedUpdate[moduleId] = warnUnexpectedRequire; -/******/ } -/******/ } -/******/ } -/******/ currentUpdate = undefined; -/******/ -/******/ // Store self accepted outdated modules to require them later by the module system -/******/ var outdatedSelfAcceptedModules = []; -/******/ for (var j = 0; j < outdatedModules.length; j++) { -/******/ var outdatedModuleId = outdatedModules[j]; -/******/ var module = __webpack_require__.c[outdatedModuleId]; -/******/ if ( -/******/ module && -/******/ (module.hot._selfAccepted || module.hot._main) && -/******/ // removed self-accepted modules should not be required -/******/ appliedUpdate[outdatedModuleId] !== warnUnexpectedRequire && -/******/ // when called invalidate self-accepting is not possible -/******/ !module.hot._selfInvalidated -/******/ ) { -/******/ outdatedSelfAcceptedModules.push({ -/******/ module: outdatedModuleId, -/******/ require: module.hot._requireSelf, -/******/ errorHandler: module.hot._selfAccepted -/******/ }); -/******/ } -/******/ } -/******/ -/******/ var moduleOutdatedDependencies; -/******/ -/******/ return { -/******/ dispose: function () { -/******/ currentUpdateRemovedChunks.forEach(function (chunkId) { -/******/ delete installedChunks[chunkId]; -/******/ }); -/******/ currentUpdateRemovedChunks = undefined; -/******/ -/******/ var idx; -/******/ var queue = outdatedModules.slice(); -/******/ while (queue.length > 0) { -/******/ var moduleId = queue.pop(); -/******/ var module = __webpack_require__.c[moduleId]; -/******/ if (!module) continue; -/******/ -/******/ var data = {}; -/******/ -/******/ // Call dispose handlers -/******/ var disposeHandlers = module.hot._disposeHandlers; -/******/ for (j = 0; j < disposeHandlers.length; j++) { -/******/ disposeHandlers[j].call(null, data); -/******/ } -/******/ __webpack_require__.hmrD[moduleId] = data; -/******/ -/******/ // disable module (this disables requires from this module) -/******/ module.hot.active = false; -/******/ -/******/ // remove module from cache -/******/ delete __webpack_require__.c[moduleId]; -/******/ -/******/ // when disposing there is no need to call dispose handler -/******/ delete outdatedDependencies[moduleId]; -/******/ -/******/ // remove "parents" references from all children -/******/ for (j = 0; j < module.children.length; j++) { -/******/ var child = __webpack_require__.c[module.children[j]]; -/******/ if (!child) continue; -/******/ idx = child.parents.indexOf(moduleId); -/******/ if (idx >= 0) { -/******/ child.parents.splice(idx, 1); -/******/ } -/******/ } -/******/ } -/******/ -/******/ // remove outdated dependency from module children -/******/ var dependency; -/******/ for (var outdatedModuleId in outdatedDependencies) { -/******/ if (__webpack_require__.o(outdatedDependencies, outdatedModuleId)) { -/******/ module = __webpack_require__.c[outdatedModuleId]; -/******/ if (module) { -/******/ moduleOutdatedDependencies = -/******/ outdatedDependencies[outdatedModuleId]; -/******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) { -/******/ dependency = moduleOutdatedDependencies[j]; -/******/ idx = module.children.indexOf(dependency); -/******/ if (idx >= 0) module.children.splice(idx, 1); -/******/ } -/******/ } -/******/ } -/******/ } -/******/ }, -/******/ apply: function (reportError) { -/******/ var acceptPromises = []; -/******/ // insert new code -/******/ for (var updateModuleId in appliedUpdate) { -/******/ if (__webpack_require__.o(appliedUpdate, updateModuleId)) { -/******/ __webpack_require__.m[updateModuleId] = appliedUpdate[updateModuleId]; -/******/ } -/******/ } -/******/ -/******/ // run new runtime modules -/******/ for (var i = 0; i < currentUpdateRuntime.length; i++) { -/******/ currentUpdateRuntime[i](__webpack_require__); -/******/ } -/******/ -/******/ // call accept handlers -/******/ for (var outdatedModuleId in outdatedDependencies) { -/******/ if (__webpack_require__.o(outdatedDependencies, outdatedModuleId)) { -/******/ var module = __webpack_require__.c[outdatedModuleId]; -/******/ if (module) { -/******/ moduleOutdatedDependencies = -/******/ outdatedDependencies[outdatedModuleId]; -/******/ var callbacks = []; -/******/ var errorHandlers = []; -/******/ var dependenciesForCallbacks = []; -/******/ for (var j = 0; j < moduleOutdatedDependencies.length; j++) { -/******/ var dependency = moduleOutdatedDependencies[j]; -/******/ var acceptCallback = -/******/ module.hot._acceptedDependencies[dependency]; -/******/ var errorHandler = -/******/ module.hot._acceptedErrorHandlers[dependency]; -/******/ if (acceptCallback) { -/******/ if (callbacks.indexOf(acceptCallback) !== -1) continue; -/******/ callbacks.push(acceptCallback); -/******/ errorHandlers.push(errorHandler); -/******/ dependenciesForCallbacks.push(dependency); -/******/ } -/******/ } -/******/ for (var k = 0; k < callbacks.length; k++) { -/******/ var result; -/******/ try { -/******/ result = callbacks[k].call(null, moduleOutdatedDependencies); -/******/ } catch (err) { -/******/ if (typeof errorHandlers[k] === "function") { -/******/ try { -/******/ errorHandlers[k](err, { -/******/ moduleId: outdatedModuleId, -/******/ dependencyId: dependenciesForCallbacks[k] -/******/ }); -/******/ } catch (err2) { -/******/ if (options.onErrored) { -/******/ options.onErrored({ -/******/ type: "accept-error-handler-errored", -/******/ moduleId: outdatedModuleId, -/******/ dependencyId: dependenciesForCallbacks[k], -/******/ error: err2, -/******/ originalError: err -/******/ }); -/******/ } -/******/ if (!options.ignoreErrored) { -/******/ reportError(err2); -/******/ reportError(err); -/******/ } -/******/ } -/******/ } else { -/******/ if (options.onErrored) { -/******/ options.onErrored({ -/******/ type: "accept-errored", -/******/ moduleId: outdatedModuleId, -/******/ dependencyId: dependenciesForCallbacks[k], -/******/ error: err -/******/ }); -/******/ } -/******/ if (!options.ignoreErrored) { -/******/ reportError(err); -/******/ } -/******/ } -/******/ } -/******/ if (result && typeof result.then === "function") { -/******/ acceptPromises.push(result); -/******/ } -/******/ } -/******/ } -/******/ } -/******/ } -/******/ -/******/ var onAccepted = function () { -/******/ // Load self accepted modules -/******/ for (var o = 0; o < outdatedSelfAcceptedModules.length; o++) { -/******/ var item = outdatedSelfAcceptedModules[o]; -/******/ var moduleId = item.module; -/******/ try { -/******/ item.require(moduleId); -/******/ } catch (err) { -/******/ if (typeof item.errorHandler === "function") { -/******/ try { -/******/ item.errorHandler(err, { -/******/ moduleId: moduleId, -/******/ module: __webpack_require__.c[moduleId] -/******/ }); -/******/ } catch (err1) { -/******/ if (options.onErrored) { -/******/ options.onErrored({ -/******/ type: "self-accept-error-handler-errored", -/******/ moduleId: moduleId, -/******/ error: err1, -/******/ originalError: err -/******/ }); -/******/ } -/******/ if (!options.ignoreErrored) { -/******/ reportError(err1); -/******/ reportError(err); -/******/ } -/******/ } -/******/ } else { -/******/ if (options.onErrored) { -/******/ options.onErrored({ -/******/ type: "self-accept-errored", -/******/ moduleId: moduleId, -/******/ error: err -/******/ }); -/******/ } -/******/ if (!options.ignoreErrored) { -/******/ reportError(err); -/******/ } -/******/ } -/******/ } -/******/ } -/******/ }; -/******/ -/******/ return Promise.all(acceptPromises) -/******/ .then(onAccepted) -/******/ .then(function () { -/******/ return outdatedModules; -/******/ }); -/******/ } -/******/ }; -/******/ } -/******/ __webpack_require__.hmrI.jsonp = function (moduleId, applyHandlers) { -/******/ if (!currentUpdate) { -/******/ currentUpdate = {}; -/******/ currentUpdateRuntime = []; -/******/ currentUpdateRemovedChunks = []; -/******/ applyHandlers.push(applyHandler); -/******/ } -/******/ if (!__webpack_require__.o(currentUpdate, moduleId)) { -/******/ currentUpdate[moduleId] = __webpack_require__.m[moduleId]; -/******/ } -/******/ }; -/******/ __webpack_require__.hmrC.jsonp = function ( -/******/ chunkIds, -/******/ removedChunks, -/******/ removedModules, -/******/ promises, -/******/ applyHandlers, -/******/ updatedModulesList -/******/ ) { -/******/ applyHandlers.push(applyHandler); -/******/ currentUpdateChunks = {}; -/******/ currentUpdateRemovedChunks = removedChunks; -/******/ currentUpdate = removedModules.reduce(function (obj, key) { -/******/ obj[key] = false; -/******/ return obj; -/******/ }, {}); -/******/ currentUpdateRuntime = []; -/******/ chunkIds.forEach(function (chunkId) { -/******/ if ( -/******/ __webpack_require__.o(installedChunks, chunkId) && -/******/ installedChunks[chunkId] !== undefined -/******/ ) { -/******/ promises.push(loadUpdateChunk(chunkId, updatedModulesList)); -/******/ currentUpdateChunks[chunkId] = true; -/******/ } else { -/******/ currentUpdateChunks[chunkId] = false; -/******/ } -/******/ }); -/******/ if (__webpack_require__.f) { -/******/ __webpack_require__.f.jsonpHmr = function (chunkId, promises) { -/******/ if ( -/******/ currentUpdateChunks && -/******/ __webpack_require__.o(currentUpdateChunks, chunkId) && -/******/ !currentUpdateChunks[chunkId] -/******/ ) { -/******/ promises.push(loadUpdateChunk(chunkId)); -/******/ currentUpdateChunks[chunkId] = true; -/******/ } -/******/ }; -/******/ } -/******/ }; -/******/ -/******/ __webpack_require__.hmrM = () => { -/******/ if (typeof fetch === "undefined") throw new Error("No browser support: need fetch API"); -/******/ return fetch(__webpack_require__.p + __webpack_require__.hmrF()).then((response) => { -/******/ if(response.status === 404) return; // no update available -/******/ if(!response.ok) throw new Error("Failed to fetch update manifest " + response.statusText); -/******/ return response.json(); -/******/ }); -/******/ }; -/******/ -/******/ // no on chunks loaded -/******/ -/******/ // no jsonp function -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // module cache are used so entry inlining is disabled -/******/ // startup -/******/ // Load entry module and return exports -/******/ var __webpack_exports__ = __webpack_require__(125); -/******/ -/******/ })() -; \ No newline at end of file diff --git a/public/architectui/assets/scripts/circle_progress.98288b227c064e6a107f.js b/public/architectui/assets/scripts/circle_progress.98288b227c064e6a107f.js new file mode 100644 index 0000000..89a0a33 --- /dev/null +++ b/public/architectui/assets/scripts/circle_progress.98288b227c064e6a107f.js @@ -0,0 +1 @@ +(()=>{"use strict";var r,e={8363:(r,e,o)=>{var a=o(9661);o(4692)(document).ready(function(){function r(r,e,o,c){document.querySelectorAll(r).forEach(function(r,s){var i={series:[Math.round(100*e)],chart:{height:o,width:o,type:"radialBar"},plotOptions:{radialBar:{hollow:{size:"60%"},dataLabels:{name:{show:!1},value:{show:!0,fontSize:o>60?"16px":"12px",fontWeight:600,color:c,formatter:function(r){return r+"%"}}}}},fill:{colors:Array.isArray(c)?c:[c]},stroke:{lineCap:"round"}};r.innerHTML="",new a.A(r,i).render()})}r(".circle-progress-primary",.64,52,"#3f6ad8"),r(".circle-progress-success",.81,52,"#3ac47d"),r(".circle-progress-danger",.23,52,"#d92550"),r(".circle-progress-info",.69,52,"#16aaff"),r(".circle-progress-alternate",.69,52,"#6f42c1"),r(".circle-progress-dark",.69,52,"#6c757d"),r(".circle-progress-warning",.23,52,"#fd7e14"),r(".circle-progress-success-xl",.16,114,"#3ac47d"),r(".circle-progress-gradient-xl",.51,114,["#fdb83a","#fd7e14"]),r(".circle-progress-danger-xl",.51,114,["#ff1e41","#ff8130"]),r(".circle-progress-gradient",.72,52,["#ff1e41","#ff8130"]),r(".circle-progress-gradient-lg",.64,64,["#ff1e41","#ff8130"]),r(".circle-progress-gradient-alt-lg",.58,64,["#007bff","#16aaff"]),r(".circle-progress-gradient-alt-sm",.58,46,["#007bff","#16aaff"]),r(".circle-progress-danger-sm",.62,46,"#d92550"),r(".circle-progress-warning-sm",.72,46,"#fd7e14"),r(".circle-progress-success-sm",.81,46,"#3ac47d")})}},o={};function a(r){var c=o[r];if(void 0!==c)return c.exports;var s=o[r]={id:r,loaded:!1,exports:{}};return e[r].call(s.exports,s,s.exports,a),s.loaded=!0,s.exports}a.m=e,r=[],a.O=(e,o,c,s)=>{if(!o){var i=1/0;for(f=0;f=s)&&Object.keys(a.O).every(r=>a.O[r](o[l]))?o.splice(l--,1):(t=!1,s0&&r[f-1][2]>s;f--)r[f]=r[f-1];r[f]=[o,c,s]},a.d=(r,e)=>{for(var o in e)a.o(e,o)&&!a.o(r,o)&&Object.defineProperty(r,o,{enumerable:!0,get:e[o]})},a.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),a.r=r=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})},a.nmd=r=>(r.paths=[],r.children||(r.children=[]),r),a.j=79,(()=>{var r={79:0};a.O.j=e=>0===r[e];var e=(e,o)=>{var c,s,[i,t,l]=o,n=0;if(i.some(e=>0!==r[e])){for(c in t)a.o(t,c)&&(a.m[c]=t[c]);if(l)var f=l(a)}for(e&&e(o);na(8363));c=a.O(c)})(); \ No newline at end of file diff --git a/public/architectui/assets/scripts/clipboard.98288b227c064e6a107f.js b/public/architectui/assets/scripts/clipboard.98288b227c064e6a107f.js new file mode 100644 index 0000000..b11eb7b --- /dev/null +++ b/public/architectui/assets/scripts/clipboard.98288b227c064e6a107f.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,r={6039:(e,r,t)=>{var o=t(7576),n=t.n(o);t(4692)(document).ready(function(){new(n())(".clipboard-trigger")})}},t={};function o(e){var n=t[e];if(void 0!==n)return n.exports;var a=t[e]={id:e,loaded:!1,exports:{}};return r[e].call(a.exports,a,a.exports,o),a.loaded=!0,a.exports}o.m=r,e=[],o.O=(r,t,n,a)=>{if(!t){var i=1/0;for(c=0;c=a)&&Object.keys(o.O).every(e=>o.O[e](t[d]))?t.splice(d--,1):(l=!1,a0&&e[c-1][2]>a;c--)e[c]=e[c-1];e[c]=[t,n,a]},o.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return o.d(r,{a:r}),r},o.d=(e,r)=>{for(var t in r)o.o(r,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),o.j=763,(()=>{var e={763:0};o.O.j=r=>0===e[r];var r=(r,t)=>{var n,a,[i,l,d]=t,u=0;if(i.some(r=>0!==e[r])){for(n in l)o.o(l,n)&&(o.m[n]=l[n]);if(d)var c=d(o)}for(r&&r(t);uo(6039));n=o.O(n)})(); \ No newline at end of file diff --git a/public/architectui/assets/scripts/count_up.98288b227c064e6a107f.js b/public/architectui/assets/scripts/count_up.98288b227c064e6a107f.js new file mode 100644 index 0000000..5eea40a --- /dev/null +++ b/public/architectui/assets/scripts/count_up.98288b227c064e6a107f.js @@ -0,0 +1 @@ +(()=>{"use strict";var r,e={5768:(r,e,o)=>{var a=o(6991),t=o(4692);t(document).ready(function(){var r={useEasing:!0,separator:",",decimal:".",prefix:"$"},e={useEasing:!0,separator:",",decimal:".",prefix:"",suffix:"k"},o={useEasing:!0,separator:",",decimal:".",prefix:"",suffix:" %"},n={useEasing:!0,separator:",",decimal:".",prefix:"",suffix:" "},p=s(0,983),u=s(0,97),c=s(0,187),i=s(0,345);function s(r,e){return Math.floor(Math.random()*(e-r+1)+r)}t(".count-up-wrapper").each(function(){var e=new a.T("count-up-wrapper",p,r);e.error?console.error(e.error):e.start(),e.update(u)}),t(".count-up-wrapper-2").each(function(){var r=new a.T("count-up-wrapper-2",u,e);r.error?console.error(r.error):r.start(),r.update(p)}),t(".count-up-wrapper-2").each(function(){var r=new a.T("count-up-wrapper-6",i,e);r.error?console.error(r.error):r.start(),r.update(i)}),t(".count-up-wrapper-2").each(function(){var r=new a.T("count-up-wrapper-5",i,e);r.error?console.error(r.error):r.start(),r.update(i)}),t(".count-up-wrapper-3").each(function(){var r=new a.T("count-up-wrapper-3",c,o);r.error?console.error(r.error):r.start(),r.update(c)}),t(".count-up-wrapper-3").each(function(){var r=new a.T("count-up-wrapper-7",c,o);r.error?console.error(r.error):r.start(),r.update(p)}),t(".count-up-wrapper-3").each(function(){var r=new a.T("count-up-wrapper-8",c,o);r.error?console.error(r.error):r.start(),r.update(c)}),t(".count-up-wrapper-4").each(function(){var r=new a.T("count-up-wrapper-4",p,n);r.error?console.error(r.error):r.start(),r.update(p)})})}},o={};function a(r){var t=o[r];if(void 0!==t)return t.exports;var n=o[r]={id:r,loaded:!1,exports:{}};return e[r].call(n.exports,n,n.exports,a),n.loaded=!0,n.exports}a.m=e,r=[],a.O=(e,o,t,n)=>{if(!o){var p=1/0;for(s=0;s=n)&&Object.keys(a.O).every(r=>a.O[r](o[c]))?o.splice(c--,1):(u=!1,n0&&r[s-1][2]>n;s--)r[s]=r[s-1];r[s]=[o,t,n]},a.d=(r,e)=>{for(var o in e)a.o(e,o)&&!a.o(r,o)&&Object.defineProperty(r,o,{enumerable:!0,get:e[o]})},a.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),a.r=r=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})},a.nmd=r=>(r.paths=[],r.children||(r.children=[]),r),a.j=68,(()=>{var r={68:0};a.O.j=e=>0===r[e];var e=(e,o)=>{var t,n,[p,u,c]=o,i=0;if(p.some(e=>0!==r[e])){for(t in u)a.o(u,t)&&(a.m[t]=u[t]);if(c)var s=c(a)}for(e&&e(o);ia(5768));t=a.O(t)})(); \ No newline at end of file diff --git a/public/architectui/assets/scripts/datepicker.98288b227c064e6a107f.js b/public/architectui/assets/scripts/datepicker.98288b227c064e6a107f.js new file mode 100644 index 0000000..fc2a732 --- /dev/null +++ b/public/architectui/assets/scripts/datepicker.98288b227c064e6a107f.js @@ -0,0 +1 @@ +(()=>{var s,e={5358:(s,e,t)=>{var r={"./af":5177,"./af.js":5177,"./ar":1509,"./ar-dz":1488,"./ar-dz.js":1488,"./ar-kw":8676,"./ar-kw.js":8676,"./ar-ly":2353,"./ar-ly.js":2353,"./ar-ma":4496,"./ar-ma.js":4496,"./ar-ps":6947,"./ar-ps.js":6947,"./ar-sa":2682,"./ar-sa.js":2682,"./ar-tn":9756,"./ar-tn.js":9756,"./ar.js":1509,"./az":5533,"./az.js":5533,"./be":8959,"./be.js":8959,"./bg":7777,"./bg.js":7777,"./bm":4903,"./bm.js":4903,"./bn":1290,"./bn-bd":7357,"./bn-bd.js":7357,"./bn.js":1290,"./bo":1545,"./bo.js":1545,"./br":1470,"./br.js":1470,"./bs":4429,"./bs.js":4429,"./ca":7306,"./ca.js":7306,"./cs":6464,"./cs.js":6464,"./cv":3635,"./cv.js":3635,"./cy":4226,"./cy.js":4226,"./da":3601,"./da.js":3601,"./de":7853,"./de-at":6111,"./de-at.js":6111,"./de-ch":4697,"./de-ch.js":4697,"./de.js":7853,"./dv":708,"./dv.js":708,"./el":4691,"./el.js":4691,"./en-au":3872,"./en-au.js":3872,"./en-ca":8298,"./en-ca.js":8298,"./en-gb":6195,"./en-gb.js":6195,"./en-ie":6584,"./en-ie.js":6584,"./en-il":5543,"./en-il.js":5543,"./en-in":9033,"./en-in.js":9033,"./en-nz":9402,"./en-nz.js":9402,"./en-sg":3004,"./en-sg.js":3004,"./eo":2934,"./eo.js":2934,"./es":7650,"./es-do":838,"./es-do.js":838,"./es-mx":7730,"./es-mx.js":7730,"./es-us":6575,"./es-us.js":6575,"./es.js":7650,"./et":3035,"./et.js":3035,"./eu":3508,"./eu.js":3508,"./fa":119,"./fa.js":119,"./fi":527,"./fi.js":527,"./fil":5995,"./fil.js":5995,"./fo":2477,"./fo.js":2477,"./fr":5498,"./fr-ca":6435,"./fr-ca.js":6435,"./fr-ch":7892,"./fr-ch.js":7892,"./fr.js":5498,"./fy":7071,"./fy.js":7071,"./ga":1734,"./ga.js":1734,"./gd":217,"./gd.js":217,"./gl":7329,"./gl.js":7329,"./gom-deva":2124,"./gom-deva.js":2124,"./gom-latn":3383,"./gom-latn.js":3383,"./gu":5050,"./gu.js":5050,"./he":1713,"./he.js":1713,"./hi":3861,"./hi.js":3861,"./hr":6308,"./hr.js":6308,"./hu":609,"./hu.js":609,"./hy-am":7160,"./hy-am.js":7160,"./id":4063,"./id.js":4063,"./is":9374,"./is.js":9374,"./it":8383,"./it-ch":1827,"./it-ch.js":1827,"./it.js":8383,"./ja":3827,"./ja.js":3827,"./jv":9722,"./jv.js":9722,"./ka":1794,"./ka.js":1794,"./kk":7088,"./kk.js":7088,"./km":6870,"./km.js":6870,"./kn":4451,"./kn.js":4451,"./ko":3164,"./ko.js":3164,"./ku":8174,"./ku-kmr":6181,"./ku-kmr.js":6181,"./ku.js":8174,"./ky":8474,"./ky.js":8474,"./lb":9680,"./lb.js":9680,"./lo":5867,"./lo.js":5867,"./lt":5766,"./lt.js":5766,"./lv":9532,"./lv.js":9532,"./me":8076,"./me.js":8076,"./mi":1848,"./mi.js":1848,"./mk":306,"./mk.js":306,"./ml":3739,"./ml.js":3739,"./mn":9053,"./mn.js":9053,"./mr":6169,"./mr.js":6169,"./ms":3386,"./ms-my":2297,"./ms-my.js":2297,"./ms.js":3386,"./mt":7075,"./mt.js":7075,"./my":2264,"./my.js":2264,"./nb":2274,"./nb.js":2274,"./ne":8235,"./ne.js":8235,"./nl":2572,"./nl-be":3784,"./nl-be.js":3784,"./nl.js":2572,"./nn":4566,"./nn.js":4566,"./oc-lnc":9330,"./oc-lnc.js":9330,"./pa-in":9849,"./pa-in.js":9849,"./pl":4418,"./pl.js":4418,"./pt":9834,"./pt-br":8303,"./pt-br.js":8303,"./pt.js":9834,"./ro":4457,"./ro.js":4457,"./ru":2271,"./ru.js":2271,"./sd":1221,"./sd.js":1221,"./se":3478,"./se.js":3478,"./si":7538,"./si.js":7538,"./sk":5784,"./sk.js":5784,"./sl":6637,"./sl.js":6637,"./sq":6794,"./sq.js":6794,"./sr":5719,"./sr-cyrl":3322,"./sr-cyrl.js":3322,"./sr.js":5719,"./ss":6e3,"./ss.js":6e3,"./sv":1011,"./sv.js":1011,"./sw":748,"./sw.js":748,"./ta":1025,"./ta.js":1025,"./te":1885,"./te.js":1885,"./tet":8861,"./tet.js":8861,"./tg":6571,"./tg.js":6571,"./th":5802,"./th.js":5802,"./tk":9527,"./tk.js":9527,"./tl-ph":9231,"./tl-ph.js":9231,"./tlh":1052,"./tlh.js":1052,"./tr":5096,"./tr.js":5096,"./tzl":9846,"./tzl.js":9846,"./tzm":1765,"./tzm-latn":7711,"./tzm-latn.js":7711,"./tzm.js":1765,"./ug-cn":8414,"./ug-cn.js":8414,"./uk":6618,"./uk.js":6618,"./ur":158,"./ur.js":158,"./uz":7609,"./uz-latn":2475,"./uz-latn.js":2475,"./uz.js":7609,"./vi":1135,"./vi.js":1135,"./x-pseudo":4051,"./x-pseudo.js":4051,"./yo":2218,"./yo.js":2218,"./zh-cn":2648,"./zh-cn.js":2648,"./zh-hk":1632,"./zh-hk.js":1632,"./zh-mo":1541,"./zh-mo.js":1541,"./zh-tw":304,"./zh-tw.js":304};function a(s){var e=n(s);return t(e)}function n(s){if(!t.o(r,s)){var e=new Error("Cannot find module '"+s+"'");throw e.code="MODULE_NOT_FOUND",e}return r[s]}a.keys=function(){return Object.keys(r)},a.resolve=n,s.exports=a,a.id=5358},5687:(s,e,t)=>{"use strict";t(4808),t(3335);var r=t(5093),a=t.n(r),n=t(4692);n(document).ready(function(){n('[data-toggle="datepicker"]').datepicker(),n('[data-toggle="datepicker-year"]').datepicker({startView:2}),n('[data-toggle="datepicker-month"]').datepicker({startView:1}),n('[data-toggle="datepicker-inline"]').datepicker({inline:!0}),n('[data-toggle="datepicker-icon"]').datepicker({trigger:".datepicker-trigger"}),n('[data-toggle="datepicker-button"]').datepicker({trigger:".datepicker-trigger-btn"}),n('input[name="daterange"]').daterangepicker(),n('input[name="datetimes"]').daterangepicker({timePicker:!0,startDate:a()().startOf("hour"),endDate:a()().startOf("hour").add(32,"hour"),locale:{format:"M/DD hh:mm A"}}),n('input[name="birthday"]').daterangepicker({singleDatePicker:!0,showDropdowns:!0,minYear:1901,maxYear:parseInt(a()().format("YYYY"),10)},function(s,e,t){var r=a()().diff(s,"years");alert("You are "+r+" years old!")});var s=a()().subtract(29,"days"),e=a()();function t(s,e){n("#reportrange span").html(s.format("MMMM D, YYYY")+" - "+e.format("MMMM D, YYYY"))}n("#reportrange").daterangepicker({startDate:s,endDate:e,opens:"right",ranges:{Today:[a()(),a()()],Yesterday:[a()().subtract(1,"days"),a()().subtract(1,"days")],"Last 7 Days":[a()().subtract(6,"days"),a()()],"Last 30 Days":[a()().subtract(29,"days"),a()()],"This Month":[a()().startOf("month"),a()().endOf("month")],"Last Month":[a()().subtract(1,"month").startOf("month"),a()().subtract(1,"month").endOf("month")]}},t),t(s,e),n('input[name="daterange-centered"]').daterangepicker({timePicker:!0,buttonClasses:"btn btn-success",cancelClass:"btn-link bg-transparent rm-border text-danger",opens:"center",drops:"up",startDate:"12/12/2018",endDate:"12/18/2018"})})}},t={};function r(s){var a=t[s];if(void 0!==a)return a.exports;var n=t[s]={id:s,loaded:!1,exports:{}};return e[s].call(n.exports,n,n.exports,r),n.loaded=!0,n.exports}r.m=e,s=[],r.O=(e,t,a,n)=>{if(!t){var j=1/0;for(l=0;l=n)&&Object.keys(r.O).every(s=>r.O[s](t[i]))?t.splice(i--,1):(o=!1,n0&&s[l-1][2]>n;l--)s[l]=s[l-1];s[l]=[t,a,n]},r.n=s=>{var e=s&&s.__esModule?()=>s.default:()=>s;return r.d(e,{a:e}),e},r.d=(s,e)=>{for(var t in e)r.o(e,t)&&!r.o(s,t)&&Object.defineProperty(s,t,{enumerable:!0,get:e[t]})},r.o=(s,e)=>Object.prototype.hasOwnProperty.call(s,e),r.r=s=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(s,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(s,"__esModule",{value:!0})},r.nmd=s=>(s.paths=[],s.children||(s.children=[]),s),r.j=329,(()=>{var s={329:0};r.O.j=e=>0===s[e];var e=(e,t)=>{var a,n,[j,o,i]=t,d=0;if(j.some(e=>0!==s[e])){for(a in o)r.o(o,a)&&(r.m[a]=o[a]);if(i)var l=i(r)}for(e&&e(t);dr(5687));a=r.O(a)})(); \ No newline at end of file diff --git a/public/architectui/assets/scripts/demo.98288b227c064e6a107f.js b/public/architectui/assets/scripts/demo.98288b227c064e6a107f.js new file mode 100644 index 0000000..818a0e7 --- /dev/null +++ b/public/architectui/assets/scripts/demo.98288b227c064e6a107f.js @@ -0,0 +1 @@ +(()=>{var a,s={508:(a,s,e)=>{var t=e(4692);t(document).ready(function(){t(".btn-open-options").click(function(){t(".ui-theme-settings").toggleClass("settings-open")}),t(".close-sidebar-btn").click(function(){var a=t(this).attr("data-class");t(".app-container").toggleClass(a);var s=t(this);s.hasClass("is-active")?s.removeClass("is-active"):s.addClass("is-active")}),t(".switch-container-class input[type='checkbox']").on("change",function(){var a=t(this).closest(".switch-container-class"),s=a.attr("data-class"),e=".app-container";t(this).is(":checked")?(t(e).addClass(s),a.addClass("active")):(t(e).removeClass(s),a.removeClass("active"))}),t(".switch-container-class").on("click",function(a){if(!t(a.target).is('input[type="checkbox"]')){var s=t(this).attr("data-class");t(".app-container").toggleClass(s),t(this).parent().find(".switch-container-class").removeClass("active"),t(this).addClass("active")}}),t(".switch-theme-class").on("click",function(){var a=t(this).attr("data-class"),s=".app-container";"app-theme-white"==a&&(t(s).removeClass("app-theme-gray"),t(s).addClass(a)),"app-theme-gray"==a&&(t(s).removeClass("app-theme-white"),t(s).addClass(a)),"body-tabs-line"==a&&(t(s).removeClass("body-tabs-shadow"),t(s).addClass(a)),"body-tabs-shadow"==a&&(t(s).removeClass("body-tabs-line"),t(s).addClass(a)),t(this).parent().find(".switch-theme-class").removeClass("active"),t(this).addClass("active")}),t(".switch-header-cs-class").on("click",function(){var a=t(this).attr("data-class"),s=".app-header";t(".switch-header-cs-class").removeClass("active"),t(this).addClass("active"),t(s).attr("class","app-header"),t(s).addClass("header-shadow "+a)}),t(".switch-sidebar-cs-class").on("click",function(){var a=t(this).attr("data-class"),s=".app-sidebar";t(".switch-sidebar-cs-class").removeClass("active"),t(this).addClass("active"),t(s).attr("class","app-sidebar"),t(s).addClass("sidebar-shadow "+a)})})}},e={};function t(a){var i=e[a];if(void 0!==i)return i.exports;var r=e[a]={id:a,loaded:!1,exports:{}};return s[a].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}t.m=s,a=[],t.O=(s,e,i,r)=>{if(!e){var c=1/0;for(d=0;d=r)&&Object.keys(t.O).every(a=>t.O[a](e[l]))?e.splice(l--,1):(o=!1,r0&&a[d-1][2]>r;d--)a[d]=a[d-1];a[d]=[e,i,r]},t.d=(a,s)=>{for(var e in s)t.o(s,e)&&!t.o(a,e)&&Object.defineProperty(a,e,{enumerable:!0,get:s[e]})},t.o=(a,s)=>Object.prototype.hasOwnProperty.call(a,s),t.r=a=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})},t.nmd=a=>(a.paths=[],a.children||(a.children=[]),a),t.j=594,(()=>{var a={594:0};t.O.j=s=>0===a[s];var s=(s,e)=>{var i,r,[c,o,l]=e,n=0;if(c.some(s=>0!==a[s])){for(i in o)t.o(o,i)&&(t.m[i]=o[i]);if(l)var d=l(t)}for(s&&s(e);nt(508));i=t.O(i)})(); \ No newline at end of file diff --git a/public/architectui/assets/scripts/demo.js b/public/architectui/assets/scripts/demo.js deleted file mode 100644 index 4ebf9dc..0000000 --- a/public/architectui/assets/scripts/demo.js +++ /dev/null @@ -1,1108 +0,0 @@ -/* - * ATTENTION: An "eval-source-map" devtool has been used. - * This devtool is neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ 1: -/***/ (function(module, exports) { - -eval("{var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery JavaScript Library v3.7.1\n * https://jquery.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-08-28T13:37Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( true && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar version = \"3.7.1\",\n\n\trhtmlSuffix = /HTML$/i,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\n\t// Retrieve the text value of an array of DOM nodes\n\ttext: function( elem ) {\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += jQuery.text( node );\n\t\t\t}\n\t\t}\n\t\tif ( nodeType === 1 || nodeType === 11 ) {\n\t\t\treturn elem.textContent;\n\t\t}\n\t\tif ( nodeType === 9 ) {\n\t\t\treturn elem.documentElement.textContent;\n\t\t}\n\t\tif ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tisXMLDoc: function( elem ) {\n\t\tvar namespace = elem && elem.namespaceURI,\n\t\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t\t// Assume HTML when documentElement doesn't yet exist, such as inside\n\t\t// document fragments.\n\t\treturn !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar pop = arr.pop;\n\n\nvar sort = arr.sort;\n\n\nvar splice = arr.splice;\n\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n// Note: an element does not contain itself\njQuery.contains = function( a, b ) {\n\tvar bup = b && b.parentNode;\n\n\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE doesn't have `contains` on SVG.\n\t\ta.contains ?\n\t\t\ta.contains( bup ) :\n\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t) );\n};\n\n\n\n\n// CSS string/identifier serialization\n// https://drafts.csswg.org/cssom/#common-serializing-idioms\nvar rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n\nfunction fcssescape( ch, asCodePoint ) {\n\tif ( asCodePoint ) {\n\n\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\tif ( ch === \"\\0\" ) {\n\t\t\treturn \"\\uFFFD\";\n\t\t}\n\n\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t}\n\n\t// Other potentially-special ASCII characters get backslash-escaped\n\treturn \"\\\\\" + ch;\n}\n\njQuery.escapeSelector = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\n\n\n\nvar preferredDoc = document,\n\tpushNative = push;\n\n( function() {\n\nvar i,\n\tExpr,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\tpush = pushNative,\n\n\t// Local document vars\n\tdocument,\n\tdocumentElement,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\tmatches,\n\n\t// Instance-specific data\n\texpando = jQuery.expando,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|\" +\n\t\t\"loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trleadingCombinator = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" +\n\t\twhitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\tID: new RegExp( \"^#(\" + identifier + \")\" ),\n\t\tCLASS: new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\tTAG: new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\tATTR: new RegExp( \"^\" + attributes ),\n\t\tPSEUDO: new RegExp( \"^\" + pseudos ),\n\t\tCHILD: new RegExp(\n\t\t\t\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\tbool: new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\tneedsContext: new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\tif ( nonHex ) {\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\treturn nonHex;\n\t\t}\n\n\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t// Support: IE <=11+\n\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t// surrogate pair\n\t\treturn high < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes; see `setDocument`.\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE/Edge.\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && nodeName( elem, \"fieldset\" );\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android <=4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = {\n\t\tapply: function( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t},\n\t\tcall: function( target ) {\n\t\t\tpushNative.apply( target, slice.call( arguments, 1 ) );\n\t\t}\n\t};\n}\n\nfunction find( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tfind.contains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( !nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when\n\t\t\t\t\t// strict-comparing two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( newContext != context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = jQuery.escapeSelector( nid );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrimCSS, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties\n\t\t// (see https://github.com/jquery/sizzle/issues/157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by jQuery selector module\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn nodeName( elem, \"input\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn ( nodeName( elem, \"input\" ) || nodeName( elem, \"button\" ) ) &&\n\t\t\telem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11+\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a jQuery selector context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [node] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nfunction setDocument( node ) {\n\tvar subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocumentElement = document.documentElement;\n\tdocumentIsHTML = !jQuery.isXMLDoc( document );\n\n\t// Support: iOS 7 only, IE 9 - 11+\n\t// Older browsers didn't support unprefixed `matches`.\n\tmatches = documentElement.matches ||\n\t\tdocumentElement.webkitMatchesSelector ||\n\t\tdocumentElement.msMatchesSelector;\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors\n\t// (see trac-13936).\n\t// Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,\n\t// all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.\n\tif ( documentElement.msMatchesSelector &&\n\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tpreferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t\tsubWindow.addEventListener( \"unload\", unloadHandler );\n\t}\n\n\t// Support: IE <10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocumentElement.appendChild( el ).id = jQuery.expando;\n\t\treturn !document.getElementsByName ||\n\t\t\t!document.getElementsByName( jQuery.expando ).length;\n\t} );\n\n\t// Support: IE 9 only\n\t// Check to see if it's possible to do matchesSelector\n\t// on a disconnected node.\n\tsupport.disconnectedMatch = assert( function( el ) {\n\t\treturn matches.call( el, \"*\" );\n\t} );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// IE/Edge don't support the :scope pseudo-class.\n\tsupport.scope = assert( function() {\n\t\treturn document.querySelectorAll( \":scope\" );\n\t} );\n\n\t// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only\n\t// Make sure the `:has()` argument is parsed unforgivingly.\n\t// We include `*` in the test to detect buggy implementations that are\n\t// _selectively_ forgiving (specifically when the list includes at least\n\t// one valid selector).\n\t// Note that we treat complete lack of support for `:has()` as if it were\n\t// spec-compliant support, which is fine because use of `:has()` in such\n\t// environments will fail in the qSA path and fall back to jQuery traversal\n\t// anyway.\n\tsupport.cssHas = assert( function() {\n\t\ttry {\n\t\t\tdocument.querySelector( \":has(*,:jqfake)\" );\n\t\t\treturn false;\n\t\t} catch ( e ) {\n\t\t\treturn true;\n\t\t}\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find.TAG = function( tag, context ) {\n\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t// DocumentFragment nodes don't have gEBTN\n\t\t} else {\n\t\t\treturn context.querySelectorAll( tag );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find.CLASS = function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\trbuggyQSA = [];\n\n\t// Build QSA regex\n\t// Regex strategy adopted from Diego Perini\n\tassert( function( el ) {\n\n\t\tvar input;\n\n\t\tdocumentElement.appendChild( el ).innerHTML =\n\t\t\t\"\" +\n\t\t\t\"\";\n\n\t\t// Support: iOS <=7 - 8 only\n\t\t// Boolean attributes and \"value\" are not treated correctly in some XML documents\n\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t}\n\n\t\t// Support: iOS <=7 - 8 only\n\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\trbuggyQSA.push( \"~=\" );\n\t\t}\n\n\t\t// Support: iOS 8 only\n\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t}\n\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\trbuggyQSA.push( \":checked\" );\n\t\t}\n\n\t\t// Support: Windows 8 Native Apps\n\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tdocumentElement.appendChild( el ).disabled = true;\n\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t}\n\n\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t// Adding a temporary attribute to the document before the selection works\n\t\t// around the issue.\n\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"name\", \"\" );\n\t\tel.appendChild( input );\n\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t}\n\t} );\n\n\tif ( !support.cssHas ) {\n\n\t\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t\t// Our regular `try-catch` mechanism fails to detect natively-unsupported\n\t\t// pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n\t\t// in browsers that parse the `:has()` argument as a forgiving selector list.\n\t\t// https://drafts.csswg.org/selectors/#relational now requires the argument\n\t\t// to be parsed unforgivingly, but browsers have not yet fully adjusted.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = function( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a === document || a.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b === document || b.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t};\n\n\treturn document;\n}\n\nfind.matches = function( expr, elements ) {\n\treturn find( expr, null, null, elements );\n};\n\nfind.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn find( expr, document, null, [ elem ] ).length > 0;\n};\n\nfind.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn jQuery.contains( context, elem );\n};\n\n\nfind.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (see trac-13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\tif ( val !== undefined ) {\n\t\treturn val;\n\t}\n\n\treturn elem.getAttribute( name );\n};\n\nfind.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\njQuery.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\t//\n\t// Support: Android <=4.0+\n\t// Testing for detecting duplicates is unpredictable so instead assume we can't\n\t// depend on duplicate detection in all browsers without a stable sort.\n\thasDuplicate = !support.sortStable;\n\tsortInput = !support.sortStable && slice.call( results, 0 );\n\tsort.call( results, sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tsplice.call( results, duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\njQuery.fn.uniqueSort = function() {\n\treturn this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );\n};\n\nExpr = jQuery.expr = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\tATTR: function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || \"\" )\n\t\t\t\t.replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\tCHILD: function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" )\n\t\t\t\t);\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr.CHILD.test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\tTAG: function( nodeNameSelector ) {\n\t\t\tvar expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn nodeName( elem, expectedNodeName );\n\t\t\t\t};\n\t\t},\n\n\t\tCLASS: function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace + \")\" + className +\n\t\t\t\t\t\"(\" + whitespace + \"|$)\" ) ) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\tATTR: function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = find.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\tif ( operator === \"=\" ) {\n\t\t\t\t\treturn result === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"!=\" ) {\n\t\t\t\t\treturn result !== check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"^=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) === 0;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"*=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"$=\" ) {\n\t\t\t\t\treturn check && result.slice( -check.length ) === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"~=\" ) {\n\t\t\t\t\treturn ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" )\n\t\t\t\t\t\t.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"|=\" ) {\n\t\t\t\t\treturn result === check || result.slice( 0, check.length + 1 ) === check + \"-\";\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t},\n\n\t\tCHILD: function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || ( parent[ expando ] = {} );\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\t\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\t\t\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\tPSEUDO: function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// https://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tfind.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as jQuery does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\tnot: markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrimCSS, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element\n\t\t\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\thas: markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn find( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\tcontains: markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// https://www.w3.org/TR/selectors/#lang-pseudo\n\t\tlang: markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tfind.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\ttarget: function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\troot: function( elem ) {\n\t\t\treturn elem === documentElement;\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === safeActiveElement() &&\n\t\t\t\tdocument.hasFocus() &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\tenabled: createDisabledPseudo( false ),\n\t\tdisabled: createDisabledPseudo( true ),\n\n\t\tchecked: function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\treturn ( nodeName( elem, \"input\" ) && !!elem.checked ) ||\n\t\t\t\t( nodeName( elem, \"option\" ) && !!elem.selected );\n\t\t},\n\n\t\tselected: function( elem ) {\n\n\t\t\t// Support: IE <=11+\n\t\t\t// Accessing the selectedIndex property\n\t\t\t// forces the browser to treat the default option as\n\t\t\t// selected when in an optgroup.\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\tempty: function( elem ) {\n\n\t\t\t// https://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !Expr.pseudos.empty( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\theader: function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"button\" ||\n\t\t\t\tnodeName( elem, \"button\" );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"text\" &&\n\n\t\t\t\t// Support: IE <10 only\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear\n\t\t\t\t// with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\tfirst: createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\tlast: createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\teq: createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\teven: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\todd: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tlt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i;\n\n\t\t\tif ( argument < 0 ) {\n\t\t\t\ti = argument + length;\n\t\t\t} else if ( argument > length ) {\n\t\t\t\ti = length;\n\t\t\t} else {\n\t\t\t\ti = argument;\n\t\t\t}\n\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tgt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos.nth = Expr.pseudos.eq;\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rleadingCombinator.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrimCSS, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\tif ( parseOnly ) {\n\t\treturn soFar.length;\n\t}\n\n\treturn soFar ?\n\t\tfind.error( selector ) :\n\n\t\t// Cache the tokens\n\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\tif ( skip && nodeName( elem, skip ) ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = outerCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tfind( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem, matcherOut,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed ||\n\t\t\t\tmultipleContexts( selector || \"*\",\n\t\t\t\t\tcontext.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems;\n\n\t\tif ( matcher ) {\n\n\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter\n\t\t\t// or preexisting results,\n\t\t\tmatcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t[] :\n\n\t\t\t\t// ...otherwise use results directly\n\t\t\t\tresults;\n\n\t\t\t// Find primary matches\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t} else {\n\t\t\tmatcherOut = matcherIn;\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tvar ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element\n\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 )\n\t\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrimCSS, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find.TAG( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: iOS <=7 - 9 only\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: ) matching\n\t\t\t// elements by id. (see trac-14142)\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tjQuery.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\nfunction compile( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n}\n\n/**\n * A low-level selection function that works with jQuery's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with jQuery selector compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find.ID(\n\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\tcontext\n\t\t\t) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) &&\n\t\t\t\t\t\ttestContext( context.parentNode ) || context\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Support: Android <=4.0 - 4.1+\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Android <=4.0 - 4.1+\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\njQuery.find = find;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.unique = jQuery.uniqueSort;\n\n// These have always been private, but they used to be documented as part of\n// Sizzle so let's maintain them for now for backwards compatibility purposes.\nfind.compile = compile;\nfind.select = select;\nfind.setDocument = setDocument;\nfind.tokenize = tokenize;\n\nfind.escape = jQuery.escapeSelector;\nfind.getText = jQuery.text;\nfind.isXML = jQuery.isXMLDoc;\nfind.selectors = jQuery.expr;\nfind.support = jQuery.support;\nfind.uniqueSort = jQuery.uniqueSort;\n\n\t/* eslint-enable */\n\n} )();\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to jQuery#find\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.error );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the error, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getErrorHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getErrorHook();\n\n\t\t\t\t\t\t\t\t// The deprecated alias of the above. While the name suggests\n\t\t\t\t\t\t\t\t// returning the stack, not an error instance, jQuery just passes\n\t\t\t\t\t\t\t\t// it directly to `console.warn` so both will work; an instance\n\t\t\t\t\t\t\t\t// just better cooperates with source maps.\n\t\t\t\t\t\t\t\t} else if ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\n// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error\n// captured before the async barrier to get the original error cause\n// which may otherwise be hidden.\njQuery.Deferred.exceptionHook = function( error, asyncError ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message,\n\t\t\terror.stack, asyncError );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces \";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting or other required elements.\n\tthead: [ 1, \"\", \"
    \" ],\n\tcol: [ 2, \"\", \"
    \" ],\n\ttr: [ 2, \"\", \"
    \" ],\n\ttd: [ 3, \"\", \"
    \" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", true );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, isSetup ) {\n\n\t// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !isSetup ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\tif ( !saved ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tdataPriv.set( this, type, false );\n\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering\n\t\t\t\t// the native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, jQuery.event.trigger(\n\t\t\t\t\tsaved[ 0 ],\n\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\tthis\n\t\t\t\t) );\n\n\t\t\t\t// Abort handling of the native event by all jQuery handlers while allowing\n\t\t\t\t// native handlers on the same element to run. On target, this is achieved\n\t\t\t\t// by stopping immediate propagation just on the jQuery event. However,\n\t\t\t\t// the native event is re-wrapped by a jQuery one on each level of the\n\t\t\t\t// propagation so the only way to stop it for jQuery is to stop it for\n\t\t\t\t// everyone via native `stopPropagation()`. This is not a problem for\n\t\t\t\t// focus/blur which don't bubble, but it does also stop click on checkboxes\n\t\t\t\t// and radios. We accept this limitation.\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.isImmediatePropagationStopped = returnTrue;\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\n\tfunction focusMappedHandler( nativeEvent ) {\n\t\tif ( document.documentMode ) {\n\n\t\t\t// Support: IE 11+\n\t\t\t// Attach a single focusin/focusout handler on the document while someone wants\n\t\t\t// focus/blur. This is because the former are synchronous in IE while the latter\n\t\t\t// are async. In other browsers, all those handlers are invoked synchronously.\n\n\t\t\t// `handle` from private data would already wrap the event, but we need\n\t\t\t// to change the `type` here.\n\t\t\tvar handle = dataPriv.get( this, \"handle\" ),\n\t\t\t\tevent = jQuery.event.fix( nativeEvent );\n\t\t\tevent.type = nativeEvent.type === \"focusin\" ? \"focus\" : \"blur\";\n\t\t\tevent.isSimulated = true;\n\n\t\t\t// First, handle focusin/focusout\n\t\t\thandle( nativeEvent );\n\n\t\t\t// ...then, handle focus/blur\n\t\t\t//\n\t\t\t// focus/blur don't bubble while focusin/focusout do; simulate the former by only\n\t\t\t// invoking the handler at the lower level.\n\t\t\tif ( event.target === event.currentTarget ) {\n\n\t\t\t\t// The setup part calls `leverageNative`, which, in turn, calls\n\t\t\t\t// `jQuery.event.add`, so event handle will already have been set\n\t\t\t\t// by this point.\n\t\t\t\thandle( event );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// For non-IE browsers, attach a single capturing handler on the document\n\t\t\t// while someone wants focusin/focusout.\n\t\t\tjQuery.event.simulate( delegateType, nativeEvent.target,\n\t\t\t\tjQuery.event.fix( nativeEvent ) );\n\t\t}\n\t}\n\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\tvar attaches;\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, true );\n\n\t\t\tif ( document.documentMode ) {\n\n\t\t\t\t// Support: IE 9 - 11+\n\t\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\t\tattaches = dataPriv.get( this, delegateType );\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t}\n\t\t\t\tdataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );\n\t\t\t} else {\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tvar attaches;\n\n\t\t\tif ( document.documentMode ) {\n\t\t\t\tattaches = dataPriv.get( this, delegateType ) - 1;\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t\tdataPriv.remove( this, delegateType );\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.set( this, delegateType, attaches );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Return false to indicate standard teardown should be applied\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n\n\t// Support: Firefox <=44\n\t// Firefox doesn't have focus(in | out) events\n\t// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n\t//\n\t// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n\t// focus(in | out) events fire after focus & blur events,\n\t// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n\t// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n\t//\n\t// Support: IE 9 - 11+\n\t// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,\n\t// attach a single handler for both events in IE.\n\tjQuery.event.special[ delegateType ] = {\n\t\tsetup: function() {\n\n\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType );\n\n\t\t\t// Support: IE 9 - 11+\n\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.addEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\tdataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );\n\t\t},\n\t\tteardown: function() {\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType ) - 1;\n\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.removeEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( dataHolder, delegateType );\n\t\t\t} else {\n\t\t\t\tdataPriv.set( dataHolder, delegateType, attaches );\n\t\t\t}\n\t\t}\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Re-enable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew jQuery#find here for performance reasons:\n\t\t\t// https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"box-sizing:content-box;border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is `display: block`\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, trac-12537)\n\t// .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0,\n\t\tmarginDelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\t// Count margin delta separately to only add it after scroll gutter adjustment.\n\t\t// This is needed to make negative margins work with `outerHeight( true )` (gh-3982).\n\t\tif ( box === \"margin\" ) {\n\t\t\tmarginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta + marginDelta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\tanimationIterationCount: true,\n\t\taspectRatio: true,\n\t\tborderImageSlice: true,\n\t\tcolumnCount: true,\n\t\tflexGrow: true,\n\t\tflexShrink: true,\n\t\tfontWeight: true,\n\t\tgridArea: true,\n\t\tgridColumn: true,\n\t\tgridColumnEnd: true,\n\t\tgridColumnStart: true,\n\t\tgridRow: true,\n\t\tgridRowEnd: true,\n\t\tgridRowStart: true,\n\t\tlineHeight: true,\n\t\topacity: true,\n\t\torder: true,\n\t\torphans: true,\n\t\tscale: true,\n\t\twidows: true,\n\t\tzIndex: true,\n\t\tzoom: true,\n\n\t\t// SVG-related\n\t\tfillOpacity: true,\n\t\tfloodOpacity: true,\n\t\tstopOpacity: true,\n\t\tstrokeMiterlimit: true,\n\t\tstrokeOpacity: true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"
  • aj6P+xsdz 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 literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/AD.svg b/public/architectui/assets/fonts/AD.svg new file mode 100644 index 0000000..4855f9f --- /dev/null +++ b/public/architectui/assets/fonts/AD.svg @@ -0,0 +1,35 @@ + + + + AD + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AE.svg b/public/architectui/assets/fonts/AE.svg new file mode 100644 index 0000000..3095fe3 --- /dev/null +++ b/public/architectui/assets/fonts/AE.svg @@ -0,0 +1,33 @@ + + + + AE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AF.svg b/public/architectui/assets/fonts/AF.svg new file mode 100644 index 0000000..75216b7 --- /dev/null +++ b/public/architectui/assets/fonts/AF.svg @@ -0,0 +1,34 @@ + + + + AF + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AG.svg b/public/architectui/assets/fonts/AG.svg new file mode 100644 index 0000000..ac56b80 --- /dev/null +++ b/public/architectui/assets/fonts/AG.svg @@ -0,0 +1,44 @@ + + + + AG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AI.svg b/public/architectui/assets/fonts/AI.svg new file mode 100644 index 0000000..7f53e46 --- /dev/null +++ b/public/architectui/assets/fonts/AI.svg @@ -0,0 +1,50 @@ + + + + AI + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AL.svg b/public/architectui/assets/fonts/AL.svg new file mode 100644 index 0000000..43ff1a3 --- /dev/null +++ b/public/architectui/assets/fonts/AL.svg @@ -0,0 +1,27 @@ + + + + AL + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AM.svg b/public/architectui/assets/fonts/AM.svg new file mode 100644 index 0000000..5224d30 --- /dev/null +++ b/public/architectui/assets/fonts/AM.svg @@ -0,0 +1,32 @@ + + + + AM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AO.svg b/public/architectui/assets/fonts/AO.svg new file mode 100644 index 0000000..86044f3 --- /dev/null +++ b/public/architectui/assets/fonts/AO.svg @@ -0,0 +1,37 @@ + + + + AO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AR.svg b/public/architectui/assets/fonts/AR.svg new file mode 100644 index 0000000..4dbc96f --- /dev/null +++ b/public/architectui/assets/fonts/AR.svg @@ -0,0 +1,26 @@ + + + + AR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AS.svg b/public/architectui/assets/fonts/AS.svg new file mode 100644 index 0000000..afb3754 --- /dev/null +++ b/public/architectui/assets/fonts/AS.svg @@ -0,0 +1,36 @@ + + + + AS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AT.svg b/public/architectui/assets/fonts/AT.svg new file mode 100644 index 0000000..627245e --- /dev/null +++ b/public/architectui/assets/fonts/AT.svg @@ -0,0 +1,24 @@ + + + + AT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AU.svg b/public/architectui/assets/fonts/AU.svg new file mode 100644 index 0000000..aad6b1e --- /dev/null +++ b/public/architectui/assets/fonts/AU.svg @@ -0,0 +1,36 @@ + + + + AU + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AW.svg b/public/architectui/assets/fonts/AW.svg new file mode 100644 index 0000000..892d8aa --- /dev/null +++ b/public/architectui/assets/fonts/AW.svg @@ -0,0 +1,30 @@ + + + + AW + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AX.svg b/public/architectui/assets/fonts/AX.svg new file mode 100644 index 0000000..577cd26 --- /dev/null +++ b/public/architectui/assets/fonts/AX.svg @@ -0,0 +1,32 @@ + + + + AX + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/AZ.svg b/public/architectui/assets/fonts/AZ.svg new file mode 100644 index 0000000..3f082f3 --- /dev/null +++ b/public/architectui/assets/fonts/AZ.svg @@ -0,0 +1,33 @@ + + + + AZ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BA.svg b/public/architectui/assets/fonts/BA.svg new file mode 100644 index 0000000..a16324e --- /dev/null +++ b/public/architectui/assets/fonts/BA.svg @@ -0,0 +1,32 @@ + + + + BA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BB.svg b/public/architectui/assets/fonts/BB.svg new file mode 100644 index 0000000..5c89e13 --- /dev/null +++ b/public/architectui/assets/fonts/BB.svg @@ -0,0 +1,38 @@ + + + + BB + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BD.svg b/public/architectui/assets/fonts/BD.svg new file mode 100644 index 0000000..e1a3cd3 --- /dev/null +++ b/public/architectui/assets/fonts/BD.svg @@ -0,0 +1,27 @@ + + + + BD + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BE.svg b/public/architectui/assets/fonts/BE.svg new file mode 100644 index 0000000..ac00173 --- /dev/null +++ b/public/architectui/assets/fonts/BE.svg @@ -0,0 +1,32 @@ + + + + BE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BF.svg b/public/architectui/assets/fonts/BF.svg new file mode 100644 index 0000000..5b4286b --- /dev/null +++ b/public/architectui/assets/fonts/BF.svg @@ -0,0 +1,28 @@ + + + + BF + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BG.svg b/public/architectui/assets/fonts/BG.svg new file mode 100644 index 0000000..e8256f4 --- /dev/null +++ b/public/architectui/assets/fonts/BG.svg @@ -0,0 +1,28 @@ + + + + BG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BH.svg b/public/architectui/assets/fonts/BH.svg new file mode 100644 index 0000000..e1c1109 --- /dev/null +++ b/public/architectui/assets/fonts/BH.svg @@ -0,0 +1,23 @@ + + + + BH + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BI.svg b/public/architectui/assets/fonts/BI.svg new file mode 100644 index 0000000..2f20825 --- /dev/null +++ b/public/architectui/assets/fonts/BI.svg @@ -0,0 +1,36 @@ + + + + BI + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BJ.svg b/public/architectui/assets/fonts/BJ.svg new file mode 100644 index 0000000..b21c46e --- /dev/null +++ b/public/architectui/assets/fonts/BJ.svg @@ -0,0 +1,32 @@ + + + + BJ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BL.svg b/public/architectui/assets/fonts/BL.svg new file mode 100644 index 0000000..b99bc2c --- /dev/null +++ b/public/architectui/assets/fonts/BL.svg @@ -0,0 +1,42 @@ + + + + BL + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BM.svg b/public/architectui/assets/fonts/BM.svg new file mode 100644 index 0000000..798dd8b --- /dev/null +++ b/public/architectui/assets/fonts/BM.svg @@ -0,0 +1,49 @@ + + + + BM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BN.svg b/public/architectui/assets/fonts/BN.svg new file mode 100644 index 0000000..1fe9afc --- /dev/null +++ b/public/architectui/assets/fonts/BN.svg @@ -0,0 +1,28 @@ + + + + BN + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BO.svg b/public/architectui/assets/fonts/BO.svg new file mode 100644 index 0000000..7ee247b --- /dev/null +++ b/public/architectui/assets/fonts/BO.svg @@ -0,0 +1,32 @@ + + + + BO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BR.svg b/public/architectui/assets/fonts/BR.svg new file mode 100644 index 0000000..17edb10 --- /dev/null +++ b/public/architectui/assets/fonts/BR.svg @@ -0,0 +1,35 @@ + + + + BR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BS.svg b/public/architectui/assets/fonts/BS.svg new file mode 100644 index 0000000..767423a --- /dev/null +++ b/public/architectui/assets/fonts/BS.svg @@ -0,0 +1,33 @@ + + + + BS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BT.svg b/public/architectui/assets/fonts/BT.svg new file mode 100644 index 0000000..d2f749b --- /dev/null +++ b/public/architectui/assets/fonts/BT.svg @@ -0,0 +1,27 @@ + + + + BT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BV.svg b/public/architectui/assets/fonts/BV.svg new file mode 100644 index 0000000..00a47ee --- /dev/null +++ b/public/architectui/assets/fonts/BV.svg @@ -0,0 +1,28 @@ + + + + BV + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BW.svg b/public/architectui/assets/fonts/BW.svg new file mode 100644 index 0000000..ccac652 --- /dev/null +++ b/public/architectui/assets/fonts/BW.svg @@ -0,0 +1,29 @@ + + + + BW + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BY.svg b/public/architectui/assets/fonts/BY.svg new file mode 100644 index 0000000..d584988 --- /dev/null +++ b/public/architectui/assets/fonts/BY.svg @@ -0,0 +1,30 @@ + + + + BY + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/BZ.svg b/public/architectui/assets/fonts/BZ.svg new file mode 100644 index 0000000..8758df2 --- /dev/null +++ b/public/architectui/assets/fonts/BZ.svg @@ -0,0 +1,30 @@ + + + + BZ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CA.svg b/public/architectui/assets/fonts/CA.svg new file mode 100644 index 0000000..786b609 --- /dev/null +++ b/public/architectui/assets/fonts/CA.svg @@ -0,0 +1,25 @@ + + + + CA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CC.svg b/public/architectui/assets/fonts/CC.svg new file mode 100644 index 0000000..b96f301 --- /dev/null +++ b/public/architectui/assets/fonts/CC.svg @@ -0,0 +1,33 @@ + + + + CC + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CD.svg b/public/architectui/assets/fonts/CD.svg new file mode 100644 index 0000000..0d351c3 --- /dev/null +++ b/public/architectui/assets/fonts/CD.svg @@ -0,0 +1,31 @@ + + + + CD + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CF.svg b/public/architectui/assets/fonts/CF.svg new file mode 100644 index 0000000..68566a2 --- /dev/null +++ b/public/architectui/assets/fonts/CF.svg @@ -0,0 +1,43 @@ + + + + CF + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CG.svg b/public/architectui/assets/fonts/CG.svg new file mode 100644 index 0000000..bc4eb95 --- /dev/null +++ b/public/architectui/assets/fonts/CG.svg @@ -0,0 +1,34 @@ + + + + CG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CH.svg b/public/architectui/assets/fonts/CH.svg new file mode 100644 index 0000000..772f4fa --- /dev/null +++ b/public/architectui/assets/fonts/CH.svg @@ -0,0 +1,23 @@ + + + + CH + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CI.svg b/public/architectui/assets/fonts/CI.svg new file mode 100644 index 0000000..096d98a --- /dev/null +++ b/public/architectui/assets/fonts/CI.svg @@ -0,0 +1,28 @@ + + + + CI + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CK.svg b/public/architectui/assets/fonts/CK.svg new file mode 100644 index 0000000..c1ea373 --- /dev/null +++ b/public/architectui/assets/fonts/CK.svg @@ -0,0 +1,31 @@ + + + + CK + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CL.svg b/public/architectui/assets/fonts/CL.svg new file mode 100644 index 0000000..d456d95 --- /dev/null +++ b/public/architectui/assets/fonts/CL.svg @@ -0,0 +1,29 @@ + + + + CL + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CM.svg b/public/architectui/assets/fonts/CM.svg new file mode 100644 index 0000000..482f4a9 --- /dev/null +++ b/public/architectui/assets/fonts/CM.svg @@ -0,0 +1,38 @@ + + + + CM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CN.svg b/public/architectui/assets/fonts/CN.svg new file mode 100644 index 0000000..883ba15 --- /dev/null +++ b/public/architectui/assets/fonts/CN.svg @@ -0,0 +1,32 @@ + + + + CN + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CO.svg b/public/architectui/assets/fonts/CO.svg new file mode 100644 index 0000000..be492e3 --- /dev/null +++ b/public/architectui/assets/fonts/CO.svg @@ -0,0 +1,32 @@ + + + + CO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CR.svg b/public/architectui/assets/fonts/CR.svg new file mode 100644 index 0000000..271204e --- /dev/null +++ b/public/architectui/assets/fonts/CR.svg @@ -0,0 +1,29 @@ + + + + CR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CU.svg b/public/architectui/assets/fonts/CU.svg new file mode 100644 index 0000000..23750cd --- /dev/null +++ b/public/architectui/assets/fonts/CU.svg @@ -0,0 +1,32 @@ + + + + CU + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CV.svg b/public/architectui/assets/fonts/CV.svg new file mode 100644 index 0000000..4b6152f --- /dev/null +++ b/public/architectui/assets/fonts/CV.svg @@ -0,0 +1,30 @@ + + + + CV + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CW.svg b/public/architectui/assets/fonts/CW.svg new file mode 100644 index 0000000..14acd27 --- /dev/null +++ b/public/architectui/assets/fonts/CW.svg @@ -0,0 +1,29 @@ + + + + CW + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CX.svg b/public/architectui/assets/fonts/CX.svg new file mode 100644 index 0000000..b3fe73d --- /dev/null +++ b/public/architectui/assets/fonts/CX.svg @@ -0,0 +1,38 @@ + + + + CX + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CY.svg b/public/architectui/assets/fonts/CY.svg new file mode 100644 index 0000000..b7860aa --- /dev/null +++ b/public/architectui/assets/fonts/CY.svg @@ -0,0 +1,24 @@ + + + + CY + Created with sketchtool. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/CZ.svg b/public/architectui/assets/fonts/CZ.svg new file mode 100644 index 0000000..d56c61b --- /dev/null +++ b/public/architectui/assets/fonts/CZ.svg @@ -0,0 +1,28 @@ + + + + CZ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/DE.svg b/public/architectui/assets/fonts/DE.svg new file mode 100644 index 0000000..4ff1ebd --- /dev/null +++ b/public/architectui/assets/fonts/DE.svg @@ -0,0 +1,32 @@ + + + + DE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/DJ.svg b/public/architectui/assets/fonts/DJ.svg new file mode 100644 index 0000000..c0a019f --- /dev/null +++ b/public/architectui/assets/fonts/DJ.svg @@ -0,0 +1,33 @@ + + + + DJ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/DK.svg b/public/architectui/assets/fonts/DK.svg new file mode 100644 index 0000000..27900e1 --- /dev/null +++ b/public/architectui/assets/fonts/DK.svg @@ -0,0 +1,23 @@ + + + + DK + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/DM.svg b/public/architectui/assets/fonts/DM.svg new file mode 100644 index 0000000..d5c401e --- /dev/null +++ b/public/architectui/assets/fonts/DM.svg @@ -0,0 +1,41 @@ + + + + DM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/DO.svg b/public/architectui/assets/fonts/DO.svg new file mode 100644 index 0000000..9188e0b --- /dev/null +++ b/public/architectui/assets/fonts/DO.svg @@ -0,0 +1,33 @@ + + + + DO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/DZ.svg b/public/architectui/assets/fonts/DZ.svg new file mode 100644 index 0000000..0920d71 --- /dev/null +++ b/public/architectui/assets/fonts/DZ.svg @@ -0,0 +1,29 @@ + + + + DZ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/EC.svg b/public/architectui/assets/fonts/EC.svg new file mode 100644 index 0000000..0fbd3ea --- /dev/null +++ b/public/architectui/assets/fonts/EC.svg @@ -0,0 +1,39 @@ + + + + EC + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/EE.svg b/public/architectui/assets/fonts/EE.svg new file mode 100644 index 0000000..6360522 --- /dev/null +++ b/public/architectui/assets/fonts/EE.svg @@ -0,0 +1,28 @@ + + + + EE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/EG.svg b/public/architectui/assets/fonts/EG.svg new file mode 100644 index 0000000..32d4447 --- /dev/null +++ b/public/architectui/assets/fonts/EG.svg @@ -0,0 +1,30 @@ + + + + EG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/ER.svg b/public/architectui/assets/fonts/ER.svg new file mode 100644 index 0000000..bb70368 --- /dev/null +++ b/public/architectui/assets/fonts/ER.svg @@ -0,0 +1,40 @@ + + + + ER + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/ES.svg b/public/architectui/assets/fonts/ES.svg new file mode 100644 index 0000000..883554f --- /dev/null +++ b/public/architectui/assets/fonts/ES.svg @@ -0,0 +1,34 @@ + + + + ES + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/ET.svg b/public/architectui/assets/fonts/ET.svg new file mode 100644 index 0000000..c4387b9 --- /dev/null +++ b/public/architectui/assets/fonts/ET.svg @@ -0,0 +1,42 @@ + + + + ET + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/EU.svg b/public/architectui/assets/fonts/EU.svg new file mode 100644 index 0000000..db74ffa --- /dev/null +++ b/public/architectui/assets/fonts/EU.svg @@ -0,0 +1,27 @@ + + + + EU + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/FI.svg b/public/architectui/assets/fonts/FI.svg new file mode 100644 index 0000000..9d243ed --- /dev/null +++ b/public/architectui/assets/fonts/FI.svg @@ -0,0 +1,22 @@ + + + + FI + Created with sketchtool. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/FJ.svg b/public/architectui/assets/fonts/FJ.svg new file mode 100644 index 0000000..e3ebc9b --- /dev/null +++ b/public/architectui/assets/fonts/FJ.svg @@ -0,0 +1,51 @@ + + + + FJ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/FK.svg b/public/architectui/assets/fonts/FK.svg new file mode 100644 index 0000000..01b0f2a --- /dev/null +++ b/public/architectui/assets/fonts/FK.svg @@ -0,0 +1,58 @@ + + + + FK + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/FM.svg b/public/architectui/assets/fonts/FM.svg new file mode 100644 index 0000000..befd157 --- /dev/null +++ b/public/architectui/assets/fonts/FM.svg @@ -0,0 +1,23 @@ + + + + FM + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/FO.svg b/public/architectui/assets/fonts/FO.svg new file mode 100644 index 0000000..77618c0 --- /dev/null +++ b/public/architectui/assets/fonts/FO.svg @@ -0,0 +1,27 @@ + + + + FO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/FR.svg b/public/architectui/assets/fonts/FR.svg new file mode 100644 index 0000000..940de61 --- /dev/null +++ b/public/architectui/assets/fonts/FR.svg @@ -0,0 +1,28 @@ + + + + FR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GA.svg b/public/architectui/assets/fonts/GA.svg new file mode 100644 index 0000000..45c6808 --- /dev/null +++ b/public/architectui/assets/fonts/GA.svg @@ -0,0 +1,32 @@ + + + + GA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GB-ENG.svg b/public/architectui/assets/fonts/GB-ENG.svg new file mode 100644 index 0000000..f032cb4 --- /dev/null +++ b/public/architectui/assets/fonts/GB-ENG.svg @@ -0,0 +1,22 @@ + + + + GB-ENG + Created with sketchtool. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GB-NIR.svg b/public/architectui/assets/fonts/GB-NIR.svg new file mode 100644 index 0000000..5d04864 --- /dev/null +++ b/public/architectui/assets/fonts/GB-NIR.svg @@ -0,0 +1,41 @@ + + + + GB-NIR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GB-SCT.svg b/public/architectui/assets/fonts/GB-SCT.svg new file mode 100644 index 0000000..6aabe99 --- /dev/null +++ b/public/architectui/assets/fonts/GB-SCT.svg @@ -0,0 +1,23 @@ + + + + GB-SCT + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GB-WLS.svg b/public/architectui/assets/fonts/GB-WLS.svg new file mode 100644 index 0000000..607b333 --- /dev/null +++ b/public/architectui/assets/fonts/GB-WLS.svg @@ -0,0 +1,28 @@ + + + + GB-WLS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GB-ZET.svg b/public/architectui/assets/fonts/GB-ZET.svg new file mode 100644 index 0000000..7080d48 --- /dev/null +++ b/public/architectui/assets/fonts/GB-ZET.svg @@ -0,0 +1,23 @@ + + + + GB-ZET + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GB.svg b/public/architectui/assets/fonts/GB.svg new file mode 100644 index 0000000..679d27c --- /dev/null +++ b/public/architectui/assets/fonts/GB.svg @@ -0,0 +1,32 @@ + + + + GB + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GD.svg b/public/architectui/assets/fonts/GD.svg new file mode 100644 index 0000000..210dc3f --- /dev/null +++ b/public/architectui/assets/fonts/GD.svg @@ -0,0 +1,49 @@ + + + + GD + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GE.svg b/public/architectui/assets/fonts/GE.svg new file mode 100644 index 0000000..818f3f5 --- /dev/null +++ b/public/architectui/assets/fonts/GE.svg @@ -0,0 +1,26 @@ + + + + GE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GF.svg b/public/architectui/assets/fonts/GF.svg new file mode 100644 index 0000000..bae1448 --- /dev/null +++ b/public/architectui/assets/fonts/GF.svg @@ -0,0 +1,32 @@ + + + + GF + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GG.svg b/public/architectui/assets/fonts/GG.svg new file mode 100644 index 0000000..fa42853 --- /dev/null +++ b/public/architectui/assets/fonts/GG.svg @@ -0,0 +1,27 @@ + + + + GG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GH.svg b/public/architectui/assets/fonts/GH.svg new file mode 100644 index 0000000..528473f --- /dev/null +++ b/public/architectui/assets/fonts/GH.svg @@ -0,0 +1,37 @@ + + + + GH + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GI.svg b/public/architectui/assets/fonts/GI.svg new file mode 100644 index 0000000..ecd8530 --- /dev/null +++ b/public/architectui/assets/fonts/GI.svg @@ -0,0 +1,38 @@ + + + + GI + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GL.svg b/public/architectui/assets/fonts/GL.svg new file mode 100644 index 0000000..33b2233 --- /dev/null +++ b/public/architectui/assets/fonts/GL.svg @@ -0,0 +1,33 @@ + + + + GL + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GM.svg b/public/architectui/assets/fonts/GM.svg new file mode 100644 index 0000000..b6330f5 --- /dev/null +++ b/public/architectui/assets/fonts/GM.svg @@ -0,0 +1,33 @@ + + + + GM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GN.svg b/public/architectui/assets/fonts/GN.svg new file mode 100644 index 0000000..2d20595 --- /dev/null +++ b/public/architectui/assets/fonts/GN.svg @@ -0,0 +1,32 @@ + + + + GN + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GP.svg b/public/architectui/assets/fonts/GP.svg new file mode 100644 index 0000000..3dbdcc1 --- /dev/null +++ b/public/architectui/assets/fonts/GP.svg @@ -0,0 +1,40 @@ + + + + GP + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GQ.svg b/public/architectui/assets/fonts/GQ.svg new file mode 100644 index 0000000..e2d5c67 --- /dev/null +++ b/public/architectui/assets/fonts/GQ.svg @@ -0,0 +1,34 @@ + + + + GQ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GR.svg b/public/architectui/assets/fonts/GR.svg new file mode 100644 index 0000000..a9b12c0 --- /dev/null +++ b/public/architectui/assets/fonts/GR.svg @@ -0,0 +1,22 @@ + + + + GR + Created with sketchtool. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GS.svg b/public/architectui/assets/fonts/GS.svg new file mode 100644 index 0000000..0398452 --- /dev/null +++ b/public/architectui/assets/fonts/GS.svg @@ -0,0 +1,112 @@ + + + + GS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GT.svg b/public/architectui/assets/fonts/GT.svg new file mode 100644 index 0000000..be45ee8 --- /dev/null +++ b/public/architectui/assets/fonts/GT.svg @@ -0,0 +1,26 @@ + + + + GT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GU.svg b/public/architectui/assets/fonts/GU.svg new file mode 100644 index 0000000..6233a0b --- /dev/null +++ b/public/architectui/assets/fonts/GU.svg @@ -0,0 +1,65 @@ + + + + GU + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GW.svg b/public/architectui/assets/fonts/GW.svg new file mode 100644 index 0000000..b09530d --- /dev/null +++ b/public/architectui/assets/fonts/GW.svg @@ -0,0 +1,37 @@ + + + + GW + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/GY.svg b/public/architectui/assets/fonts/GY.svg new file mode 100644 index 0000000..e5937c2 --- /dev/null +++ b/public/architectui/assets/fonts/GY.svg @@ -0,0 +1,42 @@ + + + + GY + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/HK.svg b/public/architectui/assets/fonts/HK.svg new file mode 100644 index 0000000..f99b888 --- /dev/null +++ b/public/architectui/assets/fonts/HK.svg @@ -0,0 +1,23 @@ + + + + HK + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/HM.svg b/public/architectui/assets/fonts/HM.svg new file mode 100644 index 0000000..8ef4f34 --- /dev/null +++ b/public/architectui/assets/fonts/HM.svg @@ -0,0 +1,36 @@ + + + + HM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/HN.svg b/public/architectui/assets/fonts/HN.svg new file mode 100644 index 0000000..50a48cd --- /dev/null +++ b/public/architectui/assets/fonts/HN.svg @@ -0,0 +1,33 @@ + + + + HN + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/HR.svg b/public/architectui/assets/fonts/HR.svg new file mode 100644 index 0000000..a6cf5da --- /dev/null +++ b/public/architectui/assets/fonts/HR.svg @@ -0,0 +1,35 @@ + + + + HR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/HT.svg b/public/architectui/assets/fonts/HT.svg new file mode 100644 index 0000000..0cd82be --- /dev/null +++ b/public/architectui/assets/fonts/HT.svg @@ -0,0 +1,46 @@ + + + + HT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/HU.svg b/public/architectui/assets/fonts/HU.svg new file mode 100644 index 0000000..795319e --- /dev/null +++ b/public/architectui/assets/fonts/HU.svg @@ -0,0 +1,28 @@ + + + + HU + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/ID.svg b/public/architectui/assets/fonts/ID.svg new file mode 100644 index 0000000..8101da0 --- /dev/null +++ b/public/architectui/assets/fonts/ID.svg @@ -0,0 +1,23 @@ + + + + ID + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/IE.svg b/public/architectui/assets/fonts/IE.svg new file mode 100644 index 0000000..60d9af8 --- /dev/null +++ b/public/architectui/assets/fonts/IE.svg @@ -0,0 +1,28 @@ + + + + IE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/IL.svg b/public/architectui/assets/fonts/IL.svg new file mode 100644 index 0000000..7646f91 --- /dev/null +++ b/public/architectui/assets/fonts/IL.svg @@ -0,0 +1,26 @@ + + + + IL + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/IM.svg b/public/architectui/assets/fonts/IM.svg new file mode 100644 index 0000000..ecc7c12 --- /dev/null +++ b/public/architectui/assets/fonts/IM.svg @@ -0,0 +1,30 @@ + + + + IM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/IN.svg b/public/architectui/assets/fonts/IN.svg new file mode 100644 index 0000000..3726ceb --- /dev/null +++ b/public/architectui/assets/fonts/IN.svg @@ -0,0 +1,31 @@ + + + + IN + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/IO.svg b/public/architectui/assets/fonts/IO.svg new file mode 100644 index 0000000..4d8b522 --- /dev/null +++ b/public/architectui/assets/fonts/IO.svg @@ -0,0 +1,33 @@ + + + + IO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/IQ.svg b/public/architectui/assets/fonts/IQ.svg new file mode 100644 index 0000000..16c4cf1 --- /dev/null +++ b/public/architectui/assets/fonts/IQ.svg @@ -0,0 +1,33 @@ + + + + IQ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/IR.svg b/public/architectui/assets/fonts/IR.svg new file mode 100644 index 0000000..af32501 --- /dev/null +++ b/public/architectui/assets/fonts/IR.svg @@ -0,0 +1,31 @@ + + + + IR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/IS.svg b/public/architectui/assets/fonts/IS.svg new file mode 100644 index 0000000..385a2bf --- /dev/null +++ b/public/architectui/assets/fonts/IS.svg @@ -0,0 +1,28 @@ + + + + IS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/IT.svg b/public/architectui/assets/fonts/IT.svg new file mode 100644 index 0000000..9e76f24 --- /dev/null +++ b/public/architectui/assets/fonts/IT.svg @@ -0,0 +1,28 @@ + + + + IT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/JE.svg b/public/architectui/assets/fonts/JE.svg new file mode 100644 index 0000000..6663c50 --- /dev/null +++ b/public/architectui/assets/fonts/JE.svg @@ -0,0 +1,32 @@ + + + + JE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/JM.svg b/public/architectui/assets/fonts/JM.svg new file mode 100644 index 0000000..54779e7 --- /dev/null +++ b/public/architectui/assets/fonts/JM.svg @@ -0,0 +1,33 @@ + + + + JM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/JO.svg b/public/architectui/assets/fonts/JO.svg new file mode 100644 index 0000000..b0788e7 --- /dev/null +++ b/public/architectui/assets/fonts/JO.svg @@ -0,0 +1,34 @@ + + + + JO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/JP.svg b/public/architectui/assets/fonts/JP.svg new file mode 100644 index 0000000..0a655c0 --- /dev/null +++ b/public/architectui/assets/fonts/JP.svg @@ -0,0 +1,22 @@ + + + + JP + Created with sketchtool. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KE.svg b/public/architectui/assets/fonts/KE.svg new file mode 100644 index 0000000..6c6a6cf --- /dev/null +++ b/public/architectui/assets/fonts/KE.svg @@ -0,0 +1,43 @@ + + + + KE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KG.svg b/public/architectui/assets/fonts/KG.svg new file mode 100644 index 0000000..12e6a24 --- /dev/null +++ b/public/architectui/assets/fonts/KG.svg @@ -0,0 +1,28 @@ + + + + KG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KH.svg b/public/architectui/assets/fonts/KH.svg new file mode 100644 index 0000000..9ea454b --- /dev/null +++ b/public/architectui/assets/fonts/KH.svg @@ -0,0 +1,29 @@ + + + + KH + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KI.svg b/public/architectui/assets/fonts/KI.svg new file mode 100644 index 0000000..e00e235 --- /dev/null +++ b/public/architectui/assets/fonts/KI.svg @@ -0,0 +1,35 @@ + + + + KI + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KM.svg b/public/architectui/assets/fonts/KM.svg new file mode 100644 index 0000000..2da152d --- /dev/null +++ b/public/architectui/assets/fonts/KM.svg @@ -0,0 +1,39 @@ + + + + KM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KN.svg b/public/architectui/assets/fonts/KN.svg new file mode 100644 index 0000000..e65b7b6 --- /dev/null +++ b/public/architectui/assets/fonts/KN.svg @@ -0,0 +1,39 @@ + + + + KN + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KP.svg b/public/architectui/assets/fonts/KP.svg new file mode 100644 index 0000000..649feb2 --- /dev/null +++ b/public/architectui/assets/fonts/KP.svg @@ -0,0 +1,30 @@ + + + + KP + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KR.svg b/public/architectui/assets/fonts/KR.svg new file mode 100644 index 0000000..078665a --- /dev/null +++ b/public/architectui/assets/fonts/KR.svg @@ -0,0 +1,38 @@ + + + + KR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KW.svg b/public/architectui/assets/fonts/KW.svg new file mode 100644 index 0000000..a73b011 --- /dev/null +++ b/public/architectui/assets/fonts/KW.svg @@ -0,0 +1,33 @@ + + + + KW + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KY.svg b/public/architectui/assets/fonts/KY.svg new file mode 100644 index 0000000..2240dbc --- /dev/null +++ b/public/architectui/assets/fonts/KY.svg @@ -0,0 +1,44 @@ + + + + KY + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/KZ.svg b/public/architectui/assets/fonts/KZ.svg new file mode 100644 index 0000000..6076ac5 --- /dev/null +++ b/public/architectui/assets/fonts/KZ.svg @@ -0,0 +1,29 @@ + + + + KZ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LA.svg b/public/architectui/assets/fonts/LA.svg new file mode 100644 index 0000000..5b740da --- /dev/null +++ b/public/architectui/assets/fonts/LA.svg @@ -0,0 +1,29 @@ + + + + LA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LB.svg b/public/architectui/assets/fonts/LB.svg new file mode 100644 index 0000000..401a235 --- /dev/null +++ b/public/architectui/assets/fonts/LB.svg @@ -0,0 +1,29 @@ + + + + LB + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LC.svg b/public/architectui/assets/fonts/LC.svg new file mode 100644 index 0000000..8d809d3 --- /dev/null +++ b/public/architectui/assets/fonts/LC.svg @@ -0,0 +1,33 @@ + + + + LC + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LGBT.svg b/public/architectui/assets/fonts/LGBT.svg new file mode 100644 index 0000000..a3f7519 --- /dev/null +++ b/public/architectui/assets/fonts/LGBT.svg @@ -0,0 +1,42 @@ + + + + LGBT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LI.svg b/public/architectui/assets/fonts/LI.svg new file mode 100644 index 0000000..1160975 --- /dev/null +++ b/public/architectui/assets/fonts/LI.svg @@ -0,0 +1,27 @@ + + + + LI + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LK.svg b/public/architectui/assets/fonts/LK.svg new file mode 100644 index 0000000..55386d5 --- /dev/null +++ b/public/architectui/assets/fonts/LK.svg @@ -0,0 +1,43 @@ + + + + LK + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LR.svg b/public/architectui/assets/fonts/LR.svg new file mode 100644 index 0000000..3d6cef1 --- /dev/null +++ b/public/architectui/assets/fonts/LR.svg @@ -0,0 +1,36 @@ + + + + LR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LS.svg b/public/architectui/assets/fonts/LS.svg new file mode 100644 index 0000000..3ec5277 --- /dev/null +++ b/public/architectui/assets/fonts/LS.svg @@ -0,0 +1,34 @@ + + + + LS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LT.svg b/public/architectui/assets/fonts/LT.svg new file mode 100644 index 0000000..8e59226 --- /dev/null +++ b/public/architectui/assets/fonts/LT.svg @@ -0,0 +1,32 @@ + + + + LT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LU.svg b/public/architectui/assets/fonts/LU.svg new file mode 100644 index 0000000..860e730 --- /dev/null +++ b/public/architectui/assets/fonts/LU.svg @@ -0,0 +1,28 @@ + + + + LU + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LV.svg b/public/architectui/assets/fonts/LV.svg new file mode 100644 index 0000000..5d0255e --- /dev/null +++ b/public/architectui/assets/fonts/LV.svg @@ -0,0 +1,24 @@ + + + + LV + Created with sketchtool. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/LY.svg b/public/architectui/assets/fonts/LY.svg new file mode 100644 index 0000000..4b9f2a0 --- /dev/null +++ b/public/architectui/assets/fonts/LY.svg @@ -0,0 +1,33 @@ + + + + LY + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/Linearicons-Free.eot b/public/architectui/assets/fonts/Linearicons-Free.eot new file mode 100644 index 0000000000000000000000000000000000000000..e531c2262bc46eff0cdfa1c0001b470697b2b9ae GIT binary patch literal 55820 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 + + + + + { + "fontFamily": "Linearicons-Free", + "majorVersion": 1, + "minorVersion": 0, + "description": "Designed by Perxis (https://perxis.com).\nFont generated by IcoMoon.", + "copyright": "Copyright © 2015 Perxis.com. All Rights Reserved.", + "designerURL": "https://perxis.com", + "license": "https://linearicons.com/free/license", + "fontURL": "https://linearicons.com", + "licenseURL": "https://linearicons.com/free/license", + "version": "Version 1.0", + "fontId": "Linearicons-Free", + "psName": "Linearicons-Free", + "subFamily": "Regular", + "fullName": "Linearicons-Free" + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/Linearicons-Free.ttf b/public/architectui/assets/fonts/Linearicons-Free.ttf new file mode 100644 index 0000000000000000000000000000000000000000..73d6783225aeb0d10553a1fd613b42446fbf7226 GIT binary patch literal 55620 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 T2LVoOtl2h#Q`^C4(|r9eHOZ?` literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/Linearicons-Free.woff b/public/architectui/assets/fonts/Linearicons-Free.woff new file mode 100644 index 0000000000000000000000000000000000000000..63b5b751e5d898d1fab6da6d266a855e2f46675c GIT binary patch literal 55696 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 literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/Linearicons-Free.woff2 b/public/architectui/assets/fonts/Linearicons-Free.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d4c5ddafc96c4e9fc92365a8d66c2c2fdb3d90ac GIT binary patch literal 21780 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 + + + MA + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MC.svg b/public/architectui/assets/fonts/MC.svg new file mode 100644 index 0000000..207590a --- /dev/null +++ b/public/architectui/assets/fonts/MC.svg @@ -0,0 +1,23 @@ + + + + MC + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MD.svg b/public/architectui/assets/fonts/MD.svg new file mode 100644 index 0000000..301e93e --- /dev/null +++ b/public/architectui/assets/fonts/MD.svg @@ -0,0 +1,42 @@ + + + + MD + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/ME.svg b/public/architectui/assets/fonts/ME.svg new file mode 100644 index 0000000..9b0838e --- /dev/null +++ b/public/architectui/assets/fonts/ME.svg @@ -0,0 +1,29 @@ + + + + ME + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MF.svg b/public/architectui/assets/fonts/MF.svg new file mode 100644 index 0000000..c45b62a --- /dev/null +++ b/public/architectui/assets/fonts/MF.svg @@ -0,0 +1,28 @@ + + + + MF + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MG.svg b/public/architectui/assets/fonts/MG.svg new file mode 100644 index 0000000..c173fdd --- /dev/null +++ b/public/architectui/assets/fonts/MG.svg @@ -0,0 +1,28 @@ + + + + MG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MH.svg b/public/architectui/assets/fonts/MH.svg new file mode 100644 index 0000000..e6b6609 --- /dev/null +++ b/public/architectui/assets/fonts/MH.svg @@ -0,0 +1,29 @@ + + + + MH + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MK.svg b/public/architectui/assets/fonts/MK.svg new file mode 100644 index 0000000..35b9229 --- /dev/null +++ b/public/architectui/assets/fonts/MK.svg @@ -0,0 +1,29 @@ + + + + MK + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/ML.svg b/public/architectui/assets/fonts/ML.svg new file mode 100644 index 0000000..babc6e5 --- /dev/null +++ b/public/architectui/assets/fonts/ML.svg @@ -0,0 +1,32 @@ + + + + ML + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MM.svg b/public/architectui/assets/fonts/MM.svg new file mode 100644 index 0000000..eb3c18a --- /dev/null +++ b/public/architectui/assets/fonts/MM.svg @@ -0,0 +1,33 @@ + + + + MM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MN.svg b/public/architectui/assets/fonts/MN.svg new file mode 100644 index 0000000..8af15a5 --- /dev/null +++ b/public/architectui/assets/fonts/MN.svg @@ -0,0 +1,33 @@ + + + + MN + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MO.svg b/public/architectui/assets/fonts/MO.svg new file mode 100644 index 0000000..be4bc87 --- /dev/null +++ b/public/architectui/assets/fonts/MO.svg @@ -0,0 +1,26 @@ + + + + MO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MP.svg b/public/architectui/assets/fonts/MP.svg new file mode 100644 index 0000000..3315148 --- /dev/null +++ b/public/architectui/assets/fonts/MP.svg @@ -0,0 +1,29 @@ + + + + MP + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MQ.svg b/public/architectui/assets/fonts/MQ.svg new file mode 100644 index 0000000..adc8207 --- /dev/null +++ b/public/architectui/assets/fonts/MQ.svg @@ -0,0 +1,27 @@ + + + + MQ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MR.svg b/public/architectui/assets/fonts/MR.svg new file mode 100644 index 0000000..da5adee --- /dev/null +++ b/public/architectui/assets/fonts/MR.svg @@ -0,0 +1,27 @@ + + + + MR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MS.svg b/public/architectui/assets/fonts/MS.svg new file mode 100644 index 0000000..184c917 --- /dev/null +++ b/public/architectui/assets/fonts/MS.svg @@ -0,0 +1,47 @@ + + + + MS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MT.svg b/public/architectui/assets/fonts/MT.svg new file mode 100644 index 0000000..5ce0b3f --- /dev/null +++ b/public/architectui/assets/fonts/MT.svg @@ -0,0 +1,29 @@ + + + + MT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MU.svg b/public/architectui/assets/fonts/MU.svg new file mode 100644 index 0000000..f2c6f3f --- /dev/null +++ b/public/architectui/assets/fonts/MU.svg @@ -0,0 +1,37 @@ + + + + MU + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MV.svg b/public/architectui/assets/fonts/MV.svg new file mode 100644 index 0000000..f10e07d --- /dev/null +++ b/public/architectui/assets/fonts/MV.svg @@ -0,0 +1,28 @@ + + + + MV + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MW.svg b/public/architectui/assets/fonts/MW.svg new file mode 100644 index 0000000..5b0cc5c --- /dev/null +++ b/public/architectui/assets/fonts/MW.svg @@ -0,0 +1,33 @@ + + + + MW + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MX.svg b/public/architectui/assets/fonts/MX.svg new file mode 100644 index 0000000..7ed245b --- /dev/null +++ b/public/architectui/assets/fonts/MX.svg @@ -0,0 +1,30 @@ + + + + MX + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MY.svg b/public/architectui/assets/fonts/MY.svg new file mode 100644 index 0000000..e7ff885 --- /dev/null +++ b/public/architectui/assets/fonts/MY.svg @@ -0,0 +1,32 @@ + + + + MY + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/MZ.svg b/public/architectui/assets/fonts/MZ.svg new file mode 100644 index 0000000..7f553b0 --- /dev/null +++ b/public/architectui/assets/fonts/MZ.svg @@ -0,0 +1,43 @@ + + + + MZ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NA.svg b/public/architectui/assets/fonts/NA.svg new file mode 100644 index 0000000..cb0ba69 --- /dev/null +++ b/public/architectui/assets/fonts/NA.svg @@ -0,0 +1,75 @@ + + + + NA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NC.svg b/public/architectui/assets/fonts/NC.svg new file mode 100644 index 0000000..bae580e --- /dev/null +++ b/public/architectui/assets/fonts/NC.svg @@ -0,0 +1,42 @@ + + + + NC + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NE.svg b/public/architectui/assets/fonts/NE.svg new file mode 100644 index 0000000..12bcf8a --- /dev/null +++ b/public/architectui/assets/fonts/NE.svg @@ -0,0 +1,33 @@ + + + + NE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NF.svg b/public/architectui/assets/fonts/NF.svg new file mode 100644 index 0000000..b707e52 --- /dev/null +++ b/public/architectui/assets/fonts/NF.svg @@ -0,0 +1,29 @@ + + + + NF + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NG.svg b/public/architectui/assets/fonts/NG.svg new file mode 100644 index 0000000..4063ff8 --- /dev/null +++ b/public/architectui/assets/fonts/NG.svg @@ -0,0 +1,24 @@ + + + + NG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NI.svg b/public/architectui/assets/fonts/NI.svg new file mode 100644 index 0000000..7adb4ba --- /dev/null +++ b/public/architectui/assets/fonts/NI.svg @@ -0,0 +1,26 @@ + + + + NI + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NL.svg b/public/architectui/assets/fonts/NL.svg new file mode 100644 index 0000000..c62f42a --- /dev/null +++ b/public/architectui/assets/fonts/NL.svg @@ -0,0 +1,28 @@ + + + + NL + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NO.svg b/public/architectui/assets/fonts/NO.svg new file mode 100644 index 0000000..cdc23f4 --- /dev/null +++ b/public/architectui/assets/fonts/NO.svg @@ -0,0 +1,28 @@ + + + + NO + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NP.svg b/public/architectui/assets/fonts/NP.svg new file mode 100644 index 0000000..c879fa8 --- /dev/null +++ b/public/architectui/assets/fonts/NP.svg @@ -0,0 +1,35 @@ + + + + NP + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NR.svg b/public/architectui/assets/fonts/NR.svg new file mode 100644 index 0000000..1a6c3a2 --- /dev/null +++ b/public/architectui/assets/fonts/NR.svg @@ -0,0 +1,28 @@ + + + + NR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NU.svg b/public/architectui/assets/fonts/NU.svg new file mode 100644 index 0000000..3d9bc80 --- /dev/null +++ b/public/architectui/assets/fonts/NU.svg @@ -0,0 +1,41 @@ + + + + NU + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/NZ.svg b/public/architectui/assets/fonts/NZ.svg new file mode 100644 index 0000000..c1f624d --- /dev/null +++ b/public/architectui/assets/fonts/NZ.svg @@ -0,0 +1,34 @@ + + + + NZ + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/OM.svg b/public/architectui/assets/fonts/OM.svg new file mode 100644 index 0000000..cb08ac8 --- /dev/null +++ b/public/architectui/assets/fonts/OM.svg @@ -0,0 +1,29 @@ + + + + OM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PA.svg b/public/architectui/assets/fonts/PA.svg new file mode 100644 index 0000000..d851668 --- /dev/null +++ b/public/architectui/assets/fonts/PA.svg @@ -0,0 +1,30 @@ + + + + PA + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PE.svg b/public/architectui/assets/fonts/PE.svg new file mode 100644 index 0000000..98a26cf --- /dev/null +++ b/public/architectui/assets/fonts/PE.svg @@ -0,0 +1,24 @@ + + + + PE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PF.svg b/public/architectui/assets/fonts/PF.svg new file mode 100644 index 0000000..b29385f --- /dev/null +++ b/public/architectui/assets/fonts/PF.svg @@ -0,0 +1,52 @@ + + + + PF + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PG.svg b/public/architectui/assets/fonts/PG.svg new file mode 100644 index 0000000..0630fab --- /dev/null +++ b/public/architectui/assets/fonts/PG.svg @@ -0,0 +1,36 @@ + + + + PG + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PH.svg b/public/architectui/assets/fonts/PH.svg new file mode 100644 index 0000000..4c1087b --- /dev/null +++ b/public/architectui/assets/fonts/PH.svg @@ -0,0 +1,33 @@ + + + + PH + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PK.svg b/public/architectui/assets/fonts/PK.svg new file mode 100644 index 0000000..7ecb09c --- /dev/null +++ b/public/architectui/assets/fonts/PK.svg @@ -0,0 +1,32 @@ + + + + PK + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PL.svg b/public/architectui/assets/fonts/PL.svg new file mode 100644 index 0000000..fadbd2d --- /dev/null +++ b/public/architectui/assets/fonts/PL.svg @@ -0,0 +1,23 @@ + + + + PL + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PM.svg b/public/architectui/assets/fonts/PM.svg new file mode 100644 index 0000000..1f39fd0 --- /dev/null +++ b/public/architectui/assets/fonts/PM.svg @@ -0,0 +1,66 @@ + + + + PM + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PN.svg b/public/architectui/assets/fonts/PN.svg new file mode 100644 index 0000000..f2b2cc4 --- /dev/null +++ b/public/architectui/assets/fonts/PN.svg @@ -0,0 +1,51 @@ + + + + PN + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PR.svg b/public/architectui/assets/fonts/PR.svg new file mode 100644 index 0000000..7d12044 --- /dev/null +++ b/public/architectui/assets/fonts/PR.svg @@ -0,0 +1,30 @@ + + + + PR + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PS.svg b/public/architectui/assets/fonts/PS.svg new file mode 100644 index 0000000..e68583b --- /dev/null +++ b/public/architectui/assets/fonts/PS.svg @@ -0,0 +1,33 @@ + + + + PS + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PT.svg b/public/architectui/assets/fonts/PT.svg new file mode 100644 index 0000000..49b59be --- /dev/null +++ b/public/architectui/assets/fonts/PT.svg @@ -0,0 +1,38 @@ + + + + PT + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PW.svg b/public/architectui/assets/fonts/PW.svg new file mode 100644 index 0000000..4ab7f16 --- /dev/null +++ b/public/architectui/assets/fonts/PW.svg @@ -0,0 +1,27 @@ + + + + PW + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/PY.svg b/public/architectui/assets/fonts/PY.svg new file mode 100644 index 0000000..2ae0054 --- /dev/null +++ b/public/architectui/assets/fonts/PY.svg @@ -0,0 +1,30 @@ + + + + PY + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/Pe-icon-7-stroke.eot b/public/architectui/assets/fonts/Pe-icon-7-stroke.eot new file mode 100644 index 0000000000000000000000000000000000000000..6f7b58489c6fe76af1597fad93bd8ebe36114eb9 GIT binary patch literal 58680 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 Nxi7{(cl`%H{|#3vvLpZi literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/Pe-icon-7-stroke.svg b/public/architectui/assets/fonts/Pe-icon-7-stroke.svg new file mode 100644 index 0000000..13d9709 --- /dev/null +++ b/public/architectui/assets/fonts/Pe-icon-7-stroke.svg @@ -0,0 +1,212 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/architectui/assets/fonts/Pe-icon-7-stroke.ttf b/public/architectui/assets/fonts/Pe-icon-7-stroke.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bc8a269c68dafaaf5aaa7920e7a17baff0748360 GIT binary patch literal 58480 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 XVssBJ#01M7olcSaV(fF*fAI6)u)>;0 literal 0 HcmV?d00001 diff --git a/public/architectui/assets/fonts/Pe-icon-7-stroke.woff b/public/architectui/assets/fonts/Pe-icon-7-stroke.woff new file mode 100644 index 0000000000000000000000000000000000000000..c205e6fd3cae5dbfd991d499c7495c9228a804c3 GIT binary patch literal 58556 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